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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: isar.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
  2.  *
  3.  * isar.c   ISAR (Siemens PSB 7110) specific routines
  4.  *
  5.  * Author       Karsten Keil (keil@isdn4linux.de)
  6.  *
  7.  * This file is (c) under GNU General Public License
  8.  *
  9.  */
  10. #define __NO_VERSION__
  11. #include <linux/init.h>
  12. #include "hisax.h"
  13. #include "isar.h"
  14. #include "isdnl1.h"
  15. #include <linux/interrupt.h>
  16. #define DBG_LOADFIRM 0
  17. #define DUMP_MBOXFRAME 2
  18. #define DLE 0x10
  19. #define ETX 0x03
  20. const u_char faxmodulation_s[] = "3,24,48,72,73,74,96,97,98,121,122,145,146"; 
  21. const u_char faxmodulation[] = {3,24,48,72,73,74,96,97,98,121,122,145,146}; 
  22. #define FAXMODCNT 13
  23. void isar_setup(struct IsdnCardState *cs);
  24. static void isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para);
  25. static inline void ll_deliver_faxstat(struct BCState *bcs, u_char status);
  26. static inline int
  27. waitforHIA(struct IsdnCardState *cs, int timeout)
  28. {
  29. while ((cs->BC_Read_Reg(cs, 0, ISAR_HIA) & 1) && timeout) {
  30. udelay(1);
  31. timeout--;
  32. }
  33. if (!timeout)
  34. printk(KERN_WARNING "HiSax: ISAR waitforHIA timeoutn");
  35. return(timeout);
  36. }
  37. int
  38. sendmsg(struct IsdnCardState *cs, u_char his, u_char creg, u_char len,
  39. u_char *msg)
  40. {
  41. long flags;
  42. int i;
  43. if (!waitforHIA(cs, 4000))
  44. return(0);
  45. #if DUMP_MBOXFRAME
  46. if (cs->debug & L1_DEB_HSCX)
  47. debugl1(cs, "sendmsg(%02x,%02x,%d)", his, creg, len);
  48. #endif
  49. save_flags(flags);
  50. cli();
  51. cs->BC_Write_Reg(cs, 0, ISAR_CTRL_H, creg);
  52. cs->BC_Write_Reg(cs, 0, ISAR_CTRL_L, len);
  53. cs->BC_Write_Reg(cs, 0, ISAR_WADR, 0);
  54. if (msg && len) {
  55. cs->BC_Write_Reg(cs, 1, ISAR_MBOX, msg[0]);
  56. for (i=1; i<len; i++)
  57. cs->BC_Write_Reg(cs, 2, ISAR_MBOX, msg[i]);
  58. #if DUMP_MBOXFRAME>1
  59. if (cs->debug & L1_DEB_HSCX_FIFO) {
  60. char tmp[256], *t;
  61. i = len;
  62. while (i>0) {
  63. t = tmp;
  64. t += sprintf(t, "sendmbox cnt %d", len);
  65. QuickHex(t, &msg[len-i], (i>64) ? 64:i);
  66. debugl1(cs, tmp);
  67. i -= 64;
  68. }
  69. }
  70. #endif
  71. }
  72. cs->BC_Write_Reg(cs, 1, ISAR_HIS, his);
  73. restore_flags(flags);
  74. waitforHIA(cs, 10000);
  75. return(1);
  76. }
  77. /* Call only with IRQ disabled !!! */
  78. inline void
  79. rcv_mbox(struct IsdnCardState *cs, struct isar_reg *ireg, u_char *msg)
  80. {
  81. int i;
  82. cs->BC_Write_Reg(cs, 1, ISAR_RADR, 0);
  83. if (msg && ireg->clsb) {
  84. msg[0] = cs->BC_Read_Reg(cs, 1, ISAR_MBOX);
  85. for (i=1; i < ireg->clsb; i++)
  86.  msg[i] = cs->BC_Read_Reg(cs, 2, ISAR_MBOX);
  87. #if DUMP_MBOXFRAME>1
  88. if (cs->debug & L1_DEB_HSCX_FIFO) {
  89. char tmp[256], *t;
  90. i = ireg->clsb;
  91. while (i>0) {
  92. t = tmp;
  93. t += sprintf(t, "rcv_mbox cnt %d", ireg->clsb);
  94. QuickHex(t, &msg[ireg->clsb-i], (i>64) ? 64:i);
  95. debugl1(cs, tmp);
  96. i -= 64;
  97. }
  98. }
  99. #endif
  100. }
  101. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  102. }
  103. /* Call only with IRQ disabled !!! */
  104. inline void
  105. get_irq_infos(struct IsdnCardState *cs, struct isar_reg *ireg)
  106. {
  107. ireg->iis = cs->BC_Read_Reg(cs, 1, ISAR_IIS);
  108. ireg->cmsb = cs->BC_Read_Reg(cs, 1, ISAR_CTRL_H);
  109. ireg->clsb = cs->BC_Read_Reg(cs, 1, ISAR_CTRL_L);
  110. #if DUMP_MBOXFRAME
  111. if (cs->debug & L1_DEB_HSCX)
  112. debugl1(cs, "rcv_mbox(%02x,%02x,%d)", ireg->iis, ireg->cmsb,
  113. ireg->clsb);
  114. #endif
  115. }
  116. int
  117. waitrecmsg(struct IsdnCardState *cs, u_char *len,
  118. u_char *msg, int maxdelay)
  119. {
  120. int timeout = 0;
  121. long flags;
  122. struct isar_reg *ir = cs->bcs[0].hw.isar.reg;
  123. while((!(cs->BC_Read_Reg(cs, 0, ISAR_IRQBIT) & ISAR_IRQSTA)) &&
  124. (timeout++ < maxdelay))
  125. udelay(1);
  126. if (timeout >= maxdelay) {
  127. printk(KERN_WARNING"isar recmsg IRQSTA timeoutn");
  128. return(0);
  129. }
  130. save_flags(flags);
  131. cli();
  132. get_irq_infos(cs, ir);
  133. rcv_mbox(cs, ir, msg);
  134. *len = ir->clsb;
  135. restore_flags(flags);
  136. return(1);
  137. }
  138. int
  139. ISARVersion(struct IsdnCardState *cs, char *s)
  140. {
  141. int ver;
  142. u_char msg[] = ISAR_MSG_HWVER;
  143. u_char tmp[64];
  144. u_char len;
  145. int debug;
  146. cs->cardmsg(cs, CARD_RESET,  NULL);
  147. /* disable ISAR IRQ */
  148. cs->BC_Write_Reg(cs, 0, ISAR_IRQBIT, 0);
  149. debug = cs->debug;
  150. cs->debug &= ~(L1_DEB_HSCX | L1_DEB_HSCX_FIFO);
  151. if (!sendmsg(cs, ISAR_HIS_VNR, 0, 3, msg))
  152. return(-1);
  153. if (!waitrecmsg(cs, &len, tmp, 100000))
  154.  return(-2);
  155. cs->debug = debug;
  156. if (cs->bcs[0].hw.isar.reg->iis == ISAR_IIS_VNR) {
  157. if (len == 1) {
  158. ver = tmp[0] & 0xf;
  159. printk(KERN_INFO "%s ISAR version %dn", s, ver);
  160. return(ver);
  161. }
  162. return(-3);
  163. }
  164. return(-4);
  165. }
  166. int
  167. isar_load_firmware(struct IsdnCardState *cs, u_char *buf)
  168. {
  169. int ret, size, cnt, debug;
  170. u_char len, nom, noc;
  171. u_short sadr, left, *sp;
  172. u_char *p = buf;
  173. u_char *msg, *tmpmsg, *mp, tmp[64];
  174. long flags;
  175. struct isar_reg *ireg = cs->bcs[0].hw.isar.reg;
  176. struct {u_short sadr;
  177. u_short len;
  178. u_short d_key;
  179. } blk_head;
  180. #define BLK_HEAD_SIZE 6
  181. if (1 != (ret = ISARVersion(cs, "Testing"))) {
  182. printk(KERN_ERR"isar_load_firmware wrong isar version %dn", ret);
  183. return(1);
  184. }
  185. debug = cs->debug;
  186. #if DBG_LOADFIRM<2
  187. cs->debug &= ~(L1_DEB_HSCX | L1_DEB_HSCX_FIFO);
  188. #endif
  189. printk(KERN_DEBUG"isar_load_firmware buf %#lxn", (u_long)buf);
  190. if ((ret = verify_area(VERIFY_READ, (void *) p, sizeof(int)))) {
  191. printk(KERN_ERR"isar_load_firmware verify_area ret %dn", ret);
  192. return ret;
  193. }
  194. if ((ret = copy_from_user(&size, p, sizeof(int)))) {
  195. printk(KERN_ERR"isar_load_firmware copy_from_user ret %dn", ret);
  196. return ret;
  197. }
  198. p += sizeof(int);
  199. printk(KERN_DEBUG"isar_load_firmware size: %dn", size);
  200. if ((ret = verify_area(VERIFY_READ, (void *) p, size))) {
  201. printk(KERN_ERR"isar_load_firmware verify_area ret %dn", ret);
  202. return ret;
  203. }
  204. cnt = 0;
  205. /* disable ISAR IRQ */
  206. cs->BC_Write_Reg(cs, 0, ISAR_IRQBIT, 0);
  207. if (!(msg = kmalloc(256, GFP_KERNEL))) {
  208. printk(KERN_ERR"isar_load_firmware no buffern");
  209. return (1);
  210. }
  211. if (!(tmpmsg = kmalloc(256, GFP_KERNEL))) {
  212. printk(KERN_ERR"isar_load_firmware no tmp buffern");
  213. kfree(msg);
  214. return (1);
  215. }
  216. while (cnt < size) {
  217. if ((ret = copy_from_user(&blk_head, p, BLK_HEAD_SIZE))) {
  218. printk(KERN_ERR"isar_load_firmware copy_from_user ret %dn", ret);
  219. goto reterror;
  220. }
  221. #ifdef __BIG_ENDIAN
  222. sadr = (blk_head.sadr & 0xff)*256 + blk_head.sadr/256;
  223. blk_head.sadr = sadr;
  224. sadr = (blk_head.len & 0xff)*256 + blk_head.len/256;
  225. blk_head.len = sadr;
  226. sadr = (blk_head.d_key & 0xff)*256 + blk_head.d_key/256;
  227. blk_head.d_key = sadr;
  228. #endif /* __BIG_ENDIAN */
  229. cnt += BLK_HEAD_SIZE;
  230. p += BLK_HEAD_SIZE;
  231. printk(KERN_DEBUG"isar firmware block (%#x,%5d,%#x)n",
  232. blk_head.sadr, blk_head.len, blk_head.d_key & 0xff);
  233. sadr = blk_head.sadr;
  234. left = blk_head.len;
  235. if (!sendmsg(cs, ISAR_HIS_DKEY, blk_head.d_key & 0xff, 0, NULL)) {
  236. printk(KERN_ERR"isar sendmsg dkey failedn");
  237. ret = 1;goto reterror;
  238. }
  239. if (!waitrecmsg(cs, &len, tmp, 100000)) {
  240. printk(KERN_ERR"isar waitrecmsg dkey failedn");
  241. ret = 1;goto reterror;
  242. }
  243. if ((ireg->iis != ISAR_IIS_DKEY) || ireg->cmsb || len) {
  244. printk(KERN_ERR"isar wrong dkey response (%x,%x,%x)n",
  245. ireg->iis, ireg->cmsb, len);
  246. ret = 1;goto reterror;
  247. }
  248. while (left>0) {
  249. if (left > 126)
  250. noc = 126;
  251. else
  252. noc = left;
  253. nom = 2*noc;
  254. mp  = msg;
  255. *mp++ = sadr / 256;
  256. *mp++ = sadr % 256;
  257. left -= noc;
  258. *mp++ = noc;
  259. if ((ret = copy_from_user(tmpmsg, p, nom))) {
  260. printk(KERN_ERR"isar_load_firmware copy_from_user ret %dn", ret);
  261. goto reterror;
  262. }
  263. p += nom;
  264. cnt += nom;
  265. nom += 3;
  266. sp = (u_short *)tmpmsg;
  267. #if DBG_LOADFIRM
  268. printk(KERN_DEBUG"isar: load %3d words at %04x left %dn",
  269.  noc, sadr, left);
  270. #endif
  271. sadr += noc;
  272. while(noc) {
  273. #ifdef __BIG_ENDIAN
  274. *mp++ = *sp % 256;
  275. *mp++ = *sp / 256;
  276. #else
  277. *mp++ = *sp / 256;
  278. *mp++ = *sp % 256;
  279. #endif /* __BIG_ENDIAN */
  280. sp++;
  281. noc--;
  282. }
  283. if (!sendmsg(cs, ISAR_HIS_FIRM, 0, nom, msg)) {
  284. printk(KERN_ERR"isar sendmsg prog failedn");
  285. ret = 1;goto reterror;
  286. }
  287. if (!waitrecmsg(cs, &len, tmp, 100000)) {
  288. printk(KERN_ERR"isar waitrecmsg prog failedn");
  289. ret = 1;goto reterror;
  290. }
  291. if ((ireg->iis != ISAR_IIS_FIRM) || ireg->cmsb || len) {
  292. printk(KERN_ERR"isar wrong prog response (%x,%x,%x)n",
  293. ireg->iis, ireg->cmsb, len);
  294. ret = 1;goto reterror;
  295. }
  296. }
  297. printk(KERN_DEBUG"isar firmware block %5d words loadedn",
  298. blk_head.len);
  299. }
  300. /* 10ms delay */
  301. cnt = 10;
  302. while (cnt--)
  303. udelay(1000);
  304. msg[0] = 0xff;
  305. msg[1] = 0xfe;
  306. ireg->bstat = 0;
  307. if (!sendmsg(cs, ISAR_HIS_STDSP, 0, 2, msg)) {
  308. printk(KERN_ERR"isar sendmsg start dsp failedn");
  309. ret = 1;goto reterror;
  310. }
  311. if (!waitrecmsg(cs, &len, tmp, 100000)) {
  312. printk(KERN_ERR"isar waitrecmsg start dsp failedn");
  313. ret = 1;goto reterror;
  314. }
  315. if ((ireg->iis != ISAR_IIS_STDSP) || ireg->cmsb || len) {
  316. printk(KERN_ERR"isar wrong start dsp response (%x,%x,%x)n",
  317. ireg->iis, ireg->cmsb, len);
  318. ret = 1;goto reterror;
  319. } else
  320. printk(KERN_DEBUG"isar start dsp successn");
  321. /* NORMAL mode entered */
  322. /* Enable IRQs of ISAR */
  323. cs->BC_Write_Reg(cs, 0, ISAR_IRQBIT, ISAR_IRQSTA);
  324. save_flags(flags);
  325. sti();
  326. cnt = 1000; /* max 1s */
  327. while ((!ireg->bstat) && cnt) {
  328. udelay(1000);
  329. cnt--;
  330. }
  331. if (!cnt) {
  332. printk(KERN_ERR"isar no general status event receivedn");
  333. ret = 1;goto reterrflg;
  334. } else {
  335. printk(KERN_DEBUG"isar general status event %xn",
  336. ireg->bstat);
  337. }
  338. /* 10ms delay */
  339. cnt = 10;
  340. while (cnt--)
  341. udelay(1000);
  342. ireg->iis = 0;
  343. if (!sendmsg(cs, ISAR_HIS_DIAG, ISAR_CTRL_STST, 0, NULL)) {
  344. printk(KERN_ERR"isar sendmsg self tst failedn");
  345. ret = 1;goto reterrflg;
  346. }
  347. cnt = 10000; /* max 100 ms */
  348. while ((ireg->iis != ISAR_IIS_DIAG) && cnt) {
  349. udelay(10);
  350. cnt--;
  351. }
  352. udelay(1000);
  353. if (!cnt) {
  354. printk(KERN_ERR"isar no self tst responsen");
  355. ret = 1;goto reterrflg;
  356. }
  357. if ((ireg->cmsb == ISAR_CTRL_STST) && (ireg->clsb == 1)
  358. && (ireg->par[0] == 0)) {
  359. printk(KERN_DEBUG"isar selftest OKn");
  360. } else {
  361. printk(KERN_DEBUG"isar selftest not OK %x/%x/%xn",
  362. ireg->cmsb, ireg->clsb, ireg->par[0]);
  363. ret = 1;goto reterrflg;
  364. }
  365. ireg->iis = 0;
  366. if (!sendmsg(cs, ISAR_HIS_DIAG, ISAR_CTRL_SWVER, 0, NULL)) {
  367. printk(KERN_ERR"isar RQST SVN failedn");
  368. ret = 1;goto reterrflg;
  369. }
  370. cnt = 30000; /* max 300 ms */
  371. while ((ireg->iis != ISAR_IIS_DIAG) && cnt) {
  372. udelay(10);
  373. cnt--;
  374. }
  375. udelay(1000);
  376. if (!cnt) {
  377. printk(KERN_ERR"isar no SVN responsen");
  378. ret = 1;goto reterrflg;
  379. } else {
  380. if ((ireg->cmsb == ISAR_CTRL_SWVER) && (ireg->clsb == 1))
  381. printk(KERN_DEBUG"isar software version %#xn",
  382. ireg->par[0]);
  383. else {
  384. printk(KERN_ERR"isar wrong swver response (%x,%x) cnt(%d)n",
  385. ireg->cmsb, ireg->clsb, cnt);
  386. ret = 1;goto reterrflg;
  387. }
  388. }
  389. cs->debug = debug;
  390. isar_setup(cs);
  391. ret = 0;
  392. reterrflg:
  393. restore_flags(flags);
  394. reterror:
  395. cs->debug = debug;
  396. if (ret)
  397. /* disable ISAR IRQ */
  398. cs->BC_Write_Reg(cs, 0, ISAR_IRQBIT, 0);
  399. kfree(msg);
  400. kfree(tmpmsg);
  401. return(ret);
  402. }
  403. extern void BChannel_bh(struct BCState *);
  404. #define B_LL_NOCARRIER 8
  405. #define B_LL_CONNECT 9
  406. #define B_LL_OK 10
  407. static void
  408. isar_bh(struct BCState *bcs)
  409. {
  410. BChannel_bh(bcs);
  411. if (test_and_clear_bit(B_LL_NOCARRIER, &bcs->event))
  412. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_NOCARR);
  413. if (test_and_clear_bit(B_LL_CONNECT, &bcs->event))
  414. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
  415. if (test_and_clear_bit(B_LL_OK, &bcs->event))
  416. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_OK);
  417. }
  418. static void
  419. isar_sched_event(struct BCState *bcs, int event)
  420. {
  421. bcs->event |= 1 << event;
  422. queue_task(&bcs->tqueue, &tq_immediate);
  423. mark_bh(IMMEDIATE_BH);
  424. }
  425. static inline void
  426. send_DLE_ETX(struct BCState *bcs)
  427. {
  428. u_char dleetx[2] = {DLE,ETX};
  429. struct sk_buff *skb;
  430. if ((skb = dev_alloc_skb(2))) {
  431. memcpy(skb_put(skb, 2), dleetx, 2);
  432. skb_queue_tail(&bcs->rqueue, skb);
  433. isar_sched_event(bcs, B_RCVBUFREADY);
  434. } else {
  435. printk(KERN_WARNING "HiSax: skb out of memoryn");
  436. }
  437. }
  438. static inline int
  439. dle_count(unsigned char *buf, int len)
  440. {
  441. int count = 0;
  442. while (len--)
  443. if (*buf++ == DLE)
  444. count++;
  445. return count;
  446. }
  447. static inline void
  448. insert_dle(unsigned char *dest, unsigned char *src, int count) {
  449. /* <DLE> in input stream have to be flagged as <DLE><DLE> */
  450. while (count--) {
  451. *dest++ = *src;
  452. if (*src++ == DLE)
  453. *dest++ = DLE;
  454. }
  455. }
  456.  
  457. static inline void
  458. isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs)
  459. {
  460. u_char *ptr;
  461. struct sk_buff *skb;
  462. struct isar_reg *ireg = bcs->hw.isar.reg;
  463. if (!ireg->clsb) {
  464. debugl1(cs, "isar zero len frame");
  465. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  466. return;
  467. }
  468. switch (bcs->mode) {
  469. case L1_MODE_NULL:
  470. debugl1(cs, "isar mode 0 spurious IIS_RDATA %x/%x/%x",
  471. ireg->iis, ireg->cmsb, ireg->clsb);
  472. printk(KERN_WARNING"isar mode 0 spurious IIS_RDATA %x/%x/%xn",
  473. ireg->iis, ireg->cmsb, ireg->clsb);
  474. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  475. break;
  476. case L1_MODE_TRANS:
  477. case L1_MODE_V32:
  478. if ((skb = dev_alloc_skb(ireg->clsb))) {
  479. rcv_mbox(cs, ireg, (u_char *)skb_put(skb, ireg->clsb));
  480. skb_queue_tail(&bcs->rqueue, skb);
  481. isar_sched_event(bcs, B_RCVBUFREADY);
  482. } else {
  483. printk(KERN_WARNING "HiSax: skb out of memoryn");
  484. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  485. }
  486. break;
  487. case L1_MODE_HDLC:
  488. if ((bcs->hw.isar.rcvidx + ireg->clsb) > HSCX_BUFMAX) {
  489. if (cs->debug & L1_DEB_WARN)
  490. debugl1(cs, "isar_rcv_frame: incoming packet too large");
  491. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  492. bcs->hw.isar.rcvidx = 0;
  493. } else if (ireg->cmsb & HDLC_ERROR) {
  494. if (cs->debug & L1_DEB_WARN)
  495. debugl1(cs, "isar frame error %x len %d",
  496. ireg->cmsb, ireg->clsb);
  497. #ifdef ERROR_STATISTIC
  498. if (ireg->cmsb & HDLC_ERR_RER)
  499. bcs->err_inv++;
  500. if (ireg->cmsb & HDLC_ERR_CER)
  501. bcs->err_crc++;
  502. #endif
  503. bcs->hw.isar.rcvidx = 0;
  504. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  505. } else {
  506. if (ireg->cmsb & HDLC_FSD)
  507. bcs->hw.isar.rcvidx = 0;
  508. ptr = bcs->hw.isar.rcvbuf + bcs->hw.isar.rcvidx;
  509. bcs->hw.isar.rcvidx += ireg->clsb;
  510. rcv_mbox(cs, ireg, ptr);
  511. if (ireg->cmsb & HDLC_FED) {
  512. if (bcs->hw.isar.rcvidx < 3) { /* last 2 bytes are the FCS */
  513. if (cs->debug & L1_DEB_WARN)
  514. debugl1(cs, "isar frame to short %d",
  515. bcs->hw.isar.rcvidx);
  516. } else if (!(skb = dev_alloc_skb(bcs->hw.isar.rcvidx-2))) {
  517. printk(KERN_WARNING "ISAR: receive out of memoryn");
  518. } else {
  519. memcpy(skb_put(skb, bcs->hw.isar.rcvidx-2),
  520. bcs->hw.isar.rcvbuf, bcs->hw.isar.rcvidx-2);
  521. skb_queue_tail(&bcs->rqueue, skb);
  522. isar_sched_event(bcs, B_RCVBUFREADY);
  523. }
  524. bcs->hw.isar.rcvidx = 0;
  525. }
  526. }
  527. break;
  528. case L1_MODE_FAX:
  529. if (bcs->hw.isar.state != STFAX_ACTIV) {
  530. if (cs->debug & L1_DEB_WARN)
  531. debugl1(cs, "isar_rcv_frame: not ACTIV");
  532. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  533. bcs->hw.isar.rcvidx = 0;
  534. break;
  535. }
  536. if (bcs->hw.isar.cmd == PCTRL_CMD_FRM) {
  537. rcv_mbox(cs, ireg, bcs->hw.isar.rcvbuf);
  538. bcs->hw.isar.rcvidx = ireg->clsb +
  539. dle_count(bcs->hw.isar.rcvbuf, ireg->clsb);
  540. if (cs->debug & L1_DEB_HSCX)
  541. debugl1(cs, "isar_rcv_frame: raw(%d) dle(%d)",
  542. ireg->clsb, bcs->hw.isar.rcvidx);
  543. if ((skb = dev_alloc_skb(bcs->hw.isar.rcvidx))) {
  544. insert_dle((u_char *)skb_put(skb, bcs->hw.isar.rcvidx),
  545. bcs->hw.isar.rcvbuf, ireg->clsb);
  546. skb_queue_tail(&bcs->rqueue, skb);
  547. isar_sched_event(bcs, B_RCVBUFREADY);
  548. if (ireg->cmsb & SART_NMD) { /* ABORT */
  549. if (cs->debug & L1_DEB_WARN)
  550. debugl1(cs, "isar_rcv_frame: no more data");
  551. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  552. bcs->hw.isar.rcvidx = 0;
  553. send_DLE_ETX(bcs);
  554. sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) |
  555. ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC,
  556. 0, NULL);
  557. bcs->hw.isar.state = STFAX_ESCAPE;
  558. isar_sched_event(bcs, B_LL_NOCARRIER);
  559. }
  560. } else {
  561. printk(KERN_WARNING "HiSax: skb out of memoryn");
  562. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  563. }
  564. break;
  565. }
  566. if (bcs->hw.isar.cmd != PCTRL_CMD_FRH) {
  567. if (cs->debug & L1_DEB_WARN)
  568. debugl1(cs, "isar_rcv_frame: unknown fax mode %x",
  569. bcs->hw.isar.cmd);
  570. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  571. bcs->hw.isar.rcvidx = 0;
  572. break;
  573. }
  574. /* PCTRL_CMD_FRH */
  575. if ((bcs->hw.isar.rcvidx + ireg->clsb) > HSCX_BUFMAX) {
  576. if (cs->debug & L1_DEB_WARN)
  577. debugl1(cs, "isar_rcv_frame: incoming packet too large");
  578. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  579. bcs->hw.isar.rcvidx = 0;
  580. } else if (ireg->cmsb & HDLC_ERROR) {
  581. if (cs->debug & L1_DEB_WARN)
  582. debugl1(cs, "isar frame error %x len %d",
  583. ireg->cmsb, ireg->clsb);
  584. bcs->hw.isar.rcvidx = 0;
  585. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  586. } else {
  587. if (ireg->cmsb & HDLC_FSD)
  588. bcs->hw.isar.rcvidx = 0;
  589. ptr = bcs->hw.isar.rcvbuf + bcs->hw.isar.rcvidx;
  590. bcs->hw.isar.rcvidx += ireg->clsb;
  591. rcv_mbox(cs, ireg, ptr);
  592. if (ireg->cmsb & HDLC_FED) {
  593. int len = bcs->hw.isar.rcvidx +
  594. dle_count(bcs->hw.isar.rcvbuf, bcs->hw.isar.rcvidx);
  595. if (bcs->hw.isar.rcvidx < 3) { /* last 2 bytes are the FCS */
  596. if (cs->debug & L1_DEB_WARN)
  597. debugl1(cs, "isar frame to short %d",
  598. bcs->hw.isar.rcvidx);
  599. } else if (!(skb = dev_alloc_skb(bcs->hw.isar.rcvidx))) {
  600. printk(KERN_WARNING "ISAR: receive out of memoryn");
  601. } else {
  602. insert_dle((u_char *)skb_put(skb, len),
  603. bcs->hw.isar.rcvbuf,
  604. bcs->hw.isar.rcvidx);
  605. skb_queue_tail(&bcs->rqueue, skb);
  606. isar_sched_event(bcs, B_RCVBUFREADY);
  607. send_DLE_ETX(bcs);
  608. isar_sched_event(bcs, B_LL_OK);
  609. }
  610. bcs->hw.isar.rcvidx = 0;
  611. }
  612. }
  613. if (ireg->cmsb & SART_NMD) { /* ABORT */
  614. if (cs->debug & L1_DEB_WARN)
  615. debugl1(cs, "isar_rcv_frame: no more data");
  616. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  617. bcs->hw.isar.rcvidx = 0;
  618. send_DLE_ETX(bcs);
  619. sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) |
  620. ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
  621. bcs->hw.isar.state = STFAX_ESCAPE;
  622. isar_sched_event(bcs, B_LL_NOCARRIER);
  623. }
  624. break;
  625. default:
  626. printk(KERN_ERR"isar_rcv_frame mode (%x)errorn", bcs->mode);
  627. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  628. break;
  629. }
  630. }
  631. void
  632. isar_fill_fifo(struct BCState *bcs)
  633. {
  634. struct IsdnCardState *cs = bcs->cs;
  635. int count;
  636. u_char msb;
  637. u_char *ptr;
  638. long flags;
  639. if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
  640. debugl1(cs, "isar_fill_fifo");
  641. if (!bcs->tx_skb)
  642. return;
  643. if (bcs->tx_skb->len <= 0)
  644. return;
  645. if (!(bcs->hw.isar.reg->bstat & 
  646. (bcs->hw.isar.dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2)))
  647. return;
  648. if (bcs->tx_skb->len > bcs->hw.isar.mml) {
  649. msb = 0;
  650. count = bcs->hw.isar.mml;
  651. } else {
  652. count = bcs->tx_skb->len;
  653. msb = HDLC_FED;
  654. }
  655. save_flags(flags);
  656. cli();
  657. ptr = bcs->tx_skb->data;
  658. if (!bcs->hw.isar.txcnt) {
  659. msb |= HDLC_FST;
  660. if ((bcs->mode == L1_MODE_FAX) &&
  661. (bcs->hw.isar.cmd == PCTRL_CMD_FTH)) {
  662. if (bcs->tx_skb->len > 1) {
  663. if ((ptr[0]== 0xff) && (ptr[1] == 0x13))
  664. /* last frame */
  665. test_and_set_bit(BC_FLG_LASTDATA,
  666. &bcs->Flag);
  667. }  
  668. }
  669. }
  670. skb_pull(bcs->tx_skb, count);
  671. bcs->tx_cnt -= count;
  672. bcs->hw.isar.txcnt += count;
  673. switch (bcs->mode) {
  674. case L1_MODE_NULL:
  675. printk(KERN_ERR"isar_fill_fifo wrong mode 0n");
  676. break;
  677. case L1_MODE_TRANS:
  678. case L1_MODE_V32:
  679. sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
  680. 0, count, ptr);
  681. break;
  682. case L1_MODE_HDLC:
  683. sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
  684. msb, count, ptr);
  685. break;
  686. case L1_MODE_FAX:
  687. if (bcs->hw.isar.state != STFAX_ACTIV) {
  688. if (cs->debug & L1_DEB_WARN)
  689. debugl1(cs, "isar_fill_fifo: not ACTIV");
  690. } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) { 
  691. sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
  692. msb, count, ptr);
  693. } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTM) {
  694. sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA,
  695. 0, count, ptr);
  696. } else {
  697. if (cs->debug & L1_DEB_WARN)
  698. debugl1(cs, "isar_fill_fifo: not FTH/FTM");
  699. }
  700. break;
  701. default:
  702. if (cs->debug)
  703. debugl1(cs, "isar_fill_fifo mode(%x) error", bcs->mode);
  704. printk(KERN_ERR"isar_fill_fifo mode(%x) errorn", bcs->mode);
  705. break;
  706. }
  707. restore_flags(flags);
  708. }
  709. inline
  710. struct BCState *sel_bcs_isar(struct IsdnCardState *cs, u_char dpath)
  711. {
  712. if ((!dpath) || (dpath == 3))
  713. return(NULL);
  714. if (cs->bcs[0].hw.isar.dpath == dpath)
  715. return(&cs->bcs[0]);
  716. if (cs->bcs[1].hw.isar.dpath == dpath)
  717. return(&cs->bcs[1]);
  718. return(NULL);
  719. }
  720. inline void
  721. send_frames(struct BCState *bcs)
  722. {
  723. if (bcs->tx_skb) {
  724. if (bcs->tx_skb->len) {
  725. isar_fill_fifo(bcs);
  726. return;
  727. } else {
  728. if (bcs->st->lli.l1writewakeup &&
  729. (PACKET_NOACK != bcs->tx_skb->pkt_type))
  730. bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.isar.txcnt);
  731. if (bcs->mode == L1_MODE_FAX) {
  732. if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) {
  733. if (test_bit(BC_FLG_LASTDATA, &bcs->Flag)) {
  734. test_and_set_bit(BC_FLG_NMD_DATA, &bcs->Flag);
  735. }
  736. } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTM) {
  737. if (test_bit(BC_FLG_DLEETX, &bcs->Flag)) {
  738. test_and_set_bit(BC_FLG_LASTDATA, &bcs->Flag);
  739. test_and_set_bit(BC_FLG_NMD_DATA, &bcs->Flag);
  740. }
  741. }
  742. }
  743. dev_kfree_skb_any(bcs->tx_skb);
  744. bcs->hw.isar.txcnt = 0; 
  745. bcs->tx_skb = NULL;
  746. }
  747. }
  748. if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
  749. bcs->hw.isar.txcnt = 0;
  750. test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
  751. isar_fill_fifo(bcs);
  752. } else {
  753. if (test_and_clear_bit(BC_FLG_DLEETX, &bcs->Flag)) {
  754. if (test_and_clear_bit(BC_FLG_LASTDATA, &bcs->Flag)) {
  755. if (test_and_clear_bit(BC_FLG_NMD_DATA, &bcs->Flag)) {
  756. u_char dummy = 0;
  757. sendmsg(bcs->cs, SET_DPS(bcs->hw.isar.dpath) |
  758. ISAR_HIS_SDATA, 0x01, 1, &dummy);
  759. }
  760. test_and_set_bit(BC_FLG_LL_OK, &bcs->Flag);
  761. } else {
  762. isar_sched_event(bcs, B_LL_CONNECT);
  763. }
  764. }
  765. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  766. isar_sched_event(bcs, B_XMTBUFREADY);
  767. }
  768. }
  769. inline void
  770. check_send(struct IsdnCardState *cs, u_char rdm)
  771. {
  772. struct BCState *bcs;
  773. if (rdm & BSTAT_RDM1) {
  774. if ((bcs = sel_bcs_isar(cs, 1))) {
  775. if (bcs->mode) {
  776. send_frames(bcs);
  777. }
  778. }
  779. }
  780. if (rdm & BSTAT_RDM2) {
  781. if ((bcs = sel_bcs_isar(cs, 2))) {
  782. if (bcs->mode) {
  783. send_frames(bcs);
  784. }
  785. }
  786. }
  787. }
  788. const char *dmril[] = {"NO SPEED", "1200/75", "NODEF2", "75/1200", "NODEF4",
  789. "300", "600", "1200", "2400", "4800", "7200",
  790. "9600nt", "9600t", "12000", "14400", "WRONG"};
  791. const char *dmrim[] = {"NO MOD", "NO DEF", "V32/V32b", "V22", "V21",
  792. "Bell103", "V23", "Bell202", "V17", "V29", "V27ter"};
  793. static void
  794. isar_pump_status_rsp(struct BCState *bcs, struct isar_reg *ireg) {
  795. struct IsdnCardState *cs = bcs->cs;
  796. u_char ril = ireg->par[0];
  797. u_char rim;
  798. if (!test_and_clear_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags))
  799. return; 
  800. if (ril > 14) {
  801. if (cs->debug & L1_DEB_WARN)
  802. debugl1(cs, "wrong pstrsp ril=%d",ril);
  803. ril = 15;
  804. }
  805. switch(ireg->par[1]) {
  806. case 0:
  807. rim = 0;
  808. break;
  809. case 0x20:
  810. rim = 2;
  811. break;
  812. case 0x40:
  813. rim = 3;
  814. break;
  815. case 0x41:
  816. rim = 4;
  817. break;
  818. case 0x51:
  819. rim = 5;
  820. break;
  821. case 0x61:
  822. rim = 6;
  823. break;
  824. case 0x71:
  825. rim = 7;
  826. break;
  827. case 0x82:
  828. rim = 8;
  829. break;
  830. case 0x92:
  831. rim = 9;
  832. break;
  833. case 0xa2:
  834. rim = 10;
  835. break;
  836. default:
  837. rim = 1;
  838. break;
  839. }
  840. sprintf(bcs->hw.isar.conmsg,"%s %s", dmril[ril], dmrim[rim]);
  841. bcs->conmsg = bcs->hw.isar.conmsg;
  842. if (cs->debug & L1_DEB_HSCX)
  843. debugl1(cs, "pump strsp %s", bcs->conmsg);
  844. }
  845. static void
  846. isar_pump_statev_modem(struct BCState *bcs, u_char devt) {
  847. struct IsdnCardState *cs = bcs->cs;
  848. u_char dps = SET_DPS(bcs->hw.isar.dpath);
  849. switch(devt) {
  850. case PSEV_10MS_TIMER:
  851. if (cs->debug & L1_DEB_HSCX)
  852. debugl1(cs, "pump stev TIMER");
  853. break;
  854. case PSEV_CON_ON:
  855. if (cs->debug & L1_DEB_HSCX)
  856. debugl1(cs, "pump stev CONNECT");
  857. l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL);
  858. break;
  859. case PSEV_CON_OFF:
  860. if (cs->debug & L1_DEB_HSCX)
  861. debugl1(cs, "pump stev NO CONNECT");
  862. sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
  863. l1_msg_b(bcs->st, PH_DEACTIVATE | REQUEST, NULL);
  864. break;
  865. case PSEV_V24_OFF:
  866. if (cs->debug & L1_DEB_HSCX)
  867. debugl1(cs, "pump stev V24 OFF");
  868. break;
  869. case PSEV_CTS_ON:
  870. if (cs->debug & L1_DEB_HSCX)
  871. debugl1(cs, "pump stev CTS ON");
  872. break;
  873. case PSEV_CTS_OFF:
  874. if (cs->debug & L1_DEB_HSCX)
  875. debugl1(cs, "pump stev CTS OFF");
  876. break;
  877. case PSEV_DCD_ON:
  878. if (cs->debug & L1_DEB_HSCX)
  879. debugl1(cs, "pump stev CARRIER ON");
  880. test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags); 
  881. sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
  882. break;
  883. case PSEV_DCD_OFF:
  884. if (cs->debug & L1_DEB_HSCX)
  885. debugl1(cs, "pump stev CARRIER OFF");
  886. break;
  887. case PSEV_DSR_ON:
  888. if (cs->debug & L1_DEB_HSCX)
  889. debugl1(cs, "pump stev DSR ON");
  890. break;
  891. case PSEV_DSR_OFF:
  892. if (cs->debug & L1_DEB_HSCX)
  893. debugl1(cs, "pump stev DSR_OFF");
  894. break;
  895. case PSEV_REM_RET:
  896. if (cs->debug & L1_DEB_HSCX)
  897. debugl1(cs, "pump stev REMOTE RETRAIN");
  898. break;
  899. case PSEV_REM_REN:
  900. if (cs->debug & L1_DEB_HSCX)
  901. debugl1(cs, "pump stev REMOTE RENEGOTIATE");
  902. break;
  903. case PSEV_GSTN_CLR:
  904. if (cs->debug & L1_DEB_HSCX)
  905. debugl1(cs, "pump stev GSTN CLEAR", devt);
  906. break;
  907. default:
  908. if (cs->debug & L1_DEB_HSCX)
  909. debugl1(cs, "unknown pump stev %x", devt);
  910. break;
  911. }
  912. }
  913. static inline void
  914. ll_deliver_faxstat(struct BCState *bcs, u_char status)
  915. {
  916.         isdn_ctrl ic;
  917. struct Channel *chanp = (struct Channel *) bcs->st->lli.userdata;
  918.  
  919. if (bcs->cs->debug & L1_DEB_HSCX)
  920. debugl1(bcs->cs, "HL->LL FAXIND %x", status);
  921. ic.driver = bcs->cs->myid;
  922. ic.command = ISDN_STAT_FAXIND;
  923. ic.arg = chanp->chan;
  924. ic.parm.aux.cmd = status;
  925. bcs->cs->iif.statcallb(&ic);
  926. }
  927. static void
  928. isar_pump_statev_fax(struct BCState *bcs, u_char devt) {
  929. struct IsdnCardState *cs = bcs->cs;
  930. u_char dps = SET_DPS(bcs->hw.isar.dpath);
  931. u_char p1;
  932. switch(devt) {
  933. case PSEV_10MS_TIMER:
  934. if (cs->debug & L1_DEB_HSCX)
  935. debugl1(cs, "pump stev TIMER");
  936. break;
  937. case PSEV_RSP_READY:
  938. if (cs->debug & L1_DEB_HSCX)
  939. debugl1(cs, "pump stev RSP_READY");
  940. bcs->hw.isar.state = STFAX_READY;
  941. l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL);
  942. if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
  943. isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FRH, 3);
  944. } else {
  945. isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FTH, 3);
  946. }
  947. break;
  948. case PSEV_LINE_TX_H:
  949. if (bcs->hw.isar.state == STFAX_LINE) {
  950. if (cs->debug & L1_DEB_HSCX)
  951. debugl1(cs, "pump stev LINE_TX_H");
  952. bcs->hw.isar.state = STFAX_CONT;
  953. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
  954. } else {
  955. if (cs->debug & L1_DEB_WARN)
  956. debugl1(cs, "pump stev LINE_TX_H wrong st %x",
  957. bcs->hw.isar.state);
  958. }
  959. break;
  960. case PSEV_LINE_RX_H:
  961. if (bcs->hw.isar.state == STFAX_LINE) {
  962. if (cs->debug & L1_DEB_HSCX)
  963. debugl1(cs, "pump stev LINE_RX_H");
  964. bcs->hw.isar.state = STFAX_CONT;
  965. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
  966. } else {
  967. if (cs->debug & L1_DEB_WARN)
  968. debugl1(cs, "pump stev LINE_RX_H wrong st %x",
  969. bcs->hw.isar.state);
  970. }
  971. break;
  972. case PSEV_LINE_TX_B:
  973. if (bcs->hw.isar.state == STFAX_LINE) {
  974. if (cs->debug & L1_DEB_HSCX)
  975. debugl1(cs, "pump stev LINE_TX_B");
  976. bcs->hw.isar.state = STFAX_CONT;
  977. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
  978. } else {
  979. if (cs->debug & L1_DEB_WARN)
  980. debugl1(cs, "pump stev LINE_TX_B wrong st %x",
  981. bcs->hw.isar.state);
  982. }
  983. break;
  984. case PSEV_LINE_RX_B:
  985. if (bcs->hw.isar.state == STFAX_LINE) {
  986. if (cs->debug & L1_DEB_HSCX)
  987. debugl1(cs, "pump stev LINE_RX_B");
  988. bcs->hw.isar.state = STFAX_CONT;
  989. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_CONT, 0, NULL);
  990. } else {
  991. if (cs->debug & L1_DEB_WARN)
  992. debugl1(cs, "pump stev LINE_RX_B wrong st %x",
  993. bcs->hw.isar.state);
  994. }
  995. break;
  996. case PSEV_RSP_CONN:
  997. if (bcs->hw.isar.state == STFAX_CONT) {
  998. if (cs->debug & L1_DEB_HSCX)
  999. debugl1(cs, "pump stev RSP_CONN");
  1000. bcs->hw.isar.state = STFAX_ACTIV;
  1001. test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags);
  1002. sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
  1003. if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) {
  1004. /* 1s Flags before data */
  1005. if (test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag))
  1006. del_timer(&bcs->hw.isar.ftimer);
  1007. /* 1000 ms */
  1008. bcs->hw.isar.ftimer.expires =
  1009. jiffies + ((1000 * HZ)/1000);
  1010. test_and_set_bit(BC_FLG_LL_CONN,
  1011. &bcs->Flag);
  1012. add_timer(&bcs->hw.isar.ftimer);
  1013. } else {
  1014. isar_sched_event(bcs, B_LL_CONNECT);
  1015. }
  1016. } else {
  1017. if (cs->debug & L1_DEB_WARN)
  1018. debugl1(cs, "pump stev RSP_CONN wrong st %x",
  1019. bcs->hw.isar.state);
  1020. }
  1021. break;
  1022. case PSEV_FLAGS_DET:
  1023. if (cs->debug & L1_DEB_HSCX)
  1024. debugl1(cs, "pump stev FLAGS_DET");
  1025. break;
  1026. case PSEV_RSP_DISC:
  1027. if (cs->debug & L1_DEB_HSCX)
  1028. debugl1(cs, "pump stev RSP_DISC");
  1029. if (bcs->hw.isar.state == STFAX_ESCAPE) {
  1030. switch(bcs->hw.isar.newcmd) {
  1031. case 0:
  1032. bcs->hw.isar.state = STFAX_READY;
  1033. break;
  1034. case PCTRL_CMD_FTH:
  1035. case PCTRL_CMD_FTM:
  1036. p1 = 10;
  1037. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
  1038. PCTRL_CMD_SILON, 1, &p1);
  1039. bcs->hw.isar.state = STFAX_SILDET;
  1040. break;
  1041. case PCTRL_CMD_FRH:
  1042. case PCTRL_CMD_FRM:
  1043. p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod;
  1044. bcs->hw.isar.newmod = 0;
  1045. bcs->hw.isar.cmd = bcs->hw.isar.newcmd;
  1046. bcs->hw.isar.newcmd = 0;
  1047. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
  1048. bcs->hw.isar.cmd, 1, &p1);
  1049. bcs->hw.isar.state = STFAX_LINE;
  1050. bcs->hw.isar.try_mod = 3;
  1051. break;
  1052. default:
  1053. if (cs->debug & L1_DEB_HSCX)
  1054. debugl1(cs, "RSP_DISC unknown newcmd %x", bcs->hw.isar.newcmd);
  1055. break;
  1056. }
  1057. } else if (bcs->hw.isar.state == STFAX_ACTIV) {
  1058. if (test_and_clear_bit(BC_FLG_LL_OK, &bcs->Flag)) {
  1059. isar_sched_event(bcs, B_LL_OK);
  1060. } else if (bcs->hw.isar.cmd == PCTRL_CMD_FRM) {
  1061. send_DLE_ETX(bcs);
  1062. isar_sched_event(bcs, B_LL_NOCARRIER);
  1063. } else {
  1064. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
  1065. }
  1066. bcs->hw.isar.state = STFAX_READY;
  1067. } else {
  1068. bcs->hw.isar.state = STFAX_READY;
  1069. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
  1070. }
  1071. break;
  1072. case PSEV_RSP_SILDET:
  1073. if (cs->debug & L1_DEB_HSCX)
  1074. debugl1(cs, "pump stev RSP_SILDET");
  1075. if (bcs->hw.isar.state == STFAX_SILDET) {
  1076. p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod;
  1077. bcs->hw.isar.newmod = 0;
  1078. bcs->hw.isar.cmd = bcs->hw.isar.newcmd;
  1079. bcs->hw.isar.newcmd = 0;
  1080. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
  1081. bcs->hw.isar.cmd, 1, &p1);
  1082. bcs->hw.isar.state = STFAX_LINE;
  1083. bcs->hw.isar.try_mod = 3;
  1084. }
  1085. break;
  1086. case PSEV_RSP_SILOFF:
  1087. if (cs->debug & L1_DEB_HSCX)
  1088. debugl1(cs, "pump stev RSP_SILOFF");
  1089. break;
  1090. case PSEV_RSP_FCERR:
  1091. if (bcs->hw.isar.state == STFAX_LINE) {
  1092. if (cs->debug & L1_DEB_HSCX)
  1093. debugl1(cs, "pump stev RSP_FCERR try %d",
  1094. bcs->hw.isar.try_mod);
  1095. if (bcs->hw.isar.try_mod--) {
  1096. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL,
  1097. bcs->hw.isar.cmd, 1,
  1098. &bcs->hw.isar.mod);
  1099. break;
  1100. }
  1101. }
  1102. if (cs->debug & L1_DEB_HSCX)
  1103. debugl1(cs, "pump stev RSP_FCERR");
  1104. bcs->hw.isar.state = STFAX_ESCAPE;
  1105. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL);
  1106. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR);
  1107. break;
  1108. default:
  1109. break;
  1110. }
  1111. }
  1112. static char debbuf[128];
  1113. void
  1114. isar_int_main(struct IsdnCardState *cs)
  1115. {
  1116. long flags;
  1117. struct isar_reg *ireg = cs->bcs[0].hw.isar.reg;
  1118. struct BCState *bcs;
  1119. save_flags(flags);
  1120. cli();
  1121. get_irq_infos(cs, ireg);
  1122. switch (ireg->iis & ISAR_IIS_MSCMSD) {
  1123. case ISAR_IIS_RDATA:
  1124. if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
  1125. isar_rcv_frame(cs, bcs);
  1126. } else {
  1127. debugl1(cs, "isar spurious IIS_RDATA %x/%x/%x",
  1128. ireg->iis, ireg->cmsb, ireg->clsb);
  1129. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  1130. }
  1131. break;
  1132. case ISAR_IIS_GSTEV:
  1133. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  1134. ireg->bstat |= ireg->cmsb;
  1135. check_send(cs, ireg->cmsb);
  1136. break;
  1137. case ISAR_IIS_BSTEV:
  1138. #ifdef ERROR_STATISTIC
  1139. if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
  1140. if (ireg->cmsb == BSTEV_TBO)
  1141. bcs->err_tx++;
  1142. if (ireg->cmsb == BSTEV_RBO)
  1143. bcs->err_rdo++;
  1144. }
  1145. #endif
  1146. if (cs->debug & L1_DEB_WARN)
  1147. debugl1(cs, "Buffer STEV dpath%d msb(%x)",
  1148. ireg->iis>>6, ireg->cmsb);
  1149. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  1150. break;
  1151. case ISAR_IIS_PSTEV:
  1152. if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
  1153. rcv_mbox(cs, ireg, (u_char *)ireg->par);
  1154. if (bcs->mode == L1_MODE_V32) {
  1155. isar_pump_statev_modem(bcs, ireg->cmsb);
  1156. } else if (bcs->mode == L1_MODE_FAX) {
  1157. isar_pump_statev_fax(bcs, ireg->cmsb);
  1158. } else {
  1159. if (cs->debug & L1_DEB_WARN)
  1160. debugl1(cs, "isar IIS_PSTEV pmode %d stat %x",
  1161. bcs->mode, ireg->cmsb);
  1162. }
  1163. } else {
  1164. debugl1(cs, "isar spurious IIS_PSTEV %x/%x/%x",
  1165. ireg->iis, ireg->cmsb, ireg->clsb);
  1166. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  1167. }
  1168. break;
  1169. case ISAR_IIS_PSTRSP:
  1170. if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) {
  1171. rcv_mbox(cs, ireg, (u_char *)ireg->par);
  1172. isar_pump_status_rsp(bcs, ireg);
  1173. } else {
  1174. debugl1(cs, "isar spurious IIS_PSTRSP %x/%x/%x",
  1175. ireg->iis, ireg->cmsb, ireg->clsb);
  1176. cs->BC_Write_Reg(cs, 1, ISAR_IIA, 0);
  1177. }
  1178. break;
  1179. case ISAR_IIS_DIAG:
  1180. case ISAR_IIS_BSTRSP:
  1181. case ISAR_IIS_IOM2RSP:
  1182. rcv_mbox(cs, ireg, (u_char *)ireg->par);
  1183. if ((cs->debug & (L1_DEB_HSCX | L1_DEB_HSCX_FIFO))
  1184. == L1_DEB_HSCX) {
  1185. u_char *tp=debbuf;
  1186. tp += sprintf(debbuf, "msg iis(%x) msb(%x)",
  1187. ireg->iis, ireg->cmsb);
  1188. QuickHex(tp, (u_char *)ireg->par, ireg->clsb);
  1189. debugl1(cs, debbuf);
  1190. }
  1191. break;
  1192. case ISAR_IIS_INVMSG:
  1193. rcv_mbox(cs, ireg, debbuf);
  1194. if (cs->debug & L1_DEB_WARN)
  1195. debugl1(cs, "invalid msg his:%x",
  1196. ireg->cmsb);
  1197. break;
  1198. default:
  1199. rcv_mbox(cs, ireg, debbuf);
  1200. if (cs->debug & L1_DEB_WARN)
  1201. debugl1(cs, "unhandled msg iis(%x) ctrl(%x/%x)",
  1202. ireg->iis, ireg->cmsb, ireg->clsb);
  1203. break;
  1204. }
  1205. restore_flags(flags);
  1206. }
  1207. static void
  1208. ftimer_handler(struct BCState *bcs) {
  1209. if (bcs->cs->debug)
  1210. debugl1(bcs->cs, "ftimer flags %04x",
  1211. bcs->Flag);
  1212. test_and_clear_bit(BC_FLG_FTI_RUN, &bcs->Flag);
  1213. if (test_and_clear_bit(BC_FLG_LL_CONN, &bcs->Flag)) {
  1214. isar_sched_event(bcs, B_LL_CONNECT);
  1215. }
  1216. }
  1217. static void
  1218. setup_pump(struct BCState *bcs) {
  1219. struct IsdnCardState *cs = bcs->cs;
  1220. u_char dps = SET_DPS(bcs->hw.isar.dpath);
  1221. u_char ctrl, param[6];
  1222. switch (bcs->mode) {
  1223. case L1_MODE_NULL:
  1224. case L1_MODE_TRANS:
  1225. case L1_MODE_HDLC:
  1226. sendmsg(cs, dps | ISAR_HIS_PUMPCFG, PMOD_BYPASS, 0, NULL);
  1227. break;
  1228. case L1_MODE_V32:
  1229. ctrl = PMOD_DATAMODEM;
  1230. if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
  1231. ctrl |= PCTRL_ORIG;
  1232. param[5] = PV32P6_CTN;
  1233. } else {
  1234. param[5] = PV32P6_ATN;
  1235. }
  1236. param[0] = 6; /* 6 db */
  1237. param[1] = PV32P2_V23R | PV32P2_V22A | PV32P2_V22B |
  1238.    PV32P2_V22C | PV32P2_V21 | PV32P2_BEL; 
  1239. param[2] = PV32P3_AMOD | PV32P3_V32B | PV32P3_V23B;
  1240. param[3] = PV32P4_UT144;
  1241. param[4] = PV32P5_UT144;
  1242. sendmsg(cs, dps | ISAR_HIS_PUMPCFG, ctrl, 6, param);
  1243. break;
  1244. case L1_MODE_FAX:
  1245. ctrl = PMOD_FAX;
  1246. if (test_bit(BC_FLG_ORIG, &bcs->Flag)) {
  1247. ctrl |= PCTRL_ORIG;
  1248. param[1] = PFAXP2_CTN;
  1249. } else {
  1250. param[1] = PFAXP2_ATN;
  1251. }
  1252. param[0] = 6; /* 6 db */
  1253. sendmsg(cs, dps | ISAR_HIS_PUMPCFG, ctrl, 2, param);
  1254. bcs->hw.isar.state = STFAX_NULL;
  1255. bcs->hw.isar.newcmd = 0;
  1256. bcs->hw.isar.newmod = 0;
  1257. test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag);
  1258. break;
  1259. }
  1260. udelay(1000);
  1261. sendmsg(cs, dps | ISAR_HIS_PSTREQ, 0, 0, NULL);
  1262. udelay(1000);
  1263. }
  1264. static void
  1265. setup_sart(struct BCState *bcs) {
  1266. struct IsdnCardState *cs = bcs->cs;
  1267. u_char dps = SET_DPS(bcs->hw.isar.dpath);
  1268. u_char ctrl, param[2];
  1269. switch (bcs->mode) {
  1270. case L1_MODE_NULL:
  1271. sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_DISABLE, 0,
  1272. NULL);
  1273. break;
  1274. case L1_MODE_TRANS:
  1275. sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_BINARY, 2,
  1276. "");
  1277. break;
  1278. case L1_MODE_HDLC:
  1279. case L1_MODE_FAX:
  1280. param[0] = 0;
  1281. sendmsg(cs, dps | ISAR_HIS_SARTCFG, SMODE_HDLC, 1,
  1282. param);
  1283. break;
  1284. case L1_MODE_V32:
  1285. ctrl = SMODE_V14 | SCTRL_HDMC_BOTH;
  1286. param[0] = S_P1_CHS_8;
  1287. param[1] = S_P2_BFT_DEF;
  1288. sendmsg(cs, dps | ISAR_HIS_SARTCFG, ctrl, 2,
  1289. param);
  1290. break;
  1291. }
  1292. udelay(1000);
  1293. sendmsg(cs, dps | ISAR_HIS_BSTREQ, 0, 0, NULL);
  1294. udelay(1000);
  1295. }
  1296. static void
  1297. setup_iom2(struct BCState *bcs) {
  1298. struct IsdnCardState *cs = bcs->cs;
  1299. u_char dps = SET_DPS(bcs->hw.isar.dpath);
  1300. u_char cmsb = IOM_CTRL_ENA, msg[5] = {IOM_P1_TXD,0,0,0,0};
  1301. if (bcs->channel)
  1302. msg[1] = msg[3] = 1;
  1303. switch (bcs->mode) {
  1304. case L1_MODE_NULL:
  1305. cmsb = 0;
  1306. /* dummy slot */
  1307. msg[1] = msg[3] = bcs->hw.isar.dpath + 2;
  1308. break;
  1309. case L1_MODE_TRANS:
  1310. case L1_MODE_HDLC:
  1311. break;
  1312. case L1_MODE_V32:
  1313. case L1_MODE_FAX:
  1314. cmsb |= IOM_CTRL_ALAW | IOM_CTRL_RCV;
  1315. break;
  1316. }
  1317. sendmsg(cs, dps | ISAR_HIS_IOM2CFG, cmsb, 5, msg);
  1318. udelay(1000);
  1319. sendmsg(cs, dps | ISAR_HIS_IOM2REQ, 0, 0, NULL);
  1320. udelay(1000);
  1321. }
  1322. int
  1323. modeisar(struct BCState *bcs, int mode, int bc)
  1324. {
  1325. struct IsdnCardState *cs = bcs->cs;
  1326. /* Here we are selecting the best datapath for requested mode */
  1327. if(bcs->mode == L1_MODE_NULL) { /* New Setup */
  1328. bcs->channel = bc;
  1329. switch (mode) {
  1330. case L1_MODE_NULL: /* init */
  1331. if (!bcs->hw.isar.dpath)
  1332. /* no init for dpath 0 */
  1333. return(0);
  1334. break;
  1335. case L1_MODE_TRANS:
  1336. case L1_MODE_HDLC:
  1337. /* best is datapath 2 */
  1338. if (!test_and_set_bit(ISAR_DP2_USE, 
  1339. &bcs->hw.isar.reg->Flags))
  1340. bcs->hw.isar.dpath = 2;
  1341. else if (!test_and_set_bit(ISAR_DP1_USE,
  1342. &bcs->hw.isar.reg->Flags))
  1343. bcs->hw.isar.dpath = 1;
  1344. else {
  1345. printk(KERN_WARNING"isar modeisar both pathes in usen");
  1346. return(1);
  1347. }
  1348. break;
  1349. case L1_MODE_V32:
  1350. case L1_MODE_FAX:
  1351. /* only datapath 1 */
  1352. if (!test_and_set_bit(ISAR_DP1_USE, 
  1353. &bcs->hw.isar.reg->Flags))
  1354. bcs->hw.isar.dpath = 1;
  1355. else {
  1356. printk(KERN_WARNING"isar modeisar analog funktions only with DP1n");
  1357. debugl1(cs, "isar modeisar analog funktions only with DP1");
  1358. return(1);
  1359. }
  1360. break;
  1361. }
  1362. }
  1363. if (cs->debug & L1_DEB_HSCX)
  1364. debugl1(cs, "isar dp%d mode %d->%d ichan %d",
  1365. bcs->hw.isar.dpath, bcs->mode, mode, bc);
  1366. bcs->mode = mode;
  1367. setup_pump(bcs);
  1368. setup_iom2(bcs);
  1369. setup_sart(bcs);
  1370. if (bcs->mode == L1_MODE_NULL) {
  1371. /* Clear resources */
  1372. if (bcs->hw.isar.dpath == 1)
  1373. test_and_clear_bit(ISAR_DP1_USE, &bcs->hw.isar.reg->Flags);
  1374. else if (bcs->hw.isar.dpath == 2)
  1375. test_and_clear_bit(ISAR_DP2_USE, &bcs->hw.isar.reg->Flags);
  1376. bcs->hw.isar.dpath = 0;
  1377. }
  1378. return(0);
  1379. }
  1380. static void
  1381. isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para) 
  1382. {
  1383. struct IsdnCardState *cs = bcs->cs;
  1384. u_char dps = SET_DPS(bcs->hw.isar.dpath);
  1385. u_char ctrl = 0, nom = 0, p1 = 0;
  1386. switch(cmd) {
  1387. case ISDN_FAX_CLASS1_FTM:
  1388. if (bcs->hw.isar.state == STFAX_READY) {
  1389. p1 = para;
  1390. ctrl = PCTRL_CMD_FTM;
  1391. nom = 1;
  1392. bcs->hw.isar.state = STFAX_LINE;
  1393. bcs->hw.isar.cmd = ctrl;
  1394. bcs->hw.isar.mod = para;
  1395. bcs->hw.isar.newmod = 0;
  1396. bcs->hw.isar.newcmd = 0;
  1397. bcs->hw.isar.try_mod = 3; 
  1398. } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
  1399. (bcs->hw.isar.cmd == PCTRL_CMD_FTM) &&
  1400. (bcs->hw.isar.mod == para)) {
  1401. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
  1402. } else {
  1403. bcs->hw.isar.newmod = para;
  1404. bcs->hw.isar.newcmd = PCTRL_CMD_FTM;
  1405. nom = 0;
  1406. ctrl = PCTRL_CMD_ESC;
  1407. bcs->hw.isar.state = STFAX_ESCAPE; 
  1408. }
  1409. break;
  1410. case ISDN_FAX_CLASS1_FTH:
  1411. if (bcs->hw.isar.state == STFAX_READY) {
  1412. p1 = para;
  1413. ctrl = PCTRL_CMD_FTH;
  1414. nom = 1;
  1415. bcs->hw.isar.state = STFAX_LINE;
  1416. bcs->hw.isar.cmd = ctrl;
  1417. bcs->hw.isar.mod = para;
  1418. bcs->hw.isar.newmod = 0;
  1419. bcs->hw.isar.newcmd = 0;
  1420. bcs->hw.isar.try_mod = 3; 
  1421. } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
  1422. (bcs->hw.isar.cmd == PCTRL_CMD_FTH) &&
  1423. (bcs->hw.isar.mod == para)) {
  1424. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
  1425. } else {
  1426. bcs->hw.isar.newmod = para;
  1427. bcs->hw.isar.newcmd = PCTRL_CMD_FTH;
  1428. nom = 0;
  1429. ctrl = PCTRL_CMD_ESC;
  1430. bcs->hw.isar.state = STFAX_ESCAPE; 
  1431. }
  1432. break;
  1433. case ISDN_FAX_CLASS1_FRM:
  1434. if (bcs->hw.isar.state == STFAX_READY) {
  1435. p1 = para;
  1436. ctrl = PCTRL_CMD_FRM;
  1437. nom = 1;
  1438. bcs->hw.isar.state = STFAX_LINE;
  1439. bcs->hw.isar.cmd = ctrl;
  1440. bcs->hw.isar.mod = para;
  1441. bcs->hw.isar.newmod = 0;
  1442. bcs->hw.isar.newcmd = 0;
  1443. bcs->hw.isar.try_mod = 3; 
  1444. } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
  1445. (bcs->hw.isar.cmd == PCTRL_CMD_FRM) &&
  1446. (bcs->hw.isar.mod == para)) {
  1447. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
  1448. } else {
  1449. bcs->hw.isar.newmod = para;
  1450. bcs->hw.isar.newcmd = PCTRL_CMD_FRM;
  1451. nom = 0;
  1452. ctrl = PCTRL_CMD_ESC;
  1453. bcs->hw.isar.state = STFAX_ESCAPE; 
  1454. }
  1455. break;
  1456. case ISDN_FAX_CLASS1_FRH:
  1457. if (bcs->hw.isar.state == STFAX_READY) {
  1458. p1 = para;
  1459. ctrl = PCTRL_CMD_FRH;
  1460. nom = 1;
  1461. bcs->hw.isar.state = STFAX_LINE;
  1462. bcs->hw.isar.cmd = ctrl;
  1463. bcs->hw.isar.mod = para;
  1464. bcs->hw.isar.newmod = 0;
  1465. bcs->hw.isar.newcmd = 0;
  1466. bcs->hw.isar.try_mod = 3; 
  1467. } else if ((bcs->hw.isar.state == STFAX_ACTIV) &&
  1468. (bcs->hw.isar.cmd == PCTRL_CMD_FRH) &&
  1469. (bcs->hw.isar.mod == para)) {
  1470. ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT);
  1471. } else {
  1472. bcs->hw.isar.newmod = para;
  1473. bcs->hw.isar.newcmd = PCTRL_CMD_FRH;
  1474. nom = 0;
  1475. ctrl = PCTRL_CMD_ESC;
  1476. bcs->hw.isar.state = STFAX_ESCAPE; 
  1477. }
  1478. break;
  1479. }
  1480. if (ctrl)
  1481. sendmsg(cs, dps | ISAR_HIS_PUMPCTRL, ctrl, nom, &p1);
  1482. }
  1483. void
  1484. isar_setup(struct IsdnCardState *cs)
  1485. {
  1486. u_char msg;
  1487. int i;
  1488. /* Dpath 1, 2 */
  1489. msg = 61;
  1490. for (i=0; i<2; i++) {
  1491. /* Buffer Config */
  1492. sendmsg(cs, (i ? ISAR_HIS_DPS2 : ISAR_HIS_DPS1) |
  1493. ISAR_HIS_P12CFG, 4, 1, &msg);
  1494. cs->bcs[i].hw.isar.mml = msg;
  1495. cs->bcs[i].mode = 0;
  1496. cs->bcs[i].hw.isar.dpath = i + 1;
  1497. modeisar(&cs->bcs[i], 0, 0);
  1498. cs->bcs[i].tqueue.routine = (void *) (void *) isar_bh;
  1499. }
  1500. }
  1501. void
  1502. isar_l2l1(struct PStack *st, int pr, void *arg)
  1503. {
  1504. struct sk_buff *skb = arg;
  1505. long flags;
  1506. switch (pr) {
  1507. case (PH_DATA | REQUEST):
  1508. save_flags(flags);
  1509. cli();
  1510. if (st->l1.bcs->tx_skb) {
  1511. skb_queue_tail(&st->l1.bcs->squeue, skb);
  1512. restore_flags(flags);
  1513. } else {
  1514. st->l1.bcs->tx_skb = skb;
  1515. test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1516. if (st->l1.bcs->cs->debug & L1_DEB_HSCX)
  1517. debugl1(st->l1.bcs->cs, "DRQ set BC_FLG_BUSY");
  1518. st->l1.bcs->hw.isar.txcnt = 0;
  1519. restore_flags(flags);
  1520. st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  1521. }
  1522. break;
  1523. case (PH_PULL | INDICATION):
  1524. if (st->l1.bcs->tx_skb) {
  1525. printk(KERN_WARNING "isar_l2l1: this shouldn't happenn");
  1526. break;
  1527. }
  1528. test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1529. if (st->l1.bcs->cs->debug & L1_DEB_HSCX)
  1530. debugl1(st->l1.bcs->cs, "PUI set BC_FLG_BUSY");
  1531. st->l1.bcs->tx_skb = skb;
  1532. st->l1.bcs->hw.isar.txcnt = 0;
  1533. st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  1534. break;
  1535. case (PH_PULL | REQUEST):
  1536. if (!st->l1.bcs->tx_skb) {
  1537. test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1538. st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
  1539. } else
  1540. test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1541. break;
  1542. case (PH_ACTIVATE | REQUEST):
  1543. test_and_set_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  1544. st->l1.bcs->hw.isar.conmsg[0] = 0;
  1545. if (test_bit(FLG_ORIG, &st->l2.flag))
  1546. test_and_set_bit(BC_FLG_ORIG, &st->l1.bcs->Flag);
  1547. else
  1548. test_and_clear_bit(BC_FLG_ORIG, &st->l1.bcs->Flag);
  1549. switch(st->l1.mode) {
  1550. case L1_MODE_TRANS:
  1551. case L1_MODE_HDLC:
  1552. if (modeisar(st->l1.bcs, st->l1.mode, st->l1.bc))
  1553. l1_msg_b(st, PH_DEACTIVATE | REQUEST, arg);
  1554. else
  1555. l1_msg_b(st, PH_ACTIVATE | REQUEST, arg);
  1556. break;
  1557. case L1_MODE_V32:
  1558. case L1_MODE_FAX:
  1559. if (modeisar(st->l1.bcs, st->l1.mode, st->l1.bc))
  1560. l1_msg_b(st, PH_DEACTIVATE | REQUEST, arg);
  1561. break;
  1562. }
  1563. break;
  1564. case (PH_DEACTIVATE | REQUEST):
  1565. l1_msg_b(st, pr, arg);
  1566. break;
  1567. case (PH_DEACTIVATE | CONFIRM):
  1568. test_and_clear_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  1569. test_and_clear_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1570. if (st->l1.bcs->cs->debug & L1_DEB_HSCX)
  1571. debugl1(st->l1.bcs->cs, "PDAC clear BC_FLG_BUSY");
  1572. modeisar(st->l1.bcs, 0, st->l1.bc);
  1573. st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
  1574. break;
  1575. }
  1576. }
  1577. void
  1578. close_isarstate(struct BCState *bcs)
  1579. {
  1580. modeisar(bcs, 0, bcs->channel);
  1581. if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
  1582. if (bcs->hw.isar.rcvbuf) {
  1583. kfree(bcs->hw.isar.rcvbuf);
  1584. bcs->hw.isar.rcvbuf = NULL;
  1585. }
  1586. skb_queue_purge(&bcs->rqueue);
  1587. skb_queue_purge(&bcs->squeue);
  1588. if (bcs->tx_skb) {
  1589. dev_kfree_skb_any(bcs->tx_skb);
  1590. bcs->tx_skb = NULL;
  1591. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  1592. if (bcs->cs->debug & L1_DEB_HSCX)
  1593. debugl1(bcs->cs, "closeisar clear BC_FLG_BUSY");
  1594. }
  1595. }
  1596. del_timer(&bcs->hw.isar.ftimer);
  1597. }
  1598. int
  1599. open_isarstate(struct IsdnCardState *cs, struct BCState *bcs)
  1600. {
  1601. if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
  1602. if (!(bcs->hw.isar.rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
  1603. printk(KERN_WARNING
  1604.        "HiSax: No memory for isar.rcvbufn");
  1605. return (1);
  1606. }
  1607. skb_queue_head_init(&bcs->rqueue);
  1608. skb_queue_head_init(&bcs->squeue);
  1609. }
  1610. bcs->tx_skb = NULL;
  1611. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  1612. if (cs->debug & L1_DEB_HSCX)
  1613. debugl1(cs, "openisar clear BC_FLG_BUSY");
  1614. bcs->event = 0;
  1615. bcs->hw.isar.rcvidx = 0;
  1616. bcs->tx_cnt = 0;
  1617. bcs->hw.isar.ftimer.function = (void *) ftimer_handler;
  1618. bcs->hw.isar.ftimer.data = (long) bcs;
  1619. init_timer(&bcs->hw.isar.ftimer);
  1620. return (0);
  1621. }
  1622. int
  1623. setstack_isar(struct PStack *st, struct BCState *bcs)
  1624. {
  1625. bcs->channel = st->l1.bc;
  1626. if (open_isarstate(st->l1.hardware, bcs))
  1627. return (-1);
  1628. st->l1.bcs = bcs;
  1629. st->l2.l2l1 = isar_l2l1;
  1630. setstack_manager(st);
  1631. bcs->st = st;
  1632. setstack_l1_B(st);
  1633. return (0);
  1634. }
  1635. int
  1636. isar_auxcmd(struct IsdnCardState *cs, isdn_ctrl *ic) {
  1637. u_long adr;
  1638. int features, i;
  1639. struct BCState *bcs;
  1640. if (cs->debug & L1_DEB_HSCX)
  1641. debugl1(cs, "isar_auxcmd cmd/ch %x/%d", ic->command, ic->arg);
  1642. switch (ic->command) {
  1643. case (ISDN_CMD_FAXCMD):
  1644. bcs = cs->channel[ic->arg].bcs;
  1645. if (cs->debug & L1_DEB_HSCX)
  1646. debugl1(cs, "isar_auxcmd cmd/subcmd %d/%d",
  1647. ic->parm.aux.cmd, ic->parm.aux.subcmd);
  1648. switch(ic->parm.aux.cmd) {
  1649. case ISDN_FAX_CLASS1_CTRL:
  1650. if (ic->parm.aux.subcmd == ETX)
  1651. test_and_set_bit(BC_FLG_DLEETX,
  1652. &bcs->Flag);
  1653. break;
  1654. case ISDN_FAX_CLASS1_FRM:
  1655. case ISDN_FAX_CLASS1_FRH:
  1656. case ISDN_FAX_CLASS1_FTM:
  1657. case ISDN_FAX_CLASS1_FTH:
  1658. if (ic->parm.aux.subcmd == AT_QUERY) {
  1659. sprintf(ic->parm.aux.para,
  1660. "%d", bcs->hw.isar.mod);
  1661. ic->command = ISDN_STAT_FAXIND;
  1662. ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
  1663. cs->iif.statcallb(ic);
  1664. return(0);
  1665. } else if (ic->parm.aux.subcmd == AT_EQ_QUERY) {
  1666. strcpy(ic->parm.aux.para, faxmodulation_s);
  1667. ic->command = ISDN_STAT_FAXIND;
  1668. ic->parm.aux.cmd = ISDN_FAX_CLASS1_QUERY;
  1669. cs->iif.statcallb(ic);
  1670. return(0);
  1671. } else if (ic->parm.aux.subcmd == AT_EQ_VALUE) {
  1672. for(i=0;i<FAXMODCNT;i++)
  1673. if (faxmodulation[i]==ic->parm.aux.para[0])
  1674. break;
  1675. if ((FAXMODCNT > i) && 
  1676. test_bit(BC_FLG_INIT, &bcs->Flag)) {
  1677. isar_pump_cmd(bcs,
  1678. ic->parm.aux.cmd,
  1679. ic->parm.aux.para[0]);
  1680. return(0);
  1681. }
  1682. }
  1683. /* wrong modulation or not activ */
  1684. /* fall through */
  1685. default:
  1686. ic->command = ISDN_STAT_FAXIND;
  1687. ic->parm.aux.cmd = ISDN_FAX_CLASS1_ERROR;
  1688. cs->iif.statcallb(ic);
  1689. }
  1690. break;
  1691. case (ISDN_CMD_IOCTL):
  1692. switch (ic->arg) {
  1693. case (9): /* load firmware */
  1694. features = ISDN_FEATURE_L2_MODEM |
  1695. ISDN_FEATURE_L2_FAX |
  1696. ISDN_FEATURE_L3_FCLASS1;
  1697. memcpy(&adr, ic->parm.num, sizeof(ulong));
  1698. if (isar_load_firmware(cs, (u_char *)adr))
  1699. return(1);
  1700. else 
  1701. ll_run(cs, features);
  1702. break;
  1703. default:
  1704. printk(KERN_DEBUG "HiSax: invalid ioctl %dn",
  1705.        (int) ic->arg);
  1706. return(-EINVAL);
  1707. }
  1708. break;
  1709. default:
  1710. return(-EINVAL);
  1711. }
  1712. return(0);
  1713. }
  1714. void __devinit
  1715. initisar(struct IsdnCardState *cs)
  1716. {
  1717. cs->bcs[0].BC_SetStack = setstack_isar;
  1718. cs->bcs[1].BC_SetStack = setstack_isar;
  1719. cs->bcs[0].BC_Close = close_isarstate;
  1720. cs->bcs[1].BC_Close = close_isarstate;
  1721. }