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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: isdnl1.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
  2.  *
  3.  * common low level stuff for Siemens Chipsetbased isdn cards
  4.  *
  5.  * Author       Karsten Keil
  6.  *              based on the teles driver from Jan den Ouden
  7.  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  8.  * 
  9.  * This software may be used and distributed according to the terms
  10.  * of the GNU General Public License, incorporated herein by reference.
  11.  *
  12.  * For changes and modifications please read
  13.  * ../../../Documentation/isdn/HiSax.cert
  14.  *
  15.  * Thanks to    Jan den Ouden
  16.  *              Fritz Elfert
  17.  *              Beat Doebeli
  18.  *
  19.  */
  20. const char *l1_revision = "$Revision: 1.1.4.1 $";
  21. #define __NO_VERSION__
  22. #include <linux/init.h>
  23. #include "hisax.h"
  24. #include "isdnl1.h"
  25. #define TIMER3_VALUE 7000
  26. static struct Fsm l1fsm_b;
  27. static struct Fsm l1fsm_s;
  28. enum {
  29. ST_L1_F2,
  30. ST_L1_F3,
  31. ST_L1_F4,
  32. ST_L1_F5,
  33. ST_L1_F6,
  34. ST_L1_F7,
  35. ST_L1_F8,
  36. };
  37. #define L1S_STATE_COUNT (ST_L1_F8+1)
  38. static char *strL1SState[] =
  39. {
  40. "ST_L1_F2",
  41. "ST_L1_F3",
  42. "ST_L1_F4",
  43. "ST_L1_F5",
  44. "ST_L1_F6",
  45. "ST_L1_F7",
  46. "ST_L1_F8",
  47. };
  48. #ifdef HISAX_UINTERFACE
  49. static
  50. struct Fsm l1fsm_u =
  51. {NULL, 0, 0, NULL, NULL};
  52. enum {
  53. ST_L1_RESET,
  54. ST_L1_DEACT,
  55. ST_L1_SYNC2,
  56. ST_L1_TRANS,
  57. };
  58. #define L1U_STATE_COUNT (ST_L1_TRANS+1)
  59. static char *strL1UState[] =
  60. {
  61. "ST_L1_RESET",
  62. "ST_L1_DEACT",
  63. "ST_L1_SYNC2",
  64. "ST_L1_TRANS",
  65. };
  66. #endif
  67. enum {
  68. ST_L1_NULL,
  69. ST_L1_WAIT_ACT,
  70. ST_L1_WAIT_DEACT,
  71. ST_L1_ACTIV,
  72. };
  73. #define L1B_STATE_COUNT (ST_L1_ACTIV+1)
  74. static char *strL1BState[] =
  75. {
  76. "ST_L1_NULL",
  77. "ST_L1_WAIT_ACT",
  78. "ST_L1_WAIT_DEACT",
  79. "ST_L1_ACTIV",
  80. };
  81. enum {
  82. EV_PH_ACTIVATE,
  83. EV_PH_DEACTIVATE,
  84. EV_RESET_IND,
  85. EV_DEACT_CNF,
  86. EV_DEACT_IND,
  87. EV_POWER_UP,
  88. EV_RSYNC_IND, 
  89. EV_INFO2_IND,
  90. EV_INFO4_IND,
  91. EV_TIMER_DEACT,
  92. EV_TIMER_ACT,
  93. EV_TIMER3,
  94. };
  95. #define L1_EVENT_COUNT (EV_TIMER3 + 1)
  96. static char *strL1Event[] =
  97. {
  98. "EV_PH_ACTIVATE",
  99. "EV_PH_DEACTIVATE",
  100. "EV_RESET_IND",
  101. "EV_DEACT_CNF",
  102. "EV_DEACT_IND",
  103. "EV_POWER_UP",
  104. "EV_RSYNC_IND", 
  105. "EV_INFO2_IND",
  106. "EV_INFO4_IND",
  107. "EV_TIMER_DEACT",
  108. "EV_TIMER_ACT",
  109. "EV_TIMER3",
  110. };
  111. void
  112. debugl1(struct IsdnCardState *cs, char *fmt, ...)
  113. {
  114. va_list args;
  115. char tmp[8];
  116. va_start(args, fmt);
  117. sprintf(tmp, "Card%d ", cs->cardnr + 1);
  118. VHiSax_putstatus(cs, tmp, fmt, args);
  119. va_end(args);
  120. }
  121. static void
  122. l1m_debug(struct FsmInst *fi, char *fmt, ...)
  123. {
  124. va_list args;
  125. struct PStack *st = fi->userdata;
  126. struct IsdnCardState *cs = st->l1.hardware;
  127. char tmp[8];
  128. va_start(args, fmt);
  129. sprintf(tmp, "Card%d ", cs->cardnr + 1);
  130. VHiSax_putstatus(cs, tmp, fmt, args);
  131. va_end(args);
  132. }
  133. void
  134. L1activated(struct IsdnCardState *cs)
  135. {
  136. struct PStack *st;
  137. st = cs->stlist;
  138. while (st) {
  139. if (test_and_clear_bit(FLG_L1_ACTIVATING, &st->l1.Flags))
  140. st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
  141. else
  142. st->l1.l1l2(st, PH_ACTIVATE | INDICATION, NULL);
  143. st = st->next;
  144. }
  145. }
  146. void
  147. L1deactivated(struct IsdnCardState *cs)
  148. {
  149. struct PStack *st;
  150. st = cs->stlist;
  151. while (st) {
  152. if (test_bit(FLG_L1_DBUSY, &cs->HW_Flags))
  153. st->l1.l1l2(st, PH_PAUSE | CONFIRM, NULL);
  154. st->l1.l1l2(st, PH_DEACTIVATE | INDICATION, NULL);
  155. st = st->next;
  156. }
  157. test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags);
  158. }
  159. void
  160. DChannel_proc_xmt(struct IsdnCardState *cs)
  161. {
  162. struct PStack *stptr;
  163. if (cs->tx_skb)
  164. return;
  165. stptr = cs->stlist;
  166. while (stptr != NULL)
  167. if (test_and_clear_bit(FLG_L1_PULL_REQ, &stptr->l1.Flags)) {
  168. stptr->l1.l1l2(stptr, PH_PULL | CONFIRM, NULL);
  169. break;
  170. } else
  171. stptr = stptr->next;
  172. }
  173. void
  174. DChannel_proc_rcv(struct IsdnCardState *cs)
  175. {
  176. struct sk_buff *skb, *nskb;
  177. struct PStack *stptr = cs->stlist;
  178. int found, tei, sapi;
  179. if (stptr)
  180. if (test_bit(FLG_L1_ACTTIMER, &stptr->l1.Flags))
  181. FsmEvent(&stptr->l1.l1m, EV_TIMER_ACT, NULL);
  182. while ((skb = skb_dequeue(&cs->rq))) {
  183. #ifdef L2FRAME_DEBUG /* psa */
  184. if (cs->debug & L1_DEB_LAPD)
  185. Logl2Frame(cs, skb, "PH_DATA", 1);
  186. #endif
  187. stptr = cs->stlist;
  188. if (skb->len<3) {
  189. debugl1(cs, "D-channel frame too short(%d)",skb->len);
  190. dev_kfree_skb(skb);
  191. return;
  192. }
  193. if ((skb->data[0] & 1) || !(skb->data[1] &1)) {
  194. debugl1(cs, "D-channel frame wrong EA0/EA1");
  195. dev_kfree_skb(skb);
  196. return;
  197. }
  198. sapi = skb->data[0] >> 2;
  199. tei = skb->data[1] >> 1;
  200. if (cs->debug & DEB_DLOG_HEX)
  201. LogFrame(cs, skb->data, skb->len);
  202. if (cs->debug & DEB_DLOG_VERBOSE)
  203. dlogframe(cs, skb, 1);
  204. if (tei == GROUP_TEI) {
  205. if (sapi == CTRL_SAPI) { /* sapi 0 */
  206. while (stptr != NULL) {
  207. if ((nskb = skb_clone(skb, GFP_ATOMIC)))
  208. stptr->l1.l1l2(stptr, PH_DATA | INDICATION, nskb);
  209. else
  210. printk(KERN_WARNING "HiSax: isdn broadcast buffer shortagen");
  211. stptr = stptr->next;
  212. }
  213. } else if (sapi == TEI_SAPI) {
  214. while (stptr != NULL) {
  215. if ((nskb = skb_clone(skb, GFP_ATOMIC)))
  216. stptr->l1.l1tei(stptr, PH_DATA | INDICATION, nskb);
  217. else
  218. printk(KERN_WARNING "HiSax: tei broadcast buffer shortagen");
  219. stptr = stptr->next;
  220. }
  221. }
  222. dev_kfree_skb(skb);
  223. } else if (sapi == CTRL_SAPI) { /* sapi 0 */
  224. found = 0;
  225. while (stptr != NULL)
  226. if (tei == stptr->l2.tei) {
  227. stptr->l1.l1l2(stptr, PH_DATA | INDICATION, skb);
  228. found = !0;
  229. break;
  230. } else
  231. stptr = stptr->next;
  232. if (!found)
  233. dev_kfree_skb(skb);
  234. } else
  235. dev_kfree_skb(skb);
  236. }
  237. }
  238. static void
  239. BChannel_proc_xmt(struct BCState *bcs)
  240. {
  241. struct PStack *st = bcs->st;
  242. if (test_bit(BC_FLG_BUSY, &bcs->Flag)) {
  243. debugl1(bcs->cs, "BC_BUSY Error");
  244. return;
  245. }
  246. if (test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags))
  247. st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
  248. if (!test_bit(BC_FLG_ACTIV, &bcs->Flag)) {
  249. if (!test_bit(BC_FLG_BUSY, &bcs->Flag) && (!skb_queue_len(&bcs->squeue))) {
  250. st->l2.l2l1(st, PH_DEACTIVATE | CONFIRM, NULL);
  251. }
  252. }
  253. }
  254. static void
  255. BChannel_proc_rcv(struct BCState *bcs)
  256. {
  257. struct sk_buff *skb;
  258. if (bcs->st->l1.l1m.state == ST_L1_WAIT_ACT) {
  259. FsmDelTimer(&bcs->st->l1.timer, 4);
  260. FsmEvent(&bcs->st->l1.l1m, EV_TIMER_ACT, NULL);
  261. }
  262. while ((skb = skb_dequeue(&bcs->rqueue))) {
  263. bcs->st->l1.l1l2(bcs->st, PH_DATA | INDICATION, skb);
  264. }
  265. }
  266. void
  267. BChannel_bh(struct BCState *bcs)
  268. {
  269. if (!bcs)
  270. return;
  271. if (test_and_clear_bit(B_RCVBUFREADY, &bcs->event))
  272. BChannel_proc_rcv(bcs);
  273. if (test_and_clear_bit(B_XMTBUFREADY, &bcs->event))
  274. BChannel_proc_xmt(bcs);
  275. }
  276. void
  277. HiSax_addlist(struct IsdnCardState *cs,
  278.       struct PStack *st)
  279. {
  280. st->next = cs->stlist;
  281. cs->stlist = st;
  282. }
  283. void
  284. HiSax_rmlist(struct IsdnCardState *cs,
  285.      struct PStack *st)
  286. {
  287. struct PStack *p;
  288. FsmDelTimer(&st->l1.timer, 0);
  289. if (cs->stlist == st)
  290. cs->stlist = st->next;
  291. else {
  292. p = cs->stlist;
  293. while (p)
  294. if (p->next == st) {
  295. p->next = st->next;
  296. return;
  297. } else
  298. p = p->next;
  299. }
  300. }
  301. void
  302. init_bcstate(struct IsdnCardState *cs,
  303.      int bc)
  304. {
  305. struct BCState *bcs = cs->bcs + bc;
  306. bcs->cs = cs;
  307. bcs->channel = bc;
  308. bcs->tqueue.sync = 0;
  309. bcs->tqueue.routine = (void *) (void *) BChannel_bh;
  310. bcs->tqueue.data = bcs;
  311. bcs->BC_SetStack = NULL;
  312. bcs->BC_Close = NULL;
  313. bcs->Flag = 0;
  314. }
  315. #ifdef L2FRAME_DEBUG /* psa */
  316. char *
  317. l2cmd(u_char cmd)
  318. {
  319. switch (cmd & ~0x10) {
  320. case 1:
  321. return "RR";
  322. case 5:
  323. return "RNR";
  324. case 9:
  325. return "REJ";
  326. case 0x6f:
  327. return "SABME";
  328. case 0x0f:
  329. return "DM";
  330. case 3:
  331. return "UI";
  332. case 0x43:
  333. return "DISC";
  334. case 0x63:
  335. return "UA";
  336. case 0x87:
  337. return "FRMR";
  338. case 0xaf:
  339. return "XID";
  340. default:
  341. if (!(cmd & 1))
  342. return "I";
  343. else
  344. return "invalid command";
  345. }
  346. }
  347. static char tmpdeb[32];
  348. char *
  349. l2frames(u_char * ptr)
  350. {
  351. switch (ptr[2] & ~0x10) {
  352. case 1:
  353. case 5:
  354. case 9:
  355. sprintf(tmpdeb, "%s[%d](nr %d)", l2cmd(ptr[2]), ptr[3] & 1, ptr[3] >> 1);
  356. break;
  357. case 0x6f:
  358. case 0x0f:
  359. case 3:
  360. case 0x43:
  361. case 0x63:
  362. case 0x87:
  363. case 0xaf:
  364. sprintf(tmpdeb, "%s[%d]", l2cmd(ptr[2]), (ptr[2] & 0x10) >> 4);
  365. break;
  366. default:
  367. if (!(ptr[2] & 1)) {
  368. sprintf(tmpdeb, "I[%d](ns %d, nr %d)", ptr[3] & 1, ptr[2] >> 1, ptr[3] >> 1);
  369. break;
  370. } else
  371. return "invalid command";
  372. }
  373. return tmpdeb;
  374. }
  375. void
  376. Logl2Frame(struct IsdnCardState *cs, struct sk_buff *skb, char *buf, int dir)
  377. {
  378. u_char *ptr;
  379. ptr = skb->data;
  380. if (ptr[0] & 1 || !(ptr[1] & 1))
  381. debugl1(cs, "Address not LAPD");
  382. else
  383. debugl1(cs, "%s %s: %s%c (sapi %d, tei %d)",
  384. (dir ? "<-" : "->"), buf, l2frames(ptr),
  385. ((ptr[0] & 2) >> 1) == dir ? 'C' : 'R', ptr[0] >> 2, ptr[1] >> 1);
  386. }
  387. #endif
  388. static void
  389. l1_reset(struct FsmInst *fi, int event, void *arg)
  390. {
  391. FsmChangeState(fi, ST_L1_F3);
  392. }
  393. static void
  394. l1_deact_cnf(struct FsmInst *fi, int event, void *arg)
  395. {
  396. struct PStack *st = fi->userdata;
  397. FsmChangeState(fi, ST_L1_F3);
  398. if (test_bit(FLG_L1_ACTIVATING, &st->l1.Flags))
  399. st->l1.l1hw(st, HW_ENABLE | REQUEST, NULL);
  400. }
  401. static void
  402. l1_deact_req_s(struct FsmInst *fi, int event, void *arg)
  403. {
  404. struct PStack *st = fi->userdata;
  405. FsmChangeState(fi, ST_L1_F3);
  406. FsmRestartTimer(&st->l1.timer, 550, EV_TIMER_DEACT, NULL, 2);
  407. test_and_set_bit(FLG_L1_DEACTTIMER, &st->l1.Flags);
  408. }
  409. static void
  410. l1_power_up_s(struct FsmInst *fi, int event, void *arg)
  411. {
  412. struct PStack *st = fi->userdata;
  413. if (test_bit(FLG_L1_ACTIVATING, &st->l1.Flags)) {
  414. FsmChangeState(fi, ST_L1_F4);
  415. st->l1.l1hw(st, HW_INFO3 | REQUEST, NULL);
  416. FsmRestartTimer(&st->l1.timer, TIMER3_VALUE, EV_TIMER3, NULL, 2);
  417. test_and_set_bit(FLG_L1_T3RUN, &st->l1.Flags);
  418. } else
  419. FsmChangeState(fi, ST_L1_F3);
  420. }
  421. static void
  422. l1_go_F5(struct FsmInst *fi, int event, void *arg)
  423. {
  424. FsmChangeState(fi, ST_L1_F5);
  425. }
  426. static void
  427. l1_go_F8(struct FsmInst *fi, int event, void *arg)
  428. {
  429. FsmChangeState(fi, ST_L1_F8);
  430. }
  431. static void
  432. l1_info2_ind(struct FsmInst *fi, int event, void *arg)
  433. {
  434. struct PStack *st = fi->userdata;
  435. #ifdef HISAX_UINTERFACE
  436. if (test_bit(FLG_L1_UINT, &st->l1.Flags))
  437. FsmChangeState(fi, ST_L1_SYNC2);
  438. else
  439. #endif
  440. FsmChangeState(fi, ST_L1_F6);
  441. st->l1.l1hw(st, HW_INFO3 | REQUEST, NULL);
  442. }
  443. static void
  444. l1_info4_ind(struct FsmInst *fi, int event, void *arg)
  445. {
  446. struct PStack *st = fi->userdata;
  447. #ifdef HISAX_UINTERFACE
  448. if (test_bit(FLG_L1_UINT, &st->l1.Flags))
  449. FsmChangeState(fi, ST_L1_TRANS);
  450. else
  451. #endif
  452. FsmChangeState(fi, ST_L1_F7);
  453. st->l1.l1hw(st, HW_INFO3 | REQUEST, NULL);
  454. if (test_and_clear_bit(FLG_L1_DEACTTIMER, &st->l1.Flags))
  455. FsmDelTimer(&st->l1.timer, 4);
  456. if (!test_bit(FLG_L1_ACTIVATED, &st->l1.Flags)) {
  457. if (test_and_clear_bit(FLG_L1_T3RUN, &st->l1.Flags))
  458. FsmDelTimer(&st->l1.timer, 3);
  459. FsmRestartTimer(&st->l1.timer, 110, EV_TIMER_ACT, NULL, 2);
  460. test_and_set_bit(FLG_L1_ACTTIMER, &st->l1.Flags);
  461. }
  462. }
  463. static void
  464. l1_timer3(struct FsmInst *fi, int event, void *arg)
  465. {
  466. struct PStack *st = fi->userdata;
  467. test_and_clear_bit(FLG_L1_T3RUN, &st->l1.Flags);
  468. if (test_and_clear_bit(FLG_L1_ACTIVATING, &st->l1.Flags))
  469. L1deactivated(st->l1.hardware);
  470. #ifdef HISAX_UINTERFACE
  471. if (!test_bit(FLG_L1_UINT, &st->l1.Flags))
  472. #endif
  473. if (st->l1.l1m.state != ST_L1_F6) {
  474. FsmChangeState(fi, ST_L1_F3);
  475. st->l1.l1hw(st, HW_ENABLE | REQUEST, NULL);
  476. }
  477. }
  478. static void
  479. l1_timer_act(struct FsmInst *fi, int event, void *arg)
  480. {
  481. struct PStack *st = fi->userdata;
  482. test_and_clear_bit(FLG_L1_ACTTIMER, &st->l1.Flags);
  483. test_and_set_bit(FLG_L1_ACTIVATED, &st->l1.Flags);
  484. L1activated(st->l1.hardware);
  485. }
  486. static void
  487. l1_timer_deact(struct FsmInst *fi, int event, void *arg)
  488. {
  489. struct PStack *st = fi->userdata;
  490. test_and_clear_bit(FLG_L1_DEACTTIMER, &st->l1.Flags);
  491. test_and_clear_bit(FLG_L1_ACTIVATED, &st->l1.Flags);
  492. L1deactivated(st->l1.hardware);
  493. st->l1.l1hw(st, HW_DEACTIVATE | RESPONSE, NULL);
  494. }
  495. static void
  496. l1_activate_s(struct FsmInst *fi, int event, void *arg)
  497. {
  498. struct PStack *st = fi->userdata;
  499.                 
  500. st->l1.l1hw(st, HW_RESET | REQUEST, NULL);
  501. }
  502. static void
  503. l1_activate_no(struct FsmInst *fi, int event, void *arg)
  504. {
  505. struct PStack *st = fi->userdata;
  506. if ((!test_bit(FLG_L1_DEACTTIMER, &st->l1.Flags)) && (!test_bit(FLG_L1_T3RUN, &st->l1.Flags))) {
  507. test_and_clear_bit(FLG_L1_ACTIVATING, &st->l1.Flags);
  508. L1deactivated(st->l1.hardware);
  509. }
  510. }
  511. static struct FsmNode L1SFnList[] __initdata =
  512. {
  513. {ST_L1_F3, EV_PH_ACTIVATE, l1_activate_s},
  514. {ST_L1_F6, EV_PH_ACTIVATE, l1_activate_no},
  515. {ST_L1_F8, EV_PH_ACTIVATE, l1_activate_no},
  516. {ST_L1_F3, EV_RESET_IND, l1_reset},
  517. {ST_L1_F4, EV_RESET_IND, l1_reset},
  518. {ST_L1_F5, EV_RESET_IND, l1_reset},
  519. {ST_L1_F6, EV_RESET_IND, l1_reset},
  520. {ST_L1_F7, EV_RESET_IND, l1_reset},
  521. {ST_L1_F8, EV_RESET_IND, l1_reset},
  522. {ST_L1_F3, EV_DEACT_CNF, l1_deact_cnf},
  523. {ST_L1_F4, EV_DEACT_CNF, l1_deact_cnf},
  524. {ST_L1_F5, EV_DEACT_CNF, l1_deact_cnf},
  525. {ST_L1_F6, EV_DEACT_CNF, l1_deact_cnf},
  526. {ST_L1_F7, EV_DEACT_CNF, l1_deact_cnf},
  527. {ST_L1_F8, EV_DEACT_CNF, l1_deact_cnf},
  528. {ST_L1_F6, EV_DEACT_IND, l1_deact_req_s},
  529. {ST_L1_F7, EV_DEACT_IND, l1_deact_req_s},
  530. {ST_L1_F8, EV_DEACT_IND, l1_deact_req_s},
  531. {ST_L1_F3, EV_POWER_UP, l1_power_up_s},
  532. {ST_L1_F4, EV_RSYNC_IND, l1_go_F5},
  533. {ST_L1_F6, EV_RSYNC_IND, l1_go_F8},
  534. {ST_L1_F7, EV_RSYNC_IND, l1_go_F8},
  535. {ST_L1_F3, EV_INFO2_IND, l1_info2_ind},
  536. {ST_L1_F4, EV_INFO2_IND, l1_info2_ind},
  537. {ST_L1_F5, EV_INFO2_IND, l1_info2_ind},
  538. {ST_L1_F7, EV_INFO2_IND, l1_info2_ind},
  539. {ST_L1_F8, EV_INFO2_IND, l1_info2_ind},
  540. {ST_L1_F3, EV_INFO4_IND, l1_info4_ind},
  541. {ST_L1_F4, EV_INFO4_IND, l1_info4_ind},
  542. {ST_L1_F5, EV_INFO4_IND, l1_info4_ind},
  543. {ST_L1_F6, EV_INFO4_IND, l1_info4_ind},
  544. {ST_L1_F8, EV_INFO4_IND, l1_info4_ind},
  545. {ST_L1_F3, EV_TIMER3, l1_timer3},
  546. {ST_L1_F4, EV_TIMER3, l1_timer3},
  547. {ST_L1_F5, EV_TIMER3, l1_timer3},
  548. {ST_L1_F6, EV_TIMER3, l1_timer3},
  549. {ST_L1_F8, EV_TIMER3, l1_timer3},
  550. {ST_L1_F7, EV_TIMER_ACT, l1_timer_act},
  551. {ST_L1_F3, EV_TIMER_DEACT, l1_timer_deact},
  552. {ST_L1_F4, EV_TIMER_DEACT, l1_timer_deact},
  553. {ST_L1_F5, EV_TIMER_DEACT, l1_timer_deact},
  554. {ST_L1_F6, EV_TIMER_DEACT, l1_timer_deact},
  555. {ST_L1_F7, EV_TIMER_DEACT, l1_timer_deact},
  556. {ST_L1_F8, EV_TIMER_DEACT, l1_timer_deact},
  557. };
  558. #define L1S_FN_COUNT (sizeof(L1SFnList)/sizeof(struct FsmNode))
  559. #ifdef HISAX_UINTERFACE
  560. static void
  561. l1_deact_req_u(struct FsmInst *fi, int event, void *arg)
  562. {
  563. struct PStack *st = fi->userdata;
  564. FsmChangeState(fi, ST_L1_RESET);
  565. FsmRestartTimer(&st->l1.timer, 550, EV_TIMER_DEACT, NULL, 2);
  566. test_and_set_bit(FLG_L1_DEACTTIMER, &st->l1.Flags);
  567. st->l1.l1hw(st, HW_ENABLE | REQUEST, NULL);
  568. }
  569. static void
  570. l1_power_up_u(struct FsmInst *fi, int event, void *arg)
  571. {
  572. struct PStack *st = fi->userdata;
  573. FsmRestartTimer(&st->l1.timer, TIMER3_VALUE, EV_TIMER3, NULL, 2);
  574. test_and_set_bit(FLG_L1_T3RUN, &st->l1.Flags);
  575. }
  576. static void
  577. l1_info0_ind(struct FsmInst *fi, int event, void *arg)
  578. {
  579. FsmChangeState(fi, ST_L1_DEACT);
  580. }
  581. static void
  582. l1_activate_u(struct FsmInst *fi, int event, void *arg)
  583. {
  584. struct PStack *st = fi->userdata;
  585.                 
  586. st->l1.l1hw(st, HW_INFO1 | REQUEST, NULL);
  587. }
  588. static struct FsmNode L1UFnList[] __initdata =
  589. {
  590. {ST_L1_RESET, EV_DEACT_IND, l1_deact_req_u},
  591. {ST_L1_DEACT, EV_DEACT_IND, l1_deact_req_u},
  592. {ST_L1_SYNC2, EV_DEACT_IND, l1_deact_req_u},
  593. {ST_L1_TRANS, EV_DEACT_IND, l1_deact_req_u},
  594. {ST_L1_DEACT, EV_PH_ACTIVATE, l1_activate_u},
  595. {ST_L1_DEACT, EV_POWER_UP, l1_power_up_u},
  596. {ST_L1_DEACT, EV_INFO2_IND, l1_info2_ind},
  597. {ST_L1_TRANS, EV_INFO2_IND, l1_info2_ind},
  598. {ST_L1_RESET, EV_DEACT_CNF, l1_info0_ind},
  599. {ST_L1_DEACT, EV_INFO4_IND, l1_info4_ind},
  600. {ST_L1_SYNC2, EV_INFO4_IND, l1_info4_ind},
  601. {ST_L1_RESET, EV_INFO4_IND, l1_info4_ind},
  602. {ST_L1_DEACT, EV_TIMER3, l1_timer3},
  603. {ST_L1_SYNC2, EV_TIMER3, l1_timer3},
  604. {ST_L1_TRANS, EV_TIMER_ACT, l1_timer_act},
  605. {ST_L1_DEACT, EV_TIMER_DEACT, l1_timer_deact},
  606. {ST_L1_SYNC2, EV_TIMER_DEACT, l1_timer_deact},
  607. {ST_L1_RESET, EV_TIMER_DEACT, l1_timer_deact},
  608. };
  609. #define L1U_FN_COUNT (sizeof(L1UFnList)/sizeof(struct FsmNode))
  610. #endif
  611. static void
  612. l1b_activate(struct FsmInst *fi, int event, void *arg)
  613. {
  614. struct PStack *st = fi->userdata;
  615. FsmChangeState(fi, ST_L1_WAIT_ACT);
  616. FsmRestartTimer(&st->l1.timer, st->l1.delay, EV_TIMER_ACT, NULL, 2);
  617. }
  618. static void
  619. l1b_deactivate(struct FsmInst *fi, int event, void *arg)
  620. {
  621. struct PStack *st = fi->userdata;
  622. FsmChangeState(fi, ST_L1_WAIT_DEACT);
  623. FsmRestartTimer(&st->l1.timer, 10, EV_TIMER_DEACT, NULL, 2);
  624. }
  625. static void
  626. l1b_timer_act(struct FsmInst *fi, int event, void *arg)
  627. {
  628. struct PStack *st = fi->userdata;
  629. FsmChangeState(fi, ST_L1_ACTIV);
  630. st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
  631. }
  632. static void
  633. l1b_timer_deact(struct FsmInst *fi, int event, void *arg)
  634. {
  635. struct PStack *st = fi->userdata;
  636. FsmChangeState(fi, ST_L1_NULL);
  637. st->l2.l2l1(st, PH_DEACTIVATE | CONFIRM, NULL);
  638. }
  639. static struct FsmNode L1BFnList[] __initdata =
  640. {
  641. {ST_L1_NULL, EV_PH_ACTIVATE, l1b_activate},
  642. {ST_L1_WAIT_ACT, EV_TIMER_ACT, l1b_timer_act},
  643. {ST_L1_ACTIV, EV_PH_DEACTIVATE, l1b_deactivate},
  644. {ST_L1_WAIT_DEACT, EV_TIMER_DEACT, l1b_timer_deact},
  645. };
  646. #define L1B_FN_COUNT (sizeof(L1BFnList)/sizeof(struct FsmNode))
  647. int __init 
  648. Isdnl1New(void)
  649. {
  650. int retval;
  651. l1fsm_s.state_count = L1S_STATE_COUNT;
  652. l1fsm_s.event_count = L1_EVENT_COUNT;
  653. l1fsm_s.strEvent = strL1Event;
  654. l1fsm_s.strState = strL1SState;
  655. retval = FsmNew(&l1fsm_s, L1SFnList, L1S_FN_COUNT);
  656. if (retval)
  657. return retval;
  658. l1fsm_b.state_count = L1B_STATE_COUNT;
  659. l1fsm_b.event_count = L1_EVENT_COUNT;
  660. l1fsm_b.strEvent = strL1Event;
  661. l1fsm_b.strState = strL1BState;
  662. retval = FsmNew(&l1fsm_b, L1BFnList, L1B_FN_COUNT);
  663. if (retval) {
  664. FsmFree(&l1fsm_s);
  665. return retval;
  666. }
  667. #ifdef HISAX_UINTERFACE
  668. l1fsm_u.state_count = L1U_STATE_COUNT;
  669. l1fsm_u.event_count = L1_EVENT_COUNT;
  670. l1fsm_u.strEvent = strL1Event;
  671. l1fsm_u.strState = strL1UState;
  672. retval = FsmNew(&l1fsm_u, L1UFnList, L1U_FN_COUNT);
  673. if (retval) {
  674. FsmFree(&l1fsm_s);
  675. FsmFree(&l1fsm_b);
  676. return retval;
  677. }
  678. #endif
  679. return 0;
  680. }
  681. void Isdnl1Free(void)
  682. {
  683. #ifdef HISAX_UINTERFACE
  684. FsmFree(&l1fsm_u);
  685. #endif
  686. FsmFree(&l1fsm_s);
  687. FsmFree(&l1fsm_b);
  688. }
  689. static void
  690. dch_l2l1(struct PStack *st, int pr, void *arg)
  691. {
  692. struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
  693. switch (pr) {
  694. case (PH_DATA | REQUEST):
  695. case (PH_PULL | REQUEST):
  696. case (PH_PULL |INDICATION):
  697. st->l1.l1hw(st, pr, arg);
  698. break;
  699. case (PH_ACTIVATE | REQUEST):
  700. if (cs->debug)
  701. debugl1(cs, "PH_ACTIVATE_REQ %s",
  702. st->l1.l1m.fsm->strState[st->l1.l1m.state]);
  703. if (test_bit(FLG_L1_ACTIVATED, &st->l1.Flags))
  704. st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
  705. else {
  706. test_and_set_bit(FLG_L1_ACTIVATING, &st->l1.Flags);
  707. FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, arg);
  708. }
  709. break;
  710. case (PH_TESTLOOP | REQUEST):
  711. if (1 & (long) arg)
  712. debugl1(cs, "PH_TEST_LOOP B1");
  713. if (2 & (long) arg)
  714. debugl1(cs, "PH_TEST_LOOP B2");
  715. if (!(3 & (long) arg))
  716. debugl1(cs, "PH_TEST_LOOP DISABLED");
  717. st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
  718. break;
  719. default:
  720. if (cs->debug)
  721. debugl1(cs, "dch_l2l1 msg %04X unhandled", pr);
  722. break;
  723. }
  724. }
  725. void
  726. l1_msg(struct IsdnCardState *cs, int pr, void *arg) {
  727. struct PStack *st;
  728. st = cs->stlist;
  729. while (st) {
  730. switch(pr) {
  731. case (HW_RESET | INDICATION):
  732. FsmEvent(&st->l1.l1m, EV_RESET_IND, arg);
  733. break;
  734. case (HW_DEACTIVATE | CONFIRM):
  735. FsmEvent(&st->l1.l1m, EV_DEACT_CNF, arg);
  736. break;
  737. case (HW_DEACTIVATE | INDICATION):
  738. FsmEvent(&st->l1.l1m, EV_DEACT_IND, arg);
  739. break;
  740. case (HW_POWERUP | CONFIRM):
  741. FsmEvent(&st->l1.l1m, EV_POWER_UP, arg);
  742. break;
  743. case (HW_RSYNC | INDICATION):
  744. FsmEvent(&st->l1.l1m, EV_RSYNC_IND, arg);
  745. break;
  746. case (HW_INFO2 | INDICATION):
  747. FsmEvent(&st->l1.l1m, EV_INFO2_IND, arg);
  748. break;
  749. case (HW_INFO4_P8 | INDICATION):
  750. case (HW_INFO4_P10 | INDICATION):
  751. FsmEvent(&st->l1.l1m, EV_INFO4_IND, arg);
  752. break;
  753. default:
  754. if (cs->debug)
  755. debugl1(cs, "l1msg %04X unhandled", pr);
  756. break;
  757. }
  758. st = st->next;
  759. }
  760. }
  761. void
  762. l1_msg_b(struct PStack *st, int pr, void *arg) {
  763. switch(pr) {
  764. case (PH_ACTIVATE | REQUEST):
  765. FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, NULL);
  766. break;
  767. case (PH_DEACTIVATE | REQUEST):
  768. FsmEvent(&st->l1.l1m, EV_PH_DEACTIVATE, NULL);
  769. break;
  770. }
  771. }
  772. void
  773. setstack_HiSax(struct PStack *st, struct IsdnCardState *cs)
  774. {
  775. st->l1.hardware = cs;
  776. st->protocol = cs->protocol;
  777. st->l1.l1m.fsm = &l1fsm_s;
  778. st->l1.l1m.state = ST_L1_F3;
  779. st->l1.Flags = 0;
  780. #ifdef HISAX_UINTERFACE
  781. if (test_bit(FLG_HW_L1_UINT, &cs->HW_Flags)) {
  782. st->l1.l1m.fsm = &l1fsm_u;
  783. st->l1.l1m.state = ST_L1_RESET;
  784. st->l1.Flags = FLG_L1_UINT;
  785. }
  786. #endif
  787. st->l1.l1m.debug = cs->debug;
  788. st->l1.l1m.userdata = st;
  789. st->l1.l1m.userint = 0;
  790. st->l1.l1m.printdebug = l1m_debug;
  791. FsmInitTimer(&st->l1.l1m, &st->l1.timer);
  792. setstack_tei(st);
  793. setstack_manager(st);
  794. st->l1.stlistp = &(cs->stlist);
  795. st->l2.l2l1  = dch_l2l1;
  796. if (cs->setstack_d)
  797. cs->setstack_d(st, cs);
  798. }
  799. void
  800. setstack_l1_B(struct PStack *st)
  801. {
  802. struct IsdnCardState *cs = st->l1.hardware;
  803. st->l1.l1m.fsm = &l1fsm_b;
  804. st->l1.l1m.state = ST_L1_NULL;
  805. st->l1.l1m.debug = cs->debug;
  806. st->l1.l1m.userdata = st;
  807. st->l1.l1m.userint = 0;
  808. st->l1.l1m.printdebug = l1m_debug;
  809. st->l1.Flags = 0;
  810. FsmInitTimer(&st->l1.l1m, &st->l1.timer);
  811. }