ixj-REDHAT.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:237k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /**
  2.  * Redhat Modifications Note:
  3.  * lines that look like:
  4.  * 'kill_fasync(j->async_queue, SIGIO);'
  5.  * had to be changed to:
  6.  * 'kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);'
  7.  * since RedHat has introduced proprietary modifications
  8.  * into the linux kernel.  Contact www.quicknet.com or
  9.  * www.redhat.com for details.
  10.  */
  11. /****************************************************************************
  12.  *    ixj.c
  13.  *
  14.  *    Device Driver for the Internet PhoneJACK and
  15.  *    Internet LineJACK Telephony Cards.
  16.  *
  17.  *    (c) Copyright 1999-2000  Quicknet Technologies, Inc.
  18.  *
  19.  *    This program is free software; you can redistribute it and/or
  20.  *    modify it under the terms of the GNU General Public License
  21.  *    as published by the Free Software Foundation; either version
  22.  *    2 of the License, or (at your option) any later version.
  23.  *
  24.  * Author:          Ed Okerson, <eokerson@quicknet.net>
  25.  *
  26.  * Contributors:    Greg Herlein, <gherlein@quicknet.net>
  27.  *                  David W. Erhart, <derhart@quicknet.net>
  28.  *                  John Sellers, <jsellers@quicknet.net>
  29.  *                  Mike Preston, <mpreston@quicknet.net>
  30.  *    
  31.  * Fixes:
  32.  * 
  33.  * More information about the hardware related to this driver can be found  
  34.  * at our website:    http://www.quicknet.net
  35.  *
  36.  * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
  37.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  38.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
  39.  * TECHNOLOGIES, INC.HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  40.  *    
  41.  * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  42.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  43.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  44.  * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
  45.  * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  46.  *
  47.  ***************************************************************************/
  48. static char ixj_c_rcsid[] = "$Id: ixj-REDHAT.c,v 1.1 2001/02/05 20:22:23 zolli Exp $";
  49. //#define PERFMON_STATS
  50. #define IXJDEBUG 0
  51. #define MAXRINGS 5
  52. #include <linux/autoconf.h>
  53. #if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS)
  54. #define MODVERSIONS
  55. #endif
  56. #ifdef MODVERSIONS
  57. #include <linux/modversions.h>
  58. #endif
  59. #ifdef CONFIG_PCMCIA
  60. #include <pcmcia/config.h>
  61. #include <pcmcia/k_compat.h>
  62. #endif
  63. #include <linux/module.h>
  64. #include <linux/init.h>
  65. #include <linux/sched.h>
  66. #include <linux/kernel.h> /* printk() */
  67. #include <linux/fs.h> /* everything... */
  68. #include <linux/errno.h> /* error codes */
  69. #include <linux/malloc.h>
  70. #include <linux/mm.h>
  71. #include <linux/ioport.h>
  72. #include <linux/interrupt.h>
  73. #include <linux/tqueue.h>
  74. #include <linux/proc_fs.h>
  75. #include <linux/poll.h>
  76. #include <linux/timer.h>
  77. #include <linux/delay.h>
  78. #include <linux/pci.h>
  79. #include <asm/io.h>
  80. #include <asm/segment.h>
  81. #include <asm/uaccess.h>
  82. #ifdef CONFIG_ISAPNP
  83. #include "../isapnp/pnpio.h"
  84. #include "../isapnp/isapnp.h"
  85. #endif
  86. #ifdef CONFIG_PCMCIA
  87. #include <pcmcia/version.h>
  88. #include <pcmcia/cs_types.h>
  89. #include <pcmcia/cs.h>
  90. #include <pcmcia/cistpl.h>
  91. #include <pcmcia/ds.h>
  92. #include <pcmcia/cisreg.h>
  93. #include <pcmcia/ciscode.h>
  94. #endif
  95. #include "ixj.h"
  96. #define TYPE(dev) (MINOR(dev) >> 4)
  97. #define NUM(dev) (MINOR(dev) & 0xf)
  98. static int ixjdebug = 0;
  99. static int hertz = HZ;
  100. static int samplerate = 100;
  101. MODULE_PARM(ixjdebug, "i");
  102. static IXJ ixj[IXJMAX];
  103. static struct timer_list ixj_timer;
  104. int ixj_convert_loaded = 0;
  105. /************************************************************************
  106. *
  107. * These are function definitions to allow external modules to register
  108. * enhanced functionality call backs.
  109. *
  110. ************************************************************************/
  111. static int Stub(IXJ * J, unsigned long arg)
  112. {
  113. return 0;
  114. }
  115. static IXJ_REGFUNC ixj_DownloadG729 = &Stub;
  116. static IXJ_REGFUNC ixj_DownloadTS85 = &Stub;
  117. static IXJ_REGFUNC ixj_PreRead = &Stub;
  118. static IXJ_REGFUNC ixj_PostRead = &Stub;
  119. static IXJ_REGFUNC ixj_PreWrite = &Stub;
  120. static IXJ_REGFUNC ixj_PostWrite = &Stub;
  121. static IXJ_REGFUNC ixj_PreIoctl = &Stub;
  122. static IXJ_REGFUNC ixj_PostIoctl = &Stub;
  123. static void ixj_read_frame(int board);
  124. static void ixj_write_frame(int board);
  125. static void ixj_init_timer(void);
  126. static void ixj_add_timer(void);
  127. static void ixj_del_timer(void);
  128. static void ixj_timeout(unsigned long ptr);
  129. static int read_filters(int board);
  130. static int LineMonitor(int board);
  131. static int ixj_fasync(int fd, struct file *, int mode);
  132. static int ixj_hookstate(int board);
  133. static int ixj_record_start(int board);
  134. static void ixj_record_stop(int board);
  135. static void ixj_vad(int board, int arg);
  136. static int ixj_play_start(int board);
  137. static void ixj_play_stop(int board);
  138. static int ixj_set_tone_on(unsigned short arg, int board);
  139. static int ixj_set_tone_off(unsigned short, int board);
  140. static int ixj_play_tone(int board, char tone);
  141. static int idle(int board);
  142. static void ixj_ring_on(int board);
  143. static void ixj_ring_off(int board);
  144. static void aec_stop(int board);
  145. static void ixj_ringback(int board);
  146. static void ixj_busytone(int board);
  147. static void ixj_dialtone(int board);
  148. static void ixj_cpt_stop(int board);
  149. static char daa_int_read(int board);
  150. static int daa_set_mode(int board, int mode);
  151. static int ixj_linetest(int board);
  152. static int ixj_daa_cid_read(int board);
  153. static void DAA_Coeff_US(int board);
  154. static void DAA_Coeff_UK(int board);
  155. static void DAA_Coeff_France(int board);
  156. static void DAA_Coeff_Germany(int board);
  157. static void DAA_Coeff_Australia(int board);
  158. static void DAA_Coeff_Japan(int board);
  159. static int ixj_init_filter(int board, IXJ_FILTER * jf);
  160. static int ixj_init_tone(int board, IXJ_TONE * ti);
  161. static int ixj_build_cadence(int board, IXJ_CADENCE * cp);
  162. static int ixj_build_filter_cadence(int board, IXJ_FILTER_CADENCE * cp);
  163. // Serial Control Interface funtions
  164. static int SCI_Control(int board, int control);
  165. static int SCI_Prepare(int board);
  166. static int SCI_WaitHighSCI(int board);
  167. static int SCI_WaitLowSCI(int board);
  168. static DWORD PCIEE_GetSerialNumber(WORD wAddress);
  169. /************************************************************************
  170. CT8020/CT8021 Host Programmers Model
  171. Host address Function Access
  172. DSPbase +
  173. 0-1 Aux Software Status Register (reserved) Read Only
  174. 2-3 Software Status Register Read Only
  175. 4-5 Aux Software Control Register (reserved) Read Write
  176. 6-7 Software Control Register Read Write
  177. 8-9 Hardware Status Register Read Only
  178. A-B Hardware Control Register Read Write
  179. C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
  180. E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
  181. ************************************************************************/
  182. extern __inline__ void ixj_read_HSR(int board)
  183. {
  184. ixj[board].hsr.bytes.low = inb_p(ixj[board].DSPbase + 8);
  185. ixj[board].hsr.bytes.high = inb_p(ixj[board].DSPbase + 9);
  186. }
  187. extern __inline__ int IsControlReady(int board)
  188. {
  189. ixj_read_HSR(board);
  190. return ixj[board].hsr.bits.controlrdy ? 1 : 0;
  191. }
  192. extern __inline__ int IsPCControlReady(int board)
  193. {
  194. ixj[board].pccr1.byte = inb_p(ixj[board].XILINXbase + 3);
  195. return ixj[board].pccr1.bits.crr ? 1 : 0;
  196. }
  197. extern __inline__ int IsStatusReady(int board)
  198. {
  199. ixj_read_HSR(board);
  200. return ixj[board].hsr.bits.statusrdy ? 1 : 0;
  201. }
  202. extern __inline__ int IsRxReady(int board)
  203. {
  204. ixj_read_HSR(board);
  205. return ixj[board].hsr.bits.rxrdy ? 1 : 0;
  206. }
  207. extern __inline__ int IsTxReady(int board)
  208. {
  209. ixj_read_HSR(board);
  210. return ixj[board].hsr.bits.txrdy ? 1 : 0;
  211. }
  212. extern __inline__ BYTE SLIC_GetState(int board)
  213. {
  214. IXJ *j = &ixj[board];
  215. j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
  216. return j->pld_slicr.bits.state;
  217. }
  218. static BOOL SLIC_SetState(BYTE byState, int board)
  219. {
  220. BOOL fRetVal = FALSE;
  221. IXJ *j = &ixj[board];
  222. // Set the C1, C2, C3 & B2EN signals.
  223. switch (byState) {
  224. case PLD_SLIC_STATE_OC:
  225. j->pld_slicw.bits.c1 = 0;
  226. j->pld_slicw.bits.c2 = 0;
  227. j->pld_slicw.bits.c3 = 0;
  228. j->pld_slicw.bits.b2en = 0;
  229. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  230. fRetVal = TRUE;
  231. break;
  232. case PLD_SLIC_STATE_RINGING:
  233. j->pld_slicw.bits.c1 = 1;
  234. j->pld_slicw.bits.c2 = 0;
  235. j->pld_slicw.bits.c3 = 0;
  236. j->pld_slicw.bits.b2en = 1;
  237. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  238. fRetVal = TRUE;
  239. break;
  240. case PLD_SLIC_STATE_ACTIVE:
  241. j->pld_slicw.bits.c1 = 0;
  242. j->pld_slicw.bits.c2 = 1;
  243. j->pld_slicw.bits.c3 = 0;
  244. j->pld_slicw.bits.b2en = 0;
  245. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  246. fRetVal = TRUE;
  247. break;
  248. case PLD_SLIC_STATE_OHT: // On-hook transmit
  249. j->pld_slicw.bits.c1 = 1;
  250. j->pld_slicw.bits.c2 = 1;
  251. j->pld_slicw.bits.c3 = 0;
  252. j->pld_slicw.bits.b2en = 0;
  253. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  254. fRetVal = TRUE;
  255. break;
  256. case PLD_SLIC_STATE_TIPOPEN:
  257. j->pld_slicw.bits.c1 = 0;
  258. j->pld_slicw.bits.c2 = 0;
  259. j->pld_slicw.bits.c3 = 1;
  260. j->pld_slicw.bits.b2en = 0;
  261. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  262. fRetVal = TRUE;
  263. break;
  264. case PLD_SLIC_STATE_STANDBY:
  265. j->pld_slicw.bits.c1 = 1;
  266. j->pld_slicw.bits.c2 = 0;
  267. j->pld_slicw.bits.c3 = 1;
  268. j->pld_slicw.bits.b2en = 1;
  269. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  270. fRetVal = TRUE;
  271. break;
  272. case PLD_SLIC_STATE_APR: // Active polarity reversal
  273. j->pld_slicw.bits.c1 = 0;
  274. j->pld_slicw.bits.c2 = 1;
  275. j->pld_slicw.bits.c3 = 1;
  276. j->pld_slicw.bits.b2en = 0;
  277. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  278. fRetVal = TRUE;
  279. break;
  280. case PLD_SLIC_STATE_OHTPR: // OHT polarity reversal
  281. j->pld_slicw.bits.c1 = 1;
  282. j->pld_slicw.bits.c2 = 1;
  283. j->pld_slicw.bits.c3 = 1;
  284. j->pld_slicw.bits.b2en = 0;
  285. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  286. fRetVal = TRUE;
  287. break;
  288. default:
  289. fRetVal = FALSE;
  290. break;
  291. }
  292. return fRetVal;
  293. }
  294. int ixj_register(int index, IXJ_REGFUNC regfunc)
  295. {
  296. int cnt;
  297. int retval = 0;
  298. switch (index) {
  299. case G729LOADER:
  300. ixj_DownloadG729 = regfunc;
  301. for (cnt = 0; cnt < IXJMAX; cnt++)
  302. ixj_DownloadG729(&ixj[cnt], 0L);
  303. break;
  304. case TS85LOADER:
  305. ixj_DownloadTS85 = regfunc;
  306. for (cnt = 0; cnt < IXJMAX; cnt++)
  307. ixj_DownloadTS85(&ixj[cnt], 0L);
  308. break;
  309. case PRE_READ:
  310. ixj_PreRead = regfunc;
  311. break;
  312. case POST_READ:
  313. ixj_PostRead = regfunc;
  314. break;
  315. case PRE_WRITE:
  316. ixj_PreWrite = regfunc;
  317. break;
  318. case POST_WRITE:
  319. ixj_PostWrite = regfunc;
  320. break;
  321. case PRE_IOCTL:
  322. ixj_PreIoctl = regfunc;
  323. break;
  324. case POST_IOCTL:
  325. ixj_PostIoctl = regfunc;
  326. break;
  327. default:
  328. retval = 1;
  329. }
  330. return retval;
  331. }
  332. int ixj_unregister(int index)
  333. {
  334. int retval = 0;
  335. switch (index) {
  336. case G729LOADER:
  337. ixj_DownloadG729 = &Stub;
  338. break;
  339. case TS85LOADER:
  340. ixj_DownloadTS85 = &Stub;
  341. break;
  342. case PRE_READ:
  343. ixj_PreRead = &Stub;
  344. break;
  345. case POST_READ:
  346. ixj_PostRead = &Stub;
  347. break;
  348. case PRE_WRITE:
  349. ixj_PreWrite = &Stub;
  350. break;
  351. case POST_WRITE:
  352. ixj_PostWrite = &Stub;
  353. break;
  354. case PRE_IOCTL:
  355. ixj_PreIoctl = &Stub;
  356. break;
  357. case POST_IOCTL:
  358. ixj_PostIoctl = &Stub;
  359. break;
  360. default:
  361. retval = 1;
  362. }
  363. return retval;
  364. }
  365. static void ixj_init_timer(void)
  366. {
  367. init_timer(&ixj_timer);
  368. ixj_timer.function = ixj_timeout;
  369. ixj_timer.data = (int) NULL;
  370. }
  371. static void ixj_add_timer(void)
  372. {
  373. ixj_timer.expires = jiffies + (hertz / samplerate);
  374. add_timer(&ixj_timer);
  375. }
  376. static void ixj_del_timer(void)
  377. {
  378. del_timer(&ixj_timer);
  379. }
  380. static void ixj_tone_timeout(int board)
  381. {
  382. IXJ *j = &ixj[board];
  383. IXJ_TONE ti;
  384. j->tone_state++;
  385. if (j->tone_state == 3) {
  386. j->tone_state = 0;
  387. if (j->cadence_t) {
  388. j->tone_cadence_state++;
  389. if (j->tone_cadence_state >= j->cadence_t->elements_used) {
  390. switch (j->cadence_t->termination) {
  391. case PLAY_ONCE:
  392. ixj_cpt_stop(board);
  393. break;
  394. case REPEAT_LAST_ELEMENT:
  395. j->tone_cadence_state--;
  396. ixj_play_tone(board, j->cadence_t->ce[j->tone_cadence_state].index);
  397. break;
  398. case REPEAT_ALL:
  399. j->tone_cadence_state = 0;
  400. if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
  401. ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
  402. ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
  403. ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
  404. ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
  405. ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
  406. ixj_init_tone(board, &ti);
  407. }
  408. ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, board);
  409. ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, board);
  410. ixj_play_tone(board, j->cadence_t->ce[0].index);
  411. break;
  412. }
  413. } else {
  414. if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
  415. ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
  416. ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
  417. ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
  418. ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
  419. ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
  420. ixj_init_tone(board, &ti);
  421. }
  422. ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, board);
  423. ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, board);
  424. ixj_play_tone(board, j->cadence_t->ce[j->tone_cadence_state].index);
  425. }
  426. }
  427. }
  428. }
  429. static void ixj_timeout(unsigned long ptr)
  430. {
  431. int board;
  432. unsigned long jifon;
  433. IXJ *j;
  434. for (board = 0; board < IXJMAX; board++) {
  435. j = &ixj[board];
  436. if (j->DSPbase) {
  437. #ifdef PERFMON_STATS
  438. j->timerchecks++;
  439. #endif
  440. if (j->tone_state) {
  441. if (!ixj_hookstate(board)) {
  442. ixj_cpt_stop(board);
  443. if (j->m_hook) {
  444. j->m_hook = 0;
  445. j->ex.bits.hookstate = 1;
  446. if (j->async_queue)
  447. {
  448.     kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);
  449. }
  450. }
  451. continue;
  452. }
  453. if (j->tone_state == 1)
  454. jifon = (hertz * j->tone_on_time * 25 / 100000);
  455. else
  456. jifon = (hertz * j->tone_on_time * 25 / 100000) +
  457.     (hertz * j->tone_off_time * 25 / 100000);
  458. if (time_before(jiffies, j->tone_start_jif + jifon)) {
  459. if (j->tone_state == 1) {
  460. ixj_play_tone(board, j->tone_index);
  461. if (j->dsp.low == 0x20) {
  462. continue;
  463. }
  464. } else {
  465. ixj_play_tone(board, 0);
  466. if (j->dsp.low == 0x20) {
  467. continue;
  468. }
  469. }
  470. } else {
  471. ixj_tone_timeout(board);
  472. if (j->flags.dialtone) {
  473. ixj_dialtone(board);
  474. }
  475. if (j->flags.busytone) {
  476. ixj_busytone(board);
  477. if (j->dsp.low == 0x20) {
  478. continue;
  479. }
  480. }
  481. if (j->flags.ringback) {
  482. ixj_ringback(board);
  483. if (j->dsp.low == 0x20) {
  484. continue;
  485. }
  486. }
  487. if (!j->tone_state) {
  488. if (j->dsp.low == 0x20 || (j->play_mode == -1 && j->rec_mode == -1))
  489. idle(board);
  490. if (j->dsp.low == 0x20 && j->play_mode != -1)
  491. ixj_play_start(board);
  492. if (j->dsp.low == 0x20 && j->rec_mode != -1)
  493. ixj_record_start(board);
  494. }
  495. }
  496. }
  497. if (!j->tone_state || j->dsp.low != 0x20) {
  498. if (IsRxReady(board)) {
  499. ixj_read_frame(board);
  500. }
  501. if (IsTxReady(board)) {
  502. ixj_write_frame(board);
  503. }
  504. }
  505. if (j->flags.cringing) {
  506. if (ixj_hookstate(board) & 1) {
  507. j->flags.cringing = 0;
  508. ixj_ring_off(board);
  509. } else {
  510. if (jiffies - j->ring_cadence_jif >= (.5 * hertz)) {
  511. j->ring_cadence_t--;
  512. if (j->ring_cadence_t == -1)
  513. j->ring_cadence_t = 15;
  514. j->ring_cadence_jif = jiffies;
  515. }
  516. if (j->ring_cadence & 1 << j->ring_cadence_t) {
  517. ixj_ring_on(board);
  518. } else {
  519. ixj_ring_off(board);
  520. }
  521. continue;
  522. }
  523. }
  524. if (!j->flags.ringing) {
  525. if (ixj_hookstate(board)) {
  526. if (j->dsp.low != 0x20 &&
  527.     j->pld_slicr.bits.state != PLD_SLIC_STATE_ACTIVE)
  528. // Internet LineJACK
  529. {
  530. SLIC_SetState(PLD_SLIC_STATE_ACTIVE, board);
  531. }
  532. LineMonitor(board);
  533. read_filters(board);
  534. ixj_WriteDSPCommand(0x511B, board);
  535. j->proc_load = j->ssr.high << 8 | j->ssr.low;
  536. if (!j->m_hook) {
  537. j->m_hook = j->ex.bits.hookstate = 1;
  538. if (j->async_queue)
  539.     kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);
  540. }
  541. } else {
  542. if (j->dsp.low != 0x20 &&
  543.     j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE)
  544. // Internet LineJACK
  545. {
  546. SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
  547. }
  548. if (j->ex.bits.dtmf_ready) {
  549. j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
  550. }
  551. if (j->m_hook) {
  552. j->m_hook = 0;
  553. j->ex.bits.hookstate = 1;
  554. if (j->async_queue)
  555.     kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);
  556. }
  557. }
  558. }
  559. if (j->cardtype == 300) {
  560. if (j->flags.pstn_present) {
  561. j->pld_scrr.byte = inb_p(j->XILINXbase);
  562. if (jiffies >= j->pstn_sleeptil && j->pld_scrr.bits.daaflag) {
  563. daa_int_read(board);
  564. if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
  565. if (!j->flags.pstn_ringing) {
  566. j->flags.pstn_ringing = 1;
  567. if (j->daa_mode != SOP_PU_RINGING)
  568. daa_set_mode(board, SOP_PU_RINGING);
  569. }
  570. }
  571. if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
  572. j->pstn_winkstart = 0;
  573. if (j->flags.pstn_ringing && !j->pstn_envelope) {
  574. j->ex.bits.pstn_ring = 0;
  575. j->pstn_envelope = 1;
  576. j->pstn_ring_start = jiffies;
  577. }
  578. } else {
  579. if (j->flags.pstn_ringing && j->pstn_envelope &&
  580.     jiffies > j->pstn_ring_start + ((hertz * 15) / 10)) {
  581. j->ex.bits.pstn_ring = 1;
  582. j->pstn_envelope = 0;
  583. } else if (j->daa_mode == SOP_PU_CONVERSATION) {
  584. if (!j->pstn_winkstart) {
  585. j->pstn_winkstart = jiffies;
  586. } else if (jiffies > j->pstn_winkstart + (hertz * j->winktime / 1000)) {
  587. daa_set_mode(board, SOP_PU_SLEEP);
  588. j->pstn_winkstart = 0;
  589. j->ex.bits.pstn_wink = 1;
  590. }
  591. } else {
  592. j->ex.bits.pstn_ring = 0;
  593. }
  594. }
  595. if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
  596. if (j->daa_mode == SOP_PU_RINGING) {
  597. daa_set_mode(board, SOP_PU_SLEEP);
  598. j->flags.pstn_ringing = 0;
  599. j->ex.bits.pstn_ring = 0;
  600. }
  601. }
  602. if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
  603. if (j->daa_mode == SOP_PU_RINGING && j->flags.pstn_ringing) {
  604. j->pstn_cid_intr = 1;
  605. j->pstn_cid_recieved = jiffies;
  606. }
  607. }
  608. } else {
  609. if (j->pld_scrr.bits.daaflag) {
  610. daa_int_read(board);
  611. }
  612. j->ex.bits.pstn_ring = 0;
  613. if (j->pstn_cid_intr && jiffies > j->pstn_cid_recieved + (hertz * 3)) {
  614. if (j->daa_mode == SOP_PU_RINGING) {
  615. ixj_daa_cid_read(board);
  616. j->ex.bits.caller_id = 1;
  617. }
  618. j->pstn_cid_intr = 0;
  619. } else {
  620. j->ex.bits.caller_id = 0;
  621. }
  622. if (!j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
  623. if (j->flags.pstn_ringing && j->pstn_envelope) {
  624. j->ex.bits.pstn_ring = 1;
  625. j->pstn_envelope = 0;
  626. } else if (j->daa_mode == SOP_PU_CONVERSATION) {
  627. if (!j->pstn_winkstart) {
  628. j->pstn_winkstart = jiffies;
  629. } else if (jiffies > j->pstn_winkstart + (hertz * 320 / 1000)) {
  630. daa_set_mode(board, SOP_PU_SLEEP);
  631. j->pstn_winkstart = 0;
  632. j->ex.bits.pstn_wink = 1;
  633. }
  634. }
  635. }
  636. }
  637. }
  638. }
  639. if (j->ex.bytes) {
  640. wake_up_interruptible(&j->poll_q); // Wake any blocked selects
  641. if (j->async_queue)
  642.     kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);
  643. }
  644. } else {
  645. break;
  646. }
  647. }
  648. ixj_add_timer();
  649. }
  650. static int ixj_status_wait(int board)
  651. {
  652. unsigned long jif;
  653. jif = jiffies;
  654. while (!IsStatusReady(board)) {
  655. if (jiffies - jif > (60 * (hertz / 100))) {
  656. return -1;
  657. }
  658. }
  659. return 0;
  660. }
  661. static int ixj_PCcontrol_wait(int board)
  662. {
  663. unsigned long jif;
  664. jif = jiffies;
  665. while (!IsPCControlReady(board)) {
  666. if (jiffies - jif > (60 * (hertz / 100))) {
  667. return -1;
  668. }
  669. }
  670. return 0;
  671. }
  672. int ixj_WriteDSPCommand(unsigned short cmd, int board)
  673. {
  674. BYTES bytes;
  675. unsigned long jif;
  676. bytes.high = (cmd & 0xFF00) >> 8;
  677. bytes.low = cmd & 0x00FF;
  678. jif = jiffies;
  679. while (!IsControlReady(board)) {
  680. if (jiffies - jif > (60 * (hertz / 100))) {
  681. return -1;
  682. }
  683. }
  684. outb_p(bytes.low, ixj[board].DSPbase + 6);
  685. outb_p(bytes.high, ixj[board].DSPbase + 7);
  686. if (ixj_status_wait(board)) {
  687. ixj[board].ssr.low = 0xFF;
  688. ixj[board].ssr.high = 0xFF;
  689. return -1;
  690. }
  691. /* Read Software Status Register */
  692. ixj[board].ssr.low = inb_p(ixj[board].DSPbase + 2);
  693. ixj[board].ssr.high = inb_p(ixj[board].DSPbase + 3);
  694. return 0;
  695. }
  696. /***************************************************************************
  697. *
  698. *  General Purpose IO Register read routine
  699. *
  700. ***************************************************************************/
  701. extern __inline__ int ixj_gpio_read(int board)
  702. {
  703. if (ixj_WriteDSPCommand(0x5143, board))
  704. return -1;
  705. ixj[board].gpio.bytes.low = ixj[board].ssr.low;
  706. ixj[board].gpio.bytes.high = ixj[board].ssr.high;
  707. return 0;
  708. }
  709. extern __inline__ void LED_SetState(int state, int board)
  710. {
  711. if (ixj[board].cardtype == 300) {
  712. ixj[board].pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
  713. ixj[board].pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
  714. ixj[board].pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
  715. ixj[board].pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
  716. outb_p(ixj[board].pld_scrw.byte, ixj[board].XILINXbase);
  717. }
  718. }
  719. /*********************************************************************
  720. *  GPIO Pins are configured as follows on the Quicknet Internet
  721. *  PhoneJACK Telephony Cards
  722. * POTS Select        GPIO_6=0 GPIO_7=0
  723. * Mic/Speaker Select GPIO_6=0 GPIO_7=1
  724. * Handset Select     GPIO_6=1 GPIO_7=0
  725. *
  726. * SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
  727. * SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
  728. * SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
  729. *
  730. * Hook Switch changes reported on GPIO_3
  731. *********************************************************************/
  732. static int ixj_set_port(int board, int arg)
  733. {
  734. IXJ *j = &ixj[board];
  735. if (j->cardtype == 400) {
  736. if (arg != PORT_POTS)
  737. return 10;
  738. else
  739. return 0;
  740. }
  741. if (j->cardtype == 600) {
  742. if (arg != PORT_SPEAKER)
  743. return 11;
  744. else
  745. return 0;
  746. }
  747. switch (arg) {
  748. case PORT_POTS:
  749. j->port = PORT_POTS;
  750. switch (j->cardtype) {
  751. case 500:
  752. j->pld_slicw.pcib.mic = 0;
  753. j->pld_slicw.pcib.spk = 0;
  754. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  755. break;
  756. case 300:
  757. if (ixj_WriteDSPCommand(0xC528, board)) /* Write CODEC config to
  758.    Software Control Register */
  759. return 2;
  760. j->pld_scrw.bits.daafsyncen = 0; // Turn off DAA Frame Sync
  761. outb_p(j->pld_scrw.byte, j->XILINXbase);
  762. j->pld_clock.byte = 0;
  763. outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
  764. j->pld_slicw.bits.rly1 = 1;
  765. j->pld_slicw.bits.spken = 0;
  766. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  767. SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
  768. break;
  769. case 100:
  770. j->gpio.bytes.high = 0x0B;
  771. j->gpio.bits.gpio6 = 0;
  772. j->gpio.bits.gpio7 = 0;
  773. ixj_WriteDSPCommand(j->gpio.word, board);
  774. break;
  775. }
  776. break;
  777. case PORT_PSTN:
  778. if (j->cardtype == 300) {
  779. ixj_WriteDSPCommand(0xC534, board); /* Write CODEC config to Software Control Register */
  780. j->pld_slicw.bits.rly3 = 0;
  781. j->pld_slicw.bits.rly1 = 1;
  782. j->pld_slicw.bits.spken = 0;
  783. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  784. j->port = PORT_PSTN;
  785. } else {
  786. return 4;
  787. }
  788. break;
  789. case PORT_SPEAKER:
  790. j->port = PORT_SPEAKER;
  791. switch (j->cardtype) {
  792. case 500:
  793. j->pld_slicw.pcib.mic = 1;
  794. j->pld_slicw.pcib.spk = 1;
  795. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  796. break;
  797. case 600:
  798. case 300:
  799. break;
  800. case 100:
  801. j->gpio.bytes.high = 0x0B;
  802. j->gpio.bits.gpio6 = 0;
  803. j->gpio.bits.gpio7 = 1;
  804. ixj_WriteDSPCommand(j->gpio.word, board);
  805. break;
  806. }
  807. break;
  808. case PORT_HANDSET:
  809. if (j->cardtype == 300 || j->cardtype == 500) {
  810. return 5;
  811. } else {
  812. j->gpio.bytes.high = 0x0B;
  813. j->gpio.bits.gpio6 = 1;
  814. j->gpio.bits.gpio7 = 0;
  815. ixj_WriteDSPCommand(j->gpio.word, board);
  816. j->port = PORT_HANDSET;
  817. }
  818. break;
  819. default:
  820. return 6;
  821. break;
  822. }
  823. return 0;
  824. }
  825. static int ixj_set_pots(int board, int arg)
  826. {
  827. IXJ *j = &ixj[board];
  828. if (j->cardtype == 300) {
  829. if (arg) {
  830. if (j->port == PORT_PSTN) {
  831. j->pld_slicw.bits.rly1 = 0;
  832. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  833. return 1;
  834. } else {
  835. return 0;
  836. }
  837. } else {
  838. j->pld_slicw.bits.rly1 = 1;
  839. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  840. return 1;
  841. }
  842. } else {
  843. return 0;
  844. }
  845. }
  846. static void ixj_ring_on(int board)
  847. {
  848. IXJ *j = &ixj[board];
  849. if (j->dsp.low == 0x20) // Internet PhoneJACK
  850.  {
  851. if (ixjdebug > 0)
  852. printk(KERN_INFO "IXJ Ring On /dev/phone%dn", board);
  853. j->gpio.bytes.high = 0x0B;
  854. j->gpio.bytes.low = 0x00;
  855. j->gpio.bits.gpio1 = 1;
  856. j->gpio.bits.gpio2 = 1;
  857. j->gpio.bits.gpio5 = 0;
  858. ixj_WriteDSPCommand(j->gpio.word, board); /* send the ring signal */
  859. } else // Internet LineJACK, Internet PhoneJACK Lite or 
  860. // Internet PhoneJACK PCI
  861.  {
  862. if (ixjdebug > 0)
  863. printk(KERN_INFO "IXJ Ring On /dev/phone%dn", board);
  864. SLIC_SetState(PLD_SLIC_STATE_RINGING, board);
  865. }
  866. }
  867. static int ixj_pcmcia_cable_check(int board)
  868. {
  869. IXJ *j = &ixj[board];
  870. j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
  871. if (!j->pccr1.bits.drf) {
  872. j->psccr.bits.dev = 3;
  873. j->psccr.bits.rw = 1;
  874. outb(j->psccr.byte, j->XILINXbase + 0x01);
  875. if (ixj_PCcontrol_wait(board))
  876. return 0;
  877. else {
  878. if (!j->flags.pcmciascp) {
  879. j->flags.pcmciascp = 1; // Set Cable Present Flag
  880. j->flags.pcmciasct = inb_p(j->XILINXbase + 0x01); // Get Cable Type
  881. j->sic1.bits.cpd = 0; // Chip Power Down
  882. j->sic1.bits.mpd = 0; // MIC Bias Power Down
  883. j->sic1.bits.hpd = 0; // Handset Bias Power Down
  884. j->sic1.bits.lpd = 0; // Line Bias Power Down
  885. j->sic1.bits.spd = 1; // Speaker Drive Power Down
  886. j->psccr.bits.addr = 1; // R/W Smart Cable Register Address
  887. j->psccr.bits.rw = 0; // Read / Write flag
  888. j->psccr.bits.dev = 0;
  889. outb(j->sic1.byte, j->XILINXbase + 0x00);
  890. outb(j->psccr.byte, j->XILINXbase + 0x01);
  891. ixj_PCcontrol_wait(board);
  892. j->sic2.bits.al = 0; // Analog Loopback DAC analog -> ADC analog
  893. j->sic2.bits.dl2 = 0; // Digital Loopback DAC -> ADC one bit
  894. j->sic2.bits.dl1 = 0; // Digital Loopback ADC -> DAC one bit
  895. j->sic2.bits.pll = 0; // 1 = div 10, 0 = div 5
  896. j->sic2.bits.hpd = 0; // HPF disable
  897. j->psccr.bits.addr = 2; // R/W Smart Cable Register Address
  898. j->psccr.bits.rw = 0; // Read / Write flag
  899. j->psccr.bits.dev = 0;
  900. outb(j->sic2.byte, j->XILINXbase + 0x00);
  901. outb(j->psccr.byte, j->XILINXbase + 0x01);
  902. ixj_PCcontrol_wait(board);
  903. j->psccr.bits.addr = 3; // R/W Smart Cable Register Address
  904. j->psccr.bits.rw = 0; // Read / Write flag
  905. j->psccr.bits.dev = 0;
  906. outb(0x00, j->XILINXbase + 0x00); // PLL Divide N1
  907. outb(j->psccr.byte, j->XILINXbase + 0x01);
  908. ixj_PCcontrol_wait(board);
  909. j->psccr.bits.addr = 4; // R/W Smart Cable Register Address
  910. j->psccr.bits.rw = 0; // Read / Write flag
  911. j->psccr.bits.dev = 0;
  912. outb(0x09, j->XILINXbase + 0x00); // PLL Multiply M1
  913. outb(j->psccr.byte, j->XILINXbase + 0x01);
  914. ixj_PCcontrol_wait(board);
  915. j->sirxg.bits.lig = 1; // Line In Gain
  916. j->sirxg.bits.lim = 1; // Line In Mute
  917. j->sirxg.bits.mcg = 3; // MIC In Gain
  918. j->sirxg.bits.mcm = 0; // MIC In Mute
  919. j->sirxg.bits.him = 0; // Handset In Mute
  920. j->sirxg.bits.iir = 1; // IIR
  921. j->psccr.bits.addr = 5; // R/W Smart Cable Register Address
  922. j->psccr.bits.rw = 0; // Read / Write flag
  923. j->psccr.bits.dev = 0;
  924. outb(j->sirxg.byte, j->XILINXbase + 0x00);
  925. outb(j->psccr.byte, j->XILINXbase + 0x01);
  926. ixj_PCcontrol_wait(board);
  927. j->siadc.bits.hom = 0; // Handset Out Mute
  928. j->siadc.bits.lom = 0; // Line Out Mute
  929. j->siadc.bits.rxg = (0xC000 - 0x41C8) / 0x4EF; // RX PGA Gain
  930. j->psccr.bits.addr = 6; // R/W Smart Cable Register Address
  931. j->psccr.bits.rw = 0; // Read / Write flag
  932. j->psccr.bits.dev = 0;
  933. outb(j->siadc.byte, j->XILINXbase + 0x00);
  934. outb(j->psccr.byte, j->XILINXbase + 0x01);
  935. ixj_PCcontrol_wait(board);
  936. j->sidac.bits.srm = 1; // Speaker Right Mute
  937. j->sidac.bits.slm = 1; // Speaker Left Mute
  938. j->sidac.bits.txg = (0xC000 - 0x45E4) / 0x5D3; // TX PGA Gain
  939. j->psccr.bits.addr = 7; // R/W Smart Cable Register Address
  940. j->psccr.bits.rw = 0; // Read / Write flag
  941. j->psccr.bits.dev = 0;
  942. outb(j->sidac.byte, j->XILINXbase + 0x00);
  943. outb(j->psccr.byte, j->XILINXbase + 0x01);
  944. ixj_PCcontrol_wait(board);
  945. j->siaatt.bits.sot = 0;
  946. j->psccr.bits.addr = 9; // R/W Smart Cable Register Address
  947. j->psccr.bits.rw = 0; // Read / Write flag
  948. j->psccr.bits.dev = 0;
  949. outb(j->siaatt.byte, j->XILINXbase + 0x00);
  950. outb(j->psccr.byte, j->XILINXbase + 0x01);
  951. ixj_PCcontrol_wait(board);
  952. }
  953. }
  954. return 1;
  955. } else {
  956. j->flags.pcmciascp = 0;
  957. return 0;
  958. }
  959. }
  960. static int ixj_hookstate(int board)
  961. {
  962. unsigned long det;
  963. IXJ *j = &ixj[board];
  964. int fOffHook = 0;
  965. switch (j->cardtype) {
  966. case 100:
  967. ixj_gpio_read(board);
  968. fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
  969. break;
  970. case 300:
  971. case 400:
  972. case 500:
  973. SLIC_GetState(board);
  974. if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
  975.     j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
  976. if (j->flags.ringing) {
  977. if (!in_interrupt()) {
  978. det = jiffies + (hertz / 50);
  979. while (time_before(jiffies, det)) {
  980. current->state = TASK_INTERRUPTIBLE;
  981. schedule_timeout(1);
  982. }
  983. }
  984. SLIC_GetState(board);
  985. if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
  986. ixj_ring_on(board);
  987. }
  988. }
  989. if (j->cardtype == 500) {
  990. j->pld_scrr.byte = inb_p(j->XILINXbase);
  991. fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
  992. } else
  993. fOffHook = j->pld_slicr.bits.det ? 1 : 0;
  994. }
  995. break;
  996. case 600:
  997. fOffHook = ixj_pcmcia_cable_check(board);
  998. break;
  999. }
  1000. if (j->r_hook != fOffHook) {
  1001. j->r_hook = fOffHook;
  1002. if (j->port != PORT_POTS || j->cardtype == 600) {
  1003. j->ex.bits.hookstate = 1;
  1004. if (j->async_queue)
  1005.     kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);
  1006. }
  1007. }
  1008. if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
  1009. fOffHook |= 2;
  1010. if (j->port == PORT_SPEAKER)
  1011. fOffHook |= 2;
  1012. if (j->port == PORT_HANDSET)
  1013. fOffHook |= 2;
  1014. return fOffHook;
  1015. }
  1016. static void ixj_ring_off(board)
  1017. {
  1018. IXJ *j = &ixj[board];
  1019. if (j->dsp.low == 0x20) // Internet PhoneJACK
  1020.  {
  1021. if (ixjdebug > 0)
  1022. printk(KERN_INFO "IXJ Ring Offn");
  1023. j->gpio.bytes.high = 0x0B;
  1024. j->gpio.bytes.low = 0x00;
  1025. j->gpio.bits.gpio1 = 0;
  1026. j->gpio.bits.gpio2 = 1;
  1027. j->gpio.bits.gpio5 = 0;
  1028. ixj_WriteDSPCommand(j->gpio.word, board);
  1029. } else // Internet LineJACK
  1030.  {
  1031. if (ixjdebug > 0)
  1032. printk(KERN_INFO "IXJ Ring Offn");
  1033. SLIC_SetState(PLD_SLIC_STATE_STANDBY, board);
  1034. SLIC_GetState(board);
  1035. }
  1036. }
  1037. static void ixj_ring_start(int board)
  1038. {
  1039. IXJ *j = &ixj[board];
  1040. j->flags.cringing = 1;
  1041. if (ixj_hookstate(board) & 1) {
  1042. if (j->port == PORT_POTS)
  1043. ixj_ring_off(board);
  1044. j->flags.cringing = 0;
  1045. } else {
  1046. j->ring_cadence_jif = jiffies;
  1047. j->ring_cadence_t = 15;
  1048. if (j->ring_cadence & 1 << j->ring_cadence_t) {
  1049. ixj_ring_on(board);
  1050. } else {
  1051. ixj_ring_off(board);
  1052. }
  1053. }
  1054. }
  1055. static int ixj_ring(int board)
  1056. {
  1057. char cntr;
  1058. unsigned long jif, det;
  1059. IXJ *j = &ixj[board];
  1060. j->flags.ringing = 1;
  1061. if (ixj_hookstate(board) & 1) {
  1062. ixj_ring_off(board);
  1063. j->flags.ringing = 0;
  1064. return 1;
  1065. }
  1066. det = 0;
  1067. for (cntr = 0; cntr < j->maxrings; cntr++) {
  1068. jif = jiffies + (1 * hertz);
  1069. ixj_ring_on(board);
  1070. while (time_before(jiffies, jif)) {
  1071. if (ixj_hookstate(board) & 1) {
  1072. ixj_ring_off(board);
  1073. j->flags.ringing = 0;
  1074. return 1;
  1075. }
  1076. current->state = TASK_INTERRUPTIBLE;
  1077. schedule_timeout(1);
  1078. if (signal_pending(current))
  1079. break;
  1080. }
  1081. jif = jiffies + (3 * hertz);
  1082. ixj_ring_off(board);
  1083. while (time_before(jiffies, jif)) {
  1084. if (ixj_hookstate(board) & 1) {
  1085. det = jiffies + (hertz / 100);
  1086. while (time_before(jiffies, det)) {
  1087. current->state = TASK_INTERRUPTIBLE;
  1088. schedule_timeout(1);
  1089. if (signal_pending(current))
  1090. break;
  1091. }
  1092. if (ixj_hookstate(board) & 1) {
  1093. j->flags.ringing = 0;
  1094. return 1;
  1095. }
  1096. }
  1097. current->state = TASK_INTERRUPTIBLE;
  1098. schedule_timeout(1);
  1099. if (signal_pending(current))
  1100. break;
  1101. }
  1102. }
  1103. ixj_ring_off(board);
  1104. j->flags.ringing = 0;
  1105. return 0;
  1106. }
  1107. int ixj_open(struct phone_device *p, struct file *file_p)
  1108. {
  1109. IXJ *j = &ixj[p->board];
  1110. if (!j->DSPbase)
  1111. return -ENODEV;
  1112. if (file_p->f_mode & FMODE_READ)
  1113. j->readers++;
  1114. if (file_p->f_mode & FMODE_WRITE)
  1115. j->writers++;
  1116. MOD_INC_USE_COUNT;
  1117. if (ixjdebug > 0)
  1118. printk(KERN_INFO "Opening board %dn", p->board);
  1119. return 0;
  1120. }
  1121. int ixj_release(struct inode *inode, struct file *file_p)
  1122. {
  1123. IXJ_TONE ti;
  1124. int board = NUM(inode->i_rdev);
  1125. IXJ *j = &ixj[board];
  1126. if (ixjdebug > 0)
  1127. printk(KERN_INFO "Closing board %dn", NUM(inode->i_rdev));
  1128. daa_set_mode(board, SOP_PU_SLEEP);
  1129. ixj_set_port(board, PORT_POTS);
  1130. aec_stop(board);
  1131. ixj_play_stop(board);
  1132. ixj_record_stop(board);
  1133. // Restore the tone table to default settings.
  1134. ti.tone_index = 10;
  1135. ti.gain0 = 1;
  1136. ti.freq0 = hz941;
  1137. ti.gain1 = 0;
  1138. ti.freq1 = hz1209;
  1139. ti.tone_index = 11;
  1140. ti.gain0 = 1;
  1141. ti.freq0 = hz941;
  1142. ti.gain1 = 0;
  1143. ti.freq1 = hz1336;
  1144. ti.tone_index = 12;
  1145. ti.gain0 = 1;
  1146. ti.freq0 = hz941;
  1147. ti.gain1 = 0;
  1148. ti.freq1 = hz1477;
  1149. ti.tone_index = 13;
  1150. ti.gain0 = 1;
  1151. ti.freq0 = hz800;
  1152. ti.gain1 = 0;
  1153. ti.freq1 = 0;
  1154. ixj_init_tone(board, &ti);
  1155. ti.tone_index = 14;
  1156. ti.gain0 = 1;
  1157. ti.freq0 = hz1000;
  1158. ti.gain1 = 0;
  1159. ti.freq1 = 0;
  1160. ixj_init_tone(board, &ti);
  1161. ti.tone_index = 15;
  1162. ti.gain0 = 1;
  1163. ti.freq0 = hz1250;
  1164. ti.gain1 = 0;
  1165. ti.freq1 = 0;
  1166. ixj_init_tone(board, &ti);
  1167. ti.tone_index = 16;
  1168. ti.gain0 = 1;
  1169. ti.freq0 = hz950;
  1170. ti.gain1 = 0;
  1171. ti.freq1 = 0;
  1172. ixj_init_tone(board, &ti);
  1173. ti.tone_index = 17;
  1174. ti.gain0 = 1;
  1175. ti.freq0 = hz1100;
  1176. ti.gain1 = 0;
  1177. ti.freq1 = 0;
  1178. ixj_init_tone(board, &ti);
  1179. ti.tone_index = 18;
  1180. ti.gain0 = 1;
  1181. ti.freq0 = hz1400;
  1182. ti.gain1 = 0;
  1183. ti.freq1 = 0;
  1184. ixj_init_tone(board, &ti);
  1185. ti.tone_index = 19;
  1186. ti.gain0 = 1;
  1187. ti.freq0 = hz1500;
  1188. ti.gain1 = 0;
  1189. ti.freq1 = 0;
  1190. ixj_init_tone(board, &ti);
  1191. ti.tone_index = 20;
  1192. ti.gain0 = 1;
  1193. ti.freq0 = hz1600;
  1194. ti.gain1 = 0;
  1195. ti.freq1 = 0;
  1196. ixj_init_tone(board, &ti);
  1197. ti.tone_index = 21;
  1198. ti.gain0 = 1;
  1199. ti.freq0 = hz1800;
  1200. ti.gain1 = 0;
  1201. ti.freq1 = 0;
  1202. ixj_init_tone(board, &ti);
  1203. ti.tone_index = 22;
  1204. ti.gain0 = 1;
  1205. ti.freq0 = hz2100;
  1206. ti.gain1 = 0;
  1207. ti.freq1 = 0;
  1208. ixj_init_tone(board, &ti);
  1209. ti.tone_index = 23;
  1210. ti.gain0 = 1;
  1211. ti.freq0 = hz1300;
  1212. ti.gain1 = 0;
  1213. ti.freq1 = 0;
  1214. ixj_init_tone(board, &ti);
  1215. ti.tone_index = 24;
  1216. ti.gain0 = 1;
  1217. ti.freq0 = hz2450;
  1218. ti.gain1 = 0;
  1219. ti.freq1 = 0;
  1220. ixj_init_tone(board, &ti);
  1221. ti.tone_index = 25;
  1222. ti.gain0 = 1;
  1223. ti.freq0 = hz350;
  1224. ti.gain1 = 0;
  1225. ti.freq1 = hz440;
  1226. ixj_init_tone(board, &ti);
  1227. ti.tone_index = 26;
  1228. ti.gain0 = 1;
  1229. ti.freq0 = hz440;
  1230. ti.gain1 = 0;
  1231. ti.freq1 = hz480;
  1232. ixj_init_tone(board, &ti);
  1233. ti.tone_index = 27;
  1234. ti.gain0 = 1;
  1235. ti.freq0 = hz480;
  1236. ti.gain1 = 0;
  1237. ti.freq1 = hz620;
  1238. ixj_init_tone(board, &ti);
  1239. idle(board);
  1240. if (file_p->f_mode & FMODE_READ)
  1241. j->readers--;
  1242. if (file_p->f_mode & FMODE_WRITE)
  1243. j->writers--;
  1244. if (j->read_buffer && !j->readers) {
  1245. kfree(j->read_buffer);
  1246. j->read_buffer = NULL;
  1247. j->read_buffer_size = 0;
  1248. }
  1249. if (j->write_buffer && !j->writers) {
  1250. kfree(j->write_buffer);
  1251. j->write_buffer = NULL;
  1252. j->write_buffer_size = 0;
  1253. }
  1254. j->rec_codec = j->play_codec = 0;
  1255. j->rec_frame_size = j->play_frame_size = 0;
  1256. ixj_fasync(-1, file_p, 0); // remove from list of async notification
  1257. MOD_DEC_USE_COUNT;
  1258. return 0;
  1259. }
  1260. static int read_filters(int board)
  1261. {
  1262. unsigned short fc, cnt;
  1263. int var;
  1264. IXJ *j = &ixj[board];
  1265. if (ixj_WriteDSPCommand(0x5144, board))
  1266. return -1;
  1267. fc = j->ssr.high << 8 | j->ssr.low;
  1268. if (fc == j->frame_count)
  1269. return 1;
  1270. j->frame_count = fc;
  1271. if (j->dtmf_proc)
  1272. return 1;
  1273. var = 10;
  1274. for (cnt = 0; cnt < 4; cnt++) {
  1275. if (ixj_WriteDSPCommand(0x5154 + cnt, board))
  1276. return -1;
  1277. if (ixj_WriteDSPCommand(0x515C, board))
  1278. return -1;
  1279. j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
  1280. if (j->cadence_f[cnt].enable) {
  1281. if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
  1282. if (j->cadence_f[cnt].state == 0) {
  1283. j->cadence_f[cnt].state = 1;
  1284. j->cadence_f[cnt].on1min = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 - var) / 10000);
  1285. j->cadence_f[cnt].on1max = jiffies + (j->cadence_f[cnt].on1 * hertz * (100 + var) / 10000);
  1286. } else if (j->cadence_f[cnt].state == 2 &&
  1287.    (time_after(jiffies, j->cadence_f[cnt].off1min) &&
  1288.     time_before(jiffies, j->cadence_f[cnt].off1max))) {
  1289. if (j->cadence_f[cnt].on2) {
  1290. j->cadence_f[cnt].state = 3;
  1291. j->cadence_f[cnt].on2min = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 - var) / 10000);
  1292. j->cadence_f[cnt].on2max = jiffies + (j->cadence_f[cnt].on2 * hertz * (100 + var) / 10000);
  1293. } else {
  1294. j->cadence_f[cnt].state = 6;
  1295. }
  1296. } else if (j->cadence_f[cnt].state == 4 &&
  1297.    (time_after(jiffies, j->cadence_f[cnt].off2min) &&
  1298.     time_before(jiffies, j->cadence_f[cnt].off2max))) {
  1299. if (j->cadence_f[cnt].on2) {
  1300. j->cadence_f[cnt].state = 5;
  1301. j->cadence_f[cnt].on3min = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 - var) / 10000);
  1302. j->cadence_f[cnt].on3max = jiffies + (j->cadence_f[cnt].on3 * hertz * (100 + var) / 10000);
  1303. } else {
  1304. j->cadence_f[cnt].state = 6;
  1305. }
  1306. } else {
  1307. j->cadence_f[cnt].state = 0;
  1308. }
  1309. } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
  1310. if (j->cadence_f[cnt].state == 1 &&
  1311.     (time_after(jiffies, j->cadence_f[cnt].on1min) &&
  1312.      time_before(jiffies, j->cadence_f[cnt].on1max))) {
  1313. j->cadence_f[cnt].state = 2;
  1314. j->cadence_f[cnt].off1min = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 - var) / 10000);
  1315. j->cadence_f[cnt].off1max = jiffies + (j->cadence_f[cnt].off1 * hertz * (100 + var) / 10000);
  1316. } else if (j->cadence_f[cnt].state == 3 &&
  1317.    (time_after(jiffies, j->cadence_f[cnt].on2min) &&
  1318.     time_before(jiffies, j->cadence_f[cnt].on2max))) {
  1319. j->cadence_f[cnt].state = 4;
  1320. j->cadence_f[cnt].off2min = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 - var) / 10000);
  1321. j->cadence_f[cnt].off2max = jiffies + (j->cadence_f[cnt].off2 * hertz * (100 + var) / 10000);
  1322. } else if (j->cadence_f[cnt].state == 5 &&
  1323.    (time_after(jiffies, j->cadence_f[cnt].on3min) &&
  1324.     time_before(jiffies, j->cadence_f[cnt].on3max))) {
  1325. j->cadence_f[cnt].state = 6;
  1326. j->cadence_f[cnt].off3min = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 - var) / 10000);
  1327. j->cadence_f[cnt].off3max = jiffies + (j->cadence_f[cnt].off3 * hertz * (100 + var) / 10000);
  1328. } else {
  1329. j->cadence_f[cnt].state = 0;
  1330. }
  1331. }
  1332. }
  1333. if (j->cadence_f[cnt].state == 6) {
  1334. j->cadence_f[cnt].state = j->cadence_f[cnt].enable = 0;
  1335. switch (cnt) {
  1336. case 0:
  1337. j->ex.bits.fc0 = 1;
  1338. break;
  1339. case 1:
  1340. j->ex.bits.fc1 = 1;
  1341. break;
  1342. case 2:
  1343. j->ex.bits.fc2 = 1;
  1344. break;
  1345. case 3:
  1346. j->ex.bits.fc3 = 1;
  1347. break;
  1348. }
  1349. }
  1350. if ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
  1351.     (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
  1352. switch (cnt) {
  1353. case 0:
  1354. j->ex.bits.f0 = 1;
  1355. break;
  1356. case 1:
  1357. j->ex.bits.f1 = 1;
  1358. break;
  1359. case 2:
  1360. j->ex.bits.f2 = 1;
  1361. break;
  1362. case 3:
  1363. j->ex.bits.f3 = 1;
  1364. break;
  1365. }
  1366. }
  1367. }
  1368. return 0;
  1369. }
  1370. static int LineMonitor(int board)
  1371. {
  1372. IXJ *j = &ixj[board];
  1373. if (j->dtmf_proc) {
  1374. return -1;
  1375. }
  1376. j->dtmf_proc = 1;
  1377. if (ixj_WriteDSPCommand(0x7000, board)) // Line Monitor
  1378. return -1;
  1379. j->dtmf.bytes.high = j->ssr.high;
  1380. j->dtmf.bytes.low = j->ssr.low;
  1381. if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
  1382. j->dtmf_state = 1;
  1383. j->dtmf_current = j->dtmf.bits.digit;
  1384. }
  1385. if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) // && j->dtmf_wp != j->dtmf_rp)
  1386.  {
  1387. j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
  1388. j->dtmf_wp++;
  1389. if (j->dtmf_wp == 79)
  1390. j->dtmf_wp = 0;
  1391. j->ex.bits.dtmf_ready = 1;
  1392. j->dtmf_state = 0;
  1393. }
  1394. j->dtmf_proc = 0;
  1395. return 0;
  1396. }
  1397. ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
  1398. {
  1399. unsigned long i = *ppos;
  1400. IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
  1401. struct wait_queue wait =
  1402. {current, NULL};
  1403. if(j->flags.inread)
  1404. return -EALREADY;
  1405. j->flags.inread = 1;
  1406. add_wait_queue(&j->read_q, &wait);
  1407. current->state = TASK_INTERRUPTIBLE;
  1408. mb();
  1409. while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
  1410. ++j->read_wait;
  1411. if (file_p->f_flags & O_NONBLOCK) {
  1412. current->state = TASK_RUNNING;
  1413. remove_wait_queue(&j->read_q, &wait);
  1414. j->flags.inread = 0;
  1415. return -EAGAIN;
  1416. }
  1417. if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) {
  1418. current->state = TASK_RUNNING;
  1419. remove_wait_queue(&j->read_q, &wait);
  1420. j->flags.inread = 0;
  1421. return 0;
  1422. }
  1423. interruptible_sleep_on(&j->read_q);
  1424. if (signal_pending(current)) {
  1425. current->state = TASK_RUNNING;
  1426. remove_wait_queue(&j->read_q, &wait);
  1427. j->flags.inread = 0;
  1428. return -EINTR;
  1429. }
  1430. }
  1431. remove_wait_queue(&j->read_q, &wait);
  1432. current->state = TASK_RUNNING;
  1433. /* Don't ever copy more than the user asks */
  1434. i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
  1435. j->read_buffer_ready = 0;
  1436. if (i) {
  1437. j->flags.inread = 0;
  1438. return -EFAULT;
  1439. }
  1440. else {
  1441. j->flags.inread = 0;
  1442. return min(length, j->read_buffer_size);
  1443. }
  1444. }
  1445. ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
  1446.   loff_t * ppos)
  1447. {
  1448. int pre_retval;
  1449. ssize_t read_retval = 0;
  1450. IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
  1451. pre_retval = ixj_PreRead(j, 0L);
  1452. switch (pre_retval) {
  1453. case NORMAL:
  1454. read_retval = ixj_read(file_p, buf, length, ppos);
  1455. ixj_PostRead(j, 0L);
  1456. break;
  1457. case NOPOST:
  1458. read_retval = ixj_read(file_p, buf, length, ppos);
  1459. break;
  1460. case POSTONLY:
  1461. ixj_PostRead(j, 0L);
  1462. break;
  1463. default:
  1464. read_retval = pre_retval;
  1465. }
  1466. return read_retval;
  1467. }
  1468. ssize_t ixj_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
  1469. {
  1470. unsigned long i = *ppos;
  1471. int board = NUM(file_p->f_dentry->d_inode->i_rdev);
  1472. IXJ *j = &ixj[board];
  1473. struct wait_queue wait =
  1474. {current, NULL};
  1475. if(j->flags.inwrite)
  1476. return -EALREADY;
  1477. j->flags.inwrite = 1;
  1478. add_wait_queue(&j->write_q, &wait);
  1479. current->state = TASK_INTERRUPTIBLE;
  1480. mb();
  1481. while (!j->write_buffers_empty) {
  1482. ++j->write_wait;
  1483. if (file_p->f_flags & O_NONBLOCK) {
  1484. current->state = TASK_RUNNING;
  1485. remove_wait_queue(&j->write_q, &wait);
  1486. j->flags.inwrite = 0;
  1487. return -EAGAIN;
  1488. }
  1489. if (!ixj_hookstate(NUM(file_p->f_dentry->d_inode->i_rdev))) {
  1490. current->state = TASK_RUNNING;
  1491. remove_wait_queue(&j->write_q, &wait);
  1492. j->flags.inwrite = 0;
  1493. return 0;
  1494. }
  1495. interruptible_sleep_on(&j->write_q);
  1496. if (signal_pending(current)) {
  1497. current->state = TASK_RUNNING;
  1498. remove_wait_queue(&j->write_q, &wait);
  1499. j->flags.inwrite = 0;
  1500. return -EINTR;
  1501. }
  1502. }
  1503. current->state = TASK_RUNNING;
  1504. remove_wait_queue(&j->write_q, &wait);
  1505. if (j->write_buffer_wp + count >= j->write_buffer_end)
  1506. j->write_buffer_wp = j->write_buffer;
  1507. i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
  1508. if (i) {
  1509. j->flags.inwrite = 0;
  1510. return -EFAULT;
  1511. }
  1512. j->flags.inwrite = 0;
  1513. return min(count, j->write_buffer_size);
  1514. }
  1515. ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count,
  1516.    loff_t * ppos)
  1517. {
  1518. int pre_retval;
  1519. ssize_t write_retval = 0;
  1520. IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
  1521. pre_retval = ixj_PreWrite(j, 0L);
  1522. switch (pre_retval) {
  1523. case NORMAL:
  1524. write_retval = ixj_write(file_p, buf, count, ppos);
  1525. if (write_retval != -EFAULT) {
  1526. ixj_PostWrite(j, 0L);
  1527. j->write_buffer_wp += count;
  1528. j->write_buffers_empty--;
  1529. }
  1530. break;
  1531. case NOPOST:
  1532. write_retval = ixj_write(file_p, buf, count, ppos);
  1533. if (write_retval != -EFAULT) {
  1534. j->write_buffer_wp += count;
  1535. j->write_buffers_empty--;
  1536. }
  1537. break;
  1538. case POSTONLY:
  1539. ixj_PostWrite(j, 0L);
  1540. break;
  1541. default:
  1542. write_retval = pre_retval;
  1543. }
  1544. return write_retval;
  1545. }
  1546. static void ixj_read_frame(int board)
  1547. {
  1548. int cnt, dly;
  1549. IXJ *j = &ixj[board];
  1550. if (j->read_buffer) {
  1551. for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
  1552. if (!(cnt % 16) && !IsRxReady(board)) {
  1553. dly = 0;
  1554. while (!IsRxReady(board)) {
  1555. if (dly++ > 5) {
  1556. dly = 0;
  1557. break;
  1558. }
  1559. udelay(10);
  1560. }
  1561. }
  1562. // Throw away word 0 of the 8021 compressed format to get standard G.729.
  1563. if (j->rec_codec == G729 && (cnt == 0 || cnt == 5 || cnt == 10)) {
  1564. inb_p(j->DSPbase + 0x0E);
  1565. inb_p(j->DSPbase + 0x0F);
  1566. }
  1567. *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
  1568. *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
  1569. }
  1570. #ifdef PERFMON_STATS
  1571. ++j->framesread;
  1572. #endif
  1573. if (j->intercom != -1) {
  1574. if (IsTxReady(j->intercom)) {
  1575. for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
  1576. if (!(cnt % 16) && !IsTxReady(board)) {
  1577. dly = 0;
  1578. while (!IsTxReady(board)) {
  1579. if (dly++ > 5) {
  1580. dly = 0;
  1581. break;
  1582. }
  1583. udelay(10);
  1584. }
  1585. }
  1586. outb_p(*(j->read_buffer + cnt), ixj[j->intercom].DSPbase + 0x0C);
  1587. outb_p(*(j->read_buffer + cnt + 1), ixj[j->intercom].DSPbase + 0x0D);
  1588. }
  1589. #ifdef PERFMON_STATS
  1590. ++ixj[j->intercom].frameswritten;
  1591. #endif
  1592. }
  1593. } else {
  1594. j->read_buffer_ready = 1;
  1595. wake_up_interruptible(&j->read_q); // Wake any blocked readers
  1596. wake_up_interruptible(&j->poll_q); // Wake any blocked selects
  1597. if (j->async_queue)
  1598.     kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);
  1599. }
  1600. }
  1601. }
  1602. static void ixj_write_frame(int board)
  1603. {
  1604. int cnt, frame_count, dly;
  1605. BYTES blankword;
  1606. IXJ *j = &ixj[board];
  1607. frame_count = 0;
  1608. if (j->write_buffer && j->write_buffers_empty < 2) {
  1609. if (j->write_buffer_wp > j->write_buffer_rp) {
  1610. frame_count =
  1611.     (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
  1612. }
  1613. if (j->write_buffer_rp > j->write_buffer_wp) {
  1614. frame_count =
  1615.     (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
  1616.     (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
  1617. }
  1618. if (frame_count >= 1) {
  1619. if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
  1620. switch (j->play_mode) {
  1621. case PLAYBACK_MODE_ULAW:
  1622. case PLAYBACK_MODE_ALAW:
  1623. blankword.low = blankword.high = 0xFF;
  1624. break;
  1625. case PLAYBACK_MODE_8LINEAR:
  1626. case PLAYBACK_MODE_16LINEAR:
  1627. blankword.low = blankword.high = 0x00;
  1628. break;
  1629. case PLAYBACK_MODE_8LINEAR_WSS:
  1630. blankword.low = blankword.high = 0x80;
  1631. break;
  1632. }
  1633. for (cnt = 0; cnt < 16; cnt++) {
  1634. if (!(cnt % 16) && !IsTxReady(board)) {
  1635. dly = 0;
  1636. while (!IsTxReady(board)) {
  1637. if (dly++ > 5) {
  1638. dly = 0;
  1639. break;
  1640. }
  1641. udelay(10);
  1642. }
  1643. }
  1644. outb_p((blankword.low), j->DSPbase + 0x0C);
  1645. outb_p((blankword.high), j->DSPbase + 0x0D);
  1646. }
  1647. j->flags.play_first_frame = 0;
  1648. }
  1649. for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
  1650. if (!(cnt % 16) && !IsTxReady(board)) {
  1651. dly = 0;
  1652. while (!IsTxReady(board)) {
  1653. if (dly++ > 5) {
  1654. dly = 0;
  1655. break;
  1656. }
  1657. udelay(10);
  1658. }
  1659. }
  1660. // Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG 
  1661. // so all frames are type 1.
  1662. if (j->play_codec == G729 && (cnt == 0 || cnt == 5 || cnt == 10)) {
  1663. outb_p(0x01, j->DSPbase + 0x0C);
  1664. outb_p(0x00, j->DSPbase + 0x0D);
  1665. }
  1666. outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
  1667. outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
  1668. *(j->write_buffer_rp + cnt) = 0;
  1669. *(j->write_buffer_rp + cnt + 1) = 0;
  1670. }
  1671. j->write_buffer_rp += j->play_frame_size * 2;
  1672. if (j->write_buffer_rp >= j->write_buffer_end) {
  1673. j->write_buffer_rp = j->write_buffer;
  1674. }
  1675. j->write_buffers_empty++;
  1676. wake_up_interruptible(&j->write_q); // Wake any blocked writers
  1677. wake_up_interruptible(&j->poll_q); // Wake any blocked selects
  1678. if (j->async_queue)
  1679.     kill_fasync(ixj[board].async_queue, SIGIO, POLL_IN);
  1680. #ifdef PERFMON_STATS
  1681. ++j->frameswritten;
  1682. #endif
  1683. }
  1684. } else {
  1685. j->drybuffer++;
  1686. }
  1687. }
  1688. static int idle(int board)
  1689. {
  1690. IXJ *j = &ixj[board];
  1691. if (ixj_WriteDSPCommand(0x0000, board)) // DSP Idle
  1692. return 0;
  1693. if (j->ssr.high || j->ssr.low)
  1694. return 0;
  1695. else
  1696. return 1;
  1697. }
  1698. static int set_base_frame(int board, int size)
  1699. {
  1700. unsigned short cmd;
  1701. int cnt;
  1702. IXJ *j = &ixj[board];
  1703. aec_stop(board);
  1704. for (cnt = 0; cnt < 10; cnt++) {
  1705. if (idle(board))
  1706. break;
  1707. }
  1708. if (j->ssr.high || j->ssr.low)
  1709. return -1;
  1710. if (j->dsp.low != 0x20) {
  1711. switch (size) {
  1712. case 30:
  1713. cmd = 0x07F0;
  1714. /* Set Base Frame Size to 240 pg9-10 8021 */
  1715. break;
  1716. case 20:
  1717. cmd = 0x07A0;
  1718. /* Set Base Frame Size to 160 pg9-10 8021 */
  1719. break;
  1720. case 10:
  1721. cmd = 0x0750;
  1722. /* Set Base Frame Size to 80 pg9-10 8021 */
  1723. break;
  1724. default:
  1725. return -1;
  1726. }
  1727. } else {
  1728. if (size == 30)
  1729. return size;
  1730. else
  1731. return -1;
  1732. }
  1733. if (ixj_WriteDSPCommand(cmd, board)) {
  1734. j->baseframe.high = j->baseframe.low = 0xFF;
  1735. return -1;
  1736. } else {
  1737. j->baseframe.high = j->ssr.high;
  1738. j->baseframe.low = j->ssr.low;
  1739. }
  1740. return size;
  1741. }
  1742. static int set_rec_codec(int board, int rate)
  1743. {
  1744. int retval = 0;
  1745. IXJ *j = &ixj[board];
  1746. j->rec_codec = rate;
  1747. switch (rate) {
  1748. case G723_63:
  1749. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  1750. j->rec_frame_size = 12;
  1751. j->rec_mode = 0;
  1752. } else {
  1753. retval = 1;
  1754. }
  1755. break;
  1756. case G723_53:
  1757. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  1758. j->rec_frame_size = 10;
  1759. j->rec_mode = 0;
  1760. } else {
  1761. retval = 1;
  1762. }
  1763. break;
  1764. case TS85:
  1765. if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
  1766. j->rec_frame_size = 16;
  1767. j->rec_mode = 0;
  1768. } else {
  1769. retval = 1;
  1770. }
  1771. break;
  1772. case TS48:
  1773. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  1774. j->rec_frame_size = 9;
  1775. j->rec_mode = 0;
  1776. } else {
  1777. retval = 1;
  1778. }
  1779. break;
  1780. case TS41:
  1781. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  1782. j->rec_frame_size = 8;
  1783. j->rec_mode = 0;
  1784. } else {
  1785. retval = 1;
  1786. }
  1787. break;
  1788. case G728:
  1789. if (j->dsp.low != 0x20) {
  1790. j->rec_frame_size = 48;
  1791. j->rec_mode = 0;
  1792. } else {
  1793. retval = 1;
  1794. }
  1795. break;
  1796. case G729:
  1797. if (j->dsp.low != 0x20) {
  1798. if (!j->flags.g729_loaded) {
  1799. retval = 1;
  1800. break;
  1801. }
  1802. switch (j->baseframe.low) {
  1803. case 0xA0:
  1804. j->rec_frame_size = 10;
  1805. break;
  1806. case 0x50:
  1807. j->rec_frame_size = 5;
  1808. break;
  1809. default:
  1810. j->rec_frame_size = 15;
  1811. break;
  1812. }
  1813. j->rec_mode = 0;
  1814. } else {
  1815. retval = 1;
  1816. }
  1817. break;
  1818. case ULAW:
  1819. switch (j->baseframe.low) {
  1820. case 0xA0:
  1821. j->rec_frame_size = 80;
  1822. break;
  1823. case 0x50:
  1824. j->rec_frame_size = 40;
  1825. break;
  1826. default:
  1827. j->rec_frame_size = 120;
  1828. break;
  1829. }
  1830. j->rec_mode = 4;
  1831. break;
  1832. case ALAW:
  1833. switch (j->baseframe.low) {
  1834. case 0xA0:
  1835. j->rec_frame_size = 80;
  1836. break;
  1837. case 0x50:
  1838. j->rec_frame_size = 40;
  1839. break;
  1840. default:
  1841. j->rec_frame_size = 120;
  1842. break;
  1843. }
  1844. j->rec_mode = 4;
  1845. break;
  1846. case LINEAR16:
  1847. switch (j->baseframe.low) {
  1848. case 0xA0:
  1849. j->rec_frame_size = 160;
  1850. break;
  1851. case 0x50:
  1852. j->rec_frame_size = 80;
  1853. break;
  1854. default:
  1855. j->rec_frame_size = 240;
  1856. break;
  1857. }
  1858. j->rec_mode = 5;
  1859. break;
  1860. case LINEAR8:
  1861. switch (j->baseframe.low) {
  1862. case 0xA0:
  1863. j->rec_frame_size = 80;
  1864. break;
  1865. case 0x50:
  1866. j->rec_frame_size = 40;
  1867. break;
  1868. default:
  1869. j->rec_frame_size = 120;
  1870. break;
  1871. }
  1872. j->rec_mode = 6;
  1873. break;
  1874. case WSS:
  1875. switch (j->baseframe.low) {
  1876. case 0xA0:
  1877. j->rec_frame_size = 80;
  1878. break;
  1879. case 0x50:
  1880. j->rec_frame_size = 40;
  1881. break;
  1882. default:
  1883. j->rec_frame_size = 120;
  1884. break;
  1885. }
  1886. j->rec_mode = 7;
  1887. break;
  1888. default:
  1889. j->rec_frame_size = 0;
  1890. j->rec_mode = -1;
  1891. if (j->read_buffer) {
  1892. kfree(j->read_buffer);
  1893. j->read_buffer = NULL;
  1894. j->read_buffer_size = 0;
  1895. }
  1896. retval = 1;
  1897. break;
  1898. }
  1899. return retval;
  1900. }
  1901. static int ixj_record_start(int board)
  1902. {
  1903. unsigned short cmd = 0x0000;
  1904. IXJ *j = &ixj[board];
  1905. if (j->read_buffer) {
  1906. ixj_record_stop(board);
  1907. }
  1908. if (!j->rec_mode) {
  1909. switch (j->rec_codec) {
  1910. case G723_63:
  1911. cmd = 0x5131;
  1912. break;
  1913. case G723_53:
  1914. cmd = 0x5132;
  1915. break;
  1916. case TS85:
  1917. cmd = 0x5130; // TrueSpeech 8.5
  1918. break;
  1919. case TS48:
  1920. cmd = 0x5133; // TrueSpeech 4.8
  1921. break;
  1922. case TS41:
  1923. cmd = 0x5134; // TrueSpeech 4.1
  1924. break;
  1925. case G728:
  1926. cmd = 0x5135;
  1927. break;
  1928. case G729:
  1929. cmd = 0x5136;
  1930. break;
  1931. default:
  1932. return 1;
  1933. }
  1934. if (ixj_WriteDSPCommand(cmd, board))
  1935. return -1;
  1936. }
  1937. if (!j->read_buffer) {
  1938. if (!j->read_buffer)
  1939. j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
  1940. if (!j->read_buffer) {
  1941. printk("Read buffer allocation for ixj board %d failed!n", board);
  1942. return -ENOMEM;
  1943. }
  1944. }
  1945. j->read_buffer_size = j->rec_frame_size * 2;
  1946. if (ixj_WriteDSPCommand(0x5102, board)) // Set Poll sync mode
  1947. return -1;
  1948. switch (j->rec_mode) {
  1949. case 0:
  1950. cmd = 0x1C03; // Record C1
  1951. break;
  1952. case 4:
  1953. if (j->ver.low == 0x12) {
  1954. cmd = 0x1E03; // Record C1
  1955. } else {
  1956. cmd = 0x1E01; // Record C1
  1957. }
  1958. break;
  1959. case 5:
  1960. if (j->ver.low == 0x12) {
  1961. cmd = 0x1E83; // Record C1
  1962. } else {
  1963. cmd = 0x1E81; // Record C1
  1964. }
  1965. break;
  1966. case 6:
  1967. if (j->ver.low == 0x12) {
  1968. cmd = 0x1F03; // Record C1
  1969. } else {
  1970. cmd = 0x1F01; // Record C1
  1971. }
  1972. break;
  1973. case 7:
  1974. if (j->ver.low == 0x12) {
  1975. cmd = 0x1F83; // Record C1
  1976. } else {
  1977. cmd = 0x1F81; // Record C1
  1978. }
  1979. break;
  1980. }
  1981. if (ixj_WriteDSPCommand(cmd, board))
  1982. return -1;
  1983. return 0;
  1984. }
  1985. static void ixj_record_stop(int board)
  1986. {
  1987. IXJ *j = &ixj[board];
  1988. if (j->read_buffer) {
  1989. kfree(j->read_buffer);
  1990. j->read_buffer = NULL;
  1991. j->read_buffer_size = 0;
  1992. }
  1993. if (j->rec_mode > -1) {
  1994. ixj_WriteDSPCommand(0x5120, board);
  1995. j->rec_mode = -1;
  1996. }
  1997. }
  1998. static void ixj_vad(int board, int arg)
  1999. {
  2000. if (arg)
  2001. ixj_WriteDSPCommand(0x513F, board);
  2002. else
  2003. ixj_WriteDSPCommand(0x513E, board);
  2004. }
  2005. static void set_rec_depth(int board, int depth)
  2006. {
  2007. if (depth > 60)
  2008. depth = 60;
  2009. if (depth < 0)
  2010. depth = 0;
  2011. ixj_WriteDSPCommand(0x5180 + depth, board);
  2012. }
  2013. static void set_rec_volume(int board, int volume)
  2014. {
  2015. ixj_WriteDSPCommand(0xCF03, board);
  2016. ixj_WriteDSPCommand(volume, board);
  2017. }
  2018. static int get_rec_level(int board)
  2019. {
  2020. IXJ *j = &ixj[board];
  2021. ixj_WriteDSPCommand(0xCF88, board);
  2022. return j->ssr.high << 8 | j->ssr.low;
  2023. }
  2024. static void ixj_aec_start(int board, int level)
  2025. {
  2026. IXJ *j = &ixj[board];
  2027. j->aec_level = level;
  2028. if (!level) {
  2029. ixj_WriteDSPCommand(0xB002, board);
  2030. } else {
  2031. if (j->rec_codec == G729 || j->play_codec == G729) {
  2032. ixj_WriteDSPCommand(0xE022, board); // Move AEC filter buffer
  2033. ixj_WriteDSPCommand(0x0300, board);
  2034. }
  2035. ixj_WriteDSPCommand(0xB001, board); // AEC On
  2036. ixj_WriteDSPCommand(0xE013, board); // Advanced AEC C1
  2037. switch (level) {
  2038. case AEC_LOW:
  2039. ixj_WriteDSPCommand(0x0000, board); // Advanced AEC C2 = off
  2040. ixj_WriteDSPCommand(0xE011, board);
  2041. ixj_WriteDSPCommand(0xFFFF, board);
  2042. break;
  2043. case AEC_MED:
  2044. ixj_WriteDSPCommand(0x0600, board); // Advanced AEC C2 = on medium
  2045. ixj_WriteDSPCommand(0xE011, board);
  2046. ixj_WriteDSPCommand(0x0080, board);
  2047. break;
  2048. case AEC_HIGH:
  2049. ixj_WriteDSPCommand(0x0C00, board); // Advanced AEC C2 = on high
  2050. ixj_WriteDSPCommand(0xE011, board);
  2051. ixj_WriteDSPCommand(0x0080, board);
  2052. break;
  2053. case AEC_AUTO:
  2054. ixj_WriteDSPCommand(0x0002, board); // Attenuation scaling factor of 2
  2055. ixj_WriteDSPCommand(0xE011, board);
  2056. ixj_WriteDSPCommand(0x0100, board); // Higher Threshold Floor
  2057. ixj_WriteDSPCommand(0xE012, board); // Set Train and Lock
  2058. ixj_WriteDSPCommand(0x0023, board);
  2059. ixj_WriteDSPCommand(0xE014, board);
  2060. ixj_WriteDSPCommand(0x0003, board); // Lock threashold at 3dB
  2061. break;
  2062. }
  2063. }
  2064. }
  2065. static void aec_stop(int board)
  2066. {
  2067. IXJ *j = &ixj[board];
  2068. if (j->rec_codec == G729 || j->play_codec == G729) {
  2069. ixj_WriteDSPCommand(0xE022, board); // Move AEC filter buffer back
  2070. ixj_WriteDSPCommand(0x0700, board);
  2071. }
  2072. if (ixj[board].play_mode != -1 && ixj[board].rec_mode != -1);
  2073. {
  2074. ixj_WriteDSPCommand(0xB002, board); // AEC Stop
  2075. }
  2076. }
  2077. static int set_play_codec(int board, int rate)
  2078. {
  2079. int retval = 0;
  2080. IXJ *j = &ixj[board];
  2081. j->play_codec = rate;
  2082. switch (rate) {
  2083. case G723_63:
  2084. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  2085. j->play_frame_size = 12;
  2086. j->play_mode = 0;
  2087. } else {
  2088. retval = 1;
  2089. }
  2090. break;
  2091. case G723_53:
  2092. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  2093. j->play_frame_size = 10;
  2094. j->play_mode = 0;
  2095. } else {
  2096. retval = 1;
  2097. }
  2098. break;
  2099. case TS85:
  2100. if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
  2101. j->play_frame_size = 16;
  2102. j->play_mode = 0;
  2103. } else {
  2104. retval = 1;
  2105. }
  2106. break;
  2107. case TS48:
  2108. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  2109. j->play_frame_size = 9;
  2110. j->play_mode = 0;
  2111. } else {
  2112. retval = 1;
  2113. }
  2114. break;
  2115. case TS41:
  2116. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  2117. j->play_frame_size = 8;
  2118. j->play_mode = 0;
  2119. } else {
  2120. retval = 1;
  2121. }
  2122. break;
  2123. case G728:
  2124. if (j->dsp.low != 0x20) {
  2125. j->play_frame_size = 48;
  2126. j->play_mode = 0;
  2127. } else {
  2128. retval = 1;
  2129. }
  2130. break;
  2131. case G729:
  2132. if (j->dsp.low != 0x20) {
  2133. if (!j->flags.g729_loaded) {
  2134. retval = 1;
  2135. break;
  2136. }
  2137. switch (j->baseframe.low) {
  2138. case 0xA0:
  2139. j->play_frame_size = 10;
  2140. break;
  2141. case 0x50:
  2142. j->play_frame_size = 5;
  2143. break;
  2144. default:
  2145. j->play_frame_size = 15;
  2146. break;
  2147. }
  2148. j->play_mode = 0;
  2149. } else {
  2150. retval = 1;
  2151. }
  2152. break;
  2153. case ULAW:
  2154. switch (j->baseframe.low) {
  2155. case 0xA0:
  2156. j->play_frame_size = 80;
  2157. break;
  2158. case 0x50:
  2159. j->play_frame_size = 40;
  2160. break;
  2161. default:
  2162. j->play_frame_size = 120;
  2163. break;
  2164. }
  2165. j->play_mode = 2;
  2166. break;
  2167. case ALAW:
  2168. switch (j->baseframe.low) {
  2169. case 0xA0:
  2170. j->play_frame_size = 80;
  2171. break;
  2172. case 0x50:
  2173. j->play_frame_size = 40;
  2174. break;
  2175. default:
  2176. j->play_frame_size = 120;
  2177. break;
  2178. }
  2179. j->play_mode = 2;
  2180. break;
  2181. case LINEAR16:
  2182. switch (j->baseframe.low) {
  2183. case 0xA0:
  2184. j->play_frame_size = 160;
  2185. break;
  2186. case 0x50:
  2187. j->play_frame_size = 80;
  2188. break;
  2189. default:
  2190. j->play_frame_size = 240;
  2191. break;
  2192. }
  2193. j->play_mode = 6;
  2194. break;
  2195. case LINEAR8:
  2196. switch (j->baseframe.low) {
  2197. case 0xA0:
  2198. j->play_frame_size = 80;
  2199. break;
  2200. case 0x50:
  2201. j->play_frame_size = 40;
  2202. break;
  2203. default:
  2204. j->play_frame_size = 120;
  2205. break;
  2206. }
  2207. j->play_mode = 4;
  2208. break;
  2209. case WSS:
  2210. switch (j->baseframe.low) {
  2211. case 0xA0:
  2212. j->play_frame_size = 80;
  2213. break;
  2214. case 0x50:
  2215. j->play_frame_size = 40;
  2216. break;
  2217. default:
  2218. j->play_frame_size = 120;
  2219. break;
  2220. }
  2221. j->play_mode = 5;
  2222. break;
  2223. default:
  2224. j->play_frame_size = 0;
  2225. j->play_mode = -1;
  2226. if (j->write_buffer) {
  2227. kfree(j->write_buffer);
  2228. j->write_buffer = NULL;
  2229. j->write_buffer_size = 0;
  2230. }
  2231. retval = 1;
  2232. break;
  2233. }
  2234. return retval;
  2235. }
  2236. static int ixj_play_start(int board)
  2237. {
  2238. unsigned short cmd = 0x0000;
  2239. IXJ *j = &ixj[board];
  2240. if (j->write_buffer) {
  2241. ixj_play_stop(board);
  2242. }
  2243. j->flags.play_first_frame = 1;
  2244. j->drybuffer = 0;
  2245. if (!j->play_mode) {
  2246. switch (j->play_codec) {
  2247. case G723_63:
  2248. cmd = 0x5231;
  2249. break;
  2250. case G723_53:
  2251. cmd = 0x5232;
  2252. break;
  2253. case TS85:
  2254. cmd = 0x5230; // TrueSpeech 8.5
  2255. break;
  2256. case TS48:
  2257. cmd = 0x5233; // TrueSpeech 4.8
  2258. break;
  2259. case TS41:
  2260. cmd = 0x5234; // TrueSpeech 4.1
  2261. break;
  2262. case G728:
  2263. cmd = 0x5235;
  2264. break;
  2265. case G729:
  2266. cmd = 0x5236;
  2267. break;
  2268. default:
  2269. return 1;
  2270. }
  2271. if (ixj_WriteDSPCommand(cmd, board))
  2272. return -1;
  2273. }
  2274. j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
  2275. if (!j->write_buffer) {
  2276. printk("Write buffer allocation for ixj board %d failed!n", board);
  2277. return -ENOMEM;
  2278. }
  2279. j->write_buffers_empty = 2;
  2280. j->write_buffer_size = j->play_frame_size * 2;
  2281. j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
  2282. j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
  2283. if (ixj_WriteDSPCommand(0x5202, board)) // Set Poll sync mode
  2284. return -1;
  2285. switch (j->play_mode) {
  2286. case 0:
  2287. cmd = 0x2C03;
  2288. break;
  2289. case 2:
  2290. if (j->ver.low == 0x12) {
  2291. cmd = 0x2C23;
  2292. } else {
  2293. cmd = 0x2C21;
  2294. }
  2295. break;
  2296. case 4:
  2297. if (j->ver.low == 0x12) {
  2298. cmd = 0x2C43;
  2299. } else {
  2300. cmd = 0x2C41;
  2301. }
  2302. break;
  2303. case 5:
  2304. if (j->ver.low == 0x12) {
  2305. cmd = 0x2C53;
  2306. } else {
  2307. cmd = 0x2C51;
  2308. }
  2309. break;
  2310. case 6:
  2311. if (j->ver.low == 0x12) {
  2312. cmd = 0x2C63;
  2313. } else {
  2314. cmd = 0x2C61;
  2315. }
  2316. break;
  2317. }
  2318. if (ixj_WriteDSPCommand(cmd, board))
  2319. return -1;
  2320. if (ixj_WriteDSPCommand(0x2000, board)) // Playback C2
  2321. return -1;
  2322. if (ixj_WriteDSPCommand(0x2000 + ixj[board].play_frame_size, board)) // Playback C3
  2323. return -1;
  2324. return 0;
  2325. }
  2326. static void ixj_play_stop(int board)
  2327. {
  2328. IXJ *j = &ixj[board];
  2329. if (j->write_buffer) {
  2330. kfree(j->write_buffer);
  2331. j->write_buffer = NULL;
  2332. j->write_buffer_size = 0;
  2333. }
  2334. if (j->play_mode > -1) {
  2335. ixj_WriteDSPCommand(0x5221, board); // Stop playback
  2336. j->play_mode = -1;
  2337. }
  2338. }
  2339. extern __inline__ void set_play_depth(int board, int depth)
  2340. {
  2341. if (depth > 60)
  2342. depth = 60;
  2343. if (depth < 0)
  2344. depth = 0;
  2345. ixj_WriteDSPCommand(0x5280 + depth, board);
  2346. }
  2347. extern __inline__ void set_play_volume(int board, int volume)
  2348. {
  2349. ixj_WriteDSPCommand(0xCF02, board);
  2350. ixj_WriteDSPCommand(volume, board);
  2351. }
  2352. extern __inline__ int get_play_level(int board)
  2353. {
  2354. ixj_WriteDSPCommand(0xCF8F, board);
  2355. return ixj[board].ssr.high << 8 | ixj[board].ssr.low;
  2356. }
  2357. static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
  2358. {
  2359. unsigned int mask = 0;
  2360. IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)];
  2361. poll_wait(file_p, &(j->poll_q), wait);
  2362. if (j->read_buffer_ready > 0)
  2363. mask |= POLLIN | POLLRDNORM; /* readable */
  2364. if (j->write_buffers_empty > 0)
  2365. mask |= POLLOUT | POLLWRNORM; /* writable */
  2366. if (j->ex.bytes)
  2367. mask |= POLLPRI;
  2368. return mask;
  2369. }
  2370. static int ixj_play_tone(int board, char tone)
  2371. {
  2372. IXJ *j = &ixj[board];
  2373. if (!j->tone_state)
  2374. idle(board);
  2375. j->tone_index = tone;
  2376. if (ixj_WriteDSPCommand(0x6000 + j->tone_index, board))
  2377. return -1;
  2378. if (!j->tone_state) {
  2379. j->tone_start_jif = jiffies;
  2380. j->tone_state = 1;
  2381. }
  2382. return 0;
  2383. }
  2384. static int ixj_set_tone_on(unsigned short arg, int board)
  2385. {
  2386. IXJ *j = &ixj[board];
  2387. j->tone_on_time = arg;
  2388. if (ixj_WriteDSPCommand(0x6E04, board)) // Set Tone On Period
  2389. return -1;
  2390. if (ixj_WriteDSPCommand(arg, board))
  2391. return -1;
  2392. return 0;
  2393. }
  2394. static int SCI_WaitHighSCI(int board)
  2395. {
  2396. int cnt;
  2397. IXJ *j = &ixj[board];
  2398. j->pld_scrr.byte = inb_p(j->XILINXbase);
  2399. if (!j->pld_scrr.bits.sci) {
  2400. for (cnt = 0; cnt < 10; cnt++) {
  2401. udelay(32);
  2402. j->pld_scrr.byte = inb_p(j->XILINXbase);
  2403. if ((j->pld_scrr.bits.sci))
  2404. return 1;
  2405. }
  2406. if (ixjdebug > 1)
  2407. printk(KERN_INFO "SCI Wait High failed %xn", j->pld_scrr.byte);
  2408. return 0;
  2409. } else
  2410. return 1;
  2411. }
  2412. static int SCI_WaitLowSCI(int board)
  2413. {
  2414. int cnt;
  2415. IXJ *j = &ixj[board];
  2416. j->pld_scrr.byte = inb_p(j->XILINXbase);
  2417. if (j->pld_scrr.bits.sci) {
  2418. for (cnt = 0; cnt < 10; cnt++) {
  2419. udelay(32);
  2420. j->pld_scrr.byte = inb_p(j->XILINXbase);
  2421. if (!(j->pld_scrr.bits.sci))
  2422. return 1;
  2423. }
  2424. if (ixjdebug > 1)
  2425. printk(KERN_INFO "SCI Wait Low failed %xn", j->pld_scrr.byte);
  2426. return 0;
  2427. } else
  2428. return 1;
  2429. }
  2430. static int SCI_Control(int board, int control)
  2431. {
  2432. IXJ *j = &ixj[board];
  2433. switch (control) {
  2434. case SCI_End:
  2435. j->pld_scrw.bits.c0 = 0; // Set PLD Serial control interface
  2436. j->pld_scrw.bits.c1 = 0; // to no selection 
  2437. break;
  2438. case SCI_Enable_DAA:
  2439. j->pld_scrw.bits.c0 = 1; // Set PLD Serial control interface
  2440. j->pld_scrw.bits.c1 = 0; // to write to DAA
  2441. break;
  2442. case SCI_Enable_Mixer:
  2443. j->pld_scrw.bits.c0 = 0; // Set PLD Serial control interface
  2444. j->pld_scrw.bits.c1 = 1; // to write to mixer 
  2445. break;
  2446. case SCI_Enable_EEPROM:
  2447. j->pld_scrw.bits.c0 = 1; // Set PLD Serial control interface
  2448. j->pld_scrw.bits.c1 = 1; // to write to EEPROM 
  2449. break;
  2450. default:
  2451. return 0;
  2452. break;
  2453. }
  2454. outb_p(j->pld_scrw.byte, j->XILINXbase);
  2455. switch (control) {
  2456. case SCI_End:
  2457. return 1;
  2458. break;
  2459. case SCI_Enable_DAA:
  2460. case SCI_Enable_Mixer:
  2461. case SCI_Enable_EEPROM:
  2462. if (!SCI_WaitHighSCI(board))
  2463. return 0;
  2464. break;
  2465. default:
  2466. return 0;
  2467. break;
  2468. }
  2469. return 1;
  2470. }
  2471. static int SCI_Prepare(int board)
  2472. {
  2473. if (!SCI_Control(board, SCI_End))
  2474. return 0;
  2475. if (!SCI_WaitLowSCI(board))
  2476. return 0;
  2477. return 1;
  2478. }
  2479. static int ixj_mixer(long val, int board)
  2480. {
  2481. BYTES bytes;
  2482. IXJ *j = &ixj[board];
  2483. bytes.high = (val & 0xFF00) >> 8;
  2484. bytes.low = val & 0x00FF;
  2485. outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); // Load Mixer Address
  2486. outb_p(bytes.low, j->XILINXbase + 0x02); // Load Mixer Data
  2487. SCI_Control(board, SCI_Enable_Mixer);
  2488. SCI_Control(board, SCI_End);
  2489. return 0;
  2490. }
  2491. static int daa_load(BYTES * p_bytes, int board)
  2492. {
  2493. IXJ *j = &ixj[board];
  2494. outb_p(p_bytes->high, j->XILINXbase + 0x03);
  2495. outb_p(p_bytes->low, j->XILINXbase + 0x02);
  2496. if (!SCI_Control(board, SCI_Enable_DAA))
  2497. return 0;
  2498. else
  2499. return 1;
  2500. }
  2501. static int ixj_daa_cr4(int board, char reg)
  2502. {
  2503. IXJ *j = &ixj[board];
  2504. BYTES bytes;
  2505. switch (j->daa_mode) {
  2506. case SOP_PU_SLEEP:
  2507. bytes.high = 0x14;
  2508. break;
  2509. case SOP_PU_RINGING:
  2510. bytes.high = 0x54;
  2511. break;
  2512. case SOP_PU_CONVERSATION:
  2513. bytes.high = 0x94;
  2514. break;
  2515. case SOP_PU_PULSEDIALING:
  2516. bytes.high = 0xD4;
  2517. break;
  2518. }
  2519. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
  2520. switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
  2521. case 0:
  2522. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
  2523. break;
  2524. case 1:
  2525. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
  2526. break;
  2527. case 2:
  2528. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
  2529. break;
  2530. case 3:
  2531. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
  2532. break;
  2533. }
  2534. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
  2535. if (!daa_load(&bytes, board))
  2536. return 0;
  2537. if (!SCI_Prepare(board))
  2538. return 0;
  2539. return 1;
  2540. }
  2541. static char daa_int_read(int board)
  2542. {
  2543. BYTES bytes;
  2544. IXJ *j = &ixj[board];
  2545. if (!SCI_Prepare(board))
  2546. return 0;
  2547. bytes.high = 0x38;
  2548. bytes.low = 0x00;
  2549. outb_p(bytes.high, j->XILINXbase + 0x03);
  2550. outb_p(bytes.low, j->XILINXbase + 0x02);
  2551. if (!SCI_Control(board, SCI_Enable_DAA))
  2552. return 0;
  2553. bytes.high = inb_p(j->XILINXbase + 0x03);
  2554. bytes.low = inb_p(j->XILINXbase + 0x02);
  2555. if (bytes.low != ALISDAA_ID_BYTE) {
  2556. if (ixjdebug > 0)
  2557. printk("Cannot read DAA ID Byte high = %d low = %dn", bytes.high, bytes.low);
  2558. return 0;
  2559. }
  2560. if (!SCI_Control(board, SCI_Enable_DAA))
  2561. return 0;
  2562. if (!SCI_Control(board, SCI_End))
  2563. return 0;
  2564. bytes.high = inb_p(j->XILINXbase + 0x03);
  2565. bytes.low = inb_p(j->XILINXbase + 0x02);
  2566. j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
  2567. return 1;
  2568. }
  2569. static int ixj_daa_cid_reset(int board)
  2570. {
  2571. int i;
  2572. BYTES bytes;
  2573. IXJ *j = &ixj[board];
  2574. if (!SCI_Prepare(board))
  2575. return 0;
  2576. bytes.high = 0x58;
  2577. bytes.low = 0x00;
  2578. outb_p(bytes.high, j->XILINXbase + 0x03);
  2579. outb_p(bytes.low, j->XILINXbase + 0x02);
  2580. if (!SCI_Control(board, SCI_Enable_DAA))
  2581. return 0;
  2582. if (!SCI_WaitHighSCI(board))
  2583. return 0;
  2584. for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
  2585. bytes.high = bytes.low = 0x00;
  2586. outb_p(bytes.high, j->XILINXbase + 0x03);
  2587. if (i < ALISDAA_CALLERID_SIZE - 1)
  2588. outb_p(bytes.low, j->XILINXbase + 0x02);
  2589. if (!SCI_Control(board, SCI_Enable_DAA))
  2590. return 0;
  2591. if (!SCI_WaitHighSCI(board))
  2592. return 0;
  2593. }
  2594. if (!SCI_Control(board, SCI_End))
  2595. return 0;
  2596. return 1;
  2597. }
  2598. static int ixj_daa_cid_read(int board)
  2599. {
  2600. int i;
  2601. BYTES bytes;
  2602. char CID[ALISDAA_CALLERID_SIZE], mContinue;
  2603. char *pIn, *pOut;
  2604. IXJ *j = &ixj[board];
  2605. if (!SCI_Prepare(board))
  2606. return 0;
  2607. bytes.high = 0x78;
  2608. bytes.low = 0x00;
  2609. outb_p(bytes.high, j->XILINXbase + 0x03);
  2610. outb_p(bytes.low, j->XILINXbase + 0x02);
  2611. if (!SCI_Control(board, SCI_Enable_DAA))
  2612. return 0;
  2613. if (!SCI_WaitHighSCI(board))
  2614. return 0;
  2615. bytes.high = inb_p(j->XILINXbase + 0x03);
  2616. bytes.low = inb_p(j->XILINXbase + 0x02);
  2617. if (bytes.low != ALISDAA_ID_BYTE) {
  2618. if (ixjdebug > 0)
  2619. printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %dn", bytes.high, bytes.low);
  2620. return 0;
  2621. }
  2622. for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
  2623. bytes.high = bytes.low = 0x00;
  2624. outb_p(bytes.high, j->XILINXbase + 0x03);
  2625. outb_p(bytes.low, j->XILINXbase + 0x02);
  2626. if (!SCI_Control(board, SCI_Enable_DAA))
  2627. return 0;
  2628. if (!SCI_WaitHighSCI(board))
  2629. return 0;
  2630. CID[i + 0] = inb_p(j->XILINXbase + 0x03);
  2631. CID[i + 1] = inb_p(j->XILINXbase + 0x02);
  2632. }
  2633. if (!SCI_Control(board, SCI_End))
  2634. return 0;
  2635. pIn = CID;
  2636. pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
  2637. mContinue = 1;
  2638. while (mContinue) {
  2639. if ((pIn[1] & 0x03) == 0x01) {
  2640. pOut[0] = pIn[0];
  2641. }
  2642. if ((pIn[2] & 0x0c) == 0x04) {
  2643. pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
  2644. }
  2645. if ((pIn[3] & 0x30) == 0x10) {
  2646. pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
  2647. }
  2648. if ((pIn[4] & 0xc0) == 0x40) {
  2649. pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
  2650. } else {
  2651. mContinue = FALSE;
  2652. }
  2653. pIn += 5, pOut += 4;
  2654. }
  2655. memset(&j->cid, 0, sizeof(IXJ_CID));
  2656. pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
  2657. pOut += 4;
  2658. strncpy(j->cid.month, pOut, 2);
  2659. pOut += 2;
  2660. strncpy(j->cid.day, pOut, 2);
  2661. pOut += 2;
  2662. strncpy(j->cid.hour, pOut, 2);
  2663. pOut += 2;
  2664. strncpy(j->cid.min, pOut, 2);
  2665. pOut += 3;
  2666. j->cid.numlen = *pOut;
  2667. pOut += 1;
  2668. strncpy(j->cid.number, pOut, j->cid.numlen);
  2669. pOut += j->cid.numlen + 1;
  2670. j->cid.namelen = *pOut;
  2671. pOut += 1;
  2672. strncpy(j->cid.name, pOut, j->cid.namelen);
  2673. ixj_daa_cid_reset(board);
  2674. return 1;
  2675. }
  2676. static char daa_get_version(int board)
  2677. {
  2678. BYTES bytes;
  2679. IXJ *j = &ixj[board];
  2680. if (!SCI_Prepare(board))
  2681. return 0;
  2682. bytes.high = 0x35;
  2683. bytes.low = 0x00;
  2684. outb_p(bytes.high, j->XILINXbase + 0x03);
  2685. outb_p(bytes.low, j->XILINXbase + 0x02);
  2686. if (!SCI_Control(board, SCI_Enable_DAA))
  2687. return 0;
  2688. bytes.high = inb_p(j->XILINXbase + 0x03);
  2689. bytes.low = inb_p(j->XILINXbase + 0x02);
  2690. if (bytes.low != ALISDAA_ID_BYTE) {
  2691. if (ixjdebug > 0)
  2692. printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %dn", bytes.high, bytes.low);
  2693. return 0;
  2694. }
  2695. if (!SCI_Control(board, SCI_Enable_DAA))
  2696. return 0;
  2697. if (!SCI_Control(board, SCI_End))
  2698. return 0;
  2699. bytes.high = inb_p(j->XILINXbase + 0x03);
  2700. bytes.low = inb_p(j->XILINXbase + 0x02);
  2701. if (ixjdebug > 0)
  2702. printk("DAA CR5 Byte high = 0x%x low = 0x%xn", bytes.high, bytes.low);
  2703. j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
  2704. return bytes.high;
  2705. }
  2706. static int daa_set_mode(int board, int mode)
  2707. {
  2708. // NOTE:
  2709. //      The DAA *MUST* be in the conversation mode if the
  2710. //      PSTN line is to be seized (PSTN line off-hook).
  2711. //      Taking the PSTN line off-hook while the DAA is in
  2712. //      a mode other than conversation mode will cause a
  2713. //      hardware failure of the ALIS-A part.
  2714. // NOTE:
  2715. //      The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
  2716. //      if the PSTN line is on-hook.  Failure to have the PSTN line
  2717. //      in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
  2718. //      ALIS-A part.
  2719. //
  2720. BYTES bytes;
  2721. IXJ *j = &ixj[board];
  2722. if (!SCI_Prepare(board))
  2723. return 0;
  2724. switch (mode) {
  2725. case SOP_PU_SLEEP:
  2726. j->pld_scrw.bits.daafsyncen = 0; // Turn off DAA Frame Sync
  2727. outb_p(j->pld_scrw.byte, j->XILINXbase);
  2728. j->pld_slicw.bits.rly2 = 0;
  2729. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2730. bytes.high = 0x10;
  2731. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  2732. daa_load(&bytes, board);
  2733. if (!SCI_Prepare(board))
  2734. return 0;
  2735. j->daa_mode = SOP_PU_SLEEP;
  2736. j->flags.pstn_ringing = 0;
  2737. j->pstn_sleeptil = jiffies + (hertz * 3);
  2738. break;
  2739. case SOP_PU_RINGING:
  2740. j->pld_scrw.bits.daafsyncen = 0; // Turn off DAA Frame Sync
  2741. outb_p(j->pld_scrw.byte, j->XILINXbase);
  2742. j->pld_slicw.bits.rly2 = 0;
  2743. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2744. bytes.high = 0x50;
  2745. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  2746. daa_load(&bytes, board);
  2747. if (!SCI_Prepare(board))
  2748. return 0;
  2749. j->daa_mode = SOP_PU_RINGING;
  2750. break;
  2751. case SOP_PU_CONVERSATION:
  2752. bytes.high = 0x90;
  2753. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  2754. daa_load(&bytes, board);
  2755. if (!SCI_Prepare(board))
  2756. return 0;
  2757. j->pld_slicw.bits.rly2 = 1;
  2758. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2759. j->pld_scrw.bits.daafsyncen = 1; // Turn on DAA Frame Sync
  2760. outb_p(j->pld_scrw.byte, j->XILINXbase);
  2761. j->daa_mode = SOP_PU_CONVERSATION;
  2762. j->flags.pstn_ringing = 0;
  2763. j->ex.bits.pstn_ring = 0;
  2764. break;
  2765. case SOP_PU_PULSEDIALING:
  2766. j->pld_scrw.bits.daafsyncen = 0; // Turn off DAA Frame Sync
  2767. outb_p(j->pld_scrw.byte, j->XILINXbase);
  2768. j->pld_slicw.bits.rly2 = 0;
  2769. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2770. bytes.high = 0xD0;
  2771. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  2772. daa_load(&bytes, board);
  2773. if (!SCI_Prepare(board))
  2774. return 0;
  2775. j->daa_mode = SOP_PU_PULSEDIALING;
  2776. break;
  2777. default:
  2778. break;
  2779. }
  2780. return 1;
  2781. }
  2782. static int ixj_daa_write(int board)
  2783. {
  2784. BYTES bytes;
  2785. IXJ *j = &ixj[board];
  2786. if (!SCI_Prepare(board))
  2787. return 0;
  2788. bytes.high = 0x14;
  2789. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
  2790. if (!daa_load(&bytes, board))
  2791. return 0;
  2792. bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
  2793. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
  2794. if (!daa_load(&bytes, board))
  2795. return 0;
  2796. bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
  2797. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  2798. if (!daa_load(&bytes, board))
  2799. return 0;
  2800. if (!SCI_Prepare(board))
  2801. return 0;
  2802. bytes.high = 0x1F;
  2803. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
  2804. if (!daa_load(&bytes, board))
  2805. return 0;
  2806. bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
  2807. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
  2808. if (!daa_load(&bytes, board))
  2809. return 0;
  2810. bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
  2811. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
  2812. if (!daa_load(&bytes, board))
  2813. return 0;
  2814. bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
  2815. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
  2816. if (!daa_load(&bytes, board))
  2817. return 0;
  2818. bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
  2819. bytes.low = 0x00;
  2820. if (!daa_load(&bytes, board))
  2821. return 0;
  2822. if (!SCI_Prepare(board))
  2823. return 0;
  2824. bytes.high = 0x00;
  2825. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
  2826. if (!daa_load(&bytes, board))
  2827. return 0;
  2828. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
  2829. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
  2830. if (!daa_load(&bytes, board))
  2831. return 0;
  2832. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
  2833. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
  2834. if (!daa_load(&bytes, board))
  2835. return 0;
  2836. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
  2837. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
  2838. if (!daa_load(&bytes, board))
  2839. return 0;
  2840. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
  2841. bytes.low = 0x00;
  2842. if (!daa_load(&bytes, board))
  2843. return 0;
  2844. if (!SCI_Control(board, SCI_End))
  2845. return 0;
  2846. if (!SCI_WaitLowSCI(board))
  2847. return 0;
  2848. bytes.high = 0x01;
  2849. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
  2850. if (!daa_load(&bytes, board))
  2851. return 0;
  2852. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
  2853. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
  2854. if (!daa_load(&bytes, board))
  2855. return 0;
  2856. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
  2857. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
  2858. if (!daa_load(&bytes, board))
  2859. return 0;
  2860. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
  2861. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
  2862. if (!daa_load(&bytes, board))
  2863. return 0;
  2864. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
  2865. bytes.low = 0x00;
  2866. if (!daa_load(&bytes, board))
  2867. return 0;
  2868. if (!SCI_Control(board, SCI_End))
  2869. return 0;
  2870. if (!SCI_WaitLowSCI(board))
  2871. return 0;
  2872. bytes.high = 0x02;
  2873. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
  2874. if (!daa_load(&bytes, board))
  2875. return 0;
  2876. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
  2877. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
  2878. if (!daa_load(&bytes, board))
  2879. return 0;
  2880. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
  2881. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
  2882. if (!daa_load(&bytes, board))
  2883. return 0;
  2884. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
  2885. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
  2886. if (!daa_load(&bytes, board))
  2887. return 0;
  2888. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
  2889. bytes.low = 0x00;
  2890. if (!daa_load(&bytes, board))
  2891. return 0;
  2892. if (!SCI_Control(board, SCI_End))
  2893. return 0;
  2894. if (!SCI_WaitLowSCI(board))
  2895. return 0;
  2896. bytes.high = 0x03;
  2897. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
  2898. if (!daa_load(&bytes, board))
  2899. return 0;
  2900. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
  2901. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
  2902. if (!daa_load(&bytes, board))
  2903. return 0;
  2904. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
  2905. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
  2906. if (!daa_load(&bytes, board))
  2907. return 0;
  2908. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
  2909. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
  2910. if (!daa_load(&bytes, board))
  2911. return 0;
  2912. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
  2913. bytes.low = 0x00;
  2914. if (!daa_load(&bytes, board))
  2915. return 0;
  2916. if (!SCI_Control(board, SCI_End))
  2917. return 0;
  2918. if (!SCI_WaitLowSCI(board))
  2919. return 0;
  2920. bytes.high = 0x04;
  2921. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
  2922. if (!daa_load(&bytes, board))
  2923. return 0;
  2924. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
  2925. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
  2926. if (!daa_load(&bytes, board))
  2927. return 0;
  2928. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
  2929. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
  2930. if (!daa_load(&bytes, board))
  2931. return 0;
  2932. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
  2933. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
  2934. if (!daa_load(&bytes, board))
  2935. return 0;
  2936. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
  2937. bytes.low = 0x00;
  2938. if (!daa_load(&bytes, board))
  2939. return 0;
  2940. if (!SCI_Control(board, SCI_End))
  2941. return 0;
  2942. if (!SCI_WaitLowSCI(board))
  2943. return 0;
  2944. bytes.high = 0x05;
  2945. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
  2946. if (!daa_load(&bytes, board))
  2947. return 0;
  2948. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
  2949. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
  2950. if (!daa_load(&bytes, board))
  2951. return 0;
  2952. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
  2953. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
  2954. if (!daa_load(&bytes, board))
  2955. return 0;
  2956. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
  2957. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
  2958. if (!daa_load(&bytes, board))
  2959. return 0;
  2960. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
  2961. bytes.low = 0x00;
  2962. if (!daa_load(&bytes, board))
  2963. return 0;
  2964. if (!SCI_Control(board, SCI_End))
  2965. return 0;
  2966. if (!SCI_WaitLowSCI(board))
  2967. return 0;
  2968. bytes.high = 0x06;
  2969. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
  2970. if (!daa_load(&bytes, board))
  2971. return 0;
  2972. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
  2973. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
  2974. if (!daa_load(&bytes, board))
  2975. return 0;
  2976. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
  2977. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
  2978. if (!daa_load(&bytes, board))
  2979. return 0;
  2980. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
  2981. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
  2982. if (!daa_load(&bytes, board))
  2983. return 0;
  2984. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
  2985. bytes.low = 0x00;
  2986. if (!daa_load(&bytes, board))
  2987. return 0;
  2988. if (!SCI_Control(board, SCI_End))
  2989. return 0;
  2990. if (!SCI_WaitLowSCI(board))
  2991. return 0;
  2992. bytes.high = 0x07;
  2993. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
  2994. if (!daa_load(&bytes, board))
  2995. return 0;
  2996. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
  2997. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
  2998. if (!daa_load(&bytes, board))
  2999. return 0;
  3000. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
  3001. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
  3002. if (!daa_load(&bytes, board))
  3003. return 0;
  3004. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
  3005. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
  3006. if (!daa_load(&bytes, board))
  3007. return 0;
  3008. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
  3009. bytes.low = 0x00;
  3010. if (!daa_load(&bytes, board))
  3011. return 0;
  3012. if (!SCI_Control(board, SCI_End))
  3013. return 0;
  3014. if (!SCI_WaitLowSCI(board))
  3015. return 0;
  3016. bytes.high = 0x08;
  3017. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
  3018. if (!daa_load(&bytes, board))
  3019. return 0;
  3020. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
  3021. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
  3022. if (!daa_load(&bytes, board))
  3023. return 0;
  3024. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
  3025. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
  3026. if (!daa_load(&bytes, board))
  3027. return 0;
  3028. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
  3029. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
  3030. if (!daa_load(&bytes, board))
  3031. return 0;
  3032. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
  3033. bytes.low = 0x00;
  3034. if (!daa_load(&bytes, board))
  3035. return 0;
  3036. if (!SCI_Control(board, SCI_End))
  3037. return 0;
  3038. if (!SCI_WaitLowSCI(board))
  3039. return 0;
  3040. bytes.high = 0x09;
  3041. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
  3042. if (!daa_load(&bytes, board))
  3043. return 0;
  3044. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
  3045. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
  3046. if (!daa_load(&bytes, board))
  3047. return 0;
  3048. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
  3049. bytes.low = 0x00;
  3050. if (!daa_load(&bytes, board))
  3051. return 0;
  3052. if (!SCI_Control(board, SCI_End))
  3053. return 0;
  3054. if (!SCI_WaitLowSCI(board))
  3055. return 0;
  3056. bytes.high = 0x0A;
  3057. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
  3058. if (!daa_load(&bytes, board))
  3059. return 0;
  3060. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
  3061. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
  3062. if (!daa_load(&bytes, board))
  3063. return 0;
  3064. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
  3065. bytes.low = 0x00;
  3066. if (!daa_load(&bytes, board))
  3067. return 0;
  3068. if (!SCI_Control(board, SCI_End))
  3069. return 0;
  3070. if (!SCI_WaitLowSCI(board))
  3071. return 0;
  3072. bytes.high = 0x0B;
  3073. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
  3074. if (!daa_load(&bytes, board))
  3075. return 0;
  3076. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
  3077. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
  3078. if (!daa_load(&bytes, board))
  3079. return 0;
  3080. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
  3081. bytes.low = 0x00;
  3082. if (!daa_load(&bytes, board))
  3083. return 0;
  3084. if (!SCI_Control(board, SCI_End))
  3085. return 0;
  3086. if (!SCI_WaitLowSCI(board))
  3087. return 0;
  3088. bytes.high = 0x0C;
  3089. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
  3090. if (!daa_load(&bytes, board))
  3091. return 0;
  3092. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
  3093. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
  3094. if (!daa_load(&bytes, board))
  3095. return 0;
  3096. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
  3097. bytes.low = 0x00;
  3098. if (!daa_load(&bytes, board))
  3099. return 0;
  3100. if (!SCI_Control(board, SCI_End))
  3101. return 0;
  3102. if (!SCI_WaitLowSCI(board))
  3103. return 0;
  3104. bytes.high = 0x0D;
  3105. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
  3106. if (!daa_load(&bytes, board))
  3107. return 0;
  3108. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
  3109. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
  3110. if (!daa_load(&bytes, board))
  3111. return 0;
  3112. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
  3113. bytes.low = 0x00;
  3114. if (!daa_load(&bytes, board))
  3115. return 0;
  3116. if (!SCI_Control(board, SCI_End))
  3117. return 0;
  3118. if (!SCI_WaitLowSCI(board))
  3119. return 0;
  3120. bytes.high = 0x0E;
  3121. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
  3122. if (!daa_load(&bytes, board))
  3123. return 0;
  3124. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
  3125. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
  3126. if (!daa_load(&bytes, board))
  3127. return 0;
  3128. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
  3129. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
  3130. if (!daa_load(&bytes, board))
  3131. return 0;
  3132. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
  3133. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
  3134. if (!daa_load(&bytes, board))
  3135. return 0;
  3136. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
  3137. bytes.low = 0x00;
  3138. if (!daa_load(&bytes, board))
  3139. return 0;
  3140. if (!SCI_Control(board, SCI_End))
  3141. return 0;
  3142. if (!SCI_WaitLowSCI(board))
  3143. return 0;
  3144. bytes.high = 0x0F;
  3145. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
  3146. if (!daa_load(&bytes, board))
  3147. return 0;
  3148. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
  3149. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
  3150. if (!daa_load(&bytes, board))
  3151. return 0;
  3152. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
  3153. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
  3154. if (!daa_load(&bytes, board))
  3155. return 0;
  3156. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
  3157. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
  3158. if (!daa_load(&bytes, board))
  3159. return 0;
  3160. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
  3161. bytes.low = 0x00;
  3162. if (!daa_load(&bytes, board))
  3163. return 0;
  3164. udelay(32);
  3165. j->pld_scrr.byte = inb_p(j->XILINXbase);
  3166. if (!SCI_Control(board, SCI_End))
  3167. return 0;
  3168. return 1;
  3169. }
  3170. int ixj_set_tone_off(unsigned short arg, int board)
  3171. {
  3172. ixj[board].tone_off_time = arg;
  3173. if (ixj_WriteDSPCommand(0x6E05, board)) // Set Tone Off Period
  3174. return -1;
  3175. if (ixj_WriteDSPCommand(arg, board))
  3176. return -1;
  3177. return 0;
  3178. }
  3179. static int ixj_get_tone_on(int board)
  3180. {
  3181. if (ixj_WriteDSPCommand(0x6E06, board)) // Get Tone On Period
  3182. return -1;
  3183. return 0;
  3184. }
  3185. static int ixj_get_tone_off(int board)
  3186. {
  3187. if (ixj_WriteDSPCommand(0x6E07, board)) // Get Tone Off Period
  3188. return -1;
  3189. return 0;
  3190. }
  3191. static void ixj_busytone(int board)
  3192. {
  3193. ixj[board].flags.ringback = 0;
  3194. ixj[board].flags.dialtone = 0;
  3195. ixj[board].flags.busytone = 1;
  3196. ixj_set_tone_on(0x07D0, board);
  3197. ixj_set_tone_off(0x07D0, board);
  3198. ixj_play_tone(board, 27);
  3199. }
  3200. static void ixj_dialtone(int board)
  3201. {
  3202. ixj[board].flags.ringback = 0;
  3203. ixj[board].flags.dialtone = 1;
  3204. ixj[board].flags.busytone = 0;
  3205. if (ixj[board].dsp.low == 0x20) {
  3206. return;
  3207. } else {
  3208. ixj_set_tone_on(0xFFFF, board);
  3209. ixj_set_tone_off(0x0000, board);
  3210. ixj_play_tone(board, 25);
  3211. }
  3212. }
  3213. static void ixj_cpt_stop(board)
  3214. {
  3215. IXJ *j = &ixj[board];
  3216. j->flags.dialtone = 0;
  3217. j->flags.busytone = 0;
  3218. j->flags.ringback = 0;
  3219. ixj_set_tone_on(0x0001, board);
  3220. ixj_set_tone_off(0x0000, board);
  3221. ixj_play_tone(board, 0);
  3222. j->tone_state = 0;
  3223. if (j->cadence_t) {
  3224. if (j->cadence_t->ce) {
  3225. kfree(j->cadence_t->ce);
  3226. }
  3227. kfree(j->cadence_t);
  3228. j->cadence_t = NULL;
  3229. }
  3230. if (j->dsp.low == 0x20 || (j->play_mode == -1 && j->rec_mode == -1))
  3231. idle(board);
  3232. if (j->play_mode != -1)
  3233. ixj_play_start(board);
  3234. if (j->rec_mode != -1)
  3235. ixj_record_start(board);
  3236. }
  3237. static void ixj_ringback(int board)
  3238. {
  3239. ixj[board].flags.busytone = 0;
  3240. ixj[board].flags.dialtone = 0;
  3241. ixj[board].flags.ringback = 1;
  3242. ixj_set_tone_on(0x0FA0, board);
  3243. ixj_set_tone_off(0x2EE0, board);
  3244. ixj_play_tone(board, 26);
  3245. }
  3246. static void ixj_testram(int board)
  3247. {
  3248. ixj_WriteDSPCommand(0x3001, board); /* Test External SRAM */
  3249. }
  3250. static int ixj_build_cadence(int board, IXJ_CADENCE * cp)
  3251. {
  3252. IXJ_CADENCE *lcp;
  3253. IXJ_CADENCE_ELEMENT *lcep;
  3254. IXJ_TONE ti;
  3255. IXJ *j = &ixj[board];
  3256. lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
  3257. if (lcp == NULL)
  3258. return -ENOMEM;
  3259. if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)))
  3260. return -EFAULT;
  3261. lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
  3262. if (lcep == NULL) {
  3263. kfree(lcp);
  3264. return -ENOMEM;
  3265. }
  3266. if (copy_from_user(lcep, lcp->ce, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
  3267. return -EFAULT;
  3268. if (j->cadence_t) {
  3269. kfree(j->cadence_t->ce);
  3270. kfree(j->cadence_t);
  3271. }
  3272. lcp->ce = (void *) lcep;
  3273. j->cadence_t = lcp;
  3274. j->tone_cadence_state = 0;
  3275. ixj_set_tone_on(lcp->ce[0].tone_on_time, board);
  3276. ixj_set_tone_off(lcp->ce[0].tone_off_time, board);
  3277. if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
  3278. ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
  3279. ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
  3280. ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
  3281. ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
  3282. ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
  3283. ixj_init_tone(board, &ti);
  3284. }
  3285. ixj_play_tone(board, lcp->ce[0].index);
  3286. return 1;
  3287. }
  3288. static int ixj_build_filter_cadence(int board, IXJ_FILTER_CADENCE * cp)
  3289. {
  3290. IXJ_FILTER_CADENCE *lcp;
  3291. IXJ *j = &ixj[board];
  3292. lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
  3293. if (lcp == NULL)
  3294. return -ENOMEM;
  3295. if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE)))
  3296. return -EFAULT;
  3297. if (lcp->filter > 4)
  3298. return -1;
  3299. j->cadence_f[lcp->filter].state = 0;
  3300. j->cadence_f[lcp->filter].enable = lcp->enable;
  3301. j->cadence_f[lcp->filter].on1 = lcp->on1;
  3302. j->cadence_f[lcp->filter].on1min = 0;
  3303. j->cadence_f[lcp->filter].on1max = 0;
  3304. j->cadence_f[lcp->filter].off1 = lcp->off1;
  3305. j->cadence_f[lcp->filter].off1min = 0;
  3306. j->cadence_f[lcp->filter].off1max = 0;
  3307. j->cadence_f[lcp->filter].on2 = lcp->on2;
  3308. j->cadence_f[lcp->filter].on2min = 0;
  3309. j->cadence_f[lcp->filter].on2max = 0;
  3310. j->cadence_f[lcp->filter].off2 = lcp->off2;
  3311. j->cadence_f[lcp->filter].off2min = 0;
  3312. j->cadence_f[lcp->filter].off2max = 0;
  3313. j->cadence_f[lcp->filter].on3 = lcp->on3;
  3314. j->cadence_f[lcp->filter].on3min = 0;
  3315. j->cadence_f[lcp->filter].on3max = 0;
  3316. j->cadence_f[lcp->filter].off3 = lcp->off3;
  3317. j->cadence_f[lcp->filter].off3min = 0;
  3318. j->cadence_f[lcp->filter].off3max = 0;
  3319. kfree(lcp);
  3320. return 0;
  3321. }
  3322. static void add_caps(int board)
  3323. {
  3324. IXJ *j = &ixj[board];
  3325. j->caps = 0;
  3326. j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
  3327. strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
  3328. j->caplist[j->caps].captype = vendor;
  3329. j->caplist[j->caps].handle = j->caps++;
  3330. j->caplist[j->caps].captype = device;
  3331. switch (j->cardtype) {
  3332. case 100:
  3333. strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
  3334. j->caplist[j->caps].cap = 100;
  3335. break;
  3336. case 300:
  3337. strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
  3338. j->caplist[j->caps].cap = 300;
  3339. break;
  3340. case 400:
  3341. strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
  3342. j->caplist[j->caps].cap = 400;
  3343. break;
  3344. case 500:
  3345. strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
  3346. j->caplist[j->caps].cap = 500;
  3347. break;
  3348. }
  3349. j->caplist[j->caps].handle = j->caps++;
  3350. strcpy(j->caplist[j->caps].desc, "POTS");
  3351. j->caplist[j->caps].captype = port;
  3352. j->caplist[j->caps].cap = pots;
  3353. j->caplist[j->caps].handle = j->caps++;
  3354. switch (ixj[board].cardtype) {
  3355. case 100:
  3356. strcpy(j->caplist[j->caps].desc, "SPEAKER");
  3357. j->caplist[j->caps].captype = port;
  3358. j->caplist[j->caps].cap = speaker;
  3359. j->caplist[j->caps].handle = j->caps++;
  3360. strcpy(j->caplist[j->caps].desc, "HANDSET");
  3361. j->caplist[j->caps].captype = port;
  3362. j->caplist[j->caps].cap = handset;
  3363. j->caplist[j->caps].handle = j->caps++;
  3364. break;
  3365. case 300:
  3366. strcpy(j->caplist[j->caps].desc, "SPEAKER");
  3367. j->caplist[j->caps].captype = port;
  3368. j->caplist[j->caps].cap = speaker;
  3369. j->caplist[j->caps].handle = j->caps++;
  3370. strcpy(j->caplist[j->caps].desc, "PSTN");
  3371. j->caplist[j->caps].captype = port;
  3372. j->caplist[j->caps].cap = pstn;
  3373. j->caplist[j->caps].handle = j->caps++;
  3374. break;
  3375. }
  3376. strcpy(j->caplist[j->caps].desc, "ULAW");
  3377. j->caplist[j->caps].captype = codec;
  3378. j->caplist[j->caps].cap = ULAW;
  3379. j->caplist[j->caps].handle = j->caps++;
  3380. strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
  3381. j->caplist[j->caps].captype = codec;
  3382. j->caplist[j->caps].cap = LINEAR16;
  3383. j->caplist[j->caps].handle = j->caps++;
  3384. strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
  3385. j->caplist[j->caps].captype = codec;
  3386. j->caplist[j->caps].cap = LINEAR8;
  3387. j->caplist[j->caps].handle = j->caps++;
  3388. strcpy(j->caplist[j->caps].desc, "Windows Sound System");
  3389. j->caplist[j->caps].captype = codec;
  3390. j->caplist[j->caps].cap = WSS;
  3391. j->caplist[j->caps].handle = j->caps++;
  3392. if (j->ver.low != 0x12) {
  3393. strcpy(j->caplist[j->caps].desc, "G.723.1 6.3Kbps");
  3394. j->caplist[j->caps].captype = codec;
  3395. j->caplist[j->caps].cap = G723_63;
  3396. j->caplist[j->caps].handle = j->caps++;
  3397. strcpy(j->caplist[j->caps].desc, "G.723.1 5.3Kbps");
  3398. j->caplist[j->caps].captype = codec;
  3399. j->caplist[j->caps].cap = G723_53;
  3400. j->caplist[j->caps].handle = j->caps++;
  3401. strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8Kbps");
  3402. j->caplist[j->caps].captype = codec;
  3403. j->caplist[j->caps].cap = TS48;
  3404. j->caplist[j->caps].handle = j->caps++;
  3405. strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1Kbps");
  3406. j->caplist[j->caps].captype = codec;
  3407. j->caplist[j->caps].cap = TS41;
  3408. j->caplist[j->caps].handle = j->caps++;
  3409. }
  3410. if (j->cardtype == 100) {
  3411. strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5Kbps");
  3412. j->caplist[j->caps].captype = codec;
  3413. j->caplist[j->caps].cap = TS85;
  3414. j->caplist[j->caps].handle = j->caps++;
  3415. }
  3416. }
  3417. static int capabilities_check(int board, struct phone_capability *pcreq)
  3418. {
  3419. int cnt;
  3420. IXJ *j = &ixj[board];
  3421. int retval = 0;
  3422. for (cnt = 0; cnt < j->caps; cnt++) {
  3423. if (pcreq->captype == j->caplist[cnt].captype &&
  3424.     pcreq->cap == j->caplist[cnt].cap) {
  3425. retval = 1;
  3426. break;
  3427. }
  3428. }
  3429. return retval;
  3430. }
  3431. int ixj_ioctl(struct inode *inode, struct file *file_p,
  3432.       unsigned int cmd, unsigned long arg)
  3433. {
  3434. IXJ_TONE ti;
  3435. IXJ_FILTER jf;
  3436. unsigned int minor = MINOR(inode->i_rdev);
  3437. int board = NUM(inode->i_rdev);
  3438. IXJ *j = &ixj[NUM(inode->i_rdev)];
  3439. int retval = 0;
  3440. if (ixjdebug > 1)
  3441. printk(KERN_DEBUG "phone%d ioctl, cmd: 0x%x, arg: 0x%lxn", minor, cmd, arg);
  3442. if (minor >= IXJMAX)
  3443. return -ENODEV;
  3444. /*
  3445.  *    Check ioctls only root can use.
  3446.  */
  3447. if (!capable(CAP_SYS_ADMIN)) {
  3448. switch (cmd) {
  3449. case IXJCTL_TESTRAM:
  3450. case IXJCTL_HZ:
  3451. return -EPERM;
  3452. }
  3453. }
  3454. switch (cmd) {
  3455. case IXJCTL_TESTRAM:
  3456. ixj_testram(board);
  3457. retval = (j->ssr.high << 8) + j->ssr.low;
  3458. break;
  3459. case IXJCTL_CARDTYPE:
  3460. retval = j->cardtype;
  3461. break;
  3462. case IXJCTL_SERIAL:
  3463. retval = j->serial;
  3464. break;
  3465. case PHONE_RING_CADENCE:
  3466. j->ring_cadence = arg;
  3467. break;
  3468. case PHONE_RING_START:
  3469. ixj_ring_start(board);
  3470. break;
  3471. case PHONE_RING_STOP:
  3472. j->flags.cringing = 0;
  3473. ixj_ring_off(board);
  3474. break;
  3475. case PHONE_RING:
  3476. retval = ixj_ring(board);
  3477. break;
  3478. case PHONE_EXCEPTION:
  3479. retval = j->ex.bytes;
  3480. j->ex.bytes &= 0x03;
  3481. break;
  3482. case PHONE_HOOKSTATE:
  3483. j->ex.bits.hookstate = 0;
  3484. retval = j->r_hook;
  3485. break;
  3486. case IXJCTL_SET_LED:
  3487. LED_SetState(arg, board);
  3488. break;
  3489. case PHONE_FRAME:
  3490. retval = set_base_frame(board, arg);
  3491. break;
  3492. case PHONE_REC_CODEC:
  3493. retval = set_rec_codec(board, arg);
  3494. break;
  3495. case PHONE_VAD:
  3496. ixj_vad(board, arg);
  3497. break;
  3498. case PHONE_REC_START:
  3499. ixj_record_start(board);
  3500. break;
  3501. case PHONE_REC_STOP:
  3502. ixj_record_stop(board);
  3503. break;
  3504. case PHONE_REC_DEPTH:
  3505. set_rec_depth(board, arg);
  3506. break;
  3507. case PHONE_REC_VOLUME:
  3508. set_rec_volume(board, arg);
  3509. break;
  3510. case PHONE_REC_LEVEL:
  3511. retval = get_rec_level(board);
  3512. break;
  3513. case IXJCTL_AEC_START:
  3514. ixj_aec_start(board, arg);
  3515. break;
  3516. case IXJCTL_AEC_STOP:
  3517. aec_stop(board);
  3518. break;
  3519. case IXJCTL_AEC_GET_LEVEL:
  3520. retval = j->aec_level;
  3521. break;
  3522. case PHONE_PLAY_CODEC:
  3523. retval = set_play_codec(board, arg);
  3524. break;
  3525. case PHONE_PLAY_START:
  3526. ixj_play_start(board);
  3527. break;
  3528. case PHONE_PLAY_STOP:
  3529. ixj_play_stop(board);
  3530. break;
  3531. case PHONE_PLAY_DEPTH:
  3532. set_play_depth(board, arg);
  3533. break;
  3534. case PHONE_PLAY_VOLUME:
  3535. set_play_volume(board, arg);
  3536. break;
  3537. case PHONE_PLAY_LEVEL:
  3538. retval = get_play_level(board);
  3539. break;
  3540. case IXJCTL_DSP_TYPE:
  3541. retval = (j->dsp.high << 8) + j->dsp.low;
  3542. break;
  3543. case IXJCTL_DSP_VERSION:
  3544. retval = (j->ver.high << 8) + j->ver.low;
  3545. break;
  3546. case IXJCTL_HZ:
  3547. hertz = arg;
  3548. break;
  3549. case IXJCTL_RATE:
  3550. if (arg > hertz)
  3551. retval = -1;
  3552. else
  3553. samplerate = arg;
  3554. break;
  3555. case IXJCTL_DRYBUFFER_READ:
  3556. put_user(j->drybuffer, (unsigned long *) arg);
  3557. break;
  3558. case IXJCTL_DRYBUFFER_CLEAR:
  3559. j->drybuffer = 0;
  3560. break;
  3561. case IXJCTL_FRAMES_READ:
  3562. put_user(j->framesread, (unsigned long *) arg);
  3563. break;
  3564. case IXJCTL_FRAMES_WRITTEN:
  3565. put_user(j->frameswritten, (unsigned long *) arg);
  3566. break;
  3567. case IXJCTL_READ_WAIT:
  3568. put_user(j->read_wait, (unsigned long *) arg);
  3569. break;
  3570. case IXJCTL_WRITE_WAIT:
  3571. put_user(j->write_wait, (unsigned long *) arg);
  3572. break;
  3573. case PHONE_MAXRINGS:
  3574. j->maxrings = arg;
  3575. break;
  3576. case PHONE_SET_TONE_ON_TIME:
  3577. ixj_set_tone_on(arg, board);
  3578. break;
  3579. case PHONE_SET_TONE_OFF_TIME:
  3580. ixj_set_tone_off(arg, board);
  3581. break;
  3582. case PHONE_GET_TONE_ON_TIME:
  3583. if (ixj_get_tone_on(board)) {
  3584. retval = -1;
  3585. } else {
  3586. retval = (j->ssr.high << 8) + j->ssr.low;
  3587. }
  3588. break;
  3589. case PHONE_GET_TONE_OFF_TIME:
  3590. if (ixj_get_tone_off(board)) {
  3591. retval = -1;
  3592. } else {
  3593. retval = (j->ssr.high << 8) + j->ssr.low;
  3594. }
  3595. break;
  3596. case PHONE_PLAY_TONE:
  3597. if (!j->tone_state)
  3598. ixj_play_tone(board, arg);
  3599. break;
  3600. case PHONE_GET_TONE_STATE:
  3601. retval = j->tone_state;
  3602. break;
  3603. case PHONE_DTMF_READY:
  3604. retval = j->ex.bits.dtmf_ready;
  3605. break;
  3606. case PHONE_GET_DTMF:
  3607. if (ixj_hookstate(board)) {
  3608. if (j->dtmf_rp != j->dtmf_wp) {
  3609. retval = j->dtmfbuffer[j->dtmf_rp];
  3610. j->dtmf_rp++;
  3611. if (j->dtmf_rp == 79)
  3612. j->dtmf_rp = 0;
  3613. if (j->dtmf_rp == j->dtmf_wp) {
  3614. j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
  3615. }
  3616. }
  3617. }
  3618. break;
  3619. case PHONE_GET_DTMF_ASCII:
  3620. if (ixj_hookstate(board)) {
  3621. if (j->dtmf_rp != j->dtmf_wp) {
  3622. switch (j->dtmfbuffer[j->dtmf_rp]) {
  3623. case 10:
  3624. retval = 42; //'*';
  3625. break;
  3626. case 11:
  3627. retval = 48; //'0';
  3628. break;
  3629. case 12:
  3630. retval = 35; //'#';
  3631. break;
  3632. case 28:
  3633. retval = 65; //'A';
  3634. break;
  3635. case 29:
  3636. retval = 66; //'B';
  3637. break;
  3638. case 30:
  3639. retval = 67; //'C';
  3640. break;
  3641. case 31:
  3642. retval = 68; //'D';
  3643. break;
  3644. default:
  3645. retval = 48 + j->dtmfbuffer[j->dtmf_rp];
  3646. break;
  3647. }
  3648. j->dtmf_rp++;
  3649. if (j->dtmf_rp == 79)
  3650. j->dtmf_rp = 0;
  3651. //          if(j->dtmf_rp == j->dtmf_wp)
  3652. {
  3653. j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
  3654. }
  3655. }
  3656. }
  3657. break;
  3658. case PHONE_DTMF_OOB:
  3659. j->flags.dtmf_oob = arg;
  3660. break;
  3661. case PHONE_DIALTONE:
  3662. ixj_dialtone(board);
  3663. break;
  3664. case PHONE_BUSY:
  3665. ixj_busytone(board);
  3666. break;
  3667. case PHONE_RINGBACK:
  3668. ixj_ringback(board);
  3669. break;
  3670. case PHONE_CPT_STOP:
  3671. ixj_cpt_stop(board);
  3672. break;
  3673. case IXJCTL_DSP_IDLE:
  3674. idle(board);
  3675. break;
  3676. case IXJCTL_MIXER:
  3677. ixj_mixer(arg, board);
  3678. break;
  3679. case IXJCTL_DAA_COEFF_SET:
  3680. switch (arg) {
  3681. case DAA_US:
  3682. DAA_Coeff_US(board);
  3683. retval = ixj_daa_write(board);
  3684. break;
  3685. case DAA_UK:
  3686. DAA_Coeff_UK(board);
  3687. retval = ixj_daa_write(board);
  3688. break;
  3689. case DAA_FRANCE:
  3690. DAA_Coeff_France(board);
  3691. retval = ixj_daa_write(board);
  3692. break;
  3693. case DAA_GERMANY:
  3694. DAA_Coeff_Germany(board);
  3695. retval = ixj_daa_write(board);
  3696. break;
  3697. case DAA_AUSTRALIA:
  3698. DAA_Coeff_Australia(board);
  3699. retval = ixj_daa_write(board);
  3700. break;
  3701. case DAA_JAPAN:
  3702. DAA_Coeff_Japan(board);
  3703. retval = ixj_daa_write(board);
  3704. break;
  3705. default:
  3706. retval = 1;
  3707. break;
  3708. }
  3709. break;
  3710. case IXJCTL_DAA_AGAIN:
  3711. ixj_daa_cr4(board, arg | 0x02);
  3712. break;
  3713. case IXJCTL_PSTN_LINETEST:
  3714. retval = ixj_linetest(board);
  3715. break;
  3716. case IXJCTL_CID:
  3717. if (copy_to_user((char *) arg, &j->cid, sizeof(IXJ_CID)))
  3718. return -EFAULT;
  3719. j->ex.bits.caller_id = 0;
  3720. break;
  3721. case IXJCTL_WINK_DURATION:
  3722. j->winktime = arg;
  3723. break;
  3724. case IXJCTL_PORT:
  3725. if (arg)
  3726. retval = ixj_set_port(board, arg);
  3727. else
  3728. retval = j->port;
  3729. break;
  3730. case IXJCTL_POTS_PSTN:
  3731. retval = ixj_set_pots(board, arg);
  3732. break;
  3733. case PHONE_CAPABILITIES:
  3734. retval = j->caps;
  3735. break;
  3736. case PHONE_CAPABILITIES_LIST:
  3737. if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps))
  3738.  return -EFAULT;
  3739. break;
  3740. case PHONE_CAPABILITIES_CHECK:
  3741. retval = capabilities_check(board, (struct phone_capability *) arg);
  3742. break;