eicon_idi.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:86k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: eicon_idi.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
  2.  *
  3.  * ISDN lowlevel-module for Eicon active cards.
  4.  * IDI interface 
  5.  *
  6.  * Copyright 1998-2000  by Armin Schindler (mac@melware.de)
  7.  * Copyright 1999,2000  Cytronics & Melware (info@melware.de)
  8.  *
  9.  * Thanks to Deutsche Mailbox Saar-Lor-Lux GmbH
  10.  * for sponsoring and testing fax
  11.  * capabilities with Diva Server cards.
  12.  * (dor@deutschemailbox.de)
  13.  *
  14.  * This software may be used and distributed according to the terms
  15.  * of the GNU General Public License, incorporated herein by reference.
  16.  *
  17.  */
  18. #include <linux/config.h>
  19. #define __NO_VERSION__
  20. #include "eicon.h"
  21. #include "eicon_idi.h"
  22. #include "eicon_dsp.h"
  23. #include "uxio.h"
  24. #undef EICON_FULL_SERVICE_OKTETT
  25. char *eicon_idi_revision = "$Revision: 1.1.4.1 $";
  26. eicon_manifbuf *manbuf;
  27. int eicon_idi_manage_assign(eicon_card *card);
  28. int eicon_idi_manage_remove(eicon_card *card);
  29. int idi_fill_in_T30(eicon_chan *chan, unsigned char *buffer);
  30. int
  31. idi_assign_req(eicon_REQ *reqbuf, int signet, eicon_chan *chan)
  32. {
  33. int l = 0;
  34. int tmp;
  35. tmp = 0;
  36.   if (!signet) {
  37. /* Signal Layer */
  38. reqbuf->XBuffer.P[l++] = CAI;
  39. reqbuf->XBuffer.P[l++] = 1;
  40. reqbuf->XBuffer.P[l++] = 0;
  41. reqbuf->XBuffer.P[l++] = KEY;
  42. reqbuf->XBuffer.P[l++] = 3;
  43. reqbuf->XBuffer.P[l++] = 'I';
  44. reqbuf->XBuffer.P[l++] = '4';
  45. reqbuf->XBuffer.P[l++] = 'L';
  46. reqbuf->XBuffer.P[l++] = SHIFT|6;
  47. reqbuf->XBuffer.P[l++] = SIN;
  48. reqbuf->XBuffer.P[l++] = 2;
  49. reqbuf->XBuffer.P[l++] = 0;
  50. reqbuf->XBuffer.P[l++] = 0;
  51. reqbuf->XBuffer.P[l++] = 0; /* end */
  52. reqbuf->Req = ASSIGN;
  53. reqbuf->ReqCh = 0;
  54. reqbuf->ReqId = DSIG_ID;
  55. reqbuf->XBuffer.length = l;
  56. reqbuf->Reference = 0; /* Sig Entity */
  57.   }
  58.   else {
  59. /* Network Layer */
  60. reqbuf->XBuffer.P[l++] = CAI;
  61. reqbuf->XBuffer.P[l++] = 1;
  62. reqbuf->XBuffer.P[l++] = chan->e.D3Id;
  63. reqbuf->XBuffer.P[l++] = LLC;
  64. reqbuf->XBuffer.P[l++] = 2;
  65. switch(chan->l2prot) {
  66. case ISDN_PROTO_L2_V11096:
  67. case ISDN_PROTO_L2_V11019:
  68. case ISDN_PROTO_L2_V11038:
  69. case ISDN_PROTO_L2_TRANS:
  70. reqbuf->XBuffer.P[l++] = 2; /* transparent */
  71. break;
  72. case ISDN_PROTO_L2_X75I:
  73. case ISDN_PROTO_L2_X75UI:
  74. case ISDN_PROTO_L2_X75BUI:
  75. reqbuf->XBuffer.P[l++] = 5; /* X.75 */ 
  76. break;
  77. case ISDN_PROTO_L2_MODEM:
  78.    if (chan->fsm_state == EICON_STATE_IWAIT)
  79. reqbuf->XBuffer.P[l++] = 9; /* V.42 incoming */
  80. else
  81. reqbuf->XBuffer.P[l++] = 10; /* V.42 */
  82. break;
  83. case ISDN_PROTO_L2_HDLC:
  84. case ISDN_PROTO_L2_FAX:
  85.    if (chan->fsm_state == EICON_STATE_IWAIT)
  86. reqbuf->XBuffer.P[l++] = 3; /* autoconnect on incoming */
  87. else
  88. reqbuf->XBuffer.P[l++] = 2; /* transparent */
  89. break;
  90. default:
  91. reqbuf->XBuffer.P[l++] = 1;
  92. }
  93. switch(chan->l3prot) {
  94. case ISDN_PROTO_L3_FCLASS2:
  95. #ifdef CONFIG_ISDN_TTY_FAX
  96. reqbuf->XBuffer.P[l++] = 6;
  97. reqbuf->XBuffer.P[l++] = NLC;
  98. tmp = idi_fill_in_T30(chan, &reqbuf->XBuffer.P[l+1]);
  99. reqbuf->XBuffer.P[l++] = tmp; 
  100. l += tmp;
  101. break;
  102. #endif
  103. case ISDN_PROTO_L3_TRANS:
  104. default:
  105. reqbuf->XBuffer.P[l++] = 4;
  106. }
  107. reqbuf->XBuffer.P[l++] = 0; /* end */
  108. reqbuf->Req = ASSIGN;
  109. reqbuf->ReqCh = 0;
  110. reqbuf->ReqId = NL_ID;
  111. reqbuf->XBuffer.length = l;
  112. reqbuf->Reference = 1; /* Net Entity */
  113.   }
  114.    return(0);
  115. }
  116. int
  117. idi_put_req(eicon_REQ *reqbuf, int rq, int signet, int Ch)
  118. {
  119. reqbuf->Req = rq;
  120. reqbuf->ReqCh = Ch;
  121. reqbuf->ReqId = 1;
  122. reqbuf->XBuffer.length = 1;
  123. reqbuf->XBuffer.P[0] = 0;
  124. reqbuf->Reference = signet;
  125.    return(0);
  126. }
  127. int
  128. idi_put_suspend_req(eicon_REQ *reqbuf, eicon_chan *chan)
  129. {
  130. reqbuf->Req = SUSPEND;
  131. reqbuf->ReqCh = 0;
  132. reqbuf->ReqId = 1;
  133. reqbuf->XBuffer.P[0] = CAI;
  134. reqbuf->XBuffer.P[1] = 1;
  135. reqbuf->XBuffer.P[2] = chan->No;
  136. reqbuf->XBuffer.P[3] = 0;
  137. reqbuf->XBuffer.length = 4;
  138. reqbuf->Reference = 0; /* Sig Entity */
  139.    return(0);
  140. }
  141. int
  142. idi_call_res_req(eicon_REQ *reqbuf, eicon_chan *chan)
  143. {
  144. int l = 9;
  145. reqbuf->Req = CALL_RES;
  146. reqbuf->ReqCh = 0;
  147. reqbuf->ReqId = 1;
  148. reqbuf->XBuffer.P[0] = CAI;
  149. reqbuf->XBuffer.P[1] = 6;
  150. reqbuf->XBuffer.P[2] = 9;
  151. reqbuf->XBuffer.P[3] = 0;
  152. reqbuf->XBuffer.P[4] = 0;
  153. reqbuf->XBuffer.P[5] = 0;
  154. reqbuf->XBuffer.P[6] = 32;
  155. reqbuf->XBuffer.P[7] = 0;
  156. switch(chan->l2prot) {
  157. case ISDN_PROTO_L2_X75I:
  158. case ISDN_PROTO_L2_X75UI:
  159. case ISDN_PROTO_L2_X75BUI:
  160. case ISDN_PROTO_L2_HDLC:
  161. reqbuf->XBuffer.P[1] = 1;
  162. reqbuf->XBuffer.P[2] = 0x05;
  163. l = 4;
  164. break;
  165. case ISDN_PROTO_L2_V11096:
  166. reqbuf->XBuffer.P[2] = 0x0d;
  167. reqbuf->XBuffer.P[3] = 5;
  168. reqbuf->XBuffer.P[4] = 0;
  169. break;
  170. case ISDN_PROTO_L2_V11019:
  171. reqbuf->XBuffer.P[2] = 0x0d;
  172. reqbuf->XBuffer.P[3] = 6;
  173. reqbuf->XBuffer.P[4] = 0;
  174. break;
  175. case ISDN_PROTO_L2_V11038:
  176. reqbuf->XBuffer.P[2] = 0x0d;
  177. reqbuf->XBuffer.P[3] = 7;
  178. reqbuf->XBuffer.P[4] = 0;
  179. break;
  180. case ISDN_PROTO_L2_MODEM:
  181. reqbuf->XBuffer.P[2] = 0x11;
  182. reqbuf->XBuffer.P[3] = 7;
  183. reqbuf->XBuffer.P[4] = 0;
  184. reqbuf->XBuffer.P[5] = 0;
  185. reqbuf->XBuffer.P[6] = 128;
  186. reqbuf->XBuffer.P[7] = 0;
  187. break;
  188. case ISDN_PROTO_L2_FAX:
  189. reqbuf->XBuffer.P[2] = 0x10;
  190. reqbuf->XBuffer.P[3] = 0;
  191. reqbuf->XBuffer.P[4] = 0;
  192. reqbuf->XBuffer.P[5] = 0;
  193. reqbuf->XBuffer.P[6] = 128;
  194. reqbuf->XBuffer.P[7] = 0;
  195. break;
  196. case ISDN_PROTO_L2_TRANS:
  197. switch(chan->l3prot) {
  198. case ISDN_PROTO_L3_TRANSDSP:
  199. reqbuf->XBuffer.P[2] = 22; /* DTMF, audio events on */
  200. }
  201. break;
  202. }
  203. reqbuf->XBuffer.P[8] = 0;
  204. reqbuf->XBuffer.length = l;
  205. reqbuf->Reference = 0; /* Sig Entity */
  206. eicon_log(NULL, 8, "idi_req: Ch%d: Call_Resn", chan->No);
  207.    return(0);
  208. }
  209. int
  210. idi_do_req(eicon_card *card, eicon_chan *chan, int cmd, int layer)
  211. {
  212.         struct sk_buff *skb;
  213.         struct sk_buff *skb2;
  214. eicon_REQ *reqbuf;
  215. eicon_chan_ptr *chan2;
  216.         skb = alloc_skb(270 + sizeof(eicon_REQ), GFP_ATOMIC);
  217.         skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  218.         if ((!skb) || (!skb2)) {
  219.                 eicon_log(card, 1, "idi_err: Ch%d: alloc_skb failed in do_req()n", chan->No);
  220. if (skb) 
  221. dev_kfree_skb(skb);
  222. if (skb2) 
  223. dev_kfree_skb(skb2);
  224.                 return -ENOMEM; 
  225. }
  226. chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  227. chan2->ptr = chan;
  228. reqbuf = (eicon_REQ *)skb_put(skb, 270 + sizeof(eicon_REQ));
  229. eicon_log(card, 8, "idi_req: Ch%d: req %x (%s)n", chan->No, cmd, (layer)?"Net":"Sig");
  230. if (layer) cmd |= 0x700;
  231. switch(cmd) {
  232. case ASSIGN:
  233. case ASSIGN|0x700:
  234. idi_assign_req(reqbuf, layer, chan);
  235. break;
  236. case REMOVE:
  237. case REMOVE|0x700:
  238. idi_put_req(reqbuf, REMOVE, layer, 0);
  239. break;
  240. case INDICATE_REQ:
  241. idi_put_req(reqbuf, INDICATE_REQ, 0, 0);
  242. break;
  243. case HANGUP:
  244. idi_put_req(reqbuf, HANGUP, 0, 0);
  245. break;
  246. case SUSPEND:
  247. idi_put_suspend_req(reqbuf, chan);
  248. break;
  249. case RESUME:
  250. idi_put_req(reqbuf, RESUME, 0 ,0);
  251. break;
  252. case REJECT:
  253. idi_put_req(reqbuf, REJECT, 0 ,0);
  254. break;
  255. case CALL_ALERT:
  256. idi_put_req(reqbuf, CALL_ALERT, 0, 0);
  257. break;
  258. case CALL_RES:
  259. idi_call_res_req(reqbuf, chan);
  260. break;
  261. case CALL_HOLD:
  262. idi_put_req(reqbuf, CALL_HOLD, 0, 0);
  263. break;
  264. case N_CONNECT|0x700:
  265. idi_put_req(reqbuf, N_CONNECT, 1, 0);
  266. break;
  267. case N_CONNECT_ACK|0x700:
  268. idi_put_req(reqbuf, N_CONNECT_ACK, 1, 0);
  269. break;
  270. case N_DISC|0x700:
  271. idi_put_req(reqbuf, N_DISC, 1, chan->e.IndCh);
  272. break;
  273. case N_DISC_ACK|0x700:
  274. idi_put_req(reqbuf, N_DISC_ACK, 1, chan->e.IndCh);
  275. break;
  276. default:
  277. eicon_log(card, 1, "idi_req: Ch%d: Unknown requestn", chan->No);
  278. dev_kfree_skb(skb);
  279. dev_kfree_skb(skb2);
  280. return(-1);
  281. }
  282. skb_queue_tail(&chan->e.X, skb);
  283. skb_queue_tail(&card->sndq, skb2); 
  284. eicon_schedule_tx(card);
  285. return(0);
  286. }
  287. int
  288. eicon_idi_listen_req(eicon_card *card, eicon_chan *chan)
  289. {
  290. if ((!card) || (!chan))
  291. return 1;
  292. eicon_log(card, 16, "idi_req: Ch%d: Listen_Req eazmask=0x%xn",chan->No, chan->eazmask);
  293. if (!chan->e.D3Id) {
  294. idi_do_req(card, chan, ASSIGN, 0); 
  295. }
  296. if (chan->fsm_state == EICON_STATE_NULL) {
  297. if (!(chan->statectrl & HAVE_CONN_REQ)) {
  298. idi_do_req(card, chan, INDICATE_REQ, 0);
  299. chan->fsm_state = EICON_STATE_LISTEN;
  300. }
  301. }
  302.   return(0);
  303. }
  304. unsigned char
  305. idi_si2bc(int si1, int si2, char *bc, char *hlc)
  306. {
  307.   hlc[0] = 0;
  308.   switch(si1) {
  309. case 1:
  310. bc[0] = 0x90; /* 3,1 kHz audio */
  311. bc[1] = 0x90; /* 64 kbit/s */
  312. bc[2] = 0xa3; /* G.711 A-law */
  313. #ifdef EICON_FULL_SERVICE_OKTETT
  314. if (si2 == 1) {
  315. bc[0] = 0x80; /* Speech */
  316. hlc[0] = 0x02; /* hlc len */
  317. hlc[1] = 0x91; /* first hic */
  318. hlc[2] = 0x81; /* Telephony */
  319. }
  320. #endif
  321. return(3);
  322. case 2:
  323. bc[0] = 0x90; /* 3,1 kHz audio */
  324. bc[1] = 0x90; /* 64 kbit/s */
  325. bc[2] = 0xa3; /* G.711 A-law */
  326. #ifdef EICON_FULL_SERVICE_OKTETT
  327. if (si2 == 2) {
  328. hlc[0] = 0x02; /* hlc len */
  329. hlc[1] = 0x91; /* first hic */
  330. hlc[2] = 0x84; /* Fax Gr.2/3 */
  331. }
  332. #endif
  333. return(3);
  334. case 5:
  335. case 7:
  336. default:
  337. bc[0] = 0x88;
  338. bc[1] = 0x90;
  339. return(2);
  340.   }
  341.  return (0);
  342. }
  343. int
  344. idi_hangup(eicon_card *card, eicon_chan *chan)
  345. {
  346. if ((!card) || (!chan))
  347. return 1;
  348. if ((chan->fsm_state == EICON_STATE_ACTIVE) ||
  349.     (chan->fsm_state == EICON_STATE_WMCONN)) {
  350.    if (chan->e.B2Id) idi_do_req(card, chan, N_DISC, 1);
  351. }
  352. if (chan->e.B2Id) idi_do_req(card, chan, REMOVE, 1);
  353. if (chan->fsm_state != EICON_STATE_NULL) {
  354. chan->statectrl |= WAITING_FOR_HANGUP;
  355. idi_do_req(card, chan, HANGUP, 0);
  356. chan->fsm_state = EICON_STATE_NULL;
  357. }
  358. eicon_log(card, 8, "idi_req: Ch%d: Hangupn", chan->No);
  359. #ifdef CONFIG_ISDN_TTY_FAX
  360. chan->fax = 0;
  361. #endif
  362.   return(0);
  363. }
  364. int
  365. capipmsg(eicon_card *card, eicon_chan *chan, capi_msg *cm)
  366. {
  367. if ((cm->para[0] != 3) || (cm->para[1] != 0))
  368. return -1;
  369. if (cm->para[2] < 3)
  370. return -1;
  371. if (cm->para[4] != 0)
  372. return -1;
  373. switch(cm->para[3]) {
  374. case 4: /* Suspend */
  375. eicon_log(card, 8, "idi_req: Ch%d: Call Suspendn", chan->No);
  376. if (cm->para[5]) {
  377. idi_do_req(card, chan, SUSPEND, 0);
  378. } else {
  379. idi_do_req(card, chan, CALL_HOLD, 0);
  380. }
  381. break;
  382. case 5: /* Resume */
  383. eicon_log(card, 8, "idi_req: Ch%d: Call Resumen", chan->No);
  384. idi_do_req(card, chan, RESUME, 0);
  385. break;
  386.         }
  387. return 0;
  388. }
  389. int
  390. idi_connect_res(eicon_card *card, eicon_chan *chan)
  391. {
  392. if ((!card) || (!chan))
  393. return 1;
  394. chan->fsm_state = EICON_STATE_IWAIT;
  395. /* check if old NetID has been removed */
  396. if (chan->e.B2Id) {
  397. eicon_log(card, 1, "eicon: Ch%d: old net_id %x still exist, removing.n",
  398. chan->No, chan->e.B2Id);
  399. idi_do_req(card, chan, REMOVE, 1);
  400. }
  401. idi_do_req(card, chan, ASSIGN, 1);
  402. idi_do_req(card, chan, CALL_RES, 0);
  403. return(0);
  404. }
  405. int
  406. idi_connect_req(eicon_card *card, eicon_chan *chan, char *phone,
  407.                     char *eazmsn, int si1, int si2)
  408. {
  409. int l = 0;
  410. int i;
  411. unsigned char tmp;
  412. unsigned char *sub, *sp;
  413. unsigned char bc[5];
  414. unsigned char hlc[5];
  415.         struct sk_buff *skb;
  416.         struct sk_buff *skb2;
  417. eicon_REQ *reqbuf;
  418. eicon_chan_ptr *chan2;
  419. if ((!card) || (!chan))
  420. return 1;
  421.         skb = alloc_skb(270 + sizeof(eicon_REQ), GFP_ATOMIC);
  422.         skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  423.         if ((!skb) || (!skb2)) {
  424.                 eicon_log(card, 1, "idi_err: Ch%d: alloc_skb failed in connect_req()n", chan->No);
  425. if (skb) 
  426. dev_kfree_skb(skb);
  427. if (skb2) 
  428. dev_kfree_skb(skb2);
  429.                 return -ENOMEM; 
  430. }
  431. chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  432. chan2->ptr = chan;
  433. reqbuf = (eicon_REQ *)skb_put(skb, 270 + sizeof(eicon_REQ));
  434. reqbuf->Req = CALL_REQ;
  435. reqbuf->ReqCh = 0;
  436. reqbuf->ReqId = 1;
  437. sub = NULL;
  438. sp = phone;
  439. while (*sp) {
  440. if (*sp == '.') {
  441. sub = sp + 1;
  442. *sp = 0;
  443. } else
  444. sp++;
  445. }
  446. reqbuf->XBuffer.P[l++] = CPN;
  447. reqbuf->XBuffer.P[l++] = strlen(phone) + 1;
  448. reqbuf->XBuffer.P[l++] = 0x81;
  449. for(i=0; i<strlen(phone);i++) 
  450. reqbuf->XBuffer.P[l++] = phone[i] & 0x7f;
  451. if (sub) {
  452. reqbuf->XBuffer.P[l++] = DSA;
  453. reqbuf->XBuffer.P[l++] = strlen(sub) + 2;
  454. reqbuf->XBuffer.P[l++] = 0x80; /* NSAP coded */
  455. reqbuf->XBuffer.P[l++] = 0x50; /* local IDI format */
  456. while (*sub)
  457. reqbuf->XBuffer.P[l++] = *sub++ & 0x7f;
  458. }
  459. sub = NULL;
  460. sp = eazmsn;
  461. while (*sp) {
  462. if (*sp == '.') {
  463. sub = sp + 1;
  464. *sp = 0;
  465. } else
  466. sp++;
  467. }
  468. reqbuf->XBuffer.P[l++] = OAD;
  469. reqbuf->XBuffer.P[l++] = strlen(eazmsn) + 2;
  470. reqbuf->XBuffer.P[l++] = 0x01;
  471. reqbuf->XBuffer.P[l++] = 0x80;
  472. for(i=0; i<strlen(eazmsn);i++) 
  473. reqbuf->XBuffer.P[l++] = eazmsn[i] & 0x7f;
  474. if (sub) {
  475. reqbuf->XBuffer.P[l++] = OSA;
  476. reqbuf->XBuffer.P[l++] = strlen(sub) + 2;
  477. reqbuf->XBuffer.P[l++] = 0x80; /* NSAP coded */
  478. reqbuf->XBuffer.P[l++] = 0x50; /* local IDI format */
  479. while (*sub)
  480. reqbuf->XBuffer.P[l++] = *sub++ & 0x7f;
  481. }
  482. if (si2 > 2) {
  483. reqbuf->XBuffer.P[l++] = SHIFT|6;
  484. reqbuf->XBuffer.P[l++] = SIN;
  485. reqbuf->XBuffer.P[l++] = 2;
  486. reqbuf->XBuffer.P[l++] = si1;
  487. reqbuf->XBuffer.P[l++] = si2;
  488. }
  489. else if ((tmp = idi_si2bc(si1, si2, bc, hlc)) > 0) {
  490. reqbuf->XBuffer.P[l++] = BC;
  491. reqbuf->XBuffer.P[l++] = tmp;
  492. for(i=0; i<tmp;i++) 
  493. reqbuf->XBuffer.P[l++] = bc[i];
  494. if ((tmp=hlc[0])) {
  495. reqbuf->XBuffer.P[l++] = HLC;
  496. reqbuf->XBuffer.P[l++] = tmp;
  497. for(i=1; i<=tmp;i++) 
  498. reqbuf->XBuffer.P[l++] = hlc[i];
  499. }
  500. }
  501.         reqbuf->XBuffer.P[l++] = CAI;
  502.         reqbuf->XBuffer.P[l++] = 6;
  503.         reqbuf->XBuffer.P[l++] = 0x09;
  504. reqbuf->XBuffer.P[l++] = 0;
  505. reqbuf->XBuffer.P[l++] = 0;
  506. reqbuf->XBuffer.P[l++] = 0;
  507. reqbuf->XBuffer.P[l++] = 32;
  508. reqbuf->XBuffer.P[l++] = 0;
  509.         switch(chan->l2prot) {
  510. case ISDN_PROTO_L2_X75I:
  511. case ISDN_PROTO_L2_X75UI:
  512. case ISDN_PROTO_L2_X75BUI:
  513.                 case ISDN_PROTO_L2_HDLC:
  514.                         reqbuf->XBuffer.P[l-6] = 5;
  515.                         reqbuf->XBuffer.P[l-7] = 1;
  516. l -= 5; 
  517.                         break;
  518.                 case ISDN_PROTO_L2_V11096:
  519.                         reqbuf->XBuffer.P[l-7] = 3;
  520.                         reqbuf->XBuffer.P[l-6] = 0x0d;
  521.                         reqbuf->XBuffer.P[l-5] = 5;
  522.                         reqbuf->XBuffer.P[l-4] = 0;
  523.                         l -= 3;
  524.                         break;
  525.                 case ISDN_PROTO_L2_V11019:
  526.                         reqbuf->XBuffer.P[l-7] = 3;
  527.                         reqbuf->XBuffer.P[l-6] = 0x0d;
  528.                         reqbuf->XBuffer.P[l-5] = 6;
  529.                         reqbuf->XBuffer.P[l-4] = 0;
  530.                         l -= 3;
  531.                         break;
  532.                 case ISDN_PROTO_L2_V11038:
  533.                         reqbuf->XBuffer.P[l-7] = 3;
  534.                         reqbuf->XBuffer.P[l-6] = 0x0d;
  535.                         reqbuf->XBuffer.P[l-5] = 7;
  536.                         reqbuf->XBuffer.P[l-4] = 0;
  537.                         l -= 3;
  538.                         break;
  539.                 case ISDN_PROTO_L2_MODEM:
  540. reqbuf->XBuffer.P[l-6] = 0x11;
  541. reqbuf->XBuffer.P[l-5] = 7;
  542. reqbuf->XBuffer.P[l-4] = 0;
  543. reqbuf->XBuffer.P[l-3] = 0;
  544. reqbuf->XBuffer.P[l-2] = 128;
  545. reqbuf->XBuffer.P[l-1] = 0;
  546.                         break;
  547.                 case ISDN_PROTO_L2_FAX:
  548. reqbuf->XBuffer.P[l-6] = 0x10;
  549. reqbuf->XBuffer.P[l-5] = 0;
  550. reqbuf->XBuffer.P[l-4] = 0;
  551. reqbuf->XBuffer.P[l-3] = 0;
  552. reqbuf->XBuffer.P[l-2] = 128;
  553. reqbuf->XBuffer.P[l-1] = 0;
  554.                         break;
  555. case ISDN_PROTO_L2_TRANS:
  556. switch(chan->l3prot) {
  557. case ISDN_PROTO_L3_TRANSDSP:
  558. reqbuf->XBuffer.P[l-6] = 22; /* DTMF, audio events on */
  559. }
  560. break;
  561.         }
  562. reqbuf->XBuffer.P[l++] = 0; /* end */
  563. reqbuf->XBuffer.length = l;
  564. reqbuf->Reference = 0; /* Sig Entity */
  565. if (chan->statectrl & WAITING_FOR_HANGUP) {
  566. /* If the line did not disconnect yet,
  567. we have to delay this command */
  568. eicon_log(card, 32, "idi_req: Ch%d: delaying conn_reqn", chan->No);
  569. chan->statectrl |= HAVE_CONN_REQ;
  570. chan->tskb1 = skb;
  571. chan->tskb2 = skb2;
  572. } else {
  573. skb_queue_tail(&chan->e.X, skb);
  574. skb_queue_tail(&card->sndq, skb2); 
  575. eicon_schedule_tx(card);
  576. }
  577. eicon_log(card, 8, "idi_req: Ch%d: Conn_Req %s -> %sn",chan->No, eazmsn, phone);
  578.    return(0);
  579. }
  580. void
  581. idi_IndParse(eicon_card *ccard, eicon_chan *chan, idi_ind_message *message, unsigned char *buffer, int len)
  582. {
  583. int i,j;
  584. int pos = 0;
  585. int codeset = 0;
  586. int wlen = 0;
  587. int lock = 0;
  588. __u8 w;
  589. __u16 code;
  590. isdn_ctrl cmd;
  591. memset(message, 0, sizeof(idi_ind_message));
  592. if ((!len) || (!buffer[pos])) return;
  593.   while(pos <= len) {
  594. w = buffer[pos++];
  595. if (!w) return;
  596. if (w & 0x80) {
  597. wlen = 0;
  598. }
  599. else {
  600. wlen = buffer[pos++];
  601. }
  602. if (pos > len) return;
  603. if (lock & 0x80) lock &= 0x7f;
  604. else codeset = lock;
  605. if((w&0xf0) == SHIFT) {
  606. codeset = w;
  607. if(!(codeset & 0x08)) lock = codeset & 7;
  608. codeset &= 7;
  609. lock |= 0x80;
  610. }
  611. else {
  612. if (w==ESC && wlen >=2) {
  613. code = buffer[pos++]|0x800;
  614. wlen--;
  615. }
  616. else code = w;
  617. code |= (codeset<<8);
  618. if (pos + wlen > len) {
  619. eicon_log(ccard, 1, "idi_err: Ch%d: IElen %d of %x exceeds Ind_Length (+%d)n", chan->No, 
  620. wlen, code, (pos + wlen) - len);
  621. return;
  622. }
  623. switch(code) {
  624. case OAD:
  625. if (wlen > sizeof(message->oad)) {
  626. pos += wlen;
  627. break;
  628. }
  629. j = 1;
  630. if (wlen) {
  631. message->plan = buffer[pos++];
  632. if (message->plan &0x80) 
  633. message->screen = 0;
  634. else {
  635. message->screen = buffer[pos++];
  636. j = 2;
  637. }
  638. }
  639. for(i=0; i < wlen-j; i++) 
  640. message->oad[i] = buffer[pos++];
  641. eicon_log(ccard, 2, "idi_inf: Ch%d: OAD=(0x%02x,0x%02x) %sn", chan->No, 
  642. message->plan, message->screen, message->oad);
  643. break;
  644. case RDN:
  645. if (wlen > sizeof(message->rdn)) {
  646. pos += wlen;
  647. break;
  648. }
  649. j = 1;
  650. if (wlen) {
  651. if (!(buffer[pos++] & 0x80)) {
  652. pos++; 
  653. j = 2;
  654. }
  655. }
  656. for(i=0; i < wlen-j; i++) 
  657. message->rdn[i] = buffer[pos++];
  658. eicon_log(ccard, 2, "idi_inf: Ch%d: RDN= %sn", chan->No, 
  659. message->rdn);
  660. break;
  661. case CPN:
  662. if (wlen > sizeof(message->cpn)) {
  663. pos += wlen;
  664. break;
  665. }
  666. for(i=0; i < wlen; i++) 
  667. message->cpn[i] = buffer[pos++];
  668. eicon_log(ccard, 2, "idi_inf: Ch%d: CPN=(0x%02x) %sn", chan->No,
  669. (__u8)message->cpn[0], message->cpn + 1);
  670. break;
  671. case DSA:
  672. if (wlen > sizeof(message->dsa)) {
  673. pos += wlen;
  674. break;
  675. }
  676. pos += 2;
  677. for(i=0; i < wlen-2; i++) 
  678. message->dsa[i] = buffer[pos++];
  679. eicon_log(ccard, 2, "idi_inf: Ch%d: DSA=%sn", chan->No, message->dsa);
  680. break;
  681. case OSA:
  682. if (wlen > sizeof(message->osa)) {
  683. pos += wlen;
  684. break;
  685. }
  686. pos += 2;
  687. for(i=0; i < wlen-2; i++) 
  688. message->osa[i] = buffer[pos++];
  689. eicon_log(ccard, 2, "idi_inf: Ch%d: OSA=%sn", chan->No, message->osa);
  690. break;
  691. case CAD:
  692. pos += wlen;
  693. eicon_log(ccard, 2, "idi_inf: Ch%d: Connected Address in ind, len:%xn", 
  694. chan->No, wlen);
  695. break;
  696. case BC:
  697. if (wlen > sizeof(message->bc)) {
  698. pos += wlen;
  699. break;
  700. }
  701. for(i=0; i < wlen; i++) 
  702. message->bc[i] = buffer[pos++];
  703. eicon_log(ccard, 4, "idi_inf: Ch%d: BC = 0x%02x 0x%02x 0x%02xn", chan->No,
  704. message->bc[0],message->bc[1],message->bc[2]);
  705. break;
  706. case 0x800|BC:
  707. if (wlen > sizeof(message->e_bc)) {
  708. pos += wlen;
  709. break;
  710. }
  711. for(i=0; i < wlen; i++) 
  712. message->e_bc[i] = buffer[pos++];
  713. eicon_log(ccard, 4, "idi_inf: Ch%d: ESC/BC=%dn", chan->No, message->bc[0]);
  714. break;
  715. case LLC:
  716. if (wlen > sizeof(message->llc)) {
  717. pos += wlen;
  718. break;
  719. }
  720. for(i=0; i < wlen; i++) 
  721. message->llc[i] = buffer[pos++];
  722. eicon_log(ccard, 4, "idi_inf: Ch%d: LLC=%d %d %d %d ...n", chan->No, message->llc[0],
  723. message->llc[1],message->llc[2],message->llc[3]);
  724. break;
  725. case HLC:
  726. if (wlen > sizeof(message->hlc)) {
  727. pos += wlen;
  728. break;
  729. }
  730. for(i=0; i < wlen; i++) 
  731. message->hlc[i] = buffer[pos++];
  732. eicon_log(ccard, 4, "idi_inf: Ch%d: HLC=%x %x %x %x %x ...n", chan->No,
  733. message->hlc[0], message->hlc[1],
  734. message->hlc[2], message->hlc[3], message->hlc[4]);
  735. break;
  736. case DSP:
  737. case 0x600|DSP:
  738. if (wlen > sizeof(message->display)) {
  739. pos += wlen;
  740. break;
  741. }
  742. for(i=0; i < wlen; i++) 
  743. message->display[i] = buffer[pos++];
  744. eicon_log(ccard, 4, "idi_inf: Ch%d: Display: %sn", chan->No,
  745. message->display);
  746. break;
  747. case 0x600|KEY:
  748. if (wlen > sizeof(message->keypad)) {
  749. pos += wlen;
  750. break;
  751. }
  752. for(i=0; i < wlen; i++) 
  753. message->keypad[i] = buffer[pos++];
  754. eicon_log(ccard, 4, "idi_inf: Ch%d: Keypad: %sn", chan->No,
  755. message->keypad);
  756. break;
  757. case NI:
  758. case 0x600|NI:
  759. if (wlen) {
  760. switch(buffer[pos] & 127) {
  761. case 0:
  762. eicon_log(ccard, 4, "idi_inf: Ch%d: User suspended.n", chan->No);
  763. break;
  764. case 1:
  765. eicon_log(ccard, 4, "idi_inf: Ch%d: User resumed.n", chan->No);
  766. break;
  767. case 2:
  768. eicon_log(ccard, 4, "idi_inf: Ch%d: Bearer service change.n", chan->No);
  769. break;
  770. default:
  771. eicon_log(ccard, 4, "idi_inf: Ch%d: Unknown Notification %x.n", 
  772. chan->No, buffer[pos] & 127);
  773. }
  774. pos += wlen;
  775. }
  776. break;
  777. case PI:
  778. case 0x600|PI:
  779. if (wlen > 1) {
  780. switch(buffer[pos+1] & 127) {
  781. case 1:
  782. eicon_log(ccard, 4, "idi_inf: Ch%d: Call is not end-to-end ISDN.n", chan->No);
  783. break;
  784. case 2:
  785. eicon_log(ccard, 4, "idi_inf: Ch%d: Destination address is non ISDN.n", chan->No);
  786. break;
  787. case 3:
  788. eicon_log(ccard, 4, "idi_inf: Ch%d: Origination address is non ISDN.n", chan->No);
  789. break;
  790. case 4:
  791. eicon_log(ccard, 4, "idi_inf: Ch%d: Call has returned to the ISDN.n", chan->No);
  792. break;
  793. case 5:
  794. eicon_log(ccard, 4, "idi_inf: Ch%d: Interworking has occurred.n", chan->No);
  795. break;
  796. case 8:
  797. eicon_log(ccard, 4, "idi_inf: Ch%d: In-band information available.n", chan->No);
  798. break;
  799. default:
  800. eicon_log(ccard, 4, "idi_inf: Ch%d: Unknown Progress %x.n", 
  801. chan->No, buffer[pos+1] & 127);
  802. }
  803. }
  804. pos += wlen;
  805. break;
  806. case CAU:
  807. if (wlen > sizeof(message->cau)) {
  808. pos += wlen;
  809. break;
  810. }
  811. for(i=0; i < wlen; i++) 
  812. message->cau[i] = buffer[pos++];
  813. memcpy(&chan->cause, &message->cau, 2);
  814. eicon_log(ccard, 4, "idi_inf: Ch%d: CAU=%d %dn", chan->No,
  815. message->cau[0],message->cau[1]);
  816. break;
  817. case 0x800|CAU:
  818. if (wlen > sizeof(message->e_cau)) {
  819. pos += wlen;
  820. break;
  821. }
  822. for(i=0; i < wlen; i++) 
  823. message->e_cau[i] = buffer[pos++];
  824. eicon_log(ccard, 4, "idi_inf: Ch%d: ECAU=%d %dn", chan->No,
  825. message->e_cau[0],message->e_cau[1]);
  826. break;
  827. case 0x800|CHI:
  828. if (wlen > sizeof(message->e_chi)) {
  829. pos += wlen;
  830. break;
  831. }
  832. for(i=0; i < wlen; i++) 
  833. message->e_chi[i] = buffer[pos++];
  834. eicon_log(ccard, 4, "idi_inf: Ch%d: ESC/CHI=%dn", chan->No,
  835. message->e_cau[0]);
  836. break;
  837. case 0x800|0x7a:
  838. pos ++;
  839. message->e_mt=buffer[pos++];
  840. eicon_log(ccard, 4, "idi_inf: Ch%d: EMT=0x%xn", chan->No, message->e_mt);
  841. break;
  842. case DT:
  843. if (wlen > sizeof(message->dt)) {
  844. pos += wlen;
  845. break;
  846. }
  847. for(i=0; i < wlen; i++) 
  848. message->dt[i] = buffer[pos++];
  849. eicon_log(ccard, 4, "idi_inf: Ch%d: DT: %02d.%02d.%02d %02d:%02d:%02dn", chan->No,
  850. message->dt[2], message->dt[1], message->dt[0],
  851. message->dt[3], message->dt[4], message->dt[5]);
  852. break;
  853. case 0x600|SIN:
  854. if (wlen > sizeof(message->sin)) {
  855. pos += wlen;
  856. break;
  857. }
  858. for(i=0; i < wlen; i++) 
  859. message->sin[i] = buffer[pos++];
  860. eicon_log(ccard, 2, "idi_inf: Ch%d: SIN=%d %dn", chan->No,
  861. message->sin[0],message->sin[1]);
  862. break;
  863. case 0x600|CPS:
  864. eicon_log(ccard, 2, "idi_inf: Ch%d: Called Party Status in indn", chan->No);
  865. pos += wlen;
  866. break;
  867. case 0x600|CIF:
  868. for (i = 0; i < wlen; i++)
  869. if (buffer[pos + i] != '0') break;
  870. memcpy(&cmd.parm.num, &buffer[pos + i], wlen - i);
  871. cmd.parm.num[wlen - i] = 0;
  872. eicon_log(ccard, 2, "idi_inf: Ch%d: CIF=%sn", chan->No, cmd.parm.num);
  873. pos += wlen;
  874. cmd.driver = ccard->myid;
  875. cmd.command = ISDN_STAT_CINF;
  876. cmd.arg = chan->No;
  877. ccard->interface.statcallb(&cmd);
  878. break;
  879. case 0x600|DATE:
  880. eicon_log(ccard, 2, "idi_inf: Ch%d: Date in indn", chan->No);
  881. pos += wlen;
  882. break;
  883. case 0xa1: 
  884. eicon_log(ccard, 2, "idi_inf: Ch%d: Sending Complete in ind.n", chan->No);
  885. pos += wlen;
  886. break;
  887. case 0xe08: 
  888. case 0xe7a: 
  889. case 0xe04: 
  890. case 0xe00: 
  891. /* *** TODO *** */
  892. case CHA:
  893. /* Charge advice */
  894. case FTY:
  895. case 0x600|FTY:
  896. case CHI:
  897. case 0x800:
  898. /* Not yet interested in this */
  899. pos += wlen;
  900. break;
  901. case 0x880:
  902. /* Managment Information Element */
  903. if (!manbuf) {
  904. eicon_log(ccard, 1, "idi_err: manbuf not allocatedn");
  905. }
  906. else {
  907. memcpy(&manbuf->data[manbuf->pos], &buffer[pos], wlen);
  908. manbuf->length[manbuf->count] = wlen;
  909. manbuf->count++;
  910. manbuf->pos += wlen;
  911. }
  912. pos += wlen;
  913. break;
  914. default:
  915. pos += wlen;
  916. eicon_log(ccard, 6, "idi_inf: Ch%d: unknown information element 0x%x in ind, len:%xn", 
  917. chan->No, code, wlen);
  918. }
  919. }
  920.   }
  921. }
  922. void
  923. idi_bc2si(unsigned char *bc, unsigned char *hlc, unsigned char *sin, unsigned char *si1, unsigned char *si2)
  924. {
  925. si1[0] = 0;
  926. si2[0] = 0;
  927. switch (bc[0] & 0x7f) {
  928. case 0x00: /* Speech */
  929. si1[0] = 1;
  930. #ifdef EICON_FULL_SERVICE_OKTETT
  931. si1[0] = sin[0];
  932. si2[0] = sin[1];
  933. #endif
  934. break;
  935. case 0x10: /* 3.1 Khz audio */
  936. si1[0] = 1;
  937. #ifdef EICON_FULL_SERVICE_OKTETT
  938. si1[0] = sin[0];
  939. si2[0] = sin[1];
  940. #endif
  941. break;
  942. case 0x08: /* Unrestricted digital information */
  943. si1[0] = 7;
  944. si2[0] = sin[1];
  945. break;
  946. case 0x09: /* Restricted digital information */
  947. si1[0] = 2;
  948. break;
  949. case 0x11:
  950. /* Unrestr. digital information  with
  951.  * tones/announcements ( or 7 kHz audio
  952.  */
  953. si1[0] = 3;
  954. break;
  955. case 0x18: /* Video */
  956. si1[0] = 4;
  957. break;
  958. }
  959. switch (bc[1] & 0x7f) {
  960. case 0x40: /* packed mode */
  961. si1[0] = 8;
  962. break;
  963. case 0x10: /* 64 kbit */
  964. case 0x11: /* 2*64 kbit */
  965. case 0x13: /* 384 kbit */
  966. case 0x15: /* 1536 kbit */
  967. case 0x17: /* 1920 kbit */
  968. /* moderate = bc[1] & 0x7f; */
  969. break;
  970. }
  971. }
  972. /********************* FAX stuff ***************************/
  973. #ifdef CONFIG_ISDN_TTY_FAX
  974. int
  975. idi_fill_in_T30(eicon_chan *chan, unsigned char *buffer)
  976. {
  977. eicon_t30_s *t30 = (eicon_t30_s *) buffer;
  978. if (!chan->fax) {
  979. eicon_log(NULL, 1,"idi_T30: fill_in with NULL fax struct, ERRORn");
  980. return 0;
  981. }
  982. memset(t30, 0, sizeof(eicon_t30_s));
  983. t30->station_id_len = EICON_FAXID_LEN;
  984. memcpy(&t30->station_id[0], &chan->fax->id[0], EICON_FAXID_LEN);
  985. t30->resolution = chan->fax->resolution;
  986. t30->rate = chan->fax->rate + 1; /* eicon rate starts with 1 */
  987. t30->format = T30_FORMAT_SFF;
  988. t30->pages_low = 0;
  989. t30->pages_high = 0;
  990. t30->atf = 1; /* optimised for AT+F command set */
  991. t30->code = 0;
  992. t30->feature_bits_low = 0;
  993. t30->feature_bits_high = 0;
  994. t30->control_bits_low = 0;
  995. t30->control_bits_high = 0;
  996. if (chan->fax->nbc) {
  997. /* set compression by DCC value */
  998.      switch(chan->fax->compression) {
  999. case (0): /* 1-D modified */
  1000. break;
  1001. case (1): /* 2-D modified Read */
  1002. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_2D_CODING;
  1003. t30->feature_bits_low |= T30_FEATURE_BIT_2D_CODING;
  1004. break;
  1005. case (2): /* 2-D uncompressed */
  1006. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_UNCOMPR;
  1007. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_2D_CODING;
  1008. t30->feature_bits_low |= T30_FEATURE_BIT_UNCOMPR_ENABLED;
  1009. t30->feature_bits_low |= T30_FEATURE_BIT_2D_CODING;
  1010. break;
  1011. case (3): /* 2-D modified Read */
  1012. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_T6_CODING;
  1013. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_2D_CODING;
  1014. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_UNCOMPR;
  1015. t30->feature_bits_low |= T30_FEATURE_BIT_UNCOMPR_ENABLED;
  1016. t30->feature_bits_low |= T30_FEATURE_BIT_T6_CODING;
  1017. t30->feature_bits_low |= T30_FEATURE_BIT_2D_CODING;
  1018. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_ECM;
  1019. t30->feature_bits_low |= T30_FEATURE_BIT_ECM;
  1020. break;
  1021.   }
  1022. } else {
  1023. /* set compression to best */
  1024. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_T6_CODING;
  1025. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_2D_CODING;
  1026. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_UNCOMPR;
  1027. t30->feature_bits_low |= T30_FEATURE_BIT_UNCOMPR_ENABLED;
  1028. t30->feature_bits_low |= T30_FEATURE_BIT_T6_CODING;
  1029. t30->feature_bits_low |= T30_FEATURE_BIT_2D_CODING;
  1030. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_ECM;
  1031. t30->feature_bits_low |= T30_FEATURE_BIT_ECM;
  1032. }
  1033. switch(chan->fax->ecm) {
  1034. case (0): /* disable ECM */
  1035. break;
  1036. case (1):
  1037. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_ECM;
  1038. t30->control_bits_low |= T30_CONTROL_BIT_ECM_64_BYTES;
  1039. t30->feature_bits_low |= T30_FEATURE_BIT_ECM;
  1040. t30->feature_bits_low |= T30_FEATURE_BIT_ECM_64_BYTES;
  1041. break;
  1042. case (2):
  1043. t30->control_bits_low |= T30_CONTROL_BIT_ENABLE_ECM;
  1044. t30->feature_bits_low |= T30_FEATURE_BIT_ECM;
  1045. break;
  1046. }
  1047. if (DebugVar & 128) {
  1048. char st[40];
  1049. eicon_log(NULL, 128, "sT30:code = %xn", t30->code);
  1050. eicon_log(NULL, 128, "sT30:rate = %xn", t30->rate);
  1051. eicon_log(NULL, 128, "sT30:res  = %xn", t30->resolution);
  1052. eicon_log(NULL, 128, "sT30:format = %xn", t30->format);
  1053. eicon_log(NULL, 128, "sT30:pages_low = %xn", t30->pages_low);
  1054. eicon_log(NULL, 128, "sT30:pages_high = %xn", t30->pages_high);
  1055. eicon_log(NULL, 128, "sT30:atf  = %xn", t30->atf);
  1056. eicon_log(NULL, 128, "sT30:control_bits_low = %xn", t30->control_bits_low);
  1057. eicon_log(NULL, 128, "sT30:control_bits_high = %xn", t30->control_bits_high);
  1058. eicon_log(NULL, 128, "sT30:feature_bits_low = %xn", t30->feature_bits_low);
  1059. eicon_log(NULL, 128, "sT30:feature_bits_high = %xn", t30->feature_bits_high);
  1060. //eicon_log(NULL, 128, "sT30:universal_5 = %xn", t30->universal_5);
  1061. //eicon_log(NULL, 128, "sT30:universal_6 = %xn", t30->universal_6);
  1062. //eicon_log(NULL, 128, "sT30:universal_7 = %xn", t30->universal_7);
  1063. eicon_log(NULL, 128, "sT30:station_id_len = %xn", t30->station_id_len);
  1064. eicon_log(NULL, 128, "sT30:head_line_len = %xn", t30->head_line_len);
  1065. strncpy(st, t30->station_id, t30->station_id_len);
  1066. st[t30->station_id_len] = 0;
  1067. eicon_log(NULL, 128, "sT30:station_id = <%s>n", st);
  1068. }
  1069. return(sizeof(eicon_t30_s));
  1070. }
  1071. /* send fax struct */
  1072. int
  1073. idi_send_edata(eicon_card *card, eicon_chan *chan)
  1074. {
  1075. struct sk_buff *skb;
  1076. struct sk_buff *skb2;
  1077. eicon_REQ *reqbuf;
  1078. eicon_chan_ptr *chan2;
  1079. if ((chan->fsm_state == EICON_STATE_NULL) || (chan->fsm_state == EICON_STATE_LISTEN)) {
  1080. eicon_log(card, 1, "idi_snd: Ch%d: send edata on state %d !n", chan->No, chan->fsm_state);
  1081. return -ENODEV;
  1082. }
  1083. eicon_log(card, 128, "idi_snd: Ch%d: edata (fax)n", chan->No);
  1084. skb = alloc_skb(sizeof(eicon_REQ) + sizeof(eicon_t30_s), GFP_ATOMIC);
  1085. skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  1086. if ((!skb) || (!skb2)) {
  1087. eicon_log(card, 1, "idi_err: Ch%d: alloc_skb failed in send_edata()n", chan->No);
  1088. if (skb) 
  1089. dev_kfree_skb(skb);
  1090. if (skb2) 
  1091. dev_kfree_skb(skb2);
  1092. return -ENOMEM;
  1093. }
  1094. chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  1095. chan2->ptr = chan;
  1096. reqbuf = (eicon_REQ *)skb_put(skb, sizeof(eicon_t30_s) + sizeof(eicon_REQ));
  1097. reqbuf->Req = N_EDATA;
  1098. reqbuf->ReqCh = chan->e.IndCh;
  1099. reqbuf->ReqId = 1;
  1100. reqbuf->XBuffer.length = idi_fill_in_T30(chan, reqbuf->XBuffer.P);
  1101. reqbuf->Reference = 1; /* Net Entity */
  1102. skb_queue_tail(&chan->e.X, skb);
  1103. skb_queue_tail(&card->sndq, skb2);
  1104. eicon_schedule_tx(card);
  1105. return (0);
  1106. }
  1107. void
  1108. idi_parse_edata(eicon_card *ccard, eicon_chan *chan, unsigned char *buffer, int len)
  1109. {
  1110. eicon_t30_s *p = (eicon_t30_s *)buffer;
  1111. int i;
  1112. if (DebugVar & 128) {
  1113. char st[40];
  1114. eicon_log(ccard, 128, "rT30:len %d , size %dn", len, sizeof(eicon_t30_s));
  1115. eicon_log(ccard, 128, "rT30:code = %xn", p->code);
  1116. eicon_log(ccard, 128, "rT30:rate = %xn", p->rate);
  1117. eicon_log(ccard, 128, "rT30:res  = %xn", p->resolution);
  1118. eicon_log(ccard, 128, "rT30:format = %xn", p->format);
  1119. eicon_log(ccard, 128, "rT30:pages_low = %xn", p->pages_low);
  1120. eicon_log(ccard, 128, "rT30:pages_high = %xn", p->pages_high);
  1121. eicon_log(ccard, 128, "rT30:atf  = %xn", p->atf);
  1122. eicon_log(ccard, 128, "rT30:control_bits_low = %xn", p->control_bits_low);
  1123. eicon_log(ccard, 128, "rT30:control_bits_high = %xn", p->control_bits_high);
  1124. eicon_log(ccard, 128, "rT30:feature_bits_low = %xn", p->feature_bits_low);
  1125. eicon_log(ccard, 128, "rT30:feature_bits_high = %xn", p->feature_bits_high);
  1126. //eicon_log(ccard, 128, "rT30:universal_5 = %xn", p->universal_5);
  1127. //eicon_log(ccard, 128, "rT30:universal_6 = %xn", p->universal_6);
  1128. //eicon_log(ccard, 128, "rT30:universal_7 = %xn", p->universal_7);
  1129. eicon_log(ccard, 128, "rT30:station_id_len = %xn", p->station_id_len);
  1130. eicon_log(ccard, 128, "rT30:head_line_len = %xn", p->head_line_len);
  1131. strncpy(st, p->station_id, p->station_id_len);
  1132. st[p->station_id_len] = 0;
  1133. eicon_log(ccard, 128, "rT30:station_id = <%s>n", st);
  1134. }
  1135. if (!chan->fax) {
  1136. eicon_log(ccard, 1, "idi_edata: parse to NULL fax struct, ERRORn");
  1137. return;
  1138. }
  1139. chan->fax->code = p->code;
  1140. i = (p->station_id_len < FAXIDLEN) ? p->station_id_len : (FAXIDLEN - 1);
  1141. memcpy(chan->fax->r_id, p->station_id, i);
  1142. chan->fax->r_id[i] = 0;
  1143. chan->fax->r_resolution = p->resolution;
  1144. chan->fax->r_rate = p->rate - 1;
  1145. chan->fax->r_binary = 0; /* no binary support */
  1146. chan->fax->r_width = 0;
  1147. chan->fax->r_length = 2;
  1148. chan->fax->r_scantime = 0;
  1149. chan->fax->r_compression = 0;
  1150. chan->fax->r_ecm = 0;
  1151. if (p->feature_bits_low & T30_FEATURE_BIT_2D_CODING) {
  1152. chan->fax->r_compression = 1;
  1153. if (p->feature_bits_low & T30_FEATURE_BIT_UNCOMPR_ENABLED) {
  1154. chan->fax->r_compression = 2;
  1155. }
  1156. }
  1157. if (p->feature_bits_low & T30_FEATURE_BIT_T6_CODING) {
  1158. chan->fax->r_compression = 3;
  1159. }
  1160. if (p->feature_bits_low & T30_FEATURE_BIT_ECM) {
  1161. chan->fax->r_ecm = 2;
  1162. if (p->feature_bits_low & T30_FEATURE_BIT_ECM_64_BYTES)
  1163. chan->fax->r_ecm = 1;
  1164. }
  1165. }
  1166. void
  1167. idi_fax_send_header(eicon_card *card, eicon_chan *chan, int header)
  1168. {
  1169. static __u16 wd2sff[] = {
  1170. 1728, 2048, 2432, 1216, 864
  1171. };
  1172. static __u16 ln2sff[2][3] = {
  1173. { 1143, 1401, 0 } , { 2287, 2802, 0 }
  1174. };
  1175. struct sk_buff *skb;
  1176. eicon_sff_dochead *doc;
  1177. eicon_sff_pagehead *page;
  1178. u_char *docp;
  1179. if (!chan->fax) {
  1180. eicon_log(card, 1, "idi_fax: send head with NULL fax struct, ERRORn");
  1181. return;
  1182. }
  1183. if (header == 2) { /* DocHeader + PageHeader */
  1184. skb = alloc_skb(sizeof(eicon_sff_dochead) + sizeof(eicon_sff_pagehead), GFP_ATOMIC);
  1185. } else {
  1186. skb = alloc_skb(sizeof(eicon_sff_pagehead), GFP_ATOMIC);
  1187. }
  1188. if (!skb) {
  1189. eicon_log(card, 1, "idi_err: Ch%d: alloc_skb failed in fax_send_header()n", chan->No);
  1190. return;
  1191. }
  1192. if (header == 2) { /* DocHeader + PageHeader */
  1193. docp = skb_put(skb, sizeof(eicon_sff_dochead) + sizeof(eicon_sff_pagehead));
  1194. doc = (eicon_sff_dochead *) docp;
  1195. page = (eicon_sff_pagehead *) (docp + sizeof(eicon_sff_dochead));
  1196. memset(docp, 0,sizeof(eicon_sff_dochead)  + sizeof(eicon_sff_pagehead));
  1197. doc->id = 0x66666653;
  1198. doc->version = 0x01;
  1199. doc->off1pagehead = sizeof(eicon_sff_dochead);
  1200. } else {
  1201. page = (eicon_sff_pagehead *)skb_put(skb, sizeof(eicon_sff_pagehead));
  1202. memset(page, 0, sizeof(eicon_sff_pagehead));
  1203. }
  1204. switch(header) {
  1205. case 1: /* PageHeaderEnd */
  1206. page->pageheadid = 254;
  1207. page->pageheadlen = 0; 
  1208. break;
  1209. case 0: /* PageHeader */
  1210. case 2: /* DocHeader + PageHeader */
  1211. page->pageheadid = 254;
  1212. page->pageheadlen = sizeof(eicon_sff_pagehead) - 2;
  1213. page->resvert = chan->fax->resolution;
  1214. page->reshoriz = 0; /* always 203 dpi */
  1215. page->coding = 0; /* always 1D */
  1216. page->linelength = wd2sff[chan->fax->width];
  1217. page->pagelength = ln2sff[chan->fax->resolution][chan->fax->length]; 
  1218. eicon_log(card, 128, "sSFF-Head: linelength = %dn", page->linelength);
  1219. eicon_log(card, 128, "sSFF-Head: pagelength = %dn", page->pagelength);
  1220. break;
  1221. }
  1222. idi_send_data(card, chan, 0, skb, 0, 0);
  1223. }
  1224. void
  1225. idi_fax_cmd(eicon_card *card, eicon_chan *chan) 
  1226. {
  1227. isdn_ctrl cmd;
  1228. if ((!card) || (!chan))
  1229. return;
  1230. if (!chan->fax) {
  1231. eicon_log(card, 1, "idi_fax: cmd with NULL fax struct, ERRORn");
  1232. return;
  1233. }
  1234. switch (chan->fax->code) {
  1235. case ISDN_TTY_FAX_DT:
  1236. if (chan->fax->phase == ISDN_FAX_PHASE_B) {
  1237. idi_send_edata(card, chan);
  1238. break;
  1239. }
  1240. if (chan->fax->phase == ISDN_FAX_PHASE_D) {
  1241. idi_send_edata(card, chan);
  1242. break;
  1243. }
  1244. break;
  1245. case ISDN_TTY_FAX_DR:
  1246. if (chan->fax->phase == ISDN_FAX_PHASE_B) {
  1247. idi_send_edata(card, chan);
  1248. cmd.driver = card->myid;
  1249. cmd.command = ISDN_STAT_FAXIND;
  1250. cmd.arg = chan->No;
  1251. chan->fax->r_code = ISDN_TTY_FAX_CFR;
  1252. card->interface.statcallb(&cmd);
  1253. cmd.driver = card->myid;
  1254. cmd.command = ISDN_STAT_FAXIND;
  1255. cmd.arg = chan->No;
  1256. chan->fax->r_code = ISDN_TTY_FAX_RID;
  1257. card->interface.statcallb(&cmd);
  1258. /* telling 1-D compression */
  1259. chan->fax->r_compression = 0;
  1260. cmd.driver = card->myid;
  1261. cmd.command = ISDN_STAT_FAXIND;
  1262. cmd.arg = chan->No;
  1263. chan->fax->r_code = ISDN_TTY_FAX_DCS;
  1264. card->interface.statcallb(&cmd);
  1265. chan->fax2.NextObject = FAX_OBJECT_DOCU;
  1266. chan->fax2.PrevObject = FAX_OBJECT_DOCU;
  1267. break;
  1268. }
  1269. if (chan->fax->phase == ISDN_FAX_PHASE_D) {
  1270. idi_send_edata(card, chan);
  1271. break;
  1272. }
  1273. break;
  1274. case ISDN_TTY_FAX_ET:
  1275. switch(chan->fax->fet) {
  1276. case 0:
  1277. case 1:
  1278. idi_fax_send_header(card, chan, 0);
  1279. break;
  1280. case 2:
  1281. idi_fax_send_header(card, chan, 1);
  1282. break;
  1283. }
  1284. break;
  1285. }
  1286. }
  1287. void
  1288. idi_edata_rcveop(eicon_card *card, eicon_chan *chan)
  1289. {
  1290. isdn_ctrl cmd;
  1291. if (!chan->fax) {
  1292. eicon_log(card, 1, "idi_edata: rcveop with NULL fax struct, ERRORn");
  1293. return;
  1294. }
  1295. cmd.driver = card->myid;
  1296. cmd.command = ISDN_STAT_FAXIND;
  1297. cmd.arg = chan->No;
  1298. chan->fax->r_code = ISDN_TTY_FAX_ET;
  1299. card->interface.statcallb(&cmd);
  1300. }
  1301. void
  1302. idi_reset_fax_stat(eicon_chan *chan)
  1303. {
  1304. chan->fax2.LineLen = 0;
  1305. chan->fax2.LineData = 0;
  1306. chan->fax2.LineDataLen = 0;
  1307. chan->fax2.NullByteExist = 0;
  1308. chan->fax2.Dle = 0;
  1309. chan->fax2.PageCount = 0;
  1310. chan->fax2.Eop = 0;
  1311. }
  1312. void
  1313. idi_edata_action(eicon_card *ccard, eicon_chan *chan, char *buffer, int len)
  1314. {
  1315. isdn_ctrl cmd;
  1316. if (!chan->fax) {
  1317. eicon_log(ccard, 1, "idi_edata: action with NULL fax struct, ERRORn");
  1318. return;
  1319. }
  1320. if (chan->fax->direction == ISDN_TTY_FAX_CONN_OUT) {
  1321. idi_parse_edata(ccard, chan, buffer, len);
  1322. if (chan->fax->phase == ISDN_FAX_PHASE_A) {
  1323. idi_reset_fax_stat(chan);
  1324. chan->fsm_state = EICON_STATE_ACTIVE;
  1325. cmd.driver = ccard->myid;
  1326. cmd.command = ISDN_STAT_BCONN;
  1327. cmd.arg = chan->No;
  1328. strcpy(cmd.parm.num, "");
  1329. ccard->interface.statcallb(&cmd);
  1330. cmd.driver = ccard->myid;
  1331. cmd.command = ISDN_STAT_FAXIND;
  1332. cmd.arg = chan->No;
  1333. chan->fax->r_code = ISDN_TTY_FAX_FCON;
  1334. ccard->interface.statcallb(&cmd);
  1335. cmd.driver = ccard->myid;
  1336. cmd.command = ISDN_STAT_FAXIND;
  1337. cmd.arg = chan->No;
  1338. chan->fax->r_code = ISDN_TTY_FAX_RID;
  1339. ccard->interface.statcallb(&cmd);
  1340. cmd.driver = ccard->myid;
  1341. cmd.command = ISDN_STAT_FAXIND;
  1342. cmd.arg = chan->No;
  1343. chan->fax->r_code = ISDN_TTY_FAX_DIS;
  1344. ccard->interface.statcallb(&cmd);
  1345. if (chan->fax->r_compression != 0) {
  1346. /* telling fake compression in second DIS message */
  1347. chan->fax->r_compression = 0;
  1348. cmd.driver = ccard->myid;
  1349. cmd.command = ISDN_STAT_FAXIND;
  1350. cmd.arg = chan->No;
  1351. chan->fax->r_code = ISDN_TTY_FAX_DIS;
  1352. ccard->interface.statcallb(&cmd);
  1353. }
  1354. cmd.driver = ccard->myid;
  1355. cmd.command = ISDN_STAT_FAXIND;
  1356. cmd.arg = chan->No;
  1357. chan->fax->r_code = ISDN_TTY_FAX_SENT; /* OK message */
  1358. ccard->interface.statcallb(&cmd);
  1359. } else
  1360. if (chan->fax->phase == ISDN_FAX_PHASE_D) {
  1361. if ((chan->fax->code == EDATA_T30_MCF) &&
  1362.     (chan->fax->fet != 2)) {
  1363. cmd.driver = ccard->myid;
  1364. cmd.command = ISDN_STAT_FAXIND;
  1365. cmd.arg = chan->No;
  1366. chan->fax->r_code = ISDN_TTY_FAX_PTS;
  1367. ccard->interface.statcallb(&cmd);
  1368. }
  1369. switch(chan->fax->fet) {
  1370. case 0: /* new page */
  1371. /* stay in phase D , wait on cmd +FDT */
  1372. break;
  1373. case 1: /* new document */
  1374. /* link-level switch to phase B */
  1375. break;
  1376. case 2: /* session end */
  1377. default:
  1378. /* send_edata produces error on some */
  1379. /* fax-machines here, so we don't */
  1380. /* idi_send_edata(ccard, chan); */
  1381. break;
  1382. }
  1383. }
  1384. }
  1385. if (chan->fax->direction == ISDN_TTY_FAX_CONN_IN) {
  1386. idi_parse_edata(ccard, chan, buffer, len);
  1387. if ((chan->fax->code == EDATA_T30_DCS) &&
  1388.     (chan->fax->phase == ISDN_FAX_PHASE_A)) {
  1389. idi_reset_fax_stat(chan);
  1390. cmd.driver = ccard->myid;
  1391. cmd.command = ISDN_STAT_BCONN;
  1392. cmd.arg = chan->No;
  1393. strcpy(cmd.parm.num, "");
  1394. ccard->interface.statcallb(&cmd);
  1395. cmd.driver = ccard->myid;
  1396. cmd.command = ISDN_STAT_FAXIND;
  1397. cmd.arg = chan->No;
  1398. chan->fax->r_code = ISDN_TTY_FAX_FCON_I;
  1399. ccard->interface.statcallb(&cmd);
  1400. } else
  1401. if ((chan->fax->code == EDATA_T30_TRAIN_OK) &&
  1402.     (chan->fax->phase == ISDN_FAX_PHASE_A)) {
  1403. cmd.driver = ccard->myid;
  1404. cmd.command = ISDN_STAT_FAXIND;
  1405. cmd.arg = chan->No;
  1406. chan->fax->r_code = ISDN_TTY_FAX_RID;
  1407. ccard->interface.statcallb(&cmd);
  1408. cmd.driver = ccard->myid;
  1409. cmd.command = ISDN_STAT_FAXIND;
  1410. cmd.arg = chan->No;
  1411. chan->fax->r_code = ISDN_TTY_FAX_TRAIN_OK;
  1412. ccard->interface.statcallb(&cmd);
  1413. } else
  1414. if ((chan->fax->code == EDATA_T30_TRAIN_OK) &&
  1415.     (chan->fax->phase == ISDN_FAX_PHASE_B)) {
  1416. cmd.driver = ccard->myid;
  1417. cmd.command = ISDN_STAT_FAXIND;
  1418. cmd.arg = chan->No;
  1419. chan->fax->r_code = ISDN_TTY_FAX_TRAIN_OK;
  1420. ccard->interface.statcallb(&cmd);
  1421. } else
  1422. if (chan->fax->phase == ISDN_FAX_PHASE_C) {
  1423. switch(chan->fax->code) {
  1424. case EDATA_T30_TRAIN_OK:
  1425. idi_send_edata(ccard, chan);
  1426. break;
  1427. case EDATA_T30_MPS:
  1428. chan->fax->fet = 0;
  1429. idi_edata_rcveop(ccard, chan);
  1430. break;
  1431. case EDATA_T30_EOM:
  1432. chan->fax->fet = 1;
  1433. idi_edata_rcveop(ccard, chan);
  1434. break;
  1435. case EDATA_T30_EOP:
  1436. chan->fax->fet = 2;
  1437. idi_edata_rcveop(ccard, chan);
  1438. break;
  1439. }
  1440. }
  1441. }
  1442. }
  1443. void
  1444. fax_put_rcv(eicon_card *ccard, eicon_chan *chan, u_char *Data, int len)
  1445. {
  1446. struct sk_buff *skb;
  1447.         skb = alloc_skb(len + MAX_HEADER_LEN, GFP_ATOMIC);
  1448. if (!skb) {
  1449. eicon_log(ccard, 1, "idi_err: Ch%d: alloc_skb failed in fax_put_rcv()n", chan->No);
  1450. return;
  1451. }
  1452. skb_reserve(skb, MAX_HEADER_LEN);
  1453. memcpy(skb_put(skb, len), Data, len);
  1454. ccard->interface.rcvcallb_skb(ccard->myid, chan->No, skb);
  1455. }
  1456. void
  1457. idi_faxdata_rcv(eicon_card *ccard, eicon_chan *chan, struct sk_buff *skb)
  1458. {
  1459. eicon_OBJBUFFER InBuf;
  1460. eicon_OBJBUFFER LineBuf;
  1461. unsigned int Length = 0;
  1462. unsigned int aLength = 0;
  1463. unsigned int ObjectSize = 0;
  1464. unsigned int ObjHeadLen = 0;
  1465. unsigned int ObjDataLen = 0;
  1466. __u8 Recordtype;
  1467. __u8 PageHeaderLen;
  1468. __u8 Event;
  1469. eicon_sff_pagehead *ob_page;
  1470. __u16 Cl2Eol = 0x8000;
  1471. # define EVENT_NONE 0
  1472. # define EVENT_NEEDDATA 1
  1473. if (!chan->fax) {
  1474. eicon_log(ccard, 1, "idi_fax: rcvdata with NULL fax struct, ERRORn");
  1475. return;
  1476. }
  1477. if (chan->fax->direction == ISDN_TTY_FAX_CONN_IN) {
  1478. InBuf.Data = skb->data;
  1479. InBuf.Size = skb->len;
  1480. InBuf.Len  = 0;
  1481. InBuf.Next = InBuf.Data;
  1482. LineBuf.Data = chan->fax2.abLine;
  1483. LineBuf.Size = sizeof(chan->fax2.abLine);
  1484. LineBuf.Len  = chan->fax2.LineLen;
  1485. LineBuf.Next = LineBuf.Data + LineBuf.Len;
  1486. Event = EVENT_NONE;
  1487. while (Event == EVENT_NONE) {
  1488. switch(chan->fax2.NextObject) {
  1489. case FAX_OBJECT_DOCU:
  1490. Length = LineBuf.Len + (InBuf.Size - InBuf.Len);
  1491. if (Length < sizeof(eicon_sff_dochead)) {
  1492. Event = EVENT_NEEDDATA;
  1493. break;
  1494. }
  1495. ObjectSize = sizeof(eicon_sff_dochead);
  1496. Length = ObjectSize;
  1497. if (LineBuf.Len < Length) {
  1498. Length -= LineBuf.Len;
  1499. LineBuf.Len = 0;
  1500. LineBuf.Next = LineBuf.Data;
  1501. InBuf.Len += Length;
  1502. InBuf.Next += Length;
  1503. } else {
  1504. LineBuf.Len -= Length;
  1505. LineBuf.Next = LineBuf.Data + LineBuf.Len;
  1506. memmove(LineBuf.Data, LineBuf.Data + Length, LineBuf.Len);
  1507. }
  1508. chan->fax2.PrevObject = FAX_OBJECT_DOCU;
  1509. chan->fax2.NextObject = FAX_OBJECT_PAGE;
  1510. break;
  1511. case FAX_OBJECT_PAGE:
  1512. Length = LineBuf.Len + (InBuf.Size - InBuf.Len);
  1513. if (Length < 2) {
  1514. Event = EVENT_NEEDDATA;
  1515. break;
  1516. }
  1517. if (LineBuf.Len == 0) {
  1518. *LineBuf.Next++ = *InBuf.Next++;
  1519. LineBuf.Len++;
  1520. InBuf.Len++;
  1521. }
  1522. if (LineBuf.Len == 1) {
  1523. *LineBuf.Next++ = *InBuf.Next++;
  1524. LineBuf.Len++;
  1525. InBuf.Len++;
  1526. }
  1527. PageHeaderLen = *(LineBuf.Data + 1);
  1528. ObjectSize = (PageHeaderLen == 0) ? 2 : sizeof(eicon_sff_pagehead);
  1529. if (Length < ObjectSize) {
  1530. Event = EVENT_NEEDDATA;
  1531. break;
  1532. }
  1533. Length = ObjectSize;
  1534. /* extract page dimensions */
  1535. if (LineBuf.Len < Length) {
  1536. aLength = Length - LineBuf.Len;
  1537. memcpy(LineBuf.Next, InBuf.Next, aLength);
  1538. LineBuf.Next += aLength;
  1539. InBuf.Next += aLength;
  1540. LineBuf.Len += aLength;
  1541. InBuf.Len += aLength;
  1542. }
  1543. if (Length > 2) {
  1544. ob_page = (eicon_sff_pagehead *)LineBuf.Data;
  1545. switch(ob_page->linelength) {
  1546. case 2048:
  1547. chan->fax->r_width = 1;
  1548. break;
  1549. case 2432:
  1550. chan->fax->r_width = 2;
  1551. break;
  1552. case 1216:
  1553. chan->fax->r_width = 3;
  1554. break;
  1555. case 864:
  1556. chan->fax->r_width = 4;
  1557. break;
  1558. case 1728:
  1559. default:
  1560. chan->fax->r_width = 0;
  1561. }
  1562. switch(ob_page->pagelength) {
  1563. case 1143:
  1564. case 2287:
  1565. chan->fax->r_length = 0;
  1566. break;
  1567. case 1401:
  1568. case 2802:
  1569. chan->fax->r_length = 1;
  1570. break;
  1571. default:
  1572. chan->fax->r_length = 2;
  1573. }
  1574. eicon_log(ccard, 128, "rSFF-Head: linelength = %dn", ob_page->linelength);
  1575. eicon_log(ccard, 128, "rSFF-Head: pagelength = %dn", ob_page->pagelength);
  1576. }
  1577. LineBuf.Len -= Length;
  1578. LineBuf.Next = LineBuf.Data + LineBuf.Len;
  1579. memmove(LineBuf.Data, LineBuf.Data + Length, LineBuf.Len);
  1580. chan->fax2.PrevObject = FAX_OBJECT_PAGE;
  1581. chan->fax2.NextObject = FAX_OBJECT_LINE;
  1582. break;
  1583. case FAX_OBJECT_LINE:
  1584. Length = LineBuf.Len + (InBuf.Size - InBuf.Len);
  1585. if (Length < 1) {
  1586. Event = EVENT_NEEDDATA;
  1587. break;
  1588. }
  1589. if (LineBuf.Len == 0) {
  1590. *LineBuf.Next++ = *InBuf.Next++;
  1591. LineBuf.Len++;
  1592. InBuf.Len++;
  1593. }
  1594. Recordtype = *LineBuf.Data;
  1595. if (Recordtype == 0) {
  1596. /* recordtype pixel row (2 byte length) */
  1597. ObjHeadLen = 3;
  1598. if (Length < ObjHeadLen) {
  1599. Event = EVENT_NEEDDATA;
  1600. break;
  1601. }
  1602. while (LineBuf.Len < ObjHeadLen) {
  1603. *LineBuf.Next++ = *InBuf.Next++;
  1604. LineBuf.Len++;
  1605. InBuf.Len++;
  1606. }
  1607. ObjDataLen = *((__u16*) (LineBuf.Data + 1));
  1608. ObjectSize = ObjHeadLen + ObjDataLen;
  1609. if (Length < ObjectSize) {
  1610. Event = EVENT_NEEDDATA;
  1611. break;
  1612. }
  1613. } else
  1614. if ((Recordtype >= 1) && (Recordtype <= 216)) {
  1615. /* recordtype pixel row (1 byte length) */
  1616. ObjHeadLen = 1;
  1617. ObjDataLen = Recordtype;
  1618. ObjectSize = ObjHeadLen + ObjDataLen;
  1619. if (Length < ObjectSize) {
  1620. Event = EVENT_NEEDDATA;
  1621. break;
  1622. }
  1623. } else
  1624. if ((Recordtype >= 217) && (Recordtype <= 253)) {
  1625. /* recordtype empty lines */
  1626. ObjHeadLen = 1;
  1627. ObjDataLen = 0;
  1628. ObjectSize = ObjHeadLen + ObjDataLen;
  1629. LineBuf.Len--;
  1630. LineBuf.Next = LineBuf.Data + LineBuf.Len;
  1631. memmove(LineBuf.Data, LineBuf.Data + 1, LineBuf.Len);
  1632. break;
  1633. } else
  1634. if (Recordtype == 254) {
  1635. /* recordtype page header */
  1636. chan->fax2.PrevObject = FAX_OBJECT_LINE;
  1637. chan->fax2.NextObject = FAX_OBJECT_PAGE;
  1638. break;
  1639. } else {
  1640. /* recordtype user information */
  1641. ObjHeadLen = 2;
  1642. if (Length < ObjHeadLen) {
  1643. Event = EVENT_NEEDDATA;
  1644. break;
  1645. }
  1646. while (LineBuf.Len < ObjHeadLen) {
  1647. *LineBuf.Next++ = *InBuf.Next++;
  1648. LineBuf.Len++;
  1649. InBuf.Len++;
  1650. }
  1651. ObjDataLen = *(LineBuf.Data + 1);
  1652. ObjectSize = ObjHeadLen + ObjDataLen;
  1653. if (ObjDataLen == 0) {
  1654. /* illegal line coding */
  1655. LineBuf.Len -= ObjHeadLen;
  1656. LineBuf.Next = LineBuf.Data + LineBuf.Len;
  1657. memmove(LineBuf.Data, LineBuf.Data + ObjHeadLen, LineBuf.Len);
  1658. break;
  1659. } else {
  1660. /* user information */
  1661. if (Length < ObjectSize) {
  1662. Event = EVENT_NEEDDATA;
  1663. break;
  1664. }
  1665. Length = ObjectSize;
  1666. if (LineBuf.Len < Length) {
  1667. Length -= LineBuf.Len;
  1668. LineBuf.Len = 0;
  1669. LineBuf.Next = LineBuf.Data;
  1670. InBuf.Len += Length;
  1671. InBuf.Next += Length;
  1672. } else {
  1673. LineBuf.Len -= Length;
  1674. LineBuf.Next = LineBuf.Data + LineBuf.Len;
  1675. memmove(LineBuf.Data, LineBuf.Data + Length, LineBuf.Len);
  1676. }
  1677. }
  1678. break;
  1679. }
  1680. Length = ObjectSize;
  1681. if (LineBuf.Len > ObjHeadLen) {
  1682. fax_put_rcv(ccard, chan, LineBuf.Data + ObjHeadLen,
  1683. (LineBuf.Len - ObjHeadLen));
  1684. }
  1685. Length -= LineBuf.Len;
  1686. LineBuf.Len = 0;
  1687. LineBuf.Next = LineBuf.Data;
  1688. if (Length > 0) {
  1689. fax_put_rcv(ccard, chan, InBuf.Next, Length);
  1690. InBuf.Len += Length;
  1691. InBuf.Next += Length;
  1692. }
  1693. fax_put_rcv(ccard, chan, (__u8 *)&Cl2Eol, sizeof(Cl2Eol));
  1694. break;
  1695. } /* end of switch (chan->fax2.NextObject) */
  1696. } /* end of while (Event==EVENT_NONE) */
  1697. if (InBuf.Len < InBuf.Size) {
  1698. Length = InBuf.Size - InBuf.Len;
  1699. if ((LineBuf.Len + Length) > LineBuf.Size) {
  1700. eicon_log(ccard, 1, "idi_fax: Ch%d: %d bytes dropping, small buffern", chan->No,
  1701. Length);
  1702. } else {
  1703. memcpy(LineBuf.Next, InBuf.Next, Length);
  1704. LineBuf.Len += Length;
  1705. }
  1706. }
  1707. chan->fax2.LineLen = LineBuf.Len;
  1708. } else { /* CONN_OUT */
  1709. /* On CONN_OUT we do not need incoming data, drop it */
  1710. /* maybe later for polling */
  1711. }
  1712. # undef EVENT_NONE
  1713. # undef EVENT_NEEDDATA
  1714. return;
  1715. }
  1716. int
  1717. idi_fax_send_outbuf(eicon_card *ccard, eicon_chan *chan, eicon_OBJBUFFER *OutBuf)
  1718. {
  1719. struct sk_buff *skb;
  1720. skb = alloc_skb(OutBuf->Len, GFP_ATOMIC);
  1721. if (!skb) {
  1722. eicon_log(ccard, 1, "idi_err: Ch%d: alloc_skb failed in fax_send_outbuf()n", chan->No);
  1723. return(-1);
  1724. }
  1725. memcpy(skb_put(skb, OutBuf->Len), OutBuf->Data, OutBuf->Len);
  1726. OutBuf->Len = 0;
  1727. OutBuf->Next = OutBuf->Data;
  1728. return(idi_send_data(ccard, chan, 0, skb, 1, 0));
  1729. }
  1730. int
  1731. idi_faxdata_send(eicon_card *ccard, eicon_chan *chan, struct sk_buff *skb)
  1732. {
  1733. isdn_ctrl cmd;
  1734. eicon_OBJBUFFER InBuf;
  1735. __u8 InData;
  1736. __u8 InMask;
  1737. eicon_OBJBUFFER OutBuf;
  1738. eicon_OBJBUFFER LineBuf;
  1739. __u32 LineData;
  1740. unsigned int LineDataLen;
  1741. __u8 Byte;
  1742. __u8 Event;
  1743. int ret = 1;
  1744. # define EVENT_NONE 0
  1745. # define EVENT_EOD 1
  1746. # define EVENT_EOL  2
  1747. # define EVENT_EOP  3
  1748. if ((!ccard) || (!chan))
  1749. return -1;
  1750. if (!chan->fax) {
  1751. eicon_log(ccard, 1, "idi_fax: senddata with NULL fax struct, ERRORn");
  1752. return -1;
  1753. }
  1754. if (chan->fax->direction == ISDN_TTY_FAX_CONN_IN) {
  1755. /* Simply ignore any data written in data mode when receiving a fax.    */
  1756. /* This is not completely correct because only XON's should come here.  */
  1757.          dev_kfree_skb(skb);
  1758. return 1;
  1759. }
  1760. if (chan->fax->phase != ISDN_FAX_PHASE_C) {
  1761.          dev_kfree_skb(skb);
  1762. return 1;
  1763. }
  1764.         if (chan->queued + skb->len > 1200)
  1765.                 return 0;
  1766. if (chan->pqueued > 1)
  1767. return 0;
  1768. InBuf.Data = skb->data;
  1769. InBuf.Size = skb->len;
  1770. InBuf.Len  = 0;
  1771. InBuf.Next = InBuf.Data;
  1772. InData = 0;
  1773. InMask = 0;
  1774. LineBuf.Data = chan->fax2.abLine;
  1775. LineBuf.Size = sizeof(chan->fax2.abLine);
  1776. LineBuf.Len  = chan->fax2.LineLen;
  1777. LineBuf.Next = LineBuf.Data + LineBuf.Len;
  1778. LineData = chan->fax2.LineData;
  1779. LineDataLen = chan->fax2.LineDataLen;
  1780. OutBuf.Data = chan->fax2.abFrame;
  1781. OutBuf.Size = sizeof(chan->fax2.abFrame);
  1782. OutBuf.Len = 0;
  1783. OutBuf.Next = OutBuf.Data;
  1784. Event = EVENT_NONE;
  1785. chan->fax2.Eop = 0;
  1786. for (;;) {
  1787.   for (;;) {
  1788. if (InMask == 0) {
  1789. if (InBuf.Len >= InBuf.Size) {
  1790. Event = EVENT_EOD;
  1791. break;
  1792. }
  1793. if ((chan->fax2.Dle != _DLE_) && *InBuf.Next == _DLE_) {
  1794. chan->fax2.Dle = _DLE_;
  1795. InBuf.Next++;
  1796. InBuf.Len++;
  1797. if (InBuf.Len >= InBuf.Size) {
  1798. Event = EVENT_EOD;
  1799. break;
  1800. }
  1801. }
  1802. if (chan->fax2.Dle == _DLE_) {
  1803. chan->fax2.Dle = 0;
  1804. if (*InBuf.Next == _ETX_) {
  1805. Event = EVENT_EOP;
  1806. break;
  1807. } else
  1808. if (*InBuf.Next == _DLE_) {
  1809. /* do nothing */
  1810. } else {
  1811. eicon_log(ccard, 1,
  1812. "idi_err: Ch%d: unknown DLE escape %02x foundn",
  1813. chan->No, *InBuf.Next);
  1814. InBuf.Next++;
  1815. InBuf.Len++;
  1816. if (InBuf.Len >= InBuf.Size) {
  1817. Event = EVENT_EOD;
  1818. break;
  1819. }
  1820. }
  1821. }
  1822. InBuf.Len++;
  1823. InData = *InBuf.Next++;
  1824. InMask = (chan->fax->bor) ? 0x80 : 0x01;
  1825. }
  1826. while (InMask) {
  1827. LineData >>= 1;
  1828. LineDataLen++;
  1829. if (InData & InMask)
  1830. LineData |= 0x80000000;
  1831. if (chan->fax->bor)
  1832. InMask >>= 1;
  1833. else
  1834. InMask <<= 1;
  1835. if ((LineDataLen >= T4_EOL_BITSIZE) &&
  1836.    ((LineData & T4_EOL_MASK_DWORD) == T4_EOL_DWORD)) {
  1837. Event = EVENT_EOL;
  1838. if (LineDataLen > T4_EOL_BITSIZE) {
  1839. Byte = (__u8)
  1840. ((LineData & ~T4_EOL_MASK_DWORD) >>
  1841. (32 - LineDataLen));
  1842. if (Byte == 0) {
  1843. if (! chan->fax2.NullByteExist) {
  1844. chan->fax2.NullBytesPos = LineBuf.Len;
  1845. chan->fax2.NullByteExist = 1;
  1846. }
  1847. } else {
  1848. chan->fax2.NullByteExist = 0;
  1849. }
  1850. if (LineBuf.Len < LineBuf.Size) {
  1851. *LineBuf.Next++  = Byte;
  1852. LineBuf.Len++;
  1853. }
  1854. }
  1855. LineDataLen = 0;
  1856. break;
  1857. }
  1858. if (LineDataLen >= T4_EOL_BITSIZE + 8) {
  1859. Byte = (__u8)
  1860. ((LineData & ~T4_EOL_MASK_DWORD) >>
  1861. (32 - T4_EOL_BITSIZE - 8));
  1862. LineData &= T4_EOL_MASK_DWORD;
  1863. LineDataLen = T4_EOL_BITSIZE;
  1864. if (Byte == 0) {
  1865. if (! chan->fax2.NullByteExist) {
  1866. chan->fax2.NullBytesPos = LineBuf.Len;
  1867. chan->fax2.NullByteExist = 1;
  1868. }
  1869. } else {
  1870. chan->fax2.NullByteExist = 0;
  1871. }
  1872. if (LineBuf.Len < LineBuf.Size) {
  1873. *LineBuf.Next++  = Byte; 
  1874. LineBuf.Len++;
  1875. }
  1876. }
  1877. }
  1878. if (Event != EVENT_NONE)
  1879. break;
  1880.   }
  1881. if ((Event != EVENT_EOL) && (Event != EVENT_EOP))
  1882. break;
  1883. if ((Event == EVENT_EOP) && (LineDataLen > 0)) {
  1884. LineData >>= 32 - LineDataLen;
  1885. LineDataLen = 0;
  1886. while (LineData != 0) {
  1887. Byte = (__u8) LineData;
  1888. LineData >>= 8;
  1889. if (Byte == 0) {
  1890. if (! chan->fax2.NullByteExist) {
  1891. chan->fax2.NullBytesPos = LineBuf.Len;
  1892. chan->fax2.NullByteExist = 1;
  1893. }
  1894. } else {
  1895. chan->fax2.NullByteExist = 0;
  1896. }
  1897. if (LineBuf.Len < LineBuf.Size) {
  1898. *LineBuf.Next++  = Byte;
  1899. LineBuf.Len++;
  1900. }
  1901. }
  1902. }
  1903. if (chan->fax2.NullByteExist) {
  1904. if (chan->fax2.NullBytesPos == 0) {
  1905. LineBuf.Len = 0;
  1906. } else {
  1907. LineBuf.Len = chan->fax2.NullBytesPos + 1;
  1908. }
  1909. }
  1910. if (LineBuf.Len > 0) {
  1911. if (OutBuf.Len + LineBuf.Len + SFF_LEN_FLD_SIZE > OutBuf.Size) {
  1912. ret = idi_fax_send_outbuf(ccard, chan, &OutBuf);
  1913. }
  1914. if (LineBuf.Len <= 216) {
  1915. *OutBuf.Next++ = (__u8) LineBuf.Len;
  1916. OutBuf.Len++;
  1917. } else {
  1918. *OutBuf.Next++ = 0;
  1919. *((__u16 *) OutBuf.Next)++ = (__u16) LineBuf.Len;
  1920. OutBuf.Len += 3;
  1921. }
  1922. memcpy(OutBuf.Next, LineBuf.Data, LineBuf.Len);
  1923. OutBuf.Next += LineBuf.Len;
  1924. OutBuf.Len  += LineBuf.Len;
  1925. }
  1926. LineBuf.Len = 0;
  1927. LineBuf.Next = LineBuf.Data;
  1928. chan->fax2.NullByteExist = 0;
  1929. if (Event == EVENT_EOP)
  1930. break;
  1931. Event = EVENT_NONE;
  1932. }
  1933. if (Event == EVENT_EOP) {
  1934. chan->fax2.Eop = 1;
  1935. chan->fax2.PageCount++;
  1936. cmd.driver = ccard->myid;
  1937. cmd.command = ISDN_STAT_FAXIND;
  1938. cmd.arg = chan->No;
  1939. chan->fax->r_code = ISDN_TTY_FAX_EOP;
  1940. ccard->interface.statcallb(&cmd);
  1941. }
  1942. if (OutBuf.Len > 0) {
  1943. ret = idi_fax_send_outbuf(ccard, chan, &OutBuf);
  1944. }
  1945. chan->fax2.LineLen = LineBuf.Len;
  1946. chan->fax2.LineData = LineData;
  1947. chan->fax2.LineDataLen = LineDataLen;
  1948. # undef EVENT_NONE
  1949. # undef EVENT_EOD
  1950. # undef EVENT_EOL
  1951. # undef EVENT_EOP
  1952. if (ret >= 0)
  1953.         dev_kfree_skb(skb);
  1954. if (ret == 0)
  1955. ret = 1;
  1956. return(ret);
  1957. }
  1958. void
  1959. idi_fax_hangup(eicon_card *ccard, eicon_chan *chan)
  1960. {
  1961. isdn_ctrl cmd;
  1962. if (!chan->fax) {
  1963. eicon_log(ccard, 1, "idi_fax: hangup with NULL fax struct, ERRORn");
  1964. return;
  1965. }
  1966. if ((chan->fax->direction == ISDN_TTY_FAX_CONN_OUT) &&
  1967.     (chan->fax->code == 0)) {
  1968. cmd.driver = ccard->myid;
  1969. cmd.command = ISDN_STAT_FAXIND;
  1970. cmd.arg = chan->No;
  1971. chan->fax->r_code = ISDN_TTY_FAX_PTS;
  1972. ccard->interface.statcallb(&cmd);
  1973. }
  1974. if ((chan->fax->code > 1) && (chan->fax->code < 120))
  1975. chan->fax->code += 120;
  1976. eicon_log(ccard, 8, "idi_fax: Ch%d: Hangup (code=%d)n", chan->No, chan->fax->code);
  1977. chan->fax->r_code = ISDN_TTY_FAX_HNG;
  1978. cmd.driver = ccard->myid;
  1979. cmd.command = ISDN_STAT_FAXIND;
  1980. cmd.arg = chan->No;
  1981. ccard->interface.statcallb(&cmd);
  1982. }
  1983. #endif /******** FAX ********/
  1984. int
  1985. idi_send_udata(eicon_card *card, eicon_chan *chan, int UReq, u_char *buffer, int len)
  1986. {
  1987. struct sk_buff *skb;
  1988. struct sk_buff *skb2;
  1989. eicon_REQ *reqbuf;
  1990. eicon_chan_ptr *chan2;
  1991. if ((chan->fsm_state == EICON_STATE_NULL) || (chan->fsm_state == EICON_STATE_LISTEN)) {
  1992. eicon_log(card, 1, "idi_snd: Ch%d: send udata on state %d !n", chan->No, chan->fsm_state);
  1993. return -ENODEV;
  1994. }
  1995. eicon_log(card, 8, "idi_snd: Ch%d: udata 0x%x: %d %d %d %dn", chan->No,
  1996. UReq, buffer[0], buffer[1], buffer[2], buffer[3]);
  1997. skb = alloc_skb(sizeof(eicon_REQ) + len + 1, GFP_ATOMIC);
  1998. skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  1999. if ((!skb) || (!skb2)) {
  2000. eicon_log(card, 1, "idi_err: Ch%d: alloc_skb failed in send_udata()n", chan->No);
  2001. if (skb) 
  2002. dev_kfree_skb(skb);
  2003. if (skb2) 
  2004. dev_kfree_skb(skb2);
  2005. return -ENOMEM;
  2006. }
  2007. chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  2008. chan2->ptr = chan;
  2009. reqbuf = (eicon_REQ *)skb_put(skb, 1 + len + sizeof(eicon_REQ));
  2010. reqbuf->Req = N_UDATA;
  2011. reqbuf->ReqCh = chan->e.IndCh;
  2012. reqbuf->ReqId = 1;
  2013. reqbuf->XBuffer.length = len + 1;
  2014. reqbuf->XBuffer.P[0] = UReq;
  2015. memcpy(&reqbuf->XBuffer.P[1], buffer, len);
  2016. reqbuf->Reference = 1; /* Net Entity */
  2017. skb_queue_tail(&chan->e.X, skb);
  2018. skb_queue_tail(&card->sndq, skb2);
  2019. eicon_schedule_tx(card);
  2020. return (0);
  2021. }
  2022. void
  2023. idi_audio_cmd(eicon_card *ccard, eicon_chan *chan, int cmd, u_char *value)
  2024. {
  2025. u_char buf[6];
  2026. struct enable_dtmf_s *dtmf_buf = (struct enable_dtmf_s *)buf;
  2027. if ((!ccard) || (!chan))
  2028. return;
  2029. memset(buf, 0, 6);
  2030. switch(cmd) {
  2031. case ISDN_AUDIO_SETDD:
  2032. if (value[0]) {
  2033. dtmf_buf->tone = (__u16) (value[1] * 5);
  2034. dtmf_buf->gap = (__u16) (value[1] * 5);
  2035. idi_send_udata(ccard, chan,
  2036. DSP_UDATA_REQUEST_ENABLE_DTMF_RECEIVER,
  2037. buf, 4);
  2038. } else {
  2039. idi_send_udata(ccard, chan,
  2040. DSP_UDATA_REQUEST_DISABLE_DTMF_RECEIVER,
  2041. buf, 0);
  2042. }
  2043. break;
  2044. }
  2045. }
  2046. void
  2047. idi_parse_udata(eicon_card *ccard, eicon_chan *chan, unsigned char *buffer, int len)
  2048. {
  2049. isdn_ctrl cmd;
  2050. eicon_dsp_ind *p = (eicon_dsp_ind *) (&buffer[1]);
  2051.         static char *connmsg[] =
  2052.         {"", "V.21", "V.23", "V.22", "V.22bis", "V.32bis", "V.34",
  2053.          "V.8", "Bell 212A", "Bell 103", "V.29 Leased", "V.33 Leased", "V.90",
  2054.          "V.21 CH2", "V.27ter", "V.29", "V.33", "V.17", "V.32", "K56Flex",
  2055.          "X2", "V.18", "V.18LH", "V.18HL", "V.21LH", "V.21HL",
  2056.          "Bell 103LH", "Bell 103HL", "V.23", "V.23", "EDT 110",
  2057.          "Baudot45", "Baudot47", "Baudot50", "DTMF" };
  2058. static u_char dtmf_code[] = {
  2059. '1','4','7','*','2','5','8','0','3','6','9','#','A','B','C','D'
  2060. };
  2061. if ((!ccard) || (!chan))
  2062. return;
  2063. switch (buffer[0]) {
  2064. case DSP_UDATA_INDICATION_SYNC:
  2065. eicon_log(ccard, 16, "idi_ind: Ch%d: UDATA_SYNC time %dn", chan->No, p->time);
  2066. break;
  2067. case DSP_UDATA_INDICATION_DCD_OFF:
  2068. eicon_log(ccard, 8, "idi_ind: Ch%d: UDATA_DCD_OFF time %dn", chan->No, p->time);
  2069. break;
  2070. case DSP_UDATA_INDICATION_DCD_ON:
  2071. if ((chan->l2prot == ISDN_PROTO_L2_MODEM) &&
  2072.     (chan->fsm_state == EICON_STATE_WMCONN)) {
  2073. chan->fsm_state = EICON_STATE_ACTIVE;
  2074. cmd.driver = ccard->myid;
  2075. cmd.command = ISDN_STAT_BCONN;
  2076. cmd.arg = chan->No;
  2077.                                 if (p->norm > 34) {
  2078.                                   sprintf(cmd.parm.num, "%d/(%d)", p->speed, p->norm);
  2079.                                 } else {
  2080.                                   sprintf(cmd.parm.num, "%d/%s", p->speed, connmsg[p->norm]);
  2081.                                 }
  2082. ccard->interface.statcallb(&cmd);
  2083. }
  2084. eicon_log(ccard, 8, "idi_ind: Ch%d: UDATA_DCD_ON time %dn", chan->No, p->time);
  2085. eicon_log(ccard, 8, "idi_ind: Ch%d: %d %d %d %dn", chan->No,
  2086. p->norm, p->options, p->speed, p->delay); 
  2087. break;
  2088. case DSP_UDATA_INDICATION_CTS_OFF:
  2089. eicon_log(ccard, 8, "idi_ind: Ch%d: UDATA_CTS_OFF time %dn", chan->No, p->time);
  2090. break;
  2091. case DSP_UDATA_INDICATION_CTS_ON:
  2092. eicon_log(ccard, 8, "idi_ind: Ch%d: UDATA_CTS_ON time %dn", chan->No, p->time);
  2093. eicon_log(ccard, 8, "idi_ind: Ch%d: %d %d %d %dn", chan->No,
  2094. p->norm, p->options, p->speed, p->delay); 
  2095. break;
  2096. case DSP_UDATA_INDICATION_DISCONNECT:
  2097. eicon_log(ccard, 8, "idi_ind: Ch%d: UDATA_DISCONNECT cause %dn", chan->No, buffer[1]);
  2098. break;
  2099. case DSP_UDATA_INDICATION_DTMF_DIGITS_RECEIVED:
  2100. eicon_log(ccard, 8, "idi_ind: Ch%d: UDATA_DTMF_REC '%c'n", chan->No,
  2101. dtmf_code[buffer[1]]);
  2102. cmd.driver = ccard->myid;
  2103. cmd.command = ISDN_STAT_AUDIO;
  2104. cmd.parm.num[0] = ISDN_AUDIO_DTMF;
  2105. cmd.parm.num[1] = dtmf_code[buffer[1]];
  2106. cmd.arg = chan->No;
  2107. ccard->interface.statcallb(&cmd);
  2108. break;
  2109. default:
  2110. eicon_log(ccard, 8, "idi_ind: Ch%d: UNHANDLED UDATA Indication 0x%02xn", chan->No, buffer[0]);
  2111. }
  2112. }
  2113. void
  2114. eicon_parse_trace(eicon_card *ccard, unsigned char *buffer, int len)
  2115. {
  2116. int i,j,n;
  2117. int buflen = len * 3 + 30;
  2118. char *p;
  2119. struct trace_s {
  2120. unsigned long time;
  2121. unsigned short size;
  2122. unsigned short code;
  2123. unsigned char data[1];
  2124. } *q;
  2125. if (!(p = kmalloc(buflen, GFP_ATOMIC))) {
  2126. eicon_log(ccard, 1, "idi_err: Ch??: could not allocate trace buffern");
  2127. return;
  2128. }
  2129. memset(p, 0, buflen);
  2130. q = (struct trace_s *)buffer;
  2131. if (DebugVar & 512) {
  2132. if ((q->code == 3) || (q->code == 4)) {
  2133. n = (short) *(q->data);
  2134. if (n) {
  2135. j = sprintf(p, "DTRC:");
  2136. for (i = 0; i < n; i++) {
  2137. j += sprintf(p + j, "%02x ", q->data[i+2]);
  2138. }
  2139. j += sprintf(p + j, "n");
  2140. }
  2141. }
  2142. } else {
  2143. j = sprintf(p, "XLOG: %lx %04x %04x ",
  2144. q->time, q->size, q->code);
  2145. for (i = 0; i < q->size; i++) {
  2146. j += sprintf(p + j, "%02x ", q->data[i]);
  2147. }
  2148. j += sprintf(p + j, "n");
  2149. }
  2150. if (strlen(p))
  2151. eicon_putstatus(ccard, p);
  2152. kfree(p);
  2153. }
  2154. void
  2155. idi_handle_ind(eicon_card *ccard, struct sk_buff *skb)
  2156. {
  2157. int tmp;
  2158. char tnum[64];
  2159. int dlev;
  2160. int free_buff;
  2161. ulong flags;
  2162. struct sk_buff *skb2;
  2163.         eicon_IND *ind = (eicon_IND *)skb->data;
  2164. eicon_chan *chan;
  2165. idi_ind_message message;
  2166. isdn_ctrl cmd;
  2167. if (!ccard) {
  2168. eicon_log(ccard, 1, "idi_err: Ch??: null card in handle_indn");
  2169.    dev_kfree_skb(skb);
  2170. return;
  2171. }
  2172. if ((chan = ccard->IdTable[ind->IndId]) == NULL) {
  2173. eicon_log(ccard, 1, "idi_err: Ch??: null chan in handle_indn");
  2174.    dev_kfree_skb(skb);
  2175. return;
  2176. }
  2177. if ((ind->Ind != 8) && (ind->Ind != 0xc))
  2178. dlev = 144;
  2179. else
  2180. dlev = 128;
  2181.         eicon_log(ccard, dlev, "idi_hdl: Ch%d: Ind=%x Id=%x Ch=%x MInd=%x MLen=%x Len=%xn", chan->No,
  2182.         ind->Ind,ind->IndId,ind->IndCh,ind->MInd,ind->MLength,ind->RBuffer.length);
  2183. free_buff = 1;
  2184. /* Signal Layer */
  2185. if (chan->e.D3Id == ind->IndId) {
  2186. idi_IndParse(ccard, chan, &message, ind->RBuffer.P, ind->RBuffer.length);
  2187. switch(ind->Ind) {
  2188. case HANGUP:
  2189. eicon_log(ccard, 8, "idi_ind: Ch%d: Hangupn", chan->No);
  2190.                 while((skb2 = skb_dequeue(&chan->e.X))) {
  2191. dev_kfree_skb(skb2);
  2192. }
  2193. spin_lock_irqsave(&eicon_lock, flags);
  2194. chan->queued = 0;
  2195. chan->pqueued = 0;
  2196. chan->waitq = 0;
  2197. chan->waitpq = 0;
  2198. spin_unlock_irqrestore(&eicon_lock, flags);
  2199. if (message.e_cau[0] & 0x7f) {
  2200. cmd.driver = ccard->myid;
  2201. cmd.arg = chan->No;
  2202. sprintf(cmd.parm.num,"E%02x%02x", 
  2203. chan->cause[0]&0x7f, message.e_cau[0]&0x7f); 
  2204. cmd.command = ISDN_STAT_CAUSE;
  2205. ccard->interface.statcallb(&cmd);
  2206. }
  2207. chan->cause[0] = 0; 
  2208. if (((chan->fsm_state == EICON_STATE_ACTIVE) ||
  2209.     (chan->fsm_state == EICON_STATE_WMCONN)) ||
  2210.     ((chan->l2prot == ISDN_PROTO_L2_FAX) &&
  2211.     (chan->fsm_state == EICON_STATE_OBWAIT))) {
  2212. chan->fsm_state = EICON_STATE_NULL;
  2213. } else {
  2214. if (chan->e.B2Id)
  2215. idi_do_req(ccard, chan, REMOVE, 1);
  2216. chan->statectrl &= ~WAITING_FOR_HANGUP;
  2217. chan->statectrl &= ~IN_HOLD;
  2218. if (chan->statectrl & HAVE_CONN_REQ) {
  2219. eicon_log(ccard, 32, "idi_req: Ch%d: queueing delayed conn_reqn", chan->No);
  2220. chan->statectrl &= ~HAVE_CONN_REQ;
  2221. if ((chan->tskb1) && (chan->tskb2)) {
  2222. skb_queue_tail(&chan->e.X, chan->tskb1);
  2223. skb_queue_tail(&ccard->sndq, chan->tskb2); 
  2224. eicon_schedule_tx(ccard);
  2225. }
  2226. chan->tskb1 = NULL;
  2227. chan->tskb2 = NULL;
  2228. } else {
  2229. chan->fsm_state = EICON_STATE_NULL;
  2230. cmd.driver = ccard->myid;
  2231. cmd.arg = chan->No;
  2232. cmd.command = ISDN_STAT_DHUP;
  2233. ccard->interface.statcallb(&cmd);
  2234. eicon_idi_listen_req(ccard, chan);
  2235. #ifdef CONFIG_ISDN_TTY_FAX
  2236. chan->fax = 0;
  2237. #endif
  2238. }
  2239. }
  2240. break;
  2241. case INDICATE_IND:
  2242. eicon_log(ccard, 8, "idi_ind: Ch%d: Indicate_Indn", chan->No);
  2243. if (chan->fsm_state != EICON_STATE_LISTEN) {
  2244. eicon_log(ccard, 1, "idi_err: Ch%d: Incoming call on wrong state (%d).n",
  2245. chan->No, chan->fsm_state);
  2246. idi_do_req(ccard, chan, HANGUP, 0);
  2247. break;
  2248. }
  2249. chan->fsm_state = EICON_STATE_ICALL;
  2250. idi_bc2si(message.bc, message.hlc, message.sin, &chan->si1, &chan->si2);
  2251. strcpy(chan->cpn, message.cpn + 1);
  2252. strcpy(chan->oad, message.oad);
  2253. strcpy(chan->dsa, message.dsa);
  2254. strcpy(chan->osa, message.osa);
  2255. chan->plan = message.plan;
  2256. chan->screen = message.screen;
  2257. try_stat_icall_again: 
  2258. cmd.driver = ccard->myid;
  2259. cmd.command = ISDN_STAT_ICALL;
  2260. cmd.arg = chan->No;
  2261. cmd.parm.setup.si1 = chan->si1;
  2262. cmd.parm.setup.si2 = chan->si2;
  2263. strcpy(tnum, chan->cpn);
  2264. if (strlen(chan->dsa)) {
  2265. strcat(tnum, ".");
  2266. strcat(tnum, chan->dsa);
  2267. }
  2268. tnum[ISDN_MSNLEN - 1] = 0;
  2269. strcpy(cmd.parm.setup.eazmsn, tnum);
  2270. strcpy(tnum, chan->oad);
  2271. if (strlen(chan->osa)) {
  2272. strcat(tnum, ".");
  2273. strcat(tnum, chan->osa);
  2274. }
  2275. tnum[ISDN_MSNLEN - 1] = 0;
  2276. strcpy(cmd.parm.setup.phone, tnum);
  2277. cmd.parm.setup.plan = chan->plan;
  2278. cmd.parm.setup.screen = chan->screen;
  2279. tmp = ccard->interface.statcallb(&cmd);
  2280. switch(tmp) {
  2281. case 0: /* no user responding */
  2282. idi_do_req(ccard, chan, HANGUP, 0);
  2283. chan->fsm_state = EICON_STATE_NULL;
  2284. break;
  2285. case 1: /* alert */
  2286. eicon_log(ccard, 8, "idi_req: Ch%d: Call Alertn", chan->No);
  2287. if ((chan->fsm_state == EICON_STATE_ICALL) || (chan->fsm_state == EICON_STATE_ICALLW)) {
  2288. chan->fsm_state = EICON_STATE_ICALL;
  2289. idi_do_req(ccard, chan, CALL_ALERT, 0);
  2290. }
  2291. break;
  2292. case 2: /* reject */
  2293. eicon_log(ccard, 8, "idi_req: Ch%d: Call Rejectn", chan->No);
  2294. idi_do_req(ccard, chan, REJECT, 0);
  2295. break;
  2296. case 3: /* incomplete number */
  2297. eicon_log(ccard, 8, "idi_req: Ch%d: Incomplete Numbern", chan->No);
  2298. chan->fsm_state = EICON_STATE_ICALLW;
  2299. break;
  2300. }
  2301. break;
  2302. case INFO_IND:
  2303. eicon_log(ccard, 8, "idi_ind: Ch%d: Info_Indn", chan->No);
  2304. if ((chan->fsm_state == EICON_STATE_ICALLW) &&
  2305.     (message.cpn[0])) {
  2306. strcat(chan->cpn, message.cpn + 1);
  2307. goto try_stat_icall_again;
  2308. }
  2309. break;
  2310. case CALL_IND:
  2311. eicon_log(ccard, 8, "idi_ind: Ch%d: Call_Indn", chan->No);
  2312. if ((chan->fsm_state == EICON_STATE_ICALL) || (chan->fsm_state == EICON_STATE_IWAIT)) {
  2313. chan->fsm_state = EICON_STATE_IBWAIT;
  2314. cmd.driver = ccard->myid;
  2315. cmd.command = ISDN_STAT_DCONN;
  2316. cmd.arg = chan->No;
  2317. ccard->interface.statcallb(&cmd);
  2318. switch(chan->l2prot) {
  2319. case ISDN_PROTO_L2_FAX:
  2320. #ifdef CONFIG_ISDN_TTY_FAX
  2321. if (chan->fax)
  2322. chan->fax->phase = ISDN_FAX_PHASE_A;
  2323. #endif
  2324. break;
  2325. case ISDN_PROTO_L2_MODEM:
  2326. /* do nothing, wait for connect */
  2327. break;
  2328. case ISDN_PROTO_L2_V11096:
  2329. case ISDN_PROTO_L2_V11019:
  2330. case ISDN_PROTO_L2_V11038:
  2331. case ISDN_PROTO_L2_TRANS:
  2332. idi_do_req(ccard, chan, N_CONNECT, 1);
  2333. break;
  2334. default:;
  2335. /* On most incoming calls we use automatic connect */
  2336. /* idi_do_req(ccard, chan, N_CONNECT, 1); */
  2337. }
  2338. } else {
  2339. if (chan->fsm_state != EICON_STATE_ACTIVE)
  2340. idi_hangup(ccard, chan);
  2341. }
  2342. break;
  2343. case CALL_CON:
  2344. eicon_log(ccard, 8, "idi_ind: Ch%d: Call_Conn", chan->No);
  2345. if (chan->fsm_state == EICON_STATE_OCALL) {
  2346. /* check if old NetID has been removed */
  2347. if (chan->e.B2Id) {
  2348. eicon_log(ccard, 1, "eicon: Ch%d: old net_id %x still exist, removing.n",
  2349. chan->No, chan->e.B2Id);
  2350. idi_do_req(ccard, chan, REMOVE, 1);
  2351. }
  2352. #ifdef CONFIG_ISDN_TTY_FAX
  2353. if (chan->l2prot == ISDN_PROTO_L2_FAX) {
  2354. if (chan->fax) {
  2355. chan->fax->phase = ISDN_FAX_PHASE_A;
  2356. } else {
  2357. eicon_log(ccard, 1, "idi_ind: Call_Con with NULL fax struct, ERRORn");
  2358. idi_hangup(ccard, chan);
  2359. break;
  2360. }
  2361. }
  2362. #endif
  2363. chan->fsm_state = EICON_STATE_OBWAIT;
  2364. cmd.driver = ccard->myid;
  2365. cmd.command = ISDN_STAT_DCONN;
  2366. cmd.arg = chan->No;
  2367. ccard->interface.statcallb(&cmd);
  2368. idi_do_req(ccard, chan, ASSIGN, 1); 
  2369. idi_do_req(ccard, chan, N_CONNECT, 1);
  2370. } else
  2371. idi_hangup(ccard, chan);
  2372. break;
  2373. case AOC_IND:
  2374. eicon_log(ccard, 8, "idi_ind: Ch%d: Advice of Chargen", chan->No);
  2375. break;
  2376. case CALL_HOLD_ACK:
  2377. chan->statectrl |= IN_HOLD;
  2378. eicon_log(ccard, 8, "idi_ind: Ch%d: Call Hold Ackn", chan->No);
  2379. break;
  2380. case SUSPEND_REJ:
  2381. eicon_log(ccard, 8, "idi_ind: Ch%d: Suspend Rejectedn", chan->No);
  2382. break;
  2383. case SUSPEND:
  2384. eicon_log(ccard, 8, "idi_ind: Ch%d: Suspend Ackn", chan->No);
  2385. break;
  2386. case RESUME:
  2387. eicon_log(ccard, 8, "idi_ind: Ch%d: Resume Ackn", chan->No);
  2388. break;
  2389. default:
  2390. eicon_log(ccard, 8, "idi_ind: Ch%d: UNHANDLED SigIndication 0x%02xn", chan->No, ind->Ind);
  2391. }
  2392. }
  2393. /* Network Layer */
  2394. else if (chan->e.B2Id == ind->IndId) {
  2395. if (chan->No == ccard->nchannels) {
  2396. /* Management Indication */
  2397. if (ind->Ind == 0x04) { /* Trace_Ind */
  2398. eicon_parse_trace(ccard, ind->RBuffer.P, ind->RBuffer.length);
  2399. } else {
  2400. idi_IndParse(ccard, chan, &message, ind->RBuffer.P, ind->RBuffer.length);
  2401. chan->fsm_state = 1;
  2402. }
  2403. else
  2404. switch(ind->Ind) {
  2405. case N_CONNECT_ACK:
  2406. eicon_log(ccard, 16, "idi_ind: Ch%d: N_Connect_Ackn", chan->No);
  2407. if (chan->l2prot == ISDN_PROTO_L2_MODEM) {
  2408. chan->fsm_state = EICON_STATE_WMCONN;
  2409. break;
  2410. }
  2411. if (chan->l2prot == ISDN_PROTO_L2_FAX) {
  2412. #ifdef CONFIG_ISDN_TTY_FAX
  2413. chan->fsm_state = EICON_STATE_ACTIVE;
  2414. idi_parse_edata(ccard, chan, ind->RBuffer.P, ind->RBuffer.length);
  2415. if (chan->fax) {
  2416. if (chan->fax->phase == ISDN_FAX_PHASE_B) {
  2417. idi_fax_send_header(ccard, chan, 2);
  2418. cmd.driver = ccard->myid;
  2419. cmd.command = ISDN_STAT_FAXIND;
  2420. cmd.arg = chan->No;
  2421. chan->fax->r_code = ISDN_TTY_FAX_DCS;
  2422. ccard->interface.statcallb(&cmd);
  2423. }
  2424. }
  2425. else {
  2426. eicon_log(ccard, 1, "idi_ind: N_Connect_Ack with NULL fax struct, ERRORn");
  2427. }
  2428. #endif
  2429. break;
  2430. }
  2431. chan->fsm_state = EICON_STATE_ACTIVE;
  2432. cmd.driver = ccard->myid;
  2433. cmd.command = ISDN_STAT_BCONN;
  2434. cmd.arg = chan->No;
  2435. strcpy(cmd.parm.num, "64000");
  2436. ccard->interface.statcallb(&cmd);
  2437. break; 
  2438. case N_CONNECT:
  2439. eicon_log(ccard, 16,"idi_ind: Ch%d: N_Connectn", chan->No);
  2440. chan->e.IndCh = ind->IndCh;
  2441. if (chan->e.B2Id) idi_do_req(ccard, chan, N_CONNECT_ACK, 1);
  2442. if (chan->l2prot == ISDN_PROTO_L2_FAX) {
  2443. break;
  2444. }
  2445. if (chan->l2prot == ISDN_PROTO_L2_MODEM) {
  2446. chan->fsm_state = EICON_STATE_WMCONN;
  2447. break;
  2448. }
  2449. chan->fsm_state = EICON_STATE_ACTIVE;
  2450. cmd.driver = ccard->myid;
  2451. cmd.command = ISDN_STAT_BCONN;
  2452. cmd.arg = chan->No;
  2453. strcpy(cmd.parm.num, "64000");
  2454. ccard->interface.statcallb(&cmd);
  2455. break; 
  2456. case N_DISC:
  2457. eicon_log(ccard, 16, "idi_ind: Ch%d: N_Discn", chan->No);
  2458. if (chan->e.B2Id) {
  2459.                  while((skb2 = skb_dequeue(&chan->e.X))) {
  2460. dev_kfree_skb(skb2);
  2461. }
  2462. idi_do_req(ccard, chan, N_DISC_ACK, 1);
  2463. idi_do_req(ccard, chan, REMOVE, 1);
  2464. }
  2465. #ifdef CONFIG_ISDN_TTY_FAX
  2466. if ((chan->l2prot == ISDN_PROTO_L2_FAX) && (chan->fax)){
  2467. idi_parse_edata(ccard, chan, ind->RBuffer.P, ind->RBuffer.length);
  2468. idi_fax_hangup(ccard, chan);
  2469. }
  2470. #endif
  2471. chan->e.IndCh = 0;
  2472. spin_lock_irqsave(&eicon_lock, flags);
  2473. chan->queued = 0;
  2474. chan->pqueued = 0;
  2475. chan->waitq = 0;
  2476. chan->waitpq = 0;
  2477. spin_unlock_irqrestore(&eicon_lock, flags);
  2478. if (!(chan->statectrl & IN_HOLD)) {
  2479. idi_do_req(ccard, chan, HANGUP, 0);
  2480. }
  2481. if (chan->fsm_state == EICON_STATE_ACTIVE) {
  2482. cmd.driver = ccard->myid;
  2483. cmd.command = ISDN_STAT_BHUP;
  2484. cmd.arg = chan->No;
  2485. ccard->interface.statcallb(&cmd);
  2486. chan->fsm_state = EICON_STATE_NULL;
  2487. if (!(chan->statectrl & IN_HOLD)) {
  2488. chan->statectrl |= WAITING_FOR_HANGUP;
  2489. }
  2490. }
  2491. #ifdef CONFIG_ISDN_TTY_FAX
  2492. chan->fax = 0;
  2493. #endif
  2494. break; 
  2495. case N_DISC_ACK:
  2496. eicon_log(ccard, 16, "idi_ind: Ch%d: N_Disc_Ackn", chan->No);
  2497. #ifdef CONFIG_ISDN_TTY_FAX
  2498. if (chan->l2prot == ISDN_PROTO_L2_FAX) {
  2499. idi_parse_edata(ccard, chan, ind->RBuffer.P, ind->RBuffer.length);
  2500. idi_fax_hangup(ccard, chan);
  2501. }
  2502. #endif
  2503. break; 
  2504. case N_DATA_ACK:
  2505. eicon_log(ccard, 128, "idi_ind: Ch%d: N_Data_Ackn", chan->No);
  2506. break;
  2507. case N_DATA:
  2508. skb_pull(skb, sizeof(eicon_IND) - 1);
  2509. eicon_log(ccard, 128, "idi_rcv: Ch%d: %d bytesn", chan->No, skb->len);
  2510. if (chan->l2prot == ISDN_PROTO_L2_FAX) {
  2511. #ifdef CONFIG_ISDN_TTY_FAX
  2512. idi_faxdata_rcv(ccard, chan, skb);
  2513. #endif
  2514. } else {
  2515. ccard->interface.rcvcallb_skb(ccard->myid, chan->No, skb);
  2516. free_buff = 0; 
  2517. }
  2518. break; 
  2519. case N_UDATA:
  2520. idi_parse_udata(ccard, chan, ind->RBuffer.P, ind->RBuffer.length);
  2521. break; 
  2522. #ifdef CONFIG_ISDN_TTY_FAX
  2523. case N_EDATA:
  2524. idi_edata_action(ccard, chan, ind->RBuffer.P, ind->RBuffer.length);
  2525. break; 
  2526. #endif
  2527. default:
  2528. eicon_log(ccard, 8, "idi_ind: Ch%d: UNHANDLED NetIndication 0x%02xn", chan->No, ind->Ind);
  2529. }
  2530. }
  2531. else {
  2532. eicon_log(ccard, 1, "idi_ind: Ch%d: Ind is neither SIG nor NET !n", chan->No);
  2533. }
  2534.    if (free_buff)
  2535. dev_kfree_skb(skb);
  2536. }
  2537. int
  2538. idi_handle_ack_ok(eicon_card *ccard, eicon_chan *chan, eicon_RC *ack)
  2539. {
  2540. ulong flags;
  2541. isdn_ctrl cmd;
  2542. int tqueued = 0;
  2543. int twaitpq = 0;
  2544. if (ack->RcId != ((chan->e.ReqCh) ? chan->e.B2Id : chan->e.D3Id)) {
  2545. /* I dont know why this happens, should not ! */
  2546. /* just ignoring this RC */
  2547. eicon_log(ccard, 16, "idi_ack: Ch%d: RcId %d not equal to last %dn", chan->No, 
  2548. ack->RcId, (chan->e.ReqCh) ? chan->e.B2Id : chan->e.D3Id);
  2549. return 1;
  2550. }
  2551. /* Management Interface */
  2552. if (chan->No == ccard->nchannels) {
  2553. /* Managementinterface: changing state */
  2554. if (chan->e.Req != 0x02)
  2555. chan->fsm_state = 1;
  2556. }
  2557. /* Remove an Id */
  2558. if (chan->e.Req == REMOVE) {
  2559. if (ack->Reference != chan->e.ref) {
  2560. /* This should not happen anymore */
  2561. eicon_log(ccard, 16, "idi_ack: Ch%d: Rc-Ref %d not equal to stored %dn", chan->No,
  2562. ack->Reference, chan->e.ref);
  2563. }
  2564. spin_lock_irqsave(&eicon_lock, flags);
  2565. ccard->IdTable[ack->RcId] = NULL;
  2566. if (!chan->e.ReqCh) 
  2567. chan->e.D3Id = 0;
  2568. else
  2569. chan->e.B2Id = 0;
  2570. spin_unlock_irqrestore(&eicon_lock, flags);
  2571. eicon_log(ccard, 16, "idi_ack: Ch%d: Removed : Id=%x Ch=%d (%s)n", chan->No,
  2572. ack->RcId, ack->RcCh, (chan->e.ReqCh)? "Net":"Sig");
  2573. return 1;
  2574. }
  2575. /* Signal layer */
  2576. if (!chan->e.ReqCh) {
  2577. eicon_log(ccard, 16, "idi_ack: Ch%d: RC OK Id=%x Ch=%d (ref:%d)n", chan->No,
  2578. ack->RcId, ack->RcCh, ack->Reference);
  2579. } else {
  2580. /* Network layer */
  2581. switch(chan->e.Req & 0x0f) {
  2582. case N_CONNECT:
  2583. chan->e.IndCh = ack->RcCh;
  2584. eicon_log(ccard, 16, "idi_ack: Ch%d: RC OK Id=%x Ch=%d (ref:%d)n", chan->No,
  2585. ack->RcId, ack->RcCh, ack->Reference);
  2586. break;
  2587. case N_MDATA:
  2588. case N_DATA:
  2589. tqueued = chan->queued;
  2590. twaitpq = chan->waitpq;
  2591. if ((chan->e.Req & 0x0f) == N_DATA) {
  2592. spin_lock_irqsave(&eicon_lock, flags);
  2593. chan->waitpq = 0;
  2594. if(chan->pqueued)
  2595. chan->pqueued--;
  2596. spin_unlock_irqrestore(&eicon_lock, flags);
  2597. #ifdef CONFIG_ISDN_TTY_FAX
  2598. if (chan->l2prot == ISDN_PROTO_L2_FAX) {
  2599. if (((chan->queued - chan->waitq) < 1) &&
  2600.     (chan->fax2.Eop)) {
  2601. chan->fax2.Eop = 0;
  2602. if (chan->fax) {
  2603. cmd.driver = ccard->myid;
  2604. cmd.command = ISDN_STAT_FAXIND;
  2605. cmd.arg = chan->No;
  2606. chan->fax->r_code = ISDN_TTY_FAX_SENT;
  2607. ccard->interface.statcallb(&cmd);
  2608. }
  2609. else {
  2610. eicon_log(ccard, 1, "idi_ack: Sent with NULL fax struct, ERRORn");
  2611. }
  2612. }
  2613. }
  2614. #endif
  2615. }
  2616. spin_lock_irqsave(&eicon_lock, flags);
  2617. chan->queued -= chan->waitq;
  2618. if (chan->queued < 0) chan->queued = 0;
  2619. spin_unlock_irqrestore(&eicon_lock, flags);
  2620. if (((chan->e.Req & 0x0f) == N_DATA) && (tqueued)) {
  2621. cmd.driver = ccard->myid;
  2622. cmd.command = ISDN_STAT_BSENT;
  2623. cmd.arg = chan->No;
  2624. cmd.parm.length = twaitpq;
  2625. ccard->interface.statcallb(&cmd);
  2626. }
  2627. break;
  2628. default:
  2629. eicon_log(ccard, 16, "idi_ack: Ch%d: RC OK Id=%x Ch=%d (ref:%d)n", chan->No,
  2630. ack->RcId, ack->RcCh, ack->Reference);
  2631. }
  2632. }
  2633. return 1;
  2634. }
  2635. void
  2636. idi_handle_ack(eicon_card *ccard, struct sk_buff *skb)
  2637. {
  2638. int j;
  2639. ulong flags;
  2640.         eicon_RC *ack = (eicon_RC *)skb->data;
  2641. eicon_chan *chan;
  2642. isdn_ctrl cmd;
  2643. int dCh = -1;
  2644. if (!ccard) {
  2645. eicon_log(ccard, 1, "idi_err: Ch??: null card in handle_ackn");
  2646. dev_kfree_skb(skb);
  2647. return;
  2648. }
  2649. spin_lock_irqsave(&eicon_lock, flags);
  2650. if ((chan = ccard->IdTable[ack->RcId]) != NULL)
  2651. dCh = chan->No;
  2652. spin_unlock_irqrestore(&eicon_lock, flags);
  2653. switch (ack->Rc) {
  2654. case OK_FC:
  2655. case N_FLOW_CONTROL:
  2656. case ASSIGN_RC:
  2657. eicon_log(ccard, 1, "idi_ack: Ch%d: unhandled RC 0x%xn",
  2658. dCh, ack->Rc);
  2659. break;
  2660. case READY_INT:
  2661. case TIMER_INT:
  2662. /* we do nothing here */
  2663. break;
  2664. case OK:
  2665. if (!chan) {
  2666. eicon_log(ccard, 1, "idi_ack: Ch%d: OK on chan without Idn", dCh);
  2667. break;
  2668. }
  2669. if (!idi_handle_ack_ok(ccard, chan, ack))
  2670. chan = NULL;
  2671. break;
  2672. case ASSIGN_OK:
  2673. if (chan) {
  2674. eicon_log(ccard, 1, "idi_ack: Ch%d: ASSIGN-OK on chan already assigned (%x,%x)n",
  2675. chan->No, chan->e.D3Id, chan->e.B2Id);
  2676. }
  2677. spin_lock_irqsave(&eicon_lock, flags);
  2678. for(j = 0; j < ccard->nchannels + 1; j++) {
  2679. if ((ccard->bch[j].e.ref == ack->Reference) &&
  2680. (ccard->bch[j].e.Req == ASSIGN)) {
  2681. if (!ccard->bch[j].e.ReqCh) 
  2682. ccard->bch[j].e.D3Id  = ack->RcId;
  2683. else
  2684. ccard->bch[j].e.B2Id  = ack->RcId;
  2685. ccard->IdTable[ack->RcId] = &ccard->bch[j];
  2686. chan = &ccard->bch[j];
  2687. break;
  2688. }
  2689. }
  2690. spin_unlock_irqrestore(&eicon_lock, flags);
  2691. eicon_log(ccard, 16, "idi_ack: Ch%d: Id %x assigned (%s)n", j, 
  2692. ack->RcId, (ccard->bch[j].e.ReqCh)? "Net":"Sig");
  2693. if (j > ccard->nchannels) {
  2694. eicon_log(ccard, 24, "idi_ack: Ch??: ref %d not found for Id %dn", 
  2695. ack->Reference, ack->RcId);
  2696. }
  2697. break;
  2698. case OUT_OF_RESOURCES:
  2699. case UNKNOWN_COMMAND:
  2700. case WRONG_COMMAND:
  2701. case WRONG_ID:
  2702. case ADAPTER_DEAD:
  2703. case WRONG_CH:
  2704. case UNKNOWN_IE:
  2705. case WRONG_IE:
  2706. default:
  2707. if (!chan) {
  2708. eicon_log(ccard, 1, "idi_ack: Ch%d: Not OK !! on chan without Idn", dCh);
  2709. break;
  2710. } else
  2711. switch (chan->e.Req) {
  2712. case 12: /* Alert */
  2713. eicon_log(ccard, 2, "eicon_err: Ch%d: Alert Not OK : Rc=%d Id=%x Ch=%dn",
  2714. dCh, ack->Rc, ack->RcId, ack->RcCh);
  2715. break;
  2716. default:
  2717. if (dCh != ccard->nchannels)
  2718. eicon_log(ccard, 1, "eicon_err: Ch%d: Ack Not OK !!: Rc=%d Id=%x Ch=%d Req=%dn",
  2719. dCh, ack->Rc, ack->RcId, ack->RcCh, chan->e.Req);
  2720. }
  2721. if (dCh == ccard->nchannels) { /* Management */
  2722. chan->fsm_state = 2;
  2723. eicon_log(ccard, 8, "eicon_err: Ch%d: Ack Not OK !!: Rc=%d Id=%x Ch=%d Req=%dn",
  2724. dCh, ack->Rc, ack->RcId, ack->RcCh, chan->e.Req);
  2725. } else if (dCh >= 0) {
  2726. /* any other channel */
  2727. /* card reports error: we hangup */
  2728. idi_hangup(ccard, chan);
  2729. cmd.driver = ccard->myid;
  2730. cmd.command = ISDN_STAT_DHUP;
  2731. cmd.arg = chan->No;
  2732. ccard->interface.statcallb(&cmd);
  2733. }
  2734. }
  2735. spin_lock_irqsave(&eicon_lock, flags);
  2736. if (chan) {
  2737. chan->e.ref = 0;
  2738. chan->e.busy = 0;
  2739. }
  2740. spin_unlock_irqrestore(&eicon_lock, flags);
  2741. dev_kfree_skb(skb);
  2742. eicon_schedule_tx(ccard);
  2743. }
  2744. int
  2745. idi_send_data(eicon_card *card, eicon_chan *chan, int ack, struct sk_buff *skb, int que, int chk)
  2746. {
  2747.         struct sk_buff *xmit_skb;
  2748.         struct sk_buff *skb2;
  2749.         eicon_REQ *reqbuf;
  2750.         eicon_chan_ptr *chan2;
  2751.         int len, plen = 0, offset = 0;
  2752. unsigned long flags;
  2753. if ((!card) || (!chan)) {
  2754. eicon_log(card, 1, "idi_err: Ch??: null card/chan in send_datan");
  2755. return -1;
  2756. }
  2757.         if (chan->fsm_state != EICON_STATE_ACTIVE) {
  2758. eicon_log(card, 1, "idi_snd: Ch%d: send bytes on state %d !n", chan->No, chan->fsm_state);
  2759.                 return -ENODEV;
  2760. }
  2761.         len = skb->len;
  2762. if (len > EICON_MAX_QUEUE) /* too much for the shared memory */
  2763. return -1;
  2764.         if (!len)
  2765.                 return 0;
  2766. if ((chk) && (chan->pqueued > 1))
  2767. return 0;
  2768. eicon_log(card, 128, "idi_snd: Ch%d: %d bytes (Pqueue=%d)n",
  2769. chan->No, len, chan->pqueued);
  2770. spin_lock_irqsave(&eicon_lock, flags);
  2771. while(offset < len) {
  2772. plen = ((len - offset) > 270) ? 270 : len - offset;
  2773.         xmit_skb = alloc_skb(plen + sizeof(eicon_REQ), GFP_ATOMIC);
  2774.          skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  2775.         if ((!xmit_skb) || (!skb2)) {
  2776. spin_unlock_irqrestore(&eicon_lock, flags);
  2777.                  eicon_log(card, 1, "idi_err: Ch%d: alloc_skb failed in send_data()n", chan->No);
  2778. if (xmit_skb) 
  2779. dev_kfree_skb(skb);
  2780. if (skb2) 
  2781. dev_kfree_skb(skb2);
  2782.                  return -ENOMEM;
  2783.         }
  2784.         chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  2785.          chan2->ptr = chan;
  2786.         reqbuf = (eicon_REQ *)skb_put(xmit_skb, plen + sizeof(eicon_REQ));
  2787. if ((len - offset) > 270) { 
  2788.         reqbuf->Req = N_MDATA;
  2789. } else {
  2790.         reqbuf->Req = N_DATA;
  2791. /* if (ack) reqbuf->Req |= N_D_BIT; */
  2792. }
  2793.          reqbuf->ReqCh = chan->e.IndCh;
  2794.         reqbuf->ReqId = 1;
  2795. memcpy(&reqbuf->XBuffer.P, skb->data + offset, plen);
  2796. reqbuf->XBuffer.length = plen;
  2797. reqbuf->Reference = 1; /* Net Entity */
  2798. skb_queue_tail(&chan->e.X, xmit_skb);
  2799. skb_queue_tail(&card->sndq, skb2); 
  2800. offset += plen;
  2801. }
  2802. if (que) {
  2803. chan->queued += len;
  2804. chan->pqueued++;
  2805. }
  2806. spin_unlock_irqrestore(&eicon_lock, flags);
  2807. eicon_schedule_tx(card);
  2808.         dev_kfree_skb(skb);
  2809.         return len;
  2810. }
  2811. int
  2812. eicon_idi_manage_assign(eicon_card *card)
  2813. {
  2814.         struct sk_buff *skb;
  2815.         struct sk_buff *skb2;
  2816.         eicon_REQ  *reqbuf;
  2817.         eicon_chan     *chan;
  2818.         eicon_chan_ptr *chan2;
  2819.         chan = &(card->bch[card->nchannels]);
  2820.         skb = alloc_skb(270 + sizeof(eicon_REQ), GFP_ATOMIC);
  2821.         skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  2822.         if ((!skb) || (!skb2)) {
  2823. eicon_log(card, 1, "idi_err: alloc_skb failed in manage_assign()n");
  2824. if (skb) 
  2825. dev_kfree_skb(skb);
  2826. if (skb2) 
  2827. dev_kfree_skb(skb2);
  2828.                 return -ENOMEM;
  2829.         }
  2830.         chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  2831.         chan2->ptr = chan;
  2832.         reqbuf = (eicon_REQ *)skb_put(skb, 270 + sizeof(eicon_REQ));
  2833.         reqbuf->XBuffer.P[0] = 0;
  2834.         reqbuf->Req = ASSIGN;
  2835.         reqbuf->ReqCh = 0;
  2836.         reqbuf->ReqId = MAN_ID;
  2837.         reqbuf->XBuffer.length = 1;
  2838.         reqbuf->Reference = 2; /* Man Entity */
  2839.         skb_queue_tail(&chan->e.X, skb);
  2840.         skb_queue_tail(&card->sndq, skb2);
  2841.         eicon_schedule_tx(card);
  2842.         return(0);
  2843. }
  2844. int
  2845. eicon_idi_manage_remove(eicon_card *card)
  2846. {
  2847.         struct sk_buff *skb;
  2848.         struct sk_buff *skb2;
  2849.         eicon_REQ  *reqbuf;
  2850.         eicon_chan     *chan;
  2851.         eicon_chan_ptr *chan2;
  2852.         chan = &(card->bch[card->nchannels]);
  2853.         skb = alloc_skb(270 + sizeof(eicon_REQ), GFP_ATOMIC);
  2854.         skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  2855.         if ((!skb) || (!skb2)) {
  2856.                 eicon_log(card, 1, "idi_err: alloc_skb failed in manage_remove()n");
  2857. if (skb) 
  2858. dev_kfree_skb(skb);
  2859. if (skb2) 
  2860. dev_kfree_skb(skb2);
  2861.                 return -ENOMEM;
  2862.         }
  2863.         chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  2864.         chan2->ptr = chan;
  2865.         reqbuf = (eicon_REQ *)skb_put(skb, 270 + sizeof(eicon_REQ));
  2866.         reqbuf->Req = REMOVE;
  2867.         reqbuf->ReqCh = 0;
  2868.         reqbuf->ReqId = 1;
  2869.         reqbuf->XBuffer.length = 0;
  2870.         reqbuf->Reference = 2; /* Man Entity */
  2871.         skb_queue_tail(&chan->e.X, skb);
  2872.         skb_queue_tail(&card->sndq, skb2);
  2873.         eicon_schedule_tx(card);
  2874.         return(0);
  2875. }
  2876. int
  2877. eicon_idi_manage(eicon_card *card, eicon_manifbuf *mb)
  2878. {
  2879. int l = 0;
  2880. int ret = 0;
  2881. int timeout;
  2882. int i;
  2883.         struct sk_buff *skb;
  2884.         struct sk_buff *skb2;
  2885.         eicon_REQ  *reqbuf;
  2886.         eicon_chan     *chan;
  2887.         eicon_chan_ptr *chan2;
  2888.         chan = &(card->bch[card->nchannels]);
  2889. if (!(chan->e.D3Id)) {
  2890. chan->e.D3Id = 1;
  2891. while((skb2 = skb_dequeue(&chan->e.X)))
  2892. dev_kfree_skb(skb2);
  2893. chan->e.busy = 0;
  2894.  
  2895. if ((ret = eicon_idi_manage_assign(card))) {
  2896. chan->e.D3Id = 0;
  2897. return(ret); 
  2898. }
  2899.         timeout = jiffies + HZ / 2;
  2900.          while (time_before(jiffies, timeout)) {
  2901.                 if (chan->e.B2Id) break;
  2902.                  SLEEP(10);
  2903.         }
  2904.         if (!chan->e.B2Id) {
  2905. chan->e.D3Id = 0;
  2906. return -EIO;
  2907. }
  2908. }
  2909. chan->fsm_state = 0;
  2910. if (!(manbuf = kmalloc(sizeof(eicon_manifbuf), GFP_KERNEL))) {
  2911.                 eicon_log(card, 1, "idi_err: alloc_manifbuf failedn");
  2912. return -ENOMEM;
  2913. }
  2914. if (copy_from_user(manbuf, mb, sizeof(eicon_manifbuf))) {
  2915. kfree(manbuf);
  2916. return -EFAULT;
  2917. }
  2918.         skb = alloc_skb(270 + sizeof(eicon_REQ), GFP_ATOMIC);
  2919.         skb2 = alloc_skb(sizeof(eicon_chan_ptr), GFP_ATOMIC);
  2920.         if ((!skb) || (!skb2)) {
  2921.                 eicon_log(card, 1, "idi_err_manif: alloc_skb failed in manage()n");
  2922. if (skb) 
  2923. dev_kfree_skb(skb);
  2924. if (skb2) 
  2925. dev_kfree_skb(skb2);
  2926. kfree(manbuf);
  2927.                 return -ENOMEM;
  2928.         }
  2929.         chan2 = (eicon_chan_ptr *)skb_put(skb2, sizeof(eicon_chan_ptr));
  2930.         chan2->ptr = chan;
  2931.         reqbuf = (eicon_REQ *)skb_put(skb, 270 + sizeof(eicon_REQ));
  2932.         reqbuf->XBuffer.P[l++] = ESC;
  2933.         reqbuf->XBuffer.P[l++] = 6;
  2934.         reqbuf->XBuffer.P[l++] = 0x80;
  2935. for (i = 0; i < manbuf->length[0]; i++)
  2936.         reqbuf->XBuffer.P[l++] = manbuf->data[i];
  2937.         reqbuf->XBuffer.P[1] = manbuf->length[0] + 1;
  2938.         reqbuf->XBuffer.P[l++] = 0;
  2939.         reqbuf->Req = (manbuf->count) ? manbuf->count : MAN_READ;
  2940.         reqbuf->ReqCh = 0;
  2941.         reqbuf->ReqId = 1;
  2942.         reqbuf->XBuffer.length = l;
  2943.         reqbuf->Reference = 2; /* Man Entity */
  2944.         skb_queue_tail(&chan->e.X, skb);
  2945.         skb_queue_tail(&card->sndq, skb2);
  2946. manbuf->count = 0;
  2947. manbuf->pos = 0;
  2948.         eicon_schedule_tx(card);
  2949.         timeout = jiffies + HZ / 2;
  2950.         while (time_before(jiffies, timeout)) {
  2951.                 if (chan->fsm_state) break;
  2952.                 SLEEP(10);
  2953.         }
  2954.         if ((!chan->fsm_state) || (chan->fsm_state == 2)) {
  2955. kfree(manbuf);
  2956. return -EIO;
  2957. }
  2958. if (copy_to_user(mb, manbuf, sizeof(eicon_manifbuf))) {
  2959. kfree(manbuf);
  2960. return -EFAULT;
  2961. }
  2962. kfree(manbuf);
  2963.   return(0);
  2964. }