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

流媒体/Mpeg4/MP4

开发平台:

C/C++

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