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

Linux/Unix编程

开发平台:

Unix_Linux

  1. checksum %= 256;
  2. checksum ^= 0xFF;
  3. checksum += 1;
  4. ixj_write_cid_byte(j, (char) checksum);
  5. pad = j->fskdcnt % 240;
  6. if (pad) {
  7. pad = 240 - pad;
  8. }
  9. ixj_pad_fsk(j, pad);
  10. }
  11. static void ixj_write_frame(IXJ *j)
  12. {
  13. int cnt, frame_count, dly;
  14. IXJ_WORD dat;
  15. BYTES blankword;
  16. frame_count = 0;
  17. if(j->flags.cidplay) {
  18. for(cnt = 0; cnt < 480; cnt++) {
  19. if (!(cnt % 16) && !IsTxReady(j)) {
  20. dly = 0;
  21. while (!IsTxReady(j)) {
  22. if (dly++ > 5) {
  23. dly = 0;
  24. break;
  25. }
  26. udelay(10);
  27. }
  28. }
  29. dat.word = j->fskdata[j->cidcnt++];
  30. outb_p(dat.bytes.low, j->DSPbase + 0x0C);
  31. outb_p(dat.bytes.high, j->DSPbase + 0x0D);
  32. cnt++;
  33. }
  34. if(j->cidcnt >= j->fskdcnt) {
  35. ixj_post_cid(j);
  36. }
  37. /* This may seem rude, but if we just played one frame of FSK data for CallerID
  38.    and there is real audio data in the buffer, we need to throw it away because 
  39.    we just used it's time slot */
  40. if (j->write_buffer_rp > j->write_buffer_wp) {
  41. j->write_buffer_rp += j->cid_play_frame_size * 2;
  42. if (j->write_buffer_rp >= j->write_buffer_end) {
  43. j->write_buffer_rp = j->write_buffer;
  44. }
  45. j->write_buffers_empty++;
  46. wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
  47. wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
  48. }
  49. } else if (j->write_buffer && j->write_buffers_empty < 1) { 
  50. if (j->write_buffer_wp > j->write_buffer_rp) {
  51. frame_count =
  52.     (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
  53. }
  54. if (j->write_buffer_rp > j->write_buffer_wp) {
  55. frame_count =
  56.     (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
  57.     (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
  58. }
  59. if (frame_count >= 1) {
  60. if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
  61. switch (j->play_mode) {
  62. case PLAYBACK_MODE_ULAW:
  63. case PLAYBACK_MODE_ALAW:
  64. blankword.low = blankword.high = 0xFF;
  65. break;
  66. case PLAYBACK_MODE_8LINEAR:
  67. case PLAYBACK_MODE_16LINEAR:
  68. blankword.low = blankword.high = 0x00;
  69. break;
  70. case PLAYBACK_MODE_8LINEAR_WSS:
  71. blankword.low = blankword.high = 0x80;
  72. break;
  73. }
  74. for (cnt = 0; cnt < 16; cnt++) {
  75. if (!(cnt % 16) && !IsTxReady(j)) {
  76. dly = 0;
  77. while (!IsTxReady(j)) {
  78. if (dly++ > 5) {
  79. dly = 0;
  80. break;
  81. }
  82. udelay(10);
  83. }
  84. }
  85. outb_p((blankword.low), j->DSPbase + 0x0C);
  86. outb_p((blankword.high), j->DSPbase + 0x0D);
  87. }
  88. j->flags.play_first_frame = 0;
  89. } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
  90. for (cnt = 0; cnt < 24; cnt++) {
  91. if(cnt == 12) {
  92. blankword.low = 0x02;
  93. blankword.high = 0x00;
  94. }
  95. else {
  96. blankword.low = blankword.high = 0x00;
  97. }
  98. if (!(cnt % 16) && !IsTxReady(j)) {
  99. dly = 0;
  100. while (!IsTxReady(j)) {
  101. if (dly++ > 5) {
  102. dly = 0;
  103. break;
  104. }
  105. udelay(10);
  106. }
  107. }
  108. outb_p((blankword.low), j->DSPbase + 0x0C);
  109. outb_p((blankword.high), j->DSPbase + 0x0D);
  110. }
  111. j->flags.play_first_frame = 0;
  112. }
  113. for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
  114. if (!(cnt % 16) && !IsTxReady(j)) {
  115. dly = 0;
  116. while (!IsTxReady(j)) {
  117. if (dly++ > 5) {
  118. dly = 0;
  119. break;
  120. }
  121. udelay(10);
  122. }
  123. }
  124. /* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */
  125. if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
  126. if(j->write_buffer_rp + cnt == 0 && j->write_buffer_rp + cnt + 1 == 0 && j->write_buffer_rp + cnt + 2 == 0 &&
  127.    j->write_buffer_rp + cnt + 3 == 0 && j->write_buffer_rp + cnt + 4 == 0 && j->write_buffer_rp + cnt + 5 == 0 &&
  128.    j->write_buffer_rp + cnt + 6 == 0 && j->write_buffer_rp + cnt + 7 == 0 && j->write_buffer_rp + cnt + 8 == 0 &&
  129.    j->write_buffer_rp + cnt + 9 == 0) {
  130. /* someone is trying to write silence lets make this a type 0 frame. */
  131. outb_p(0x00, j->DSPbase + 0x0C);
  132. outb_p(0x00, j->DSPbase + 0x0D);
  133. } else {
  134. /* so all other frames are type 1. */
  135. outb_p(0x01, j->DSPbase + 0x0C);
  136. outb_p(0x00, j->DSPbase + 0x0D);
  137. }
  138. }
  139. outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
  140. outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
  141. *(j->write_buffer_rp + cnt) = 0;
  142. *(j->write_buffer_rp + cnt + 1) = 0;
  143. }
  144. j->write_buffer_rp += j->play_frame_size * 2;
  145. if (j->write_buffer_rp >= j->write_buffer_end) {
  146. j->write_buffer_rp = j->write_buffer;
  147. }
  148. j->write_buffers_empty++;
  149. wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
  150. wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
  151. ++j->frameswritten;
  152. }
  153. } else {
  154. j->drybuffer++;
  155. }
  156. if(j->ixj_signals[SIG_WRITE_READY]) {
  157. ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
  158. }
  159. }
  160. static int idle(IXJ *j)
  161. {
  162. if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
  163. return 0;
  164. if (j->ssr.high || j->ssr.low) {
  165. return 0;
  166. } else {
  167. j->play_mode = -1;
  168. j->flags.playing = 0;
  169. j->rec_mode = -1;
  170. j->flags.recording = 0;
  171. return 1;
  172.         }
  173. }
  174. static int set_base_frame(IXJ *j, int size)
  175. {
  176. unsigned short cmd;
  177. int cnt;
  178. idle(j);
  179. j->cid_play_aec_level = j->aec_level;
  180. aec_stop(j);
  181. for (cnt = 0; cnt < 10; cnt++) {
  182. if (idle(j))
  183. break;
  184. }
  185. if (j->ssr.high || j->ssr.low)
  186. return -1;
  187. if (j->dsp.low != 0x20) {
  188. switch (size) {
  189. case 30:
  190. cmd = 0x07F0;
  191. /* Set Base Frame Size to 240 pg9-10 8021 */
  192. break;
  193. case 20:
  194. cmd = 0x07A0;
  195. /* Set Base Frame Size to 160 pg9-10 8021 */
  196. break;
  197. case 10:
  198. cmd = 0x0750;
  199. /* Set Base Frame Size to 80 pg9-10 8021 */
  200. break;
  201. default:
  202. return -1;
  203. }
  204. } else {
  205. if (size == 30)
  206. return size;
  207. else
  208. return -1;
  209. }
  210. if (ixj_WriteDSPCommand(cmd, j)) {
  211. j->baseframe.high = j->baseframe.low = 0xFF;
  212. return -1;
  213. } else {
  214. j->baseframe.high = j->ssr.high;
  215. j->baseframe.low = j->ssr.low;
  216. /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
  217. if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
  218. return -1;
  219. }
  220. }
  221. ixj_aec_start(j, j->cid_play_aec_level);
  222. return size;
  223. }
  224. static int set_rec_codec(IXJ *j, int rate)
  225. {
  226. int retval = 0;
  227. j->rec_codec = rate;
  228. switch (rate) {
  229. case G723_63:
  230. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  231. j->rec_frame_size = 12;
  232. j->rec_mode = 0;
  233. } else {
  234. retval = 1;
  235. }
  236. break;
  237. case G723_53:
  238. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  239. j->rec_frame_size = 10;
  240. j->rec_mode = 0;
  241. } else {
  242. retval = 1;
  243. }
  244. break;
  245. case TS85:
  246. if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
  247. j->rec_frame_size = 16;
  248. j->rec_mode = 0;
  249. } else {
  250. retval = 1;
  251. }
  252. break;
  253. case TS48:
  254. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  255. j->rec_frame_size = 9;
  256. j->rec_mode = 0;
  257. } else {
  258. retval = 1;
  259. }
  260. break;
  261. case TS41:
  262. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  263. j->rec_frame_size = 8;
  264. j->rec_mode = 0;
  265. } else {
  266. retval = 1;
  267. }
  268. break;
  269. case G728:
  270. if (j->dsp.low != 0x20) {
  271. j->rec_frame_size = 48;
  272. j->rec_mode = 0;
  273. } else {
  274. retval = 1;
  275. }
  276. break;
  277. case G729:
  278. if (j->dsp.low != 0x20) {
  279. if (!j->flags.g729_loaded) {
  280. retval = 1;
  281. break;
  282. }
  283. switch (j->baseframe.low) {
  284. case 0xA0:
  285. j->rec_frame_size = 10;
  286. break;
  287. case 0x50:
  288. j->rec_frame_size = 5;
  289. break;
  290. default:
  291. j->rec_frame_size = 15;
  292. break;
  293. }
  294. j->rec_mode = 0;
  295. } else {
  296. retval = 1;
  297. }
  298. break;
  299. case G729B:
  300. if (j->dsp.low != 0x20) {
  301. if (!j->flags.g729_loaded) {
  302. retval = 1;
  303. break;
  304. }
  305. switch (j->baseframe.low) {
  306. case 0xA0:
  307. j->rec_frame_size = 12;
  308. break;
  309. case 0x50:
  310. j->rec_frame_size = 6;
  311. break;
  312. default:
  313. j->rec_frame_size = 18;
  314. break;
  315. }
  316. j->rec_mode = 0;
  317. } else {
  318. retval = 1;
  319. }
  320. break;
  321. case ULAW:
  322. switch (j->baseframe.low) {
  323. case 0xA0:
  324. j->rec_frame_size = 80;
  325. break;
  326. case 0x50:
  327. j->rec_frame_size = 40;
  328. break;
  329. default:
  330. j->rec_frame_size = 120;
  331. break;
  332. }
  333. j->rec_mode = 4;
  334. break;
  335. case ALAW:
  336. switch (j->baseframe.low) {
  337. case 0xA0:
  338. j->rec_frame_size = 80;
  339. break;
  340. case 0x50:
  341. j->rec_frame_size = 40;
  342. break;
  343. default:
  344. j->rec_frame_size = 120;
  345. break;
  346. }
  347. j->rec_mode = 4;
  348. break;
  349. case LINEAR16:
  350. switch (j->baseframe.low) {
  351. case 0xA0:
  352. j->rec_frame_size = 160;
  353. break;
  354. case 0x50:
  355. j->rec_frame_size = 80;
  356. break;
  357. default:
  358. j->rec_frame_size = 240;
  359. break;
  360. }
  361. j->rec_mode = 5;
  362. break;
  363. case LINEAR8:
  364. switch (j->baseframe.low) {
  365. case 0xA0:
  366. j->rec_frame_size = 80;
  367. break;
  368. case 0x50:
  369. j->rec_frame_size = 40;
  370. break;
  371. default:
  372. j->rec_frame_size = 120;
  373. break;
  374. }
  375. j->rec_mode = 6;
  376. break;
  377. case WSS:
  378. switch (j->baseframe.low) {
  379. case 0xA0:
  380. j->rec_frame_size = 80;
  381. break;
  382. case 0x50:
  383. j->rec_frame_size = 40;
  384. break;
  385. default:
  386. j->rec_frame_size = 120;
  387. break;
  388. }
  389. j->rec_mode = 7;
  390. break;
  391. default:
  392. j->rec_frame_size = 0;
  393. j->rec_mode = -1;
  394. if (j->read_buffer) {
  395. kfree(j->read_buffer);
  396. j->read_buffer = NULL;
  397. j->read_buffer_size = 0;
  398. }
  399. retval = 1;
  400. break;
  401. }
  402. return retval;
  403. }
  404. static int ixj_record_start(IXJ *j)
  405. {
  406. unsigned short cmd = 0x0000;
  407. if (j->read_buffer) {
  408. ixj_record_stop(j);
  409. }
  410. j->flags.recording = 1;
  411. ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
  412. if(ixjdebug & 0x0002)
  413. printk("IXJ %d Starting Record Codec %d at %ldn", j->board, j->rec_codec, jiffies);
  414. if (!j->rec_mode) {
  415. switch (j->rec_codec) {
  416. case G723_63:
  417. cmd = 0x5131;
  418. break;
  419. case G723_53:
  420. cmd = 0x5132;
  421. break;
  422. case TS85:
  423. cmd = 0x5130; /* TrueSpeech 8.5 */
  424. break;
  425. case TS48:
  426. cmd = 0x5133; /* TrueSpeech 4.8 */
  427. break;
  428. case TS41:
  429. cmd = 0x5134; /* TrueSpeech 4.1 */
  430. break;
  431. case G728:
  432. cmd = 0x5135;
  433. break;
  434. case G729:
  435. case G729B:
  436. cmd = 0x5136;
  437. break;
  438. default:
  439. return 1;
  440. }
  441. if (ixj_WriteDSPCommand(cmd, j))
  442. return -1;
  443. }
  444. if (!j->read_buffer) {
  445. if (!j->read_buffer)
  446. j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
  447. if (!j->read_buffer) {
  448. printk("Read buffer allocation for ixj board %d failed!n", j->board);
  449. return -ENOMEM;
  450. }
  451. }
  452. j->read_buffer_size = j->rec_frame_size * 2;
  453. if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
  454. return -1;
  455. switch (j->rec_mode) {
  456. case 0:
  457. cmd = 0x1C03; /* Record C1 */
  458. break;
  459. case 4:
  460. if (j->ver.low == 0x12) {
  461. cmd = 0x1E03; /* Record C1 */
  462. } else {
  463. cmd = 0x1E01; /* Record C1 */
  464. }
  465. break;
  466. case 5:
  467. if (j->ver.low == 0x12) {
  468. cmd = 0x1E83; /* Record C1 */
  469. } else {
  470. cmd = 0x1E81; /* Record C1 */
  471. }
  472. break;
  473. case 6:
  474. if (j->ver.low == 0x12) {
  475. cmd = 0x1F03; /* Record C1 */
  476. } else {
  477. cmd = 0x1F01; /* Record C1 */
  478. }
  479. break;
  480. case 7:
  481. if (j->ver.low == 0x12) {
  482. cmd = 0x1F83; /* Record C1 */
  483. } else {
  484. cmd = 0x1F81; /* Record C1 */
  485. }
  486. break;
  487. }
  488. if (ixj_WriteDSPCommand(cmd, j))
  489. return -1;
  490. if (j->flags.playing) {
  491. ixj_aec_start(j, j->aec_level);
  492. }
  493. return 0;
  494. }
  495. static void ixj_record_stop(IXJ *j)
  496. {
  497. if(ixjdebug & 0x0002)
  498. printk("IXJ %d Stopping Record Codec %d at %ldn", j->board, j->rec_codec, jiffies);
  499. if (j->read_buffer) {
  500. kfree(j->read_buffer);
  501. j->read_buffer = NULL;
  502. j->read_buffer_size = 0;
  503. }
  504. if (j->rec_mode > -1) {
  505. ixj_WriteDSPCommand(0x5120, j);
  506. j->rec_mode = -1;
  507. }
  508. j->flags.recording = 0;
  509. }
  510. static void ixj_vad(IXJ *j, int arg)
  511. {
  512. if (arg)
  513. ixj_WriteDSPCommand(0x513F, j);
  514. else
  515. ixj_WriteDSPCommand(0x513E, j);
  516. }
  517. static void set_rec_depth(IXJ *j, int depth)
  518. {
  519. if (depth > 60)
  520. depth = 60;
  521. if (depth < 0)
  522. depth = 0;
  523. ixj_WriteDSPCommand(0x5180 + depth, j);
  524. }
  525. static void set_dtmf_prescale(IXJ *j, int volume)
  526. {
  527. ixj_WriteDSPCommand(0xCF07, j);
  528. ixj_WriteDSPCommand(volume, j);
  529. }
  530. static int get_dtmf_prescale(IXJ *j)
  531. {
  532. ixj_WriteDSPCommand(0xCF05, j);
  533. return j->ssr.high << 8 | j->ssr.low;
  534. }
  535. static void set_rec_volume(IXJ *j, int volume)
  536. {
  537. if(j->aec_level == AEC_AGC) {
  538. if (ixjdebug & 0x0002)
  539. printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4xn", j->board, volume);
  540. ixj_WriteDSPCommand(0xCF96, j);
  541. ixj_WriteDSPCommand(volume, j);
  542. } else {
  543. if (ixjdebug & 0x0002)
  544. printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4xn", j->board, volume);
  545. ixj_WriteDSPCommand(0xCF03, j);
  546. ixj_WriteDSPCommand(volume, j);
  547. }
  548. }
  549. static int set_rec_volume_linear(IXJ *j, int volume)
  550. {
  551. int newvolume, dsprecmax;
  552. if (ixjdebug & 0x0002)
  553. printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4xn", j->board, volume);
  554. if(volume > 100 || volume < 0) {
  555.   return -1;
  556. }
  557. /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
  558. switch (j->cardtype) {
  559. case QTI_PHONEJACK:
  560. dsprecmax = 0x440;
  561. break;
  562. case QTI_LINEJACK:
  563. dsprecmax = 0x180;
  564. ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
  565. ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
  566. ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
  567. break;
  568. case QTI_PHONEJACK_LITE:
  569. dsprecmax = 0x4C0;
  570. break;
  571. case QTI_PHONEJACK_PCI:
  572. dsprecmax = 0x100;
  573. break;
  574. case QTI_PHONECARD:
  575. dsprecmax = 0x400;
  576. break;
  577. default:
  578. return -1;
  579. }
  580. newvolume = (dsprecmax * volume) / 100;
  581. set_rec_volume(j, newvolume);
  582. return 0;
  583. }
  584. static int get_rec_volume(IXJ *j)
  585. {
  586. if(j->aec_level == AEC_AGC) {
  587. if (ixjdebug & 0x0002)
  588. printk(KERN_INFO "Getting AGC Thresholdn");
  589. ixj_WriteDSPCommand(0xCF86, j);
  590. if (ixjdebug & 0x0002)
  591. printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2xn", j->ssr.high, j->ssr.low);
  592. return j->ssr.high << 8 | j->ssr.low;
  593. } else {
  594. if (ixjdebug & 0x0002)
  595. printk(KERN_INFO "Getting Record Volumen");
  596. ixj_WriteDSPCommand(0xCF01, j);
  597. return j->ssr.high << 8 | j->ssr.low;
  598. }
  599. }
  600. static int get_rec_volume_linear(IXJ *j)
  601. {
  602. int volume, newvolume, dsprecmax;
  603. switch (j->cardtype) {
  604. case QTI_PHONEJACK:
  605. dsprecmax = 0x440;
  606. break;
  607. case QTI_LINEJACK:
  608. dsprecmax = 0x180;
  609. break;
  610. case QTI_PHONEJACK_LITE:
  611. dsprecmax = 0x4C0;
  612. break;
  613. case QTI_PHONEJACK_PCI:
  614. dsprecmax = 0x100;
  615. break;
  616. case QTI_PHONECARD:
  617. dsprecmax = 0x400;
  618. break;
  619. default:
  620. return -1;
  621. }
  622. volume = get_rec_volume(j);
  623. newvolume = (volume * 100) / dsprecmax;
  624. if(newvolume > 100)
  625. newvolume = 100;
  626. return newvolume;
  627. }
  628. static int get_rec_level(IXJ *j)
  629. {
  630. int retval;
  631. ixj_WriteDSPCommand(0xCF88, j);
  632. retval = j->ssr.high << 8 | j->ssr.low;
  633. retval = (retval * 256) / 240;
  634. return retval;
  635. }
  636. static void ixj_aec_start(IXJ *j, int level)
  637. {
  638. j->aec_level = level;
  639. if (ixjdebug & 0x0002)
  640. printk(KERN_INFO "AGC set = 0x%2.2xn", j->aec_level);
  641. if (!level) {
  642. aec_stop(j);
  643. } else {
  644. if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
  645. ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
  646. ixj_WriteDSPCommand(0x0300, j);
  647. }
  648. ixj_WriteDSPCommand(0xB001, j); /* AEC On */
  649. ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
  650. switch (level) {
  651. case AEC_LOW:
  652. ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
  653. ixj_WriteDSPCommand(0xE011, j);
  654. ixj_WriteDSPCommand(0xFFFF, j);
  655. ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
  656. ixj_WriteDSPCommand(0x0000, j); /* to off */
  657. break;
  658. case AEC_MED:
  659. ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
  660. ixj_WriteDSPCommand(0xE011, j);
  661. ixj_WriteDSPCommand(0x0080, j);
  662. ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
  663. ixj_WriteDSPCommand(0x0000, j); /* to off */
  664. break;
  665. case AEC_HIGH:
  666. ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
  667. ixj_WriteDSPCommand(0xE011, j);
  668. ixj_WriteDSPCommand(0x0080, j);
  669. ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
  670. ixj_WriteDSPCommand(0x0000, j); /* to off */
  671. break;
  672. case AEC_AGC:
  673.                         /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
  674. ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
  675. ixj_WriteDSPCommand(0xE011, j);
  676. ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
  677. ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
  678. if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
  679. ixj_WriteDSPCommand(0x0224, j);
  680. else
  681. ixj_WriteDSPCommand(0x1224, j);
  682. ixj_WriteDSPCommand(0xE014, j);
  683. ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
  684. ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
  685. /* Now we can set the AGC initial parameters and turn it on */
  686. ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
  687. ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
  688. ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
  689. ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
  690. ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
  691. ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
  692. ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
  693. ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
  694. ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
  695. ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
  696. ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
  697. ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
  698. ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
  699. ixj_WriteDSPCommand(0x1200, j); /* to 25% */
  700. ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
  701. ixj_WriteDSPCommand(0x0001, j); /* to on */
  702. break;
  703. case AEC_AUTO:
  704. ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
  705. ixj_WriteDSPCommand(0xE011, j);
  706. ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
  707. ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
  708. if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
  709. ixj_WriteDSPCommand(0x0224, j);
  710. else
  711. ixj_WriteDSPCommand(0x1224, j);
  712. ixj_WriteDSPCommand(0xE014, j);
  713. ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
  714. ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
  715. break;
  716. }
  717. }
  718. }
  719. static void aec_stop(IXJ *j)
  720. {
  721. j->aec_level = AEC_OFF;
  722. if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
  723. ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
  724. ixj_WriteDSPCommand(0x0700, j);
  725. }
  726. if (j->play_mode != -1 && j->rec_mode != -1)
  727. {
  728. ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
  729. }
  730. }
  731. static int set_play_codec(IXJ *j, int rate)
  732. {
  733. int retval = 0;
  734. j->play_codec = rate;
  735. switch (rate) {
  736. case G723_63:
  737. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  738. j->play_frame_size = 12;
  739. j->play_mode = 0;
  740. } else {
  741. retval = 1;
  742. }
  743. break;
  744. case G723_53:
  745. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  746. j->play_frame_size = 10;
  747. j->play_mode = 0;
  748. } else {
  749. retval = 1;
  750. }
  751. break;
  752. case TS85:
  753. if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
  754. j->play_frame_size = 16;
  755. j->play_mode = 0;
  756. } else {
  757. retval = 1;
  758. }
  759. break;
  760. case TS48:
  761. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  762. j->play_frame_size = 9;
  763. j->play_mode = 0;
  764. } else {
  765. retval = 1;
  766. }
  767. break;
  768. case TS41:
  769. if (j->ver.low != 0x12 || ixj_convert_loaded) {
  770. j->play_frame_size = 8;
  771. j->play_mode = 0;
  772. } else {
  773. retval = 1;
  774. }
  775. break;
  776. case G728:
  777. if (j->dsp.low != 0x20) {
  778. j->play_frame_size = 48;
  779. j->play_mode = 0;
  780. } else {
  781. retval = 1;
  782. }
  783. break;
  784. case G729:
  785. if (j->dsp.low != 0x20) {
  786. if (!j->flags.g729_loaded) {
  787. retval = 1;
  788. break;
  789. }
  790. switch (j->baseframe.low) {
  791. case 0xA0:
  792. j->play_frame_size = 10;
  793. break;
  794. case 0x50:
  795. j->play_frame_size = 5;
  796. break;
  797. default:
  798. j->play_frame_size = 15;
  799. break;
  800. }
  801. j->play_mode = 0;
  802. } else {
  803. retval = 1;
  804. }
  805. break;
  806. case G729B:
  807. if (j->dsp.low != 0x20) {
  808. if (!j->flags.g729_loaded) {
  809. retval = 1;
  810. break;
  811. }
  812. switch (j->baseframe.low) {
  813. case 0xA0:
  814. j->play_frame_size = 12;
  815. break;
  816. case 0x50:
  817. j->play_frame_size = 6;
  818. break;
  819. default:
  820. j->play_frame_size = 18;
  821. break;
  822. }
  823. j->play_mode = 0;
  824. } else {
  825. retval = 1;
  826. }
  827. break;
  828. case ULAW:
  829. switch (j->baseframe.low) {
  830. case 0xA0:
  831. j->play_frame_size = 80;
  832. break;
  833. case 0x50:
  834. j->play_frame_size = 40;
  835. break;
  836. default:
  837. j->play_frame_size = 120;
  838. break;
  839. }
  840. j->play_mode = 2;
  841. break;
  842. case ALAW:
  843. switch (j->baseframe.low) {
  844. case 0xA0:
  845. j->play_frame_size = 80;
  846. break;
  847. case 0x50:
  848. j->play_frame_size = 40;
  849. break;
  850. default:
  851. j->play_frame_size = 120;
  852. break;
  853. }
  854. j->play_mode = 2;
  855. break;
  856. case LINEAR16:
  857. switch (j->baseframe.low) {
  858. case 0xA0:
  859. j->play_frame_size = 160;
  860. break;
  861. case 0x50:
  862. j->play_frame_size = 80;
  863. break;
  864. default:
  865. j->play_frame_size = 240;
  866. break;
  867. }
  868. j->play_mode = 6;
  869. break;
  870. case LINEAR8:
  871. switch (j->baseframe.low) {
  872. case 0xA0:
  873. j->play_frame_size = 80;
  874. break;
  875. case 0x50:
  876. j->play_frame_size = 40;
  877. break;
  878. default:
  879. j->play_frame_size = 120;
  880. break;
  881. }
  882. j->play_mode = 4;
  883. break;
  884. case WSS:
  885. switch (j->baseframe.low) {
  886. case 0xA0:
  887. j->play_frame_size = 80;
  888. break;
  889. case 0x50:
  890. j->play_frame_size = 40;
  891. break;
  892. default:
  893. j->play_frame_size = 120;
  894. break;
  895. }
  896. j->play_mode = 5;
  897. break;
  898. default:
  899. j->play_frame_size = 0;
  900. j->play_mode = -1;
  901. if (j->write_buffer) {
  902. kfree(j->write_buffer);
  903. j->write_buffer = NULL;
  904. j->write_buffer_size = 0;
  905. }
  906. retval = 1;
  907. break;
  908. }
  909. return retval;
  910. }
  911. static int ixj_play_start(IXJ *j)
  912. {
  913. unsigned short cmd = 0x0000;
  914. if (j->write_buffer) {
  915. ixj_play_stop(j);
  916. }
  917. if(ixjdebug & 0x0002)
  918. printk("IXJ %d Starting Play Codec %d at %ldn", j->board, j->play_codec, jiffies);
  919. j->flags.playing = 1;
  920. ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
  921. j->flags.play_first_frame = 1;
  922. j->drybuffer = 0;
  923. if (!j->play_mode) {
  924. switch (j->play_codec) {
  925. case G723_63:
  926. cmd = 0x5231;
  927. break;
  928. case G723_53:
  929. cmd = 0x5232;
  930. break;
  931. case TS85:
  932. cmd = 0x5230; /* TrueSpeech 8.5 */
  933. break;
  934. case TS48:
  935. cmd = 0x5233; /* TrueSpeech 4.8 */
  936. break;
  937. case TS41:
  938. cmd = 0x5234; /* TrueSpeech 4.1 */
  939. break;
  940. case G728:
  941. cmd = 0x5235;
  942. break;
  943. case G729:
  944. case G729B:
  945. cmd = 0x5236;
  946. break;
  947. default:
  948. return 1;
  949. }
  950. if (ixj_WriteDSPCommand(cmd, j))
  951. return -1;
  952. }
  953. j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
  954. if (!j->write_buffer) {
  955. printk("Write buffer allocation for ixj board %d failed!n", j->board);
  956. return -ENOMEM;
  957. }
  958. /* j->write_buffers_empty = 2; */
  959. j->write_buffers_empty = 1; 
  960. j->write_buffer_size = j->play_frame_size * 2;
  961. j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
  962. j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
  963. if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
  964. return -1;
  965. switch (j->play_mode) {
  966. case 0:
  967. cmd = 0x2C03;
  968. break;
  969. case 2:
  970. if (j->ver.low == 0x12) {
  971. cmd = 0x2C23;
  972. } else {
  973. cmd = 0x2C21;
  974. }
  975. break;
  976. case 4:
  977. if (j->ver.low == 0x12) {
  978. cmd = 0x2C43;
  979. } else {
  980. cmd = 0x2C41;
  981. }
  982. break;
  983. case 5:
  984. if (j->ver.low == 0x12) {
  985. cmd = 0x2C53;
  986. } else {
  987. cmd = 0x2C51;
  988. }
  989. break;
  990. case 6:
  991. if (j->ver.low == 0x12) {
  992. cmd = 0x2C63;
  993. } else {
  994. cmd = 0x2C61;
  995. }
  996. break;
  997. }
  998. if (ixj_WriteDSPCommand(cmd, j))
  999. return -1;
  1000. if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
  1001. return -1;
  1002. if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
  1003. return -1;
  1004. if (j->flags.recording) {
  1005. ixj_aec_start(j, j->aec_level);
  1006. }
  1007. return 0;
  1008. }
  1009. static void ixj_play_stop(IXJ *j)
  1010. {
  1011. if(ixjdebug & 0x0002)
  1012. printk("IXJ %d Stopping Play Codec %d at %ldn", j->board, j->play_codec, jiffies);
  1013. if (j->write_buffer) {
  1014. kfree(j->write_buffer);
  1015. j->write_buffer = NULL;
  1016. j->write_buffer_size = 0;
  1017. }
  1018. if (j->play_mode > -1) {
  1019. ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers.  8022 reference page 9-40 */
  1020. j->play_mode = -1;
  1021. }
  1022. j->flags.playing = 0;
  1023. }
  1024. static inline int get_play_level(IXJ *j)
  1025. {
  1026. int retval;
  1027. ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
  1028. return j->ssr.high << 8 | j->ssr.low;
  1029. retval = j->ssr.high << 8 | j->ssr.low;
  1030. retval = (retval * 256) / 240;
  1031. return retval;
  1032. }
  1033. static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
  1034. {
  1035. unsigned int mask = 0;
  1036. IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
  1037. poll_wait(file_p, &(j->poll_q), wait);
  1038. if (j->read_buffer_ready > 0)
  1039. mask |= POLLIN | POLLRDNORM; /* readable */
  1040. if (j->write_buffers_empty > 0)
  1041. mask |= POLLOUT | POLLWRNORM; /* writable */
  1042. if (j->ex.bytes)
  1043. mask |= POLLPRI;
  1044. return mask;
  1045. }
  1046. static int ixj_play_tone(IXJ *j, char tone)
  1047. {
  1048. if (!j->tone_state) {
  1049. if(ixjdebug & 0x0002) {
  1050. printk("IXJ %d starting tone %d at %ldn", j->board, tone, jiffies);
  1051. }
  1052. if (j->dsp.low == 0x20) {
  1053. idle(j);
  1054. }
  1055. j->tone_start_jif = jiffies;
  1056. j->tone_state = 1;
  1057. }
  1058. j->tone_index = tone;
  1059. if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
  1060. return -1;
  1061. return 0;
  1062. }
  1063. static int ixj_set_tone_on(unsigned short arg, IXJ *j)
  1064. {
  1065. j->tone_on_time = arg;
  1066. if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
  1067. return -1;
  1068. if (ixj_WriteDSPCommand(arg, j))
  1069. return -1;
  1070. return 0;
  1071. }
  1072. static int SCI_WaitHighSCI(IXJ *j)
  1073. {
  1074. int cnt;
  1075. j->pld_scrr.byte = inb_p(j->XILINXbase);
  1076. if (!j->pld_scrr.bits.sci) {
  1077. for (cnt = 0; cnt < 10; cnt++) {
  1078. udelay(32);
  1079. j->pld_scrr.byte = inb_p(j->XILINXbase);
  1080. if ((j->pld_scrr.bits.sci))
  1081. return 1;
  1082. }
  1083. if (ixjdebug & 0x0001)
  1084. printk(KERN_INFO "SCI Wait High failed %xn", j->pld_scrr.byte);
  1085. return 0;
  1086. } else
  1087. return 1;
  1088. }
  1089. static int SCI_WaitLowSCI(IXJ *j)
  1090. {
  1091. int cnt;
  1092. j->pld_scrr.byte = inb_p(j->XILINXbase);
  1093. if (j->pld_scrr.bits.sci) {
  1094. for (cnt = 0; cnt < 10; cnt++) {
  1095. udelay(32);
  1096. j->pld_scrr.byte = inb_p(j->XILINXbase);
  1097. if (!(j->pld_scrr.bits.sci))
  1098. return 1;
  1099. }
  1100. if (ixjdebug & 0x0001)
  1101. printk(KERN_INFO "SCI Wait Low failed %xn", j->pld_scrr.byte);
  1102. return 0;
  1103. } else
  1104. return 1;
  1105. }
  1106. static int SCI_Control(IXJ *j, int control)
  1107. {
  1108. switch (control) {
  1109. case SCI_End:
  1110. j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
  1111. j->pld_scrw.bits.c1 = 0; /* to no selection */
  1112. break;
  1113. case SCI_Enable_DAA:
  1114. j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
  1115. j->pld_scrw.bits.c1 = 0; /* to write to DAA */
  1116. break;
  1117. case SCI_Enable_Mixer:
  1118. j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
  1119. j->pld_scrw.bits.c1 = 1; /* to write to mixer */
  1120. break;
  1121. case SCI_Enable_EEPROM:
  1122. j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
  1123. j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
  1124. break;
  1125. default:
  1126. return 0;
  1127. break;
  1128. }
  1129. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1130. switch (control) {
  1131. case SCI_End:
  1132. return 1;
  1133. break;
  1134. case SCI_Enable_DAA:
  1135. case SCI_Enable_Mixer:
  1136. case SCI_Enable_EEPROM:
  1137. if (!SCI_WaitHighSCI(j))
  1138. return 0;
  1139. break;
  1140. default:
  1141. return 0;
  1142. break;
  1143. }
  1144. return 1;
  1145. }
  1146. static int SCI_Prepare(IXJ *j)
  1147. {
  1148. if (!SCI_Control(j, SCI_End))
  1149. return 0;
  1150. if (!SCI_WaitLowSCI(j))
  1151. return 0;
  1152. return 1;
  1153. }
  1154. static int ixj_get_mixer(long val, IXJ *j)
  1155. {
  1156. int reg = (val & 0x1F00) >> 8;
  1157.         return j->mix.vol[reg];
  1158. }
  1159. static int ixj_mixer(long val, IXJ *j)
  1160. {
  1161. BYTES bytes;
  1162. bytes.high = (val & 0x1F00) >> 8;
  1163. bytes.low = val & 0x00FF;
  1164.         /* save mixer value so we can get back later on */
  1165.         j->mix.vol[bytes.high] = bytes.low;
  1166. outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
  1167. outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
  1168. SCI_Control(j, SCI_Enable_Mixer);
  1169. SCI_Control(j, SCI_End);
  1170. return 0;
  1171. }
  1172. static int daa_load(BYTES * p_bytes, IXJ *j)
  1173. {
  1174. outb_p(p_bytes->high, j->XILINXbase + 0x03);
  1175. outb_p(p_bytes->low, j->XILINXbase + 0x02);
  1176. if (!SCI_Control(j, SCI_Enable_DAA))
  1177. return 0;
  1178. else
  1179. return 1;
  1180. }
  1181. static int ixj_daa_cr4(IXJ *j, char reg)
  1182. {
  1183. BYTES bytes;
  1184. switch (j->daa_mode) {
  1185. case SOP_PU_SLEEP:
  1186. bytes.high = 0x14;
  1187. break;
  1188. case SOP_PU_RINGING:
  1189. bytes.high = 0x54;
  1190. break;
  1191. case SOP_PU_CONVERSATION:
  1192. bytes.high = 0x94;
  1193. break;
  1194. case SOP_PU_PULSEDIALING:
  1195. bytes.high = 0xD4;
  1196. break;
  1197. }
  1198. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
  1199. switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
  1200. case 0:
  1201. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
  1202. break;
  1203. case 1:
  1204. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
  1205. break;
  1206. case 2:
  1207. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
  1208. break;
  1209. case 3:
  1210. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
  1211. break;
  1212. }
  1213. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
  1214. if (!daa_load(&bytes, j))
  1215. return 0;
  1216. if (!SCI_Prepare(j))
  1217. return 0;
  1218. return 1;
  1219. }
  1220. static char daa_int_read(IXJ *j)
  1221. {
  1222. BYTES bytes;
  1223. if (!SCI_Prepare(j))
  1224. return 0;
  1225. bytes.high = 0x38;
  1226. bytes.low = 0x00;
  1227. outb_p(bytes.high, j->XILINXbase + 0x03);
  1228. outb_p(bytes.low, j->XILINXbase + 0x02);
  1229. if (!SCI_Control(j, SCI_Enable_DAA))
  1230. return 0;
  1231. bytes.high = inb_p(j->XILINXbase + 0x03);
  1232. bytes.low = inb_p(j->XILINXbase + 0x02);
  1233. if (bytes.low != ALISDAA_ID_BYTE) {
  1234. if (ixjdebug & 0x0001)
  1235. printk("Cannot read DAA ID Byte high = %d low = %dn", bytes.high, bytes.low);
  1236. return 0;
  1237. }
  1238. if (!SCI_Control(j, SCI_Enable_DAA))
  1239. return 0;
  1240. if (!SCI_Control(j, SCI_End))
  1241. return 0;
  1242. bytes.high = inb_p(j->XILINXbase + 0x03);
  1243. bytes.low = inb_p(j->XILINXbase + 0x02);
  1244. j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
  1245. return 1;
  1246. }
  1247. static char daa_CR_read(IXJ *j, int cr)
  1248. {
  1249. IXJ_WORD wdata;
  1250. BYTES bytes;
  1251. if (!SCI_Prepare(j))
  1252. return 0;
  1253. switch (j->daa_mode) {
  1254. case SOP_PU_SLEEP:
  1255. bytes.high = 0x30 + cr;
  1256. break;
  1257. case SOP_PU_RINGING:
  1258. bytes.high = 0x70 + cr;
  1259. break;
  1260. case SOP_PU_CONVERSATION:
  1261. bytes.high = 0xB0 + cr;
  1262. break;
  1263. case SOP_PU_PULSEDIALING:
  1264. bytes.high = 0xF0 + cr;
  1265. break;
  1266. }
  1267. bytes.low = 0x00;
  1268. outb_p(bytes.high, j->XILINXbase + 0x03);
  1269. outb_p(bytes.low, j->XILINXbase + 0x02);
  1270. if (!SCI_Control(j, SCI_Enable_DAA))
  1271. return 0;
  1272. bytes.high = inb_p(j->XILINXbase + 0x03);
  1273. bytes.low = inb_p(j->XILINXbase + 0x02);
  1274. if (bytes.low != ALISDAA_ID_BYTE) {
  1275. if (ixjdebug & 0x0001)
  1276. printk("Cannot read DAA ID Byte high = %d low = %dn", bytes.high, bytes.low);
  1277. return 0;
  1278. }
  1279. if (!SCI_Control(j, SCI_Enable_DAA))
  1280. return 0;
  1281. if (!SCI_Control(j, SCI_End))
  1282. return 0;
  1283. wdata.word = inw_p(j->XILINXbase + 0x02);
  1284. switch(cr){
  1285. case 5:
  1286. j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
  1287. break;
  1288. case 4:
  1289. j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
  1290. break;
  1291. case 3:
  1292. j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
  1293. break;
  1294. case 2:
  1295. j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
  1296. break;
  1297. case 1:
  1298. j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
  1299. break;
  1300. case 0:
  1301. j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
  1302. break;
  1303. default:
  1304. return 0;
  1305. }
  1306. return 1;
  1307. }
  1308. static int ixj_daa_cid_reset(IXJ *j)
  1309. {
  1310. int i;
  1311. BYTES bytes;
  1312. if (ixjdebug & 0x0002)
  1313. printk("DAA Clearing CID ramn");
  1314. if (!SCI_Prepare(j))
  1315. return 0;
  1316. bytes.high = 0x58;
  1317. bytes.low = 0x00;
  1318. outb_p(bytes.high, j->XILINXbase + 0x03);
  1319. outb_p(bytes.low, j->XILINXbase + 0x02);
  1320. if (!SCI_Control(j, SCI_Enable_DAA))
  1321. return 0;
  1322. if (!SCI_WaitHighSCI(j))
  1323. return 0;
  1324. for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
  1325. bytes.high = bytes.low = 0x00;
  1326. outb_p(bytes.high, j->XILINXbase + 0x03);
  1327. if (i < ALISDAA_CALLERID_SIZE - 1)
  1328. outb_p(bytes.low, j->XILINXbase + 0x02);
  1329. if (!SCI_Control(j, SCI_Enable_DAA))
  1330. return 0;
  1331. if (!SCI_WaitHighSCI(j))
  1332. return 0;
  1333. }
  1334. if (!SCI_Control(j, SCI_End))
  1335. return 0;
  1336. if (ixjdebug & 0x0002)
  1337. printk("DAA CID ram clearedn");
  1338. return 1;
  1339. }
  1340. static int ixj_daa_cid_read(IXJ *j)
  1341. {
  1342. int i;
  1343. BYTES bytes;
  1344. char CID[ALISDAA_CALLERID_SIZE], mContinue;
  1345. char *pIn, *pOut;
  1346. if (!SCI_Prepare(j))
  1347. return 0;
  1348. bytes.high = 0x78;
  1349. bytes.low = 0x00;
  1350. outb_p(bytes.high, j->XILINXbase + 0x03);
  1351. outb_p(bytes.low, j->XILINXbase + 0x02);
  1352. if (!SCI_Control(j, SCI_Enable_DAA))
  1353. return 0;
  1354. if (!SCI_WaitHighSCI(j))
  1355. return 0;
  1356. bytes.high = inb_p(j->XILINXbase + 0x03);
  1357. bytes.low = inb_p(j->XILINXbase + 0x02);
  1358. if (bytes.low != ALISDAA_ID_BYTE) {
  1359. if (ixjdebug & 0x0001)
  1360. printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %dn", bytes.high, bytes.low);
  1361. return 0;
  1362. }
  1363. for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
  1364. bytes.high = bytes.low = 0x00;
  1365. outb_p(bytes.high, j->XILINXbase + 0x03);
  1366. outb_p(bytes.low, j->XILINXbase + 0x02);
  1367. if (!SCI_Control(j, SCI_Enable_DAA))
  1368. return 0;
  1369. if (!SCI_WaitHighSCI(j))
  1370. return 0;
  1371. CID[i + 0] = inb_p(j->XILINXbase + 0x03);
  1372. CID[i + 1] = inb_p(j->XILINXbase + 0x02);
  1373. }
  1374. if (!SCI_Control(j, SCI_End))
  1375. return 0;
  1376. pIn = CID;
  1377. pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
  1378. mContinue = 1;
  1379. while (mContinue) {
  1380. if ((pIn[1] & 0x03) == 0x01) {
  1381. pOut[0] = pIn[0];
  1382. }
  1383. if ((pIn[2] & 0x0c) == 0x04) {
  1384. pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
  1385. }
  1386. if ((pIn[3] & 0x30) == 0x10) {
  1387. pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
  1388. }
  1389. if ((pIn[4] & 0xc0) == 0x40) {
  1390. pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
  1391. } else {
  1392. mContinue = FALSE;
  1393. }
  1394. pIn += 5, pOut += 4;
  1395. }
  1396. memset(&j->cid, 0, sizeof(PHONE_CID));
  1397. pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
  1398. pOut += 4;
  1399. strncpy(j->cid.month, pOut, 2);
  1400. pOut += 2;
  1401. strncpy(j->cid.day, pOut, 2);
  1402. pOut += 2;
  1403. strncpy(j->cid.hour, pOut, 2);
  1404. pOut += 2;
  1405. strncpy(j->cid.min, pOut, 2);
  1406. pOut += 3;
  1407. j->cid.numlen = *pOut;
  1408. pOut += 1;
  1409. strncpy(j->cid.number, pOut, j->cid.numlen);
  1410. pOut += j->cid.numlen + 1;
  1411. j->cid.namelen = *pOut;
  1412. pOut += 1;
  1413. strncpy(j->cid.name, pOut, j->cid.namelen);
  1414. ixj_daa_cid_reset(j);
  1415. return 1;
  1416. }
  1417. static char daa_get_version(IXJ *j)
  1418. {
  1419. BYTES bytes;
  1420. if (!SCI_Prepare(j))
  1421. return 0;
  1422. bytes.high = 0x35;
  1423. bytes.low = 0x00;
  1424. outb_p(bytes.high, j->XILINXbase + 0x03);
  1425. outb_p(bytes.low, j->XILINXbase + 0x02);
  1426. if (!SCI_Control(j, SCI_Enable_DAA))
  1427. return 0;
  1428. bytes.high = inb_p(j->XILINXbase + 0x03);
  1429. bytes.low = inb_p(j->XILINXbase + 0x02);
  1430. if (bytes.low != ALISDAA_ID_BYTE) {
  1431. if (ixjdebug & 0x0001)
  1432. printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %dn", bytes.high, bytes.low);
  1433. return 0;
  1434. }
  1435. if (!SCI_Control(j, SCI_Enable_DAA))
  1436. return 0;
  1437. if (!SCI_Control(j, SCI_End))
  1438. return 0;
  1439. bytes.high = inb_p(j->XILINXbase + 0x03);
  1440. bytes.low = inb_p(j->XILINXbase + 0x02);
  1441. if (ixjdebug & 0x0002)
  1442. printk("DAA CR5 Byte high = 0x%x low = 0x%xn", bytes.high, bytes.low);
  1443. j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
  1444. return bytes.high;
  1445. }
  1446. static int daa_set_mode(IXJ *j, int mode)
  1447. {
  1448. /* NOTE:
  1449.       The DAA *MUST* be in the conversation mode if the
  1450.       PSTN line is to be seized (PSTN line off-hook).
  1451.       Taking the PSTN line off-hook while the DAA is in
  1452.       a mode other than conversation mode will cause a
  1453.       hardware failure of the ALIS-A part.
  1454.    NOTE:
  1455.       The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
  1456.       if the PSTN line is on-hook.  Failure to have the PSTN line
  1457.       in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
  1458.       ALIS-A part.
  1459. */
  1460. BYTES bytes;
  1461. j->flags.pstn_rmr = 0;
  1462. if (!SCI_Prepare(j))
  1463. return 0;
  1464. switch (mode) {
  1465. case SOP_PU_RESET:
  1466. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  1467. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1468. j->pld_slicw.bits.rly2 = 0;
  1469. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1470. bytes.high = 0x10;
  1471. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  1472. daa_load(&bytes, j);
  1473. if (!SCI_Prepare(j))
  1474. return 0;
  1475. j->daa_mode = SOP_PU_SLEEP;
  1476. break;
  1477. case SOP_PU_SLEEP:
  1478. if(j->daa_mode == SOP_PU_SLEEP)
  1479. {
  1480. break;
  1481. }
  1482. if (ixjdebug & 0x0008)
  1483. printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ldn", jiffies);
  1484. /* if(j->daa_mode == SOP_PU_CONVERSATION) */
  1485. {
  1486. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  1487. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1488. j->pld_slicw.bits.rly2 = 0;
  1489. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1490. bytes.high = 0x10;
  1491. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  1492. daa_load(&bytes, j);
  1493. if (!SCI_Prepare(j))
  1494. return 0;
  1495. }
  1496. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  1497. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1498. j->pld_slicw.bits.rly2 = 0;
  1499. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1500. bytes.high = 0x10;
  1501. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  1502. daa_load(&bytes, j);
  1503. if (!SCI_Prepare(j))
  1504. return 0;
  1505. j->daa_mode = SOP_PU_SLEEP;
  1506. j->flags.pstn_ringing = 0;
  1507. j->ex.bits.pstn_ring = 0;
  1508. j->pstn_sleeptil = jiffies + (hertz / 4);
  1509. wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
  1510. wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
  1511. wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
  1512.   break;
  1513. case SOP_PU_RINGING:
  1514. if (ixjdebug & 0x0008)
  1515. printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ldn", jiffies);
  1516. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  1517. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1518. j->pld_slicw.bits.rly2 = 0;
  1519. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1520. bytes.high = 0x50;
  1521. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  1522. daa_load(&bytes, j);
  1523. if (!SCI_Prepare(j))
  1524. return 0;
  1525. j->daa_mode = SOP_PU_RINGING;
  1526. break;
  1527. case SOP_PU_CONVERSATION:
  1528. if (ixjdebug & 0x0008)
  1529. printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ldn", jiffies);
  1530. bytes.high = 0x90;
  1531. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  1532. daa_load(&bytes, j);
  1533. if (!SCI_Prepare(j))
  1534. return 0;
  1535. j->pld_slicw.bits.rly2 = 1;
  1536. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1537. j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
  1538. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1539. j->daa_mode = SOP_PU_CONVERSATION;
  1540. j->flags.pstn_ringing = 0;
  1541. j->ex.bits.pstn_ring = 0;
  1542. j->pstn_sleeptil = jiffies;
  1543. j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
  1544. break;
  1545. case SOP_PU_PULSEDIALING:
  1546. if (ixjdebug & 0x0008)
  1547. printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ldn", jiffies);
  1548. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  1549. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1550. j->pld_slicw.bits.rly2 = 0;
  1551. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  1552. bytes.high = 0xD0;
  1553. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  1554. daa_load(&bytes, j);
  1555. if (!SCI_Prepare(j))
  1556. return 0;
  1557. j->daa_mode = SOP_PU_PULSEDIALING;
  1558. break;
  1559. default:
  1560. break;
  1561. }
  1562. return 1;
  1563. }
  1564. static int ixj_daa_write(IXJ *j)
  1565. {
  1566. BYTES bytes;
  1567. j->flags.pstncheck = 1;
  1568. daa_set_mode(j, SOP_PU_SLEEP);
  1569. if (!SCI_Prepare(j))
  1570. return 0;
  1571. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1572. bytes.high = 0x14;
  1573. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
  1574. if (!daa_load(&bytes, j))
  1575. return 0;
  1576. bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
  1577. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
  1578. if (!daa_load(&bytes, j))
  1579. return 0;
  1580. bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
  1581. bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
  1582. if (!daa_load(&bytes, j))
  1583. return 0;
  1584. if (!SCI_Prepare(j))
  1585. return 0;
  1586. bytes.high = 0x1F;
  1587. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
  1588. if (!daa_load(&bytes, j))
  1589. return 0;
  1590. bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
  1591. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
  1592. if (!daa_load(&bytes, j))
  1593. return 0;
  1594. bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
  1595. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
  1596. if (!daa_load(&bytes, j))
  1597. return 0;
  1598. bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
  1599. bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
  1600. if (!daa_load(&bytes, j))
  1601. return 0;
  1602. bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
  1603. bytes.low = 0x00;
  1604. if (!daa_load(&bytes, j))
  1605. return 0;
  1606. if (!SCI_Prepare(j))
  1607. return 0;
  1608. bytes.high = 0x00;
  1609. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
  1610. if (!daa_load(&bytes, j))
  1611. return 0;
  1612. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
  1613. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
  1614. if (!daa_load(&bytes, j))
  1615. return 0;
  1616. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
  1617. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
  1618. if (!daa_load(&bytes, j))
  1619. return 0;
  1620. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
  1621. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
  1622. if (!daa_load(&bytes, j))
  1623. return 0;
  1624. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
  1625. bytes.low = 0x00;
  1626. if (!daa_load(&bytes, j))
  1627. return 0;
  1628. if (!SCI_Control(j, SCI_End))
  1629. return 0;
  1630. if (!SCI_WaitLowSCI(j))
  1631. return 0;
  1632. bytes.high = 0x01;
  1633. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
  1634. if (!daa_load(&bytes, j))
  1635. return 0;
  1636. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
  1637. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
  1638. if (!daa_load(&bytes, j))
  1639. return 0;
  1640. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
  1641. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
  1642. if (!daa_load(&bytes, j))
  1643. return 0;
  1644. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
  1645. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
  1646. if (!daa_load(&bytes, j))
  1647. return 0;
  1648. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
  1649. bytes.low = 0x00;
  1650. if (!daa_load(&bytes, j))
  1651. return 0;
  1652. if (!SCI_Control(j, SCI_End))
  1653. return 0;
  1654. if (!SCI_WaitLowSCI(j))
  1655. return 0;
  1656. bytes.high = 0x02;
  1657. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
  1658. if (!daa_load(&bytes, j))
  1659. return 0;
  1660. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
  1661. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
  1662. if (!daa_load(&bytes, j))
  1663. return 0;
  1664. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
  1665. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
  1666. if (!daa_load(&bytes, j))
  1667. return 0;
  1668. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
  1669. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
  1670. if (!daa_load(&bytes, j))
  1671. return 0;
  1672. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
  1673. bytes.low = 0x00;
  1674. if (!daa_load(&bytes, j))
  1675. return 0;
  1676. if (!SCI_Control(j, SCI_End))
  1677. return 0;
  1678. if (!SCI_WaitLowSCI(j))
  1679. return 0;
  1680. bytes.high = 0x03;
  1681. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
  1682. if (!daa_load(&bytes, j))
  1683. return 0;
  1684. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
  1685. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
  1686. if (!daa_load(&bytes, j))
  1687. return 0;
  1688. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
  1689. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
  1690. if (!daa_load(&bytes, j))
  1691. return 0;
  1692. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
  1693. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
  1694. if (!daa_load(&bytes, j))
  1695. return 0;
  1696. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
  1697. bytes.low = 0x00;
  1698. if (!daa_load(&bytes, j))
  1699. return 0;
  1700. if (!SCI_Control(j, SCI_End))
  1701. return 0;
  1702. if (!SCI_WaitLowSCI(j))
  1703. return 0;
  1704. bytes.high = 0x04;
  1705. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
  1706. if (!daa_load(&bytes, j))
  1707. return 0;
  1708. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
  1709. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
  1710. if (!daa_load(&bytes, j))
  1711. return 0;
  1712. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
  1713. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
  1714. if (!daa_load(&bytes, j))
  1715. return 0;
  1716. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
  1717. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
  1718. if (!daa_load(&bytes, j))
  1719. return 0;
  1720. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
  1721. bytes.low = 0x00;
  1722. if (!daa_load(&bytes, j))
  1723. return 0;
  1724. if (!SCI_Control(j, SCI_End))
  1725. return 0;
  1726. if (!SCI_WaitLowSCI(j))
  1727. return 0;
  1728. bytes.high = 0x05;
  1729. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
  1730. if (!daa_load(&bytes, j))
  1731. return 0;
  1732. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
  1733. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
  1734. if (!daa_load(&bytes, j))
  1735. return 0;
  1736. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
  1737. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
  1738. if (!daa_load(&bytes, j))
  1739. return 0;
  1740. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
  1741. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
  1742. if (!daa_load(&bytes, j))
  1743. return 0;
  1744. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
  1745. bytes.low = 0x00;
  1746. if (!daa_load(&bytes, j))
  1747. return 0;
  1748. if (!SCI_Control(j, SCI_End))
  1749. return 0;
  1750. if (!SCI_WaitLowSCI(j))
  1751. return 0;
  1752. bytes.high = 0x06;
  1753. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
  1754. if (!daa_load(&bytes, j))
  1755. return 0;
  1756. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
  1757. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
  1758. if (!daa_load(&bytes, j))
  1759. return 0;
  1760. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
  1761. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
  1762. if (!daa_load(&bytes, j))
  1763. return 0;
  1764. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
  1765. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
  1766. if (!daa_load(&bytes, j))
  1767. return 0;
  1768. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
  1769. bytes.low = 0x00;
  1770. if (!daa_load(&bytes, j))
  1771. return 0;
  1772. if (!SCI_Control(j, SCI_End))
  1773. return 0;
  1774. if (!SCI_WaitLowSCI(j))
  1775. return 0;
  1776. bytes.high = 0x07;
  1777. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
  1778. if (!daa_load(&bytes, j))
  1779. return 0;
  1780. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
  1781. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
  1782. if (!daa_load(&bytes, j))
  1783. return 0;
  1784. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
  1785. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
  1786. if (!daa_load(&bytes, j))
  1787. return 0;
  1788. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
  1789. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
  1790. if (!daa_load(&bytes, j))
  1791. return 0;
  1792. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
  1793. bytes.low = 0x00;
  1794. if (!daa_load(&bytes, j))
  1795. return 0;
  1796. if (!SCI_Control(j, SCI_End))
  1797. return 0;
  1798. if (!SCI_WaitLowSCI(j))
  1799. return 0;
  1800. bytes.high = 0x08;
  1801. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
  1802. if (!daa_load(&bytes, j))
  1803. return 0;
  1804. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
  1805. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
  1806. if (!daa_load(&bytes, j))
  1807. return 0;
  1808. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
  1809. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
  1810. if (!daa_load(&bytes, j))
  1811. return 0;
  1812. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
  1813. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
  1814. if (!daa_load(&bytes, j))
  1815. return 0;
  1816. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
  1817. bytes.low = 0x00;
  1818. if (!daa_load(&bytes, j))
  1819. return 0;
  1820. if (!SCI_Control(j, SCI_End))
  1821. return 0;
  1822. if (!SCI_WaitLowSCI(j))
  1823. return 0;
  1824. bytes.high = 0x09;
  1825. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
  1826. if (!daa_load(&bytes, j))
  1827. return 0;
  1828. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
  1829. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
  1830. if (!daa_load(&bytes, j))
  1831. return 0;
  1832. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
  1833. bytes.low = 0x00;
  1834. if (!daa_load(&bytes, j))
  1835. return 0;
  1836. if (!SCI_Control(j, SCI_End))
  1837. return 0;
  1838. if (!SCI_WaitLowSCI(j))
  1839. return 0;
  1840. bytes.high = 0x0A;
  1841. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
  1842. if (!daa_load(&bytes, j))
  1843. return 0;
  1844. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
  1845. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
  1846. if (!daa_load(&bytes, j))
  1847. return 0;
  1848. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
  1849. bytes.low = 0x00;
  1850. if (!daa_load(&bytes, j))
  1851. return 0;
  1852. if (!SCI_Control(j, SCI_End))
  1853. return 0;
  1854. if (!SCI_WaitLowSCI(j))
  1855. return 0;
  1856. bytes.high = 0x0B;
  1857. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
  1858. if (!daa_load(&bytes, j))
  1859. return 0;
  1860. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
  1861. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
  1862. if (!daa_load(&bytes, j))
  1863. return 0;
  1864. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
  1865. bytes.low = 0x00;
  1866. if (!daa_load(&bytes, j))
  1867. return 0;
  1868. if (!SCI_Control(j, SCI_End))
  1869. return 0;
  1870. if (!SCI_WaitLowSCI(j))
  1871. return 0;
  1872. bytes.high = 0x0C;
  1873. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
  1874. if (!daa_load(&bytes, j))
  1875. return 0;
  1876. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
  1877. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
  1878. if (!daa_load(&bytes, j))
  1879. return 0;
  1880. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
  1881. bytes.low = 0x00;
  1882. if (!daa_load(&bytes, j))
  1883. return 0;
  1884. if (!SCI_Control(j, SCI_End))
  1885. return 0;
  1886. if (!SCI_WaitLowSCI(j))
  1887. return 0;
  1888. bytes.high = 0x0D;
  1889. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
  1890. if (!daa_load(&bytes, j))
  1891. return 0;
  1892. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
  1893. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
  1894. if (!daa_load(&bytes, j))
  1895. return 0;
  1896. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
  1897. bytes.low = 0x00;
  1898. if (!daa_load(&bytes, j))
  1899. return 0;
  1900. if (!SCI_Control(j, SCI_End))
  1901. return 0;
  1902. if (!SCI_WaitLowSCI(j))
  1903. return 0;
  1904. bytes.high = 0x0E;
  1905. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
  1906. if (!daa_load(&bytes, j))
  1907. return 0;
  1908. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
  1909. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
  1910. if (!daa_load(&bytes, j))
  1911. return 0;
  1912. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
  1913. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
  1914. if (!daa_load(&bytes, j))
  1915. return 0;
  1916. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
  1917. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
  1918. if (!daa_load(&bytes, j))
  1919. return 0;
  1920. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
  1921. bytes.low = 0x00;
  1922. if (!daa_load(&bytes, j))
  1923. return 0;
  1924. if (!SCI_Control(j, SCI_End))
  1925. return 0;
  1926. if (!SCI_WaitLowSCI(j))
  1927. return 0;
  1928. bytes.high = 0x0F;
  1929. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
  1930. if (!daa_load(&bytes, j))
  1931. return 0;
  1932. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
  1933. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
  1934. if (!daa_load(&bytes, j))
  1935. return 0;
  1936. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
  1937. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
  1938. if (!daa_load(&bytes, j))
  1939. return 0;
  1940. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
  1941. bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
  1942. if (!daa_load(&bytes, j))
  1943. return 0;
  1944. bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
  1945. bytes.low = 0x00;
  1946. if (!daa_load(&bytes, j))
  1947. return 0;
  1948. udelay(32);
  1949. j->pld_scrr.byte = inb_p(j->XILINXbase);
  1950. if (!SCI_Control(j, SCI_End))
  1951. return 0;
  1952. outb_p(j->pld_scrw.byte, j->XILINXbase);
  1953. if (ixjdebug & 0x0002)
  1954. printk("DAA Coefficients Loadedn");
  1955. j->flags.pstncheck = 0;
  1956. return 1;
  1957. }
  1958. int ixj_set_tone_off(unsigned short arg, IXJ *j)
  1959. {
  1960. j->tone_off_time = arg;
  1961. if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
  1962. return -1;
  1963. if (ixj_WriteDSPCommand(arg, j))
  1964. return -1;
  1965. return 0;
  1966. }
  1967. static int ixj_get_tone_on(IXJ *j)
  1968. {
  1969. if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
  1970. return -1;
  1971. return 0;
  1972. }
  1973. static int ixj_get_tone_off(IXJ *j)
  1974. {
  1975. if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
  1976. return -1;
  1977. return 0;
  1978. }
  1979. static void ixj_busytone(IXJ *j)
  1980. {
  1981. j->flags.ringback = 0;
  1982. j->flags.dialtone = 0;
  1983. j->flags.busytone = 1;
  1984. ixj_set_tone_on(0x07D0, j);
  1985. ixj_set_tone_off(0x07D0, j);
  1986. ixj_play_tone(j, 27);
  1987. }
  1988. static void ixj_dialtone(IXJ *j)
  1989. {
  1990. j->flags.ringback = 0;
  1991. j->flags.dialtone = 1;
  1992. j->flags.busytone = 0;
  1993. if (j->dsp.low == 0x20) {
  1994. return;
  1995. } else {
  1996. ixj_set_tone_on(0xFFFF, j);
  1997. ixj_set_tone_off(0x0000, j);
  1998. ixj_play_tone(j, 25);
  1999. }
  2000. }
  2001. static void ixj_cpt_stop(IXJ *j)
  2002. {
  2003. if(j->tone_state || j->tone_cadence_state)
  2004. {
  2005. j->flags.dialtone = 0;
  2006. j->flags.busytone = 0;
  2007. j->flags.ringback = 0;
  2008. ixj_set_tone_on(0x0001, j);
  2009. ixj_set_tone_off(0x0000, j);
  2010. ixj_play_tone(j, 0);
  2011. j->tone_state = j->tone_cadence_state = 0;
  2012. if (j->cadence_t) {
  2013. if (j->cadence_t->ce) {
  2014. kfree(j->cadence_t->ce);
  2015. }
  2016. kfree(j->cadence_t);
  2017. j->cadence_t = NULL;
  2018. }
  2019. }
  2020. if (j->play_mode == -1 && j->rec_mode == -1)
  2021. idle(j);
  2022. if (j->play_mode != -1 && j->dsp.low == 0x20)
  2023. ixj_play_start(j);
  2024. if (j->rec_mode != -1 && j->dsp.low == 0x20)
  2025. ixj_record_start(j);
  2026. }
  2027. static void ixj_ringback(IXJ *j)
  2028. {
  2029. j->flags.busytone = 0;
  2030. j->flags.dialtone = 0;
  2031. j->flags.ringback = 1;
  2032. ixj_set_tone_on(0x0FA0, j);
  2033. ixj_set_tone_off(0x2EE0, j);
  2034. ixj_play_tone(j, 26);
  2035. }
  2036. static void ixj_testram(IXJ *j)
  2037. {
  2038. ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
  2039. }
  2040. static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp)
  2041. {
  2042. IXJ_CADENCE *lcp;
  2043. IXJ_CADENCE_ELEMENT *lcep;
  2044. IXJ_TONE ti;
  2045. lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
  2046. if (lcp == NULL)
  2047. return -ENOMEM;
  2048. if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)) || (unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT) )
  2049.         {
  2050.                 kfree(lcp);
  2051.                 return -EFAULT;
  2052.         }
  2053. lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
  2054. if (lcep == NULL) {
  2055. kfree(lcp);
  2056. return -ENOMEM;
  2057. }
  2058. if (copy_from_user(lcep, lcp->ce, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
  2059. {
  2060. kfree(lcep);
  2061. kfree(lcp);
  2062. return -EFAULT;
  2063. }
  2064. if (j->cadence_t) {
  2065. kfree(j->cadence_t->ce);
  2066. kfree(j->cadence_t);
  2067. }
  2068. lcp->ce = (void *) lcep;
  2069. j->cadence_t = lcp;
  2070. j->tone_cadence_state = 0;
  2071. ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
  2072. ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
  2073. if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
  2074. ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
  2075. ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
  2076. ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
  2077. ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
  2078. ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
  2079. ixj_init_tone(j, &ti);
  2080. }
  2081. ixj_play_tone(j, lcp->ce[0].index);
  2082. return 1;
  2083. }
  2084. static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp)
  2085. {
  2086. IXJ_FILTER_CADENCE *lcp;
  2087. lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
  2088. if (lcp == NULL) {
  2089. if(ixjdebug & 0x0001) {
  2090. printk(KERN_INFO "Could not allocate memory for cadencen");
  2091. }
  2092. return -ENOMEM;
  2093.         }
  2094. if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE))) {
  2095. if(ixjdebug & 0x0001) {
  2096. printk(KERN_INFO "Could not copy cadence to kerneln");
  2097. }
  2098. return -EFAULT;
  2099. }
  2100. if (lcp->filter > 5) {
  2101. if(ixjdebug & 0x0001) {
  2102. printk(KERN_INFO "Cadence out of rangen");
  2103. }
  2104. return -1;
  2105. }
  2106. j->cadence_f[lcp->filter].state = 0;
  2107. j->cadence_f[lcp->filter].enable = lcp->enable;
  2108. j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
  2109. j->cadence_f[lcp->filter].on1 = lcp->on1;
  2110. j->cadence_f[lcp->filter].on1min = 0;
  2111. j->cadence_f[lcp->filter].on1max = 0;
  2112. j->cadence_f[lcp->filter].off1 = lcp->off1;
  2113. j->cadence_f[lcp->filter].off1min = 0;
  2114. j->cadence_f[lcp->filter].off1max = 0;
  2115. j->cadence_f[lcp->filter].on2 = lcp->on2;
  2116. j->cadence_f[lcp->filter].on2min = 0;
  2117. j->cadence_f[lcp->filter].on2max = 0;
  2118. j->cadence_f[lcp->filter].off2 = lcp->off2;
  2119. j->cadence_f[lcp->filter].off2min = 0;
  2120. j->cadence_f[lcp->filter].off2max = 0;
  2121. j->cadence_f[lcp->filter].on3 = lcp->on3;
  2122. j->cadence_f[lcp->filter].on3min = 0;
  2123. j->cadence_f[lcp->filter].on3max = 0;
  2124. j->cadence_f[lcp->filter].off3 = lcp->off3;
  2125. j->cadence_f[lcp->filter].off3min = 0;
  2126. j->cadence_f[lcp->filter].off3max = 0;
  2127. kfree(lcp);
  2128. if(ixjdebug & 0x0002) {
  2129. printk(KERN_INFO "Cadence %d loadedn", lcp->filter);
  2130. }
  2131. return 0;
  2132. }
  2133. static void add_caps(IXJ *j)
  2134. {
  2135. j->caps = 0;
  2136. j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
  2137. strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
  2138. j->caplist[j->caps].captype = vendor;
  2139. j->caplist[j->caps].handle = j->caps++;
  2140. j->caplist[j->caps].captype = device;
  2141. switch (j->cardtype) {
  2142. case QTI_PHONEJACK:
  2143. strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
  2144. break;
  2145. case QTI_LINEJACK:
  2146. strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
  2147. break;
  2148. case QTI_PHONEJACK_LITE:
  2149. strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
  2150. break;
  2151. case QTI_PHONEJACK_PCI:
  2152. strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
  2153. break;
  2154. case QTI_PHONECARD:
  2155. strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
  2156. break;
  2157. }
  2158. j->caplist[j->caps].cap = j->cardtype;
  2159. j->caplist[j->caps].handle = j->caps++;
  2160. strcpy(j->caplist[j->caps].desc, "POTS");
  2161. j->caplist[j->caps].captype = port;
  2162. j->caplist[j->caps].cap = pots;
  2163. j->caplist[j->caps].handle = j->caps++;
  2164.   /* add devices that can do speaker/mic */
  2165. switch (j->cardtype) {
  2166. case QTI_PHONEJACK:
  2167. case QTI_LINEJACK:
  2168. case QTI_PHONEJACK_PCI:
  2169. case QTI_PHONECARD:
  2170. strcpy(j->caplist[j->caps].desc, "SPEAKER");
  2171. j->caplist[j->caps].captype = port;
  2172. j->caplist[j->caps].cap = speaker;
  2173. j->caplist[j->caps].handle = j->caps++;
  2174.         default:
  2175.       break;
  2176. }
  2177.   /* add devices that can do handset */
  2178. switch (j->cardtype) {
  2179. case QTI_PHONEJACK:
  2180. strcpy(j->caplist[j->caps].desc, "HANDSET");
  2181. j->caplist[j->caps].captype = port;
  2182. j->caplist[j->caps].cap = handset;
  2183. j->caplist[j->caps].handle = j->caps++;
  2184. break;
  2185.         default:
  2186.       break;
  2187. }
  2188.   /* add devices that can do PSTN */
  2189. switch (j->cardtype) {
  2190. case QTI_LINEJACK:
  2191. strcpy(j->caplist[j->caps].desc, "PSTN");
  2192. j->caplist[j->caps].captype = port;
  2193. j->caplist[j->caps].cap = pstn;
  2194. j->caplist[j->caps].handle = j->caps++;
  2195. break;
  2196.         default:
  2197.       break;
  2198. }
  2199. /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
  2200. strcpy(j->caplist[j->caps].desc, "ULAW");
  2201. j->caplist[j->caps].captype = codec;
  2202. j->caplist[j->caps].cap = ULAW;
  2203. j->caplist[j->caps].handle = j->caps++;
  2204. strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
  2205. j->caplist[j->caps].captype = codec;
  2206. j->caplist[j->caps].cap = LINEAR16;
  2207. j->caplist[j->caps].handle = j->caps++;
  2208. strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
  2209. j->caplist[j->caps].captype = codec;
  2210. j->caplist[j->caps].cap = LINEAR8;
  2211. j->caplist[j->caps].handle = j->caps++;
  2212. strcpy(j->caplist[j->caps].desc, "Windows Sound System");
  2213. j->caplist[j->caps].captype = codec;
  2214. j->caplist[j->caps].cap = WSS;
  2215. j->caplist[j->caps].handle = j->caps++;
  2216. /* software ALAW codec, made from ULAW */
  2217. strcpy(j->caplist[j->caps].desc, "ALAW");
  2218. j->caplist[j->caps].captype = codec;
  2219. j->caplist[j->caps].cap = ALAW;
  2220. j->caplist[j->caps].handle = j->caps++;
  2221. /* version 12 of the 8020 does the following codecs in a broken way */
  2222. if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
  2223. strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
  2224. j->caplist[j->caps].captype = codec;
  2225. j->caplist[j->caps].cap = G723_63;
  2226. j->caplist[j->caps].handle = j->caps++;
  2227. strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
  2228. j->caplist[j->caps].captype = codec;
  2229. j->caplist[j->caps].cap = G723_53;
  2230. j->caplist[j->caps].handle = j->caps++;
  2231. strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
  2232. j->caplist[j->caps].captype = codec;
  2233. j->caplist[j->caps].cap = TS48;
  2234. j->caplist[j->caps].handle = j->caps++;
  2235. strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
  2236. j->caplist[j->caps].captype = codec;
  2237. j->caplist[j->caps].cap = TS41;
  2238. j->caplist[j->caps].handle = j->caps++;
  2239. }
  2240. /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
  2241. if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
  2242. strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
  2243. j->caplist[j->caps].captype = codec;
  2244. j->caplist[j->caps].cap = TS85;
  2245. j->caplist[j->caps].handle = j->caps++;
  2246. }
  2247. /* 8021 chips can do G728 */
  2248. if (j->dsp.low == 0x21) {
  2249. strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
  2250. j->caplist[j->caps].captype = codec;
  2251. j->caplist[j->caps].cap = G728;
  2252. j->caplist[j->caps].handle = j->caps++;
  2253. }
  2254. /* 8021/8022 chips can do G729 if loaded */
  2255. if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
  2256. strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
  2257. j->caplist[j->caps].captype = codec;
  2258. j->caplist[j->caps].cap = G729;
  2259. j->caplist[j->caps].handle = j->caps++;
  2260. }
  2261. if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
  2262. strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
  2263. j->caplist[j->caps].captype = codec;
  2264. j->caplist[j->caps].cap = G729B;
  2265. j->caplist[j->caps].handle = j->caps++;
  2266. }
  2267. }
  2268. static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
  2269. {
  2270. int cnt;
  2271. int retval = 0;
  2272. for (cnt = 0; cnt < j->caps; cnt++) {
  2273. if (pcreq->captype == j->caplist[cnt].captype
  2274.     && pcreq->cap == j->caplist[cnt].cap) {
  2275. retval = 1;
  2276. break;
  2277. }
  2278. }
  2279. return retval;
  2280. }
  2281. static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
  2282. {
  2283. IXJ_TONE ti;
  2284. IXJ_FILTER jf;
  2285. IXJ_FILTER_RAW jfr;
  2286. unsigned int raise, mant;
  2287. unsigned int minor = MINOR(inode->i_rdev);
  2288. int board = NUM(inode->i_rdev);
  2289. IXJ *j = get_ixj(NUM(inode->i_rdev));
  2290. int retval = 0;
  2291. /*
  2292.  *    Set up locks to ensure that only one process is talking to the DSP at a time.
  2293.  *    This is necessary to keep the DSP from locking up.
  2294.  */
  2295. while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
  2296. set_current_state(TASK_INTERRUPTIBLE);
  2297. schedule_timeout(1);
  2298. }
  2299. if (ixjdebug & 0x0040)
  2300. printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lxn", minor, cmd, arg);
  2301. if (minor >= IXJMAX) {
  2302. clear_bit(board, &j->busyflags);
  2303. return -ENODEV;
  2304. }
  2305. /*
  2306.  *    Check ioctls only root can use.
  2307.  */
  2308. if (!capable(CAP_SYS_ADMIN)) {
  2309. switch (cmd) {
  2310. case IXJCTL_TESTRAM:
  2311. case IXJCTL_HZ:
  2312. retval = -EPERM;
  2313. }
  2314. }
  2315. switch (cmd) {
  2316. case IXJCTL_TESTRAM:
  2317. ixj_testram(j);
  2318. retval = (j->ssr.high << 8) + j->ssr.low;
  2319. break;
  2320. case IXJCTL_CARDTYPE:
  2321. retval = j->cardtype;
  2322. break;
  2323. case IXJCTL_SERIAL:
  2324. retval = j->serial;
  2325. break;
  2326. case IXJCTL_VERSION:
  2327. if (copy_to_user((char *) arg, ixj_c_revision, strlen(ixj_c_revision))) 
  2328. retval = -EFAULT;
  2329. break;
  2330. case PHONE_RING_CADENCE:
  2331. j->ring_cadence = arg;
  2332. break;
  2333. case IXJCTL_CIDCW:
  2334. if(arg) {
  2335. copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
  2336. }
  2337. else {
  2338. memset(&j->cid_send, 0, sizeof(PHONE_CID));
  2339. }
  2340. ixj_write_cidcw(j);
  2341. break;
  2342.         /* Binary compatbility */
  2343.         case OLD_PHONE_RING_START:
  2344.                 arg = 0;
  2345.                 /* Fall through */
  2346.   case PHONE_RING_START:
  2347. if(arg) {
  2348. if(copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID)))
  2349. {
  2350. retval = -EFAULT;
  2351. break;
  2352. }
  2353. ixj_write_cid(j);
  2354. }
  2355. else {
  2356. memset(&j->cid_send, 0, sizeof(PHONE_CID));
  2357. }
  2358. ixj_ring_start(j);
  2359. break;
  2360. case PHONE_RING_STOP:
  2361. j->flags.cringing = 0;
  2362. if(j->cadence_f[5].enable) {
  2363. j->cadence_f[5].state = 0;
  2364. }
  2365. ixj_ring_off(j);
  2366. break;
  2367. case PHONE_RING:
  2368. retval = ixj_ring(j);
  2369. break;
  2370. case PHONE_EXCEPTION:
  2371. retval = j->ex.bytes;
  2372. if(j->ex.bits.flash) {
  2373. j->flash_end = 0;
  2374. j->ex.bits.flash = 0;
  2375. }
  2376. j->ex.bits.pstn_ring = 0;
  2377. j->ex.bits.caller_id = 0;
  2378. j->ex.bits.pstn_wink = 0;
  2379. j->ex.bits.f0 = 0;
  2380. j->ex.bits.f1 = 0;
  2381. j->ex.bits.f2 = 0;
  2382. j->ex.bits.f3 = 0;
  2383. j->ex.bits.fc0 = 0;
  2384. j->ex.bits.fc1 = 0;
  2385. j->ex.bits.fc2 = 0;
  2386. j->ex.bits.fc3 = 0;
  2387. j->ex.bits.reserved = 0;
  2388. break;
  2389. case PHONE_HOOKSTATE:
  2390. j->ex.bits.hookstate = 0;
  2391. retval = j->hookstate;  //j->r_hook;
  2392. break;
  2393. case IXJCTL_SET_LED:
  2394. LED_SetState(arg, j);
  2395. break;
  2396. case PHONE_FRAME:
  2397. retval = set_base_frame(j, arg);
  2398. break;
  2399. case PHONE_REC_CODEC:
  2400. retval = set_rec_codec(j, arg);
  2401. break;
  2402. case PHONE_VAD:
  2403. ixj_vad(j, arg);
  2404. break;
  2405. case PHONE_REC_START:
  2406. ixj_record_start(j);
  2407. break;
  2408. case PHONE_REC_STOP:
  2409. ixj_record_stop(j);
  2410. break;
  2411. case PHONE_REC_DEPTH:
  2412. set_rec_depth(j, arg);
  2413. break;
  2414. case PHONE_REC_VOLUME:
  2415. if(arg == -1) {
  2416. retval = get_rec_volume(j);
  2417. }
  2418. else {
  2419. set_rec_volume(j, arg);
  2420. retval = arg;
  2421. }
  2422. break;
  2423. case PHONE_REC_VOLUME_LINEAR:
  2424. if(arg == -1) {
  2425. retval = get_rec_volume_linear(j);
  2426. }
  2427. else {
  2428. set_rec_volume_linear(j, arg);
  2429. retval = arg;
  2430. }
  2431. break;
  2432. case IXJCTL_DTMF_PRESCALE:
  2433. if(arg == -1) {
  2434. retval = get_dtmf_prescale(j);
  2435. }
  2436. else {
  2437. set_dtmf_prescale(j, arg);
  2438. retval = arg;
  2439. }
  2440. break;
  2441. case PHONE_REC_LEVEL:
  2442. retval = get_rec_level(j);
  2443. break;
  2444. case IXJCTL_SC_RXG:
  2445. retval = ixj_siadc(j, arg);
  2446. break;
  2447. case IXJCTL_SC_TXG:
  2448. retval = ixj_sidac(j, arg);
  2449. break;
  2450. case IXJCTL_AEC_START:
  2451. ixj_aec_start(j, arg);
  2452. break;
  2453. case IXJCTL_AEC_STOP:
  2454. aec_stop(j);
  2455. break;
  2456. case IXJCTL_AEC_GET_LEVEL:
  2457. retval = j->aec_level;
  2458. break;
  2459. case PHONE_PLAY_CODEC:
  2460. retval = set_play_codec(j, arg);
  2461. break;
  2462. case PHONE_PLAY_START:
  2463. retval = ixj_play_start(j);
  2464. break;
  2465. case PHONE_PLAY_STOP:
  2466. ixj_play_stop(j);
  2467. break;
  2468. case PHONE_PLAY_DEPTH:
  2469. set_play_depth(j, arg);
  2470. break;
  2471. case PHONE_PLAY_VOLUME:
  2472. if(arg == -1) {
  2473. retval = get_play_volume(j);
  2474. }
  2475. else {
  2476. set_play_volume(j, arg);
  2477. retval = arg;
  2478. }
  2479. break;
  2480. case PHONE_PLAY_VOLUME_LINEAR:
  2481. if(arg == -1) {
  2482. retval = get_play_volume_linear(j);
  2483. }
  2484. else {
  2485. set_play_volume_linear(j, arg);
  2486. retval = arg;
  2487. }
  2488. break;
  2489. case PHONE_PLAY_LEVEL:
  2490. retval = get_play_level(j);
  2491. break;
  2492. case IXJCTL_DSP_TYPE:
  2493. retval = (j->dsp.high << 8) + j->dsp.low;
  2494. break;
  2495. case IXJCTL_DSP_VERSION:
  2496. retval = (j->ver.high << 8) + j->ver.low;
  2497. break;
  2498. case IXJCTL_HZ:
  2499. hertz = arg;
  2500. break;
  2501. case IXJCTL_RATE:
  2502. if (arg > hertz)
  2503. retval = -1;
  2504. else
  2505. samplerate = arg;
  2506. break;
  2507. case IXJCTL_DRYBUFFER_READ:
  2508. put_user(j->drybuffer, (unsigned long *) arg);
  2509. break;
  2510. case IXJCTL_DRYBUFFER_CLEAR:
  2511. j->drybuffer = 0;
  2512. break;
  2513. case IXJCTL_FRAMES_READ:
  2514. put_user(j->framesread, (unsigned long *) arg);
  2515. break;
  2516. case IXJCTL_FRAMES_WRITTEN:
  2517. put_user(j->frameswritten, (unsigned long *) arg);
  2518. break;
  2519. case IXJCTL_READ_WAIT:
  2520. put_user(j->read_wait, (unsigned long *) arg);
  2521. break;
  2522. case IXJCTL_WRITE_WAIT:
  2523. put_user(j->write_wait, (unsigned long *) arg);
  2524. break;
  2525. case PHONE_MAXRINGS:
  2526. j->maxrings = arg;
  2527. break;
  2528. case PHONE_SET_TONE_ON_TIME:
  2529. ixj_set_tone_on(arg, j);
  2530. break;
  2531. case PHONE_SET_TONE_OFF_TIME:
  2532. ixj_set_tone_off(arg, j);
  2533. break;
  2534. case PHONE_GET_TONE_ON_TIME:
  2535. if (ixj_get_tone_on(j)) {
  2536. retval = -1;
  2537. } else {
  2538. retval = (j->ssr.high << 8) + j->ssr.low;
  2539. }
  2540. break;
  2541. case PHONE_GET_TONE_OFF_TIME:
  2542. if (ixj_get_tone_off(j)) {
  2543. retval = -1;
  2544. } else {
  2545. retval = (j->ssr.high << 8) + j->ssr.low;
  2546. }
  2547. break;
  2548. case PHONE_PLAY_TONE:
  2549. if (!j->tone_state)
  2550. retval = ixj_play_tone(j, arg);
  2551. else
  2552. retval = -1;
  2553. break;
  2554. case PHONE_GET_TONE_STATE:
  2555. retval = j->tone_state;
  2556. break;
  2557. case PHONE_DTMF_READY:
  2558. retval = j->ex.bits.dtmf_ready;
  2559. break;
  2560. case PHONE_GET_DTMF:
  2561. if (ixj_hookstate(j)) {
  2562. if (j->dtmf_rp != j->dtmf_wp) {
  2563. retval = j->dtmfbuffer[j->dtmf_rp];
  2564. j->dtmf_rp++;
  2565. if (j->dtmf_rp == 79)
  2566. j->dtmf_rp = 0;
  2567. if (j->dtmf_rp == j->dtmf_wp) {
  2568. j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
  2569. }
  2570. }
  2571. }
  2572. break;
  2573. case PHONE_GET_DTMF_ASCII:
  2574. if (ixj_hookstate(j)) {
  2575. if (j->dtmf_rp != j->dtmf_wp) {
  2576. switch (j->dtmfbuffer[j->dtmf_rp]) {
  2577. case 10:
  2578. retval = 42; /* '*'; */
  2579. break;
  2580. case 11:
  2581. retval = 48; /*'0'; */
  2582. break;
  2583. case 12:
  2584. retval = 35; /*'#'; */
  2585. break;
  2586. case 28:
  2587. retval = 65; /*'A'; */
  2588. break;
  2589. case 29:
  2590. retval = 66; /*'B'; */
  2591. break;
  2592. case 30:
  2593. retval = 67; /*'C'; */
  2594. break;
  2595. case 31:
  2596. retval = 68; /*'D'; */
  2597. break;
  2598. default:
  2599. retval = 48 + j->dtmfbuffer[j->dtmf_rp];
  2600. break;
  2601. }
  2602. j->dtmf_rp++;
  2603. if (j->dtmf_rp == 79)
  2604. j->dtmf_rp = 0;
  2605. if(j->dtmf_rp == j->dtmf_wp)
  2606. {
  2607. j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
  2608. }
  2609. }
  2610. }
  2611. break;
  2612. case PHONE_DTMF_OOB:
  2613. j->flags.dtmf_oob = arg;
  2614. break;
  2615. case PHONE_DIALTONE:
  2616. ixj_dialtone(j);
  2617. break;
  2618. case PHONE_BUSY:
  2619. ixj_busytone(j);
  2620. break;
  2621. case PHONE_RINGBACK:
  2622. ixj_ringback(j);
  2623. break;
  2624. case PHONE_WINK:
  2625. if(j->cardtype == QTI_PHONEJACK) 
  2626. retval = -1;
  2627. else 
  2628. retval = ixj_wink(j);
  2629. break;
  2630. case PHONE_CPT_STOP:
  2631. ixj_cpt_stop(j);
  2632. break;
  2633.         case PHONE_QUERY_CODEC:
  2634.         {
  2635.                 struct phone_codec_data pd;
  2636.                 int val;
  2637.                 int proto_size[] = {
  2638.                         -1,
  2639.                         12, 10, 16, 9, 8, 48, 5,
  2640.                         40, 40, 80, 40, 40, 6
  2641.                 };
  2642.                 if(copy_from_user(&pd, (void *)arg, sizeof(pd))) {
  2643.                         retval = -EFAULT;
  2644. break;
  2645. }
  2646.                 if(pd.type<1 || pd.type>13) {
  2647.                         retval = -EPROTONOSUPPORT;
  2648. break;
  2649. }
  2650.                 if(pd.type<G729)
  2651.                         val=proto_size[pd.type];
  2652.                 else switch(j->baseframe.low)
  2653.                 {
  2654.                         case 0xA0:val=2*proto_size[pd.type];break;
  2655.                         case 0x50:val=proto_size[pd.type];break;
  2656.                         default:val=proto_size[pd.type]*3;break;
  2657.                 }
  2658.                 pd.buf_min=pd.buf_max=pd.buf_opt=val;
  2659.                 if(copy_to_user((void *)arg, &pd, sizeof(pd)))
  2660.                         retval = -EFAULT;
  2661.          break;
  2662.         }
  2663. case IXJCTL_DSP_IDLE:
  2664. idle(j);
  2665. break;
  2666. case IXJCTL_MIXER:
  2667.                 if ((arg & 0xff) == 0xff)
  2668. retval = ixj_get_mixer(arg, j);
  2669.                 else
  2670. ixj_mixer(arg, j);
  2671. break;
  2672. case IXJCTL_DAA_COEFF_SET:
  2673. switch (arg) {
  2674. case DAA_US:
  2675. DAA_Coeff_US(j);
  2676. retval = ixj_daa_write(j);
  2677. break;
  2678. case DAA_UK:
  2679. DAA_Coeff_UK(j);
  2680. retval = ixj_daa_write(j);
  2681. break;
  2682. case DAA_FRANCE:
  2683. DAA_Coeff_France(j);
  2684. retval = ixj_daa_write(j);
  2685. break;
  2686. case DAA_GERMANY:
  2687. DAA_Coeff_Germany(j);
  2688. retval = ixj_daa_write(j);
  2689. break;
  2690. case DAA_AUSTRALIA:
  2691. DAA_Coeff_Australia(j);
  2692. retval = ixj_daa_write(j);
  2693. break;
  2694. case DAA_JAPAN:
  2695. DAA_Coeff_Japan(j);
  2696. retval = ixj_daa_write(j);
  2697. break;
  2698. default:
  2699. retval = 1;
  2700. break;
  2701. }
  2702. break;
  2703. case IXJCTL_DAA_AGAIN:
  2704. ixj_daa_cr4(j, arg | 0x02);
  2705. break;
  2706. case IXJCTL_PSTN_LINETEST:
  2707. retval = ixj_linetest(j);
  2708. break;
  2709. case IXJCTL_VMWI:
  2710. ixj_write_vmwi(j, arg);
  2711. break;
  2712. case IXJCTL_CID:
  2713. if (copy_to_user((char *) arg, &j->cid, sizeof(PHONE_CID))) 
  2714. retval = -EFAULT;
  2715. j->ex.bits.caller_id = 0;
  2716. break;
  2717. case IXJCTL_WINK_DURATION:
  2718. j->winktime = arg;
  2719. break;
  2720. case IXJCTL_PORT:
  2721. if (arg)
  2722. retval = ixj_set_port(j, arg);
  2723. else
  2724. retval = j->port;
  2725. break;
  2726. case IXJCTL_POTS_PSTN:
  2727. retval = ixj_set_pots(j, arg);
  2728. break;
  2729. case PHONE_CAPABILITIES:
  2730. add_caps(j);
  2731. retval = j->caps;
  2732. break;
  2733. case PHONE_CAPABILITIES_LIST:
  2734. add_caps(j);
  2735. if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps)) 
  2736. retval = -EFAULT;
  2737. break;
  2738. case PHONE_CAPABILITIES_CHECK:
  2739. {
  2740. struct phone_capability cap;
  2741. if (copy_from_user(&cap, (char *) arg, sizeof(cap))) 
  2742. retval = -EFAULT;
  2743. else {
  2744. add_caps(j);
  2745. retval = capabilities_check(j, &cap);
  2746. }
  2747. }
  2748. break;
  2749. case PHONE_PSTN_SET_STATE:
  2750. daa_set_mode(j, arg);
  2751. break;
  2752. case PHONE_PSTN_GET_STATE:
  2753. retval = j->daa_mode;
  2754. j->ex.bits.pstn_ring = 0;
  2755. break;
  2756. case IXJCTL_SET_FILTER:
  2757. if (copy_from_user(&jf, (char *) arg, sizeof(jf))) 
  2758. retval = -EFAULT;
  2759. retval = ixj_init_filter(j, &jf);
  2760. break;
  2761. case IXJCTL_SET_FILTER_RAW:
  2762. if (copy_from_user(&jfr, (char *) arg, sizeof(jfr))) 
  2763. retval = -EFAULT;
  2764. retval = ixj_init_filter_raw(j, &jfr);
  2765. break;
  2766. case IXJCTL_GET_FILTER_HIST:
  2767. if(arg<0||arg>3)
  2768. retval = -EINVAL;
  2769. else
  2770. retval = j->filter_hist[arg];
  2771. break;
  2772. case IXJCTL_INIT_TONE:
  2773. copy_from_user(&ti, (char *) arg, sizeof(ti));
  2774. retval = ixj_init_tone(j, &ti);
  2775. break;
  2776. case IXJCTL_TONE_CADENCE:
  2777. retval = ixj_build_cadence(j, (IXJ_CADENCE *) arg);
  2778. break;
  2779. case IXJCTL_FILTER_CADENCE:
  2780. retval = ixj_build_filter_cadence(j, (IXJ_FILTER_CADENCE *) arg);
  2781. break;
  2782. case IXJCTL_SIGCTL:
  2783. if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF)))
  2784. retval = -EFAULT;
  2785. j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
  2786. if(j->sigdef.event < 33) {
  2787. raise = 1;
  2788. for(mant = 0; mant < j->sigdef.event; mant++){
  2789. raise *= 2;
  2790. }
  2791. if(j->sigdef.signal)
  2792. j->ex_sig.bytes |= raise; 
  2793. else
  2794. j->ex_sig.bytes &= (raise^0xffff); 
  2795. }
  2796. break;
  2797. case IXJCTL_INTERCOM_STOP:
  2798. if(arg < 0 || arg >= IXJMAX)
  2799. return -EINVAL;
  2800. j->intercom = -1;
  2801. ixj_record_stop(j);
  2802. ixj_play_stop(j);
  2803. idle(j);
  2804. get_ixj(arg)->intercom = -1;
  2805. ixj_record_stop(get_ixj(arg));
  2806. ixj_play_stop(get_ixj(arg));
  2807. idle(get_ixj(arg));
  2808. break;
  2809. case IXJCTL_INTERCOM_START:
  2810. if(arg < 0 || arg >= IXJMAX)
  2811. return -EINVAL;
  2812. j->intercom = arg;
  2813. ixj_record_start(j);
  2814. ixj_play_start(j);
  2815. get_ixj(arg)->intercom = board;
  2816. ixj_play_start(get_ixj(arg));
  2817. ixj_record_start(get_ixj(arg));
  2818. break;
  2819. }
  2820. if (ixjdebug & 0x0040)
  2821. printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lxn", minor, cmd, arg);
  2822. clear_bit(board, &j->busyflags);
  2823. return retval;
  2824. }
  2825. static int ixj_fasync(int fd, struct file *file_p, int mode)
  2826. {
  2827. IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
  2828. return fasync_helper(fd, file_p, mode, &j->async_queue);
  2829. }
  2830. struct file_operations ixj_fops =
  2831. {
  2832.         owner:          THIS_MODULE,
  2833.         read:           ixj_enhanced_read,
  2834.         write:          ixj_enhanced_write,
  2835.         poll:           ixj_poll,
  2836.         ioctl:          ixj_ioctl,
  2837.         release:        ixj_release,
  2838.         fasync:         ixj_fasync
  2839. };
  2840. static int ixj_linetest(IXJ *j)
  2841. {
  2842. unsigned long jifwait;
  2843. j->flags.pstncheck = 1; /* Testing */
  2844. j->flags.pstn_present = 0; /* Assume the line is not there */
  2845. daa_int_read(j); /*Clear DAA Interrupt flags */
  2846. /* */
  2847. /* Hold all relays in the normally de-energized position. */
  2848. /* */
  2849. j->pld_slicw.bits.rly1 = 0;
  2850. j->pld_slicw.bits.rly2 = 0;
  2851. j->pld_slicw.bits.rly3 = 0;
  2852. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2853. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  2854. outb_p(j->pld_scrw.byte, j->XILINXbase);
  2855. j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
  2856. if (j->pld_slicr.bits.potspstn) {
  2857. j->flags.pots_pstn = 1;
  2858. j->flags.pots_correct = 0;
  2859. LED_SetState(0x4, j);
  2860. } else {
  2861. j->flags.pots_pstn = 0;
  2862. j->pld_slicw.bits.rly1 = 0;
  2863. j->pld_slicw.bits.rly2 = 0;
  2864. j->pld_slicw.bits.rly3 = 1;
  2865. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2866. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  2867. outb_p(j->pld_scrw.byte, j->XILINXbase);
  2868. daa_set_mode(j, SOP_PU_CONVERSATION);
  2869. jifwait = jiffies + hertz;
  2870. while (time_before(jiffies, jifwait)) {
  2871. set_current_state(TASK_INTERRUPTIBLE);
  2872. schedule_timeout(1);
  2873. }
  2874. daa_int_read(j);
  2875. daa_set_mode(j, SOP_PU_RESET);
  2876. if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
  2877. j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
  2878. LED_SetState(0x4, j);
  2879. j->pld_slicw.bits.rly3 = 0;
  2880. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2881. } else {
  2882. j->flags.pots_correct = 1;
  2883. LED_SetState(0x8, j);
  2884. j->pld_slicw.bits.rly1 = 1;
  2885. j->pld_slicw.bits.rly2 = 0;
  2886. j->pld_slicw.bits.rly3 = 0;
  2887. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2888. }
  2889. }
  2890. j->pld_slicw.bits.rly3 = 0;
  2891. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  2892. daa_set_mode(j, SOP_PU_CONVERSATION);
  2893. jifwait = jiffies + hertz;
  2894. while (time_before(jiffies, jifwait)) {
  2895. set_current_state(TASK_INTERRUPTIBLE);
  2896. schedule_timeout(1);
  2897. }
  2898. daa_int_read(j);
  2899. daa_set_mode(j, SOP_PU_RESET);
  2900. if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
  2901. j->pstn_sleeptil = jiffies + (hertz / 4);
  2902. j->flags.pstn_present = 1;
  2903. } else {
  2904. j->flags.pstn_present = 0;
  2905. }
  2906. if (j->flags.pstn_present) {
  2907. if (j->flags.pots_correct) {
  2908. LED_SetState(0xA, j);
  2909. } else {
  2910. LED_SetState(0x6, j);
  2911. }
  2912. } else {
  2913. if (j->flags.pots_correct) {
  2914. LED_SetState(0x9, j);
  2915. } else {
  2916. LED_SetState(0x5, j);
  2917. }
  2918. }
  2919. j->flags.pstncheck = 0; /* Testing */
  2920. return j->flags.pstn_present;
  2921. }
  2922. static int ixj_selfprobe(IXJ *j)
  2923. {
  2924. unsigned short cmd;
  2925. unsigned long jif;
  2926. int cnt;
  2927. BYTES bytes;
  2928.         init_waitqueue_head(&j->poll_q);
  2929.         init_waitqueue_head(&j->read_q);
  2930.         init_waitqueue_head(&j->write_q);
  2931. while(atomic_read(&j->DSPWrite) > 0)
  2932. atomic_dec(&j->DSPWrite);
  2933. if (ixjdebug & 0x0002)
  2934. printk(KERN_INFO "Write IDLE to Software Control Registern");
  2935. ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
  2936. if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
  2937. return -1;
  2938. /* The read values of the SSR should be 0x00 for the IDLE command */
  2939. if (j->ssr.low || j->ssr.high)
  2940. return -1;
  2941. if (ixjdebug & 0x0002)
  2942. printk(KERN_INFO "Get Device ID Coden");
  2943. if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
  2944. return -1;
  2945. j->dsp.low = j->ssr.low;
  2946. j->dsp.high = j->ssr.high;
  2947. if (ixjdebug & 0x0002)
  2948. printk(KERN_INFO "Get Device Version Coden");
  2949. if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
  2950. return -1;
  2951. j->ver.low = j->ssr.low;
  2952. j->ver.high = j->ssr.high;
  2953. if (!j->cardtype) {
  2954. if (j->dsp.low == 0x21) {
  2955. bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
  2956. outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
  2957. /* Test for Internet LineJACK or Internet PhoneJACK Lite */
  2958. bytes.low = inb_p(j->XILINXbase + 0x02);
  2959. if (bytes.low == bytes.high) /*  Register is read only on */
  2960. /*  Internet PhoneJack Lite */
  2961.  {
  2962. j->cardtype = QTI_PHONEJACK_LITE;
  2963. if (check_region(j->XILINXbase, 4)) {
  2964. printk(KERN_INFO "ixj: can't get I/O address 0x%xn", j->XILINXbase);
  2965. return -1;
  2966. }
  2967. request_region(j->XILINXbase, 4, "ixj control");
  2968. j->pld_slicw.pcib.e1 = 1;
  2969. outb_p(j->pld_slicw.byte, j->XILINXbase);
  2970. } else {
  2971. j->cardtype = QTI_LINEJACK;
  2972. if (check_region(j->XILINXbase, 8)) {
  2973. printk(KERN_INFO "ixj: can't get I/O address 0x%xn", j->XILINXbase);
  2974. return -1;
  2975. }
  2976. request_region(j->XILINXbase, 8, "ixj control");
  2977. }
  2978. } else if (j->dsp.low == 0x22) {
  2979. j->cardtype = QTI_PHONEJACK_PCI;
  2980. request_region(j->XILINXbase, 4, "ixj control");
  2981. j->pld_slicw.pcib.e1 = 1;
  2982. outb_p(j->pld_slicw.byte, j->XILINXbase);
  2983. } else
  2984. j->cardtype = QTI_PHONEJACK;
  2985. } else {
  2986. switch (j->cardtype) {
  2987. case QTI_PHONEJACK:
  2988. if (!j->dsp.low != 0x20) {
  2989. j->dsp.high = 0x80;
  2990. j->dsp.low = 0x20;
  2991. ixj_WriteDSPCommand(0x3800, j);
  2992. j->ver.low = j->ssr.low;
  2993. j->ver.high = j->ssr.high;
  2994. }
  2995. break;
  2996. case QTI_LINEJACK:
  2997. if (check_region(j->XILINXbase, 8)) {
  2998. printk(KERN_INFO "ixj: can't get I/O address 0x%xn", j->XILINXbase);
  2999. return -1;
  3000. }
  3001. request_region(j->XILINXbase, 8, "ixj control");
  3002. break;
  3003. case QTI_PHONEJACK_LITE:
  3004. case QTI_PHONEJACK_PCI:
  3005. if (check_region(j->XILINXbase, 4)) {
  3006. printk(KERN_INFO "ixj: can't get I/O address 0x%xn", j->XILINXbase);
  3007. return -1;
  3008. }
  3009. request_region(j->XILINXbase, 4, "ixj control");
  3010. j->pld_slicw.pcib.e1 = 1;
  3011. outb_p(j->pld_slicw.byte, j->XILINXbase);
  3012. break;
  3013. case QTI_PHONECARD:
  3014. break;
  3015. }
  3016. }
  3017. if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
  3018. if (ixjdebug & 0x0002)
  3019. printk(KERN_INFO "Write CODEC config to Software Control Registern");
  3020. if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
  3021. return -1;
  3022. if (ixjdebug & 0x0002)
  3023. printk(KERN_INFO "Write CODEC timing to Software Control Registern");
  3024. if (j->cardtype == QTI_PHONEJACK) {
  3025. cmd = 0x9FF2;
  3026. } else {
  3027. cmd = 0x9FF5;
  3028. }
  3029. if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
  3030. return -1;
  3031. } else {
  3032. if (set_base_frame(j, 30) != 30)
  3033. return -1;
  3034. if (ixjdebug & 0x0002)
  3035. printk(KERN_INFO "Write CODEC config to Software Control Registern");
  3036. if (j->cardtype == QTI_PHONECARD) {
  3037. if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
  3038. return -1;
  3039. }
  3040. if (j->cardtype == QTI_LINEJACK) {
  3041. if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
  3042. return -1;
  3043. if (ixjdebug & 0x0002)
  3044. printk(KERN_INFO "Turn on the PLD Clock at 8Khzn");
  3045. j->pld_clock.byte = 0;
  3046. outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
  3047. }
  3048. }
  3049. if (j->dsp.low == 0x20) {
  3050. if (ixjdebug & 0x0002)
  3051. printk(KERN_INFO "Configure GPIO pinsn");
  3052. j->gpio.bytes.high = 0x09;
  3053. /*  bytes.low = 0xEF;  0xF7 */
  3054. j->gpio.bits.gpio1 = 1;
  3055. j->gpio.bits.gpio2 = 1;
  3056. j->gpio.bits.gpio3 = 0;
  3057. j->gpio.bits.gpio4 = 1;
  3058. j->gpio.bits.gpio5 = 1;
  3059. j->gpio.bits.gpio6 = 1;
  3060. j->gpio.bits.gpio7 = 1;
  3061. ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
  3062. if (ixjdebug & 0x0002)
  3063. printk(KERN_INFO "Enable SLICn");
  3064. j->gpio.bytes.high = 0x0B;
  3065. j->gpio.bytes.low = 0x00;
  3066. j->gpio.bits.gpio1 = 0;
  3067. j->gpio.bits.gpio2 = 1;
  3068. j->gpio.bits.gpio5 = 0;
  3069. ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
  3070. j->port = PORT_POTS;
  3071. } else {
  3072. if (j->cardtype == QTI_LINEJACK) {
  3073. LED_SetState(0x1, j);
  3074. jif = jiffies + (hertz / 10);
  3075. while (time_before(jiffies, jif)) {
  3076. set_current_state(TASK_INTERRUPTIBLE);
  3077. schedule_timeout(1);
  3078. }
  3079. LED_SetState(0x2, j);
  3080. jif = jiffies + (hertz / 10);
  3081. while (time_before(jiffies, jif)) {
  3082. set_current_state(TASK_INTERRUPTIBLE);
  3083. schedule_timeout(1);
  3084. }
  3085. LED_SetState(0x4, j);
  3086. jif = jiffies + (hertz / 10);
  3087. while (time_before(jiffies, jif)) {
  3088. set_current_state(TASK_INTERRUPTIBLE);
  3089. schedule_timeout(1);
  3090. }
  3091. LED_SetState(0x8, j);
  3092. jif = jiffies + (hertz / 10);
  3093. while (time_before(jiffies, jif)) {
  3094. set_current_state(TASK_INTERRUPTIBLE);
  3095. schedule_timeout(1);
  3096. }
  3097. LED_SetState(0x0, j);
  3098. daa_get_version(j);
  3099. if (ixjdebug & 0x0002)
  3100. printk("Loading DAA Coefficientsn");
  3101. DAA_Coeff_US(j);
  3102. if (!ixj_daa_write(j)) {
  3103. printk("DAA write failed on board %dn", j->board);
  3104. return -1;
  3105. }
  3106. if(!ixj_daa_cid_reset(j)) {
  3107. printk("DAA CID reset failed on board %dn", j->board);
  3108. return -1;
  3109. }
  3110. j->flags.pots_correct = 0;
  3111. j->flags.pstn_present = 0;
  3112. ixj_linetest(j);
  3113. if (j->flags.pots_correct) {
  3114. j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
  3115. outb_p(j->pld_scrw.byte, j->XILINXbase);
  3116. j->pld_slicw.bits.rly1 = 1;
  3117. j->pld_slicw.bits.spken = 1;
  3118. outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
  3119. SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
  3120. /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
  3121. j->port = PORT_POTS;
  3122. }
  3123. ixj_set_port(j, PORT_PSTN);
  3124. ixj_set_pots(j, 1);
  3125. if (ixjdebug & 0x0002)
  3126. printk(KERN_INFO "Enable Mixern");
  3127. ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
  3128. ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
  3129. ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
  3130. ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
  3131. ixj_mixer(0x0480, j); /*FM Left mute */
  3132. ixj_mixer(0x0580, j); /*FM Right mute */
  3133. ixj_mixer(0x0680, j); /*CD Left mute */
  3134. ixj_mixer(0x0780, j); /*CD Right mute */
  3135. ixj_mixer(0x0880, j); /*Line Left mute */
  3136. ixj_mixer(0x0980, j); /*Line Right mute */
  3137. ixj_mixer(0x0A80, j); /*Aux left mute  */
  3138. ixj_mixer(0x0B80, j); /*Aux right mute */
  3139. ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
  3140. ixj_mixer(0x0D80, j); /*Mono2 mute */
  3141. ixj_mixer(0x0E80, j); /*Mic mute */
  3142. ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
  3143. ixj_mixer(0x1000, j); /*Voice Left and Right out only */
  3144. ixj_mixer(0x110C, j);
  3145. ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
  3146. ixj_mixer(0x1401, j);
  3147. ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */
  3148. ixj_mixer(0x1501, j);
  3149. ixj_mixer(0x1700, j); /*Clock select */
  3150. ixj_mixer(0x1800, j); /*ADC input from mixer */
  3151. ixj_mixer(0x1901, j); /*Mic gain 30db */
  3152. if (ixjdebug & 0x0002)
  3153. printk(KERN_INFO "Setting Default US Ring Cadence Detectionn");
  3154. j->cadence_f[4].state = 0;
  3155. j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
  3156. j->cadence_f[4].off1 = 0;
  3157. j->cadence_f[4].on2 = 0;
  3158. j->cadence_f[4].off2 = 0;
  3159. j->cadence_f[4].on3 = 0;
  3160. j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
  3161. j->pstn_last_rmr = jiffies;