layer2.c
Upload User: jlfgdled
Upload Date: 2013-04-10
Package Size: 33168k
Code Size: 14k
Development Platform:

Unix_Linux

  1. /*
  2.  * PCBIT-D low-layer interface
  3.  *
  4.  * Copyright (C) 1996 Universidade de Lisboa
  5.  *
  6.  * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
  7.  *
  8.  * This software may be used and distributed according to the terms of
  9.  * the GNU General Public License, incorporated herein by reference.
  10.  */
  11. /*
  12.  * 19991203 - Fernando Carvalho - takion@superbofh.org
  13.  * Hacked to compile with egcs and run with current version of isdn modules
  14. */
  15. /*
  16.  *        Based on documentation provided by Inesc:
  17.  *        - "Interface com bus do PC para o PCBIT e PCBIT-D", Inesc, Jan 93
  18.  */
  19. /*
  20.  *        TODO: better handling of errors
  21.  *              re-write/remove debug printks
  22.  */
  23. #include <linux/sched.h>
  24. #include <linux/string.h>
  25. #include <linux/kernel.h>
  26. #include <linux/types.h>
  27. #include <linux/slab.h>
  28. #include <linux/interrupt.h>
  29. #include <linux/tqueue.h>
  30. #include <linux/mm.h>
  31. #include <linux/skbuff.h>
  32. #include <linux/isdnif.h>
  33. #include <asm/system.h>
  34. #include <asm/io.h>
  35. #include "pcbit.h"
  36. #include "layer2.h"
  37. #include "edss1.h"
  38. #undef DEBUG_FRAG
  39. /*
  40.  *  task queue struct
  41.  */
  42. /*
  43.  *  Layer 3 packet demultiplexer
  44.  *  drv.c
  45.  */
  46. extern void pcbit_l3_receive(struct pcbit_dev *dev, ulong msg,
  47.      struct sk_buff *skb,
  48.      ushort hdr_len, ushort refnum);
  49. /*
  50.  *  Prototypes
  51.  */
  52. void pcbit_deliver(void *data);
  53. static void pcbit_transmit(struct pcbit_dev *dev);
  54. static void pcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack);
  55. static void pcbit_l2_error(struct pcbit_dev *dev);
  56. static void pcbit_l2_active_conf(struct pcbit_dev *dev, u_char info);
  57. static void pcbit_l2_err_recover(unsigned long data);
  58. static void pcbit_firmware_bug(struct pcbit_dev *dev);
  59. static __inline__ void
  60. pcbit_sched_delivery(struct pcbit_dev *dev)
  61. {
  62. queue_task(&dev->qdelivery, &tq_immediate);
  63. mark_bh(IMMEDIATE_BH);
  64. }
  65. /*
  66.  *  Called from layer3
  67.  */
  68. int
  69. pcbit_l2_write(struct pcbit_dev *dev, ulong msg, ushort refnum,
  70.        struct sk_buff *skb, unsigned short hdr_len)
  71. {
  72. struct frame_buf *frame,
  73. *ptr;
  74. unsigned long flags;
  75. if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) {
  76. dev_kfree_skb(skb);
  77. return -1;
  78. }
  79. if ((frame = (struct frame_buf *) kmalloc(sizeof(struct frame_buf),
  80.   GFP_ATOMIC)) == NULL) {
  81. printk(KERN_WARNING "pcbit_2_write: kmalloc failedn");
  82. dev_kfree_skb(skb);
  83. return -1;
  84. }
  85. frame->msg = msg;
  86. frame->refnum = refnum;
  87. frame->copied = 0;
  88. frame->hdr_len = hdr_len;
  89. if (skb)
  90. frame->dt_len = skb->len - hdr_len;
  91. else
  92. frame->dt_len = 0;
  93. frame->skb = skb;
  94. frame->next = NULL;
  95. save_flags(flags);
  96. cli();
  97. if (dev->write_queue == NULL) {
  98. dev->write_queue = frame;
  99. restore_flags(flags);
  100. pcbit_transmit(dev);
  101. } else {
  102. for (ptr = dev->write_queue; ptr->next; ptr = ptr->next);
  103. ptr->next = frame;
  104. restore_flags(flags);
  105. }
  106. return 0;
  107. }
  108. static __inline__ void
  109. pcbit_tx_update(struct pcbit_dev *dev, ushort len)
  110. {
  111. u_char info;
  112. dev->send_seq = (dev->send_seq + 1) % 8;
  113. dev->fsize[dev->send_seq] = len;
  114. info = 0;
  115. info |= dev->rcv_seq << 3;
  116. info |= dev->send_seq;
  117. writeb(info, dev->sh_mem + BANK4);
  118. }
  119. /*
  120.  * called by interrupt service routine or by write_2
  121.  */
  122. static void
  123. pcbit_transmit(struct pcbit_dev *dev)
  124. {
  125. struct frame_buf *frame = NULL;
  126. unsigned char unacked;
  127. int flen;               /* fragment frame length including all headers */
  128. int free;
  129. int count,
  130.  cp_len;
  131. unsigned long flags;
  132. unsigned short tt;
  133. if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING)
  134. return;
  135. unacked = (dev->send_seq + (8 - dev->unack_seq)) & 0x07;
  136. save_flags(flags);
  137. cli();
  138. if (dev->free > 16 && dev->write_queue && unacked < 7) {
  139. if (!dev->w_busy)
  140. dev->w_busy = 1;
  141. else {
  142. restore_flags(flags);
  143. return;
  144. }
  145. frame = dev->write_queue;
  146. free = dev->free;
  147. restore_flags(flags);
  148. if (frame->copied == 0) {
  149. /* Type 0 frame */
  150. ulong  msg;
  151. if (frame->skb)
  152. flen = FRAME_HDR_LEN + PREHDR_LEN + frame->skb->len;
  153. else
  154. flen = FRAME_HDR_LEN + PREHDR_LEN;
  155. if (flen > free)
  156. flen = free;
  157. msg = frame->msg;
  158. /*
  159.  *  Board level 2 header
  160.  */
  161. pcbit_writew(dev, flen - FRAME_HDR_LEN);
  162. pcbit_writeb(dev, GET_MSG_CPU(msg));
  163. pcbit_writeb(dev, GET_MSG_PROC(msg));
  164. /* TH */
  165. pcbit_writew(dev, frame->hdr_len + PREHDR_LEN);
  166. /* TD */
  167. pcbit_writew(dev, frame->dt_len);
  168. /*
  169.  *  Board level 3 fixed-header
  170.  */
  171. /* LEN = TH */
  172. pcbit_writew(dev, frame->hdr_len + PREHDR_LEN);
  173. /* XX */
  174. pcbit_writew(dev, 0);
  175. /* C + S */
  176. pcbit_writeb(dev, GET_MSG_CMD(msg));
  177. pcbit_writeb(dev, GET_MSG_SCMD(msg));
  178. /* NUM */
  179. pcbit_writew(dev, frame->refnum);
  180. count = FRAME_HDR_LEN + PREHDR_LEN;
  181. } else {
  182. /* Type 1 frame */
  183. flen = 2 + (frame->skb->len - frame->copied);
  184. if (flen > free)
  185. flen = free;
  186. /* TT */
  187. tt = ((ushort) (flen - 2)) | 0x8000U; /* Type 1 */
  188. pcbit_writew(dev, tt);
  189. count = 2;
  190. }
  191. if (frame->skb) {
  192. cp_len = frame->skb->len - frame->copied;
  193. if (cp_len > flen - count)
  194. cp_len = flen - count;
  195. memcpy_topcbit(dev, frame->skb->data + frame->copied,
  196.        cp_len);
  197. frame->copied += cp_len;
  198. }
  199. /* bookkeeping */
  200. dev->free -= flen;
  201. pcbit_tx_update(dev, flen);
  202. save_flags(flags);
  203. cli();
  204. if (frame->skb == NULL || frame->copied == frame->skb->len) {
  205. dev->write_queue = frame->next;
  206. if (frame->skb != NULL) {
  207. /* free frame */
  208. dev_kfree_skb(frame->skb);
  209. }
  210. kfree(frame);
  211. }
  212. dev->w_busy = 0;
  213. restore_flags(flags);
  214. } else {
  215. restore_flags(flags);
  216. #ifdef DEBUG
  217. printk(KERN_DEBUG "unacked %d free %d write_queue %sn",
  218.      unacked, dev->free, dev->write_queue ? "not empty" :
  219.        "empty");
  220. #endif
  221. }
  222. }
  223. /*
  224.  *  deliver a queued frame to the upper layer
  225.  */
  226. void
  227. pcbit_deliver(void *data)
  228. {
  229. struct frame_buf *frame;
  230. unsigned long flags, msg;
  231. struct pcbit_dev *dev = (struct pcbit_dev *) data;
  232. save_flags(flags);
  233. cli();
  234. while ((frame = dev->read_queue)) {
  235. dev->read_queue = frame->next;
  236. restore_flags(flags);
  237. SET_MSG_CPU(msg, 0);
  238. SET_MSG_PROC(msg, 0);
  239. SET_MSG_CMD(msg, frame->skb->data[2]);
  240. SET_MSG_SCMD(msg, frame->skb->data[3]);
  241. frame->refnum = *((ushort *) frame->skb->data + 4);
  242. frame->msg = *((ulong *) & msg);
  243. skb_pull(frame->skb, 6);
  244. pcbit_l3_receive(dev, frame->msg, frame->skb, frame->hdr_len,
  245.  frame->refnum);
  246. kfree(frame);
  247. save_flags(flags);
  248. cli();
  249. }
  250. restore_flags(flags);
  251. }
  252. /*
  253.  * Reads BANK 2 & Reassembles
  254.  */
  255. static void
  256. pcbit_receive(struct pcbit_dev *dev)
  257. {
  258. unsigned short tt;
  259. u_char cpu,
  260.  proc;
  261. struct frame_buf *frame = NULL;
  262. unsigned long flags;
  263. u_char type1;
  264. if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING)
  265. return;
  266. tt = pcbit_readw(dev);
  267. if ((tt & 0x7fffU) > 511) {
  268. printk(KERN_INFO "pcbit: invalid frame length -> TT=%04xn",
  269.        tt);
  270. pcbit_l2_error(dev);
  271. return;
  272. }
  273. if (!(tt & 0x8000U)) {  /* Type 0 */
  274. type1 = 0;
  275. if (dev->read_frame) {
  276. printk(KERN_DEBUG "pcbit_receive: Type 0 frame and read_frame != NULLn");
  277. /* discard previous queued frame */
  278. if (dev->read_frame->skb)
  279. kfree_skb(dev->read_frame->skb);
  280. kfree(dev->read_frame);
  281. dev->read_frame = NULL;
  282. }
  283. frame = kmalloc(sizeof(struct frame_buf), GFP_ATOMIC);
  284. if (frame == NULL) {
  285. printk(KERN_WARNING "kmalloc failedn");
  286. return;
  287. }
  288. memset(frame, 0, sizeof(struct frame_buf));
  289. cpu = pcbit_readb(dev);
  290. proc = pcbit_readb(dev);
  291. if (cpu != 0x06 && cpu != 0x02) {
  292. printk(KERN_DEBUG "pcbit: invalid cpu valuen");
  293. kfree(frame);
  294. pcbit_l2_error(dev);
  295. return;
  296. }
  297. /*
  298.  * we discard cpu & proc on receiving
  299.  * but we read it to update the pointer
  300.  */
  301. frame->hdr_len = pcbit_readw(dev);
  302. frame->dt_len = pcbit_readw(dev);
  303. /*
  304.    * 0 sized packet
  305.    * I don't know if they are an error or not...
  306.    * But they are very frequent
  307.    * Not documented
  308.  */
  309. if (frame->hdr_len == 0) {
  310. kfree(frame);
  311. #ifdef DEBUG
  312. printk(KERN_DEBUG "0 sized framen");
  313. #endif
  314. pcbit_firmware_bug(dev);
  315. return;
  316. }
  317. /* sanity check the length values */
  318. if (frame->hdr_len > 1024 || frame->dt_len > 2048) {
  319. #ifdef DEBUG
  320. printk(KERN_DEBUG "length problem: ");
  321. printk(KERN_DEBUG "TH=%04x TD=%04xn",
  322.        frame->hdr_len,
  323.        frame->dt_len);
  324. #endif
  325. pcbit_l2_error(dev);
  326. kfree(frame);
  327. return;
  328. }
  329. /* minimum frame read */
  330. frame->skb = dev_alloc_skb(frame->hdr_len + frame->dt_len +
  331.    ((frame->hdr_len + 15) & ~15));
  332. if (!frame->skb) {
  333. printk(KERN_DEBUG "pcbit_receive: out of memoryn");
  334. kfree(frame);
  335. return;
  336. }
  337. /* 16 byte alignment for IP */
  338. if (frame->dt_len)
  339. skb_reserve(frame->skb, (frame->hdr_len + 15) & ~15);
  340. } else {
  341. /* Type 1 */
  342. type1 = 1;
  343. tt &= 0x7fffU;
  344. if (!(frame = dev->read_frame)) {
  345. printk("Type 1 frame and no frame queuedn");
  346. /* usually after an error: toss frame */
  347. dev->readptr += tt;
  348. if (dev->readptr > dev->sh_mem + BANK2 + BANKLEN)
  349. dev->readptr -= BANKLEN;
  350. return;
  351. }
  352. }
  353. memcpy_frompcbit(dev, skb_put(frame->skb, tt), tt);
  354. frame->copied += tt;
  355. if (frame->copied == frame->hdr_len + frame->dt_len) {
  356. save_flags(flags);
  357. cli();
  358. if (type1) {
  359. dev->read_frame = NULL;
  360. }
  361. if (dev->read_queue) {
  362. struct frame_buf *ptr;
  363. for (ptr = dev->read_queue; ptr->next; ptr = ptr->next);
  364. ptr->next = frame;
  365. } else
  366. dev->read_queue = frame;
  367. restore_flags(flags);
  368. } else {
  369. save_flags(flags);
  370. cli();
  371. dev->read_frame = frame;
  372. restore_flags(flags);
  373. }
  374. }
  375. /*
  376.  *  The board sends 0 sized frames
  377.  *  They are TDATA_CONFs that get messed up somehow
  378.  *  gotta send a fake acknowledgment to the upper layer somehow
  379.  */
  380. static __inline__ void
  381. pcbit_fake_conf(struct pcbit_dev *dev, struct pcbit_chan *chan)
  382. {
  383. isdn_ctrl ictl;
  384. if (chan->queued) {
  385. chan->queued--;
  386. ictl.driver = dev->id;
  387. ictl.command = ISDN_STAT_BSENT;
  388. ictl.arg = chan->id;
  389. dev->dev_if->statcallb(&ictl);
  390. }
  391. }
  392. static void
  393. pcbit_firmware_bug(struct pcbit_dev *dev)
  394. {
  395. struct pcbit_chan *chan;
  396. chan = dev->b1;
  397. if (chan->fsm_state == ST_ACTIVE) {
  398. pcbit_fake_conf(dev, chan);
  399. }
  400. chan = dev->b2;
  401. if (chan->fsm_state == ST_ACTIVE) {
  402. pcbit_fake_conf(dev, chan);
  403. }
  404. }
  405. void
  406. pcbit_irq_handler(int interrupt, void *devptr, struct pt_regs *regs)
  407. {
  408. struct pcbit_dev *dev;
  409. u_char info,
  410.  ack_seq,
  411.  read_seq;
  412. dev = (struct pcbit_dev *) devptr;
  413. if (!dev) {
  414. printk(KERN_WARNING "pcbit_irq_handler: wrong devicen");
  415. return;
  416. }
  417. if (dev->interrupt) {
  418. printk(KERN_DEBUG "pcbit: reentering interrupt handern");
  419. return;
  420. }
  421. dev->interrupt = 1;
  422. info = readb(dev->sh_mem + BANK3);
  423. if (dev->l2_state == L2_STARTING || dev->l2_state == L2_ERROR) {
  424. pcbit_l2_active_conf(dev, info);
  425. dev->interrupt = 0;
  426. return;
  427. }
  428. if (info & 0x40U) {     /* E bit set */
  429. #ifdef DEBUG
  430. printk(KERN_DEBUG "pcbit_irq_handler: E bit onn");
  431. #endif
  432. pcbit_l2_error(dev);
  433. dev->interrupt = 0;
  434. return;
  435. }
  436. if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) {
  437. dev->interrupt = 0;
  438. return;
  439. }
  440. ack_seq = (info >> 3) & 0x07U;
  441. read_seq = (info & 0x07U);
  442. dev->interrupt = 0;
  443. if (read_seq != dev->rcv_seq) {
  444. while (read_seq != dev->rcv_seq) {
  445. pcbit_receive(dev);
  446. dev->rcv_seq = (dev->rcv_seq + 1) % 8;
  447. }
  448. pcbit_sched_delivery(dev);
  449. }
  450. if (ack_seq != dev->unack_seq) {
  451. pcbit_recv_ack(dev, ack_seq);
  452. }
  453. info = dev->rcv_seq << 3;
  454. info |= dev->send_seq;
  455. writeb(info, dev->sh_mem + BANK4);
  456. }
  457. static void
  458. pcbit_l2_active_conf(struct pcbit_dev *dev, u_char info)
  459. {
  460. u_char state;
  461. state = dev->l2_state;
  462. #ifdef DEBUG
  463. printk(KERN_DEBUG "layer2_active_confirmn");
  464. #endif
  465. if (info & 0x80U) {
  466. dev->rcv_seq = info & 0x07U;
  467. dev->l2_state = L2_RUNNING;
  468. } else
  469. dev->l2_state = L2_DOWN;
  470. if (state == L2_STARTING)
  471. wake_up_interruptible(&dev->set_running_wq);
  472. if (state == L2_ERROR && dev->l2_state == L2_RUNNING) {
  473. pcbit_transmit(dev);
  474. }
  475. }
  476. static void
  477. pcbit_l2_err_recover(unsigned long data)
  478. {
  479. struct pcbit_dev *dev;
  480. struct frame_buf *frame;
  481. dev = (struct pcbit_dev *) data;
  482. del_timer(&dev->error_recover_timer);
  483. if (dev->w_busy || dev->r_busy) {
  484. init_timer(&dev->error_recover_timer);
  485. dev->error_recover_timer.expires = jiffies + ERRTIME;
  486. add_timer(&dev->error_recover_timer);
  487. return;
  488. }
  489. dev->w_busy = dev->r_busy = 1;
  490. if (dev->read_frame) {
  491. if (dev->read_frame->skb)
  492. kfree_skb(dev->read_frame->skb);
  493. kfree(dev->read_frame);
  494. dev->read_frame = NULL;
  495. }
  496. if (dev->write_queue) {
  497. frame = dev->write_queue;
  498. #ifdef FREE_ON_ERROR
  499. dev->write_queue = dev->write_queue->next;
  500. if (frame->skb) {
  501. dev_kfree_skb(frame->skb);
  502. }
  503. kfree(frame);
  504. #else
  505. frame->copied = 0;
  506. #endif
  507. }
  508. dev->rcv_seq = dev->send_seq = dev->unack_seq = 0;
  509. dev->free = 511;
  510. dev->l2_state = L2_ERROR;
  511. /* this is an hack... */
  512. pcbit_firmware_bug(dev);
  513. dev->writeptr = dev->sh_mem;
  514. dev->readptr = dev->sh_mem + BANK2;
  515. writeb((0x80U | ((dev->rcv_seq & 0x07) << 3) | (dev->send_seq & 0x07)),
  516.        dev->sh_mem + BANK4);
  517. dev->w_busy = dev->r_busy = 0;
  518. }
  519. static void
  520. pcbit_l2_error(struct pcbit_dev *dev)
  521. {
  522. if (dev->l2_state == L2_RUNNING) {
  523. printk(KERN_INFO "pcbit: layer 2 errorn");
  524. #ifdef DEBUG
  525. log_state(dev);
  526. #endif
  527. dev->l2_state = L2_DOWN;
  528. init_timer(&dev->error_recover_timer);
  529. dev->error_recover_timer.function = &pcbit_l2_err_recover;
  530. dev->error_recover_timer.data = (ulong) dev;
  531. dev->error_recover_timer.expires = jiffies + ERRTIME;
  532. add_timer(&dev->error_recover_timer);
  533. }
  534. }
  535. /*
  536.  * Description:
  537.  * if board acks frames
  538.  *   update dev->free
  539.  *   call pcbit_transmit to write possible queued frames
  540.  */
  541. static void
  542. pcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack)
  543. {
  544. int i,
  545.  count;
  546. int unacked;
  547. unacked = (dev->send_seq + (8 - dev->unack_seq)) & 0x07;
  548. /* dev->unack_seq < ack <= dev->send_seq; */
  549. if (unacked) {
  550. if (dev->send_seq > dev->unack_seq) {
  551. if (ack <= dev->unack_seq || ack > dev->send_seq) {
  552. printk(KERN_DEBUG
  553.      "layer 2 ack unacceptable - dev %d",
  554.        dev->id);
  555. pcbit_l2_error(dev);
  556. } else if (ack > dev->send_seq && ack <= dev->unack_seq) {
  557. printk(KERN_DEBUG
  558.      "layer 2 ack unacceptable - dev %d",
  559.        dev->id);
  560. pcbit_l2_error(dev);
  561. }
  562. }
  563. /* ack is acceptable */
  564. i = dev->unack_seq;
  565. do {
  566. dev->unack_seq = i = (i + 1) % 8;
  567. dev->free += dev->fsize[i];
  568. } while (i != ack);
  569. count = 0;
  570. while (count < 7 && dev->write_queue) {
  571. u8 lsend_seq = dev->send_seq;
  572. pcbit_transmit(dev);
  573. if (dev->send_seq == lsend_seq)
  574. break;
  575. count++;
  576. }
  577. } else
  578. printk(KERN_DEBUG "recv_ack: unacked = 0n");
  579. }