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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: netjet.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
  2.  *
  3.  * low level stuff for Traverse Technologie NETJet ISDN cards
  4.  *
  5.  * Author       Karsten Keil
  6.  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  7.  * 
  8.  * This software may be used and distributed according to the terms
  9.  * of the GNU General Public License, incorporated herein by reference.
  10.  *
  11.  * Thanks to Traverse Technologie Australia for documents and information
  12.  *
  13.  */
  14. #define __NO_VERSION__
  15. #include <linux/init.h>
  16. #include "hisax.h"
  17. #include "isac.h"
  18. #include "hscx.h"
  19. #include "isdnl1.h"
  20. #include <linux/pci.h>
  21. #include <linux/interrupt.h>
  22. #include <linux/ppp_defs.h>
  23. #include <asm/io.h>
  24. #include "netjet.h"
  25. const char *NETjet_revision = "$Revision: 1.1.4.1 $";
  26. /* Interface functions */
  27. u_char
  28. NETjet_ReadIC(struct IsdnCardState *cs, u_char offset)
  29. {
  30. long flags;
  31. u_char ret;
  32. save_flags(flags);
  33. cli();
  34. cs->hw.njet.auxd &= 0xfc;
  35. cs->hw.njet.auxd |= (offset>>4) & 3;
  36. byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
  37. ret = bytein(cs->hw.njet.isac + ((offset & 0xf)<<2));
  38. restore_flags(flags);
  39. return(ret);
  40. }
  41. void
  42. NETjet_WriteIC(struct IsdnCardState *cs, u_char offset, u_char value)
  43. {
  44. long flags;
  45. save_flags(flags);
  46. cli();
  47. cs->hw.njet.auxd &= 0xfc;
  48. cs->hw.njet.auxd |= (offset>>4) & 3;
  49. byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
  50. byteout(cs->hw.njet.isac + ((offset & 0xf)<<2), value);
  51. restore_flags(flags);
  52. }
  53. void
  54. NETjet_ReadICfifo(struct IsdnCardState *cs, u_char *data, int size)
  55. {
  56. cs->hw.njet.auxd &= 0xfc;
  57. byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
  58. insb(cs->hw.njet.isac, data, size);
  59. }
  60. __u16 fcstab[256] =
  61. {
  62. 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
  63. 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
  64. 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
  65. 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
  66. 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
  67. 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
  68. 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
  69. 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
  70. 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
  71. 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
  72. 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
  73. 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
  74. 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
  75. 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
  76. 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
  77. 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
  78. 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
  79. 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
  80. 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
  81. 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
  82. 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
  83. 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
  84. 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
  85. 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
  86. 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
  87. 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
  88. 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
  89. 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
  90. 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
  91. 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
  92. 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
  93. 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
  94. };
  95. void 
  96. NETjet_WriteICfifo(struct IsdnCardState *cs, u_char *data, int size)
  97. {
  98. cs->hw.njet.auxd &= 0xfc;
  99. byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
  100. outsb(cs->hw.njet.isac, data, size);
  101. }
  102. void fill_mem(struct BCState *bcs, u_int *pos, u_int cnt, int chan, u_char fill)
  103. {
  104. u_int mask=0x000000ff, val = 0, *p=pos;
  105. u_int i;
  106. val |= fill;
  107. if (chan) {
  108. val  <<= 8;
  109. mask <<= 8;
  110. }
  111. mask ^= 0xffffffff;
  112. for (i=0; i<cnt; i++) {
  113. *p   &= mask;
  114. *p++ |= val;
  115. if (p > bcs->hw.tiger.s_end)
  116. p = bcs->hw.tiger.send;
  117. }
  118. }
  119. void
  120. mode_tiger(struct BCState *bcs, int mode, int bc)
  121. {
  122. struct IsdnCardState *cs = bcs->cs;
  123. if (cs->debug & L1_DEB_HSCX)
  124. debugl1(cs, "Tiger mode %d bchan %d/%d",
  125. mode, bc, bcs->channel);
  126. bcs->mode = mode;
  127. bcs->channel = bc;
  128. switch (mode) {
  129. case (L1_MODE_NULL):
  130. fill_mem(bcs, bcs->hw.tiger.send,
  131. NETJET_DMA_TXSIZE, bc, 0xff);
  132. if (cs->debug & L1_DEB_HSCX)
  133. debugl1(cs, "Tiger stat rec %d/%d send %d",
  134. bcs->hw.tiger.r_tot, bcs->hw.tiger.r_err,
  135. bcs->hw.tiger.s_tot); 
  136. if ((cs->bcs[0].mode == L1_MODE_NULL) &&
  137. (cs->bcs[1].mode == L1_MODE_NULL)) {
  138. cs->hw.njet.dmactrl = 0;
  139. byteout(cs->hw.njet.base + NETJET_DMACTRL,
  140. cs->hw.njet.dmactrl);
  141. byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
  142. }
  143. break;
  144. case (L1_MODE_TRANS):
  145. break;
  146. case (L1_MODE_HDLC_56K):
  147. case (L1_MODE_HDLC):
  148. fill_mem(bcs, bcs->hw.tiger.send,
  149. NETJET_DMA_TXSIZE, bc, 0xff);
  150. bcs->hw.tiger.r_state = HDLC_ZERO_SEARCH;
  151. bcs->hw.tiger.r_tot = 0;
  152. bcs->hw.tiger.r_bitcnt = 0;
  153. bcs->hw.tiger.r_one = 0;
  154. bcs->hw.tiger.r_err = 0;
  155. bcs->hw.tiger.s_tot = 0;
  156. if (! cs->hw.njet.dmactrl) {
  157. fill_mem(bcs, bcs->hw.tiger.send,
  158. NETJET_DMA_TXSIZE, !bc, 0xff);
  159. cs->hw.njet.dmactrl = 1;
  160. byteout(cs->hw.njet.base + NETJET_DMACTRL,
  161. cs->hw.njet.dmactrl);
  162. byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0x0f);
  163. /* was 0x3f now 0x0f for TJ300 and TJ320  GE 13/07/00 */
  164. }
  165. bcs->hw.tiger.sendp = bcs->hw.tiger.send;
  166. bcs->hw.tiger.free = NETJET_DMA_TXSIZE;
  167. test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
  168. break;
  169. }
  170. if (cs->debug & L1_DEB_HSCX)
  171. debugl1(cs, "tiger: set %x %x %x  %x/%x  pulse=%d",
  172. bytein(cs->hw.njet.base + NETJET_DMACTRL),
  173. bytein(cs->hw.njet.base + NETJET_IRQMASK0),
  174. bytein(cs->hw.njet.base + NETJET_IRQSTAT0),
  175. inl(cs->hw.njet.base + NETJET_DMA_READ_ADR),
  176. inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR),
  177. bytein(cs->hw.njet.base + NETJET_PULSE_CNT));
  178. }
  179. static void printframe(struct IsdnCardState *cs, u_char *buf, int count, char *s) {
  180. char tmp[128];
  181. char *t = tmp;
  182. int i=count,j;
  183. u_char *p = buf;
  184. t += sprintf(t, "tiger %s(%4d)", s, count);
  185. while (i>0) {
  186. if (i>16)
  187. j=16;
  188. else
  189. j=i;
  190. QuickHex(t, p, j);
  191. debugl1(cs, tmp);
  192. p += j;
  193. i -= j;
  194. t = tmp;
  195. t += sprintf(t, "tiger %s      ", s);
  196. }
  197. }
  198. // macro for 64k
  199. #define MAKE_RAW_BYTE for (j=0; j<8; j++) { 
  200. bitcnt++;
  201. s_val >>= 1;
  202. if (val & 1) {
  203. s_one++;
  204. s_val |= 0x80;
  205. } else {
  206. s_one = 0;
  207. s_val &= 0x7f;
  208. }
  209. if (bitcnt==8) {
  210. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  211. bitcnt = 0;
  212. }
  213. if (s_one == 5) {
  214. s_val >>= 1;
  215. s_val &= 0x7f;
  216. bitcnt++;
  217. s_one = 0;
  218. }
  219. if (bitcnt==8) {
  220. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  221. bitcnt = 0;
  222. }
  223. val >>= 1;
  224. }
  225. static int make_raw_data(struct BCState *bcs) {
  226. // this make_raw is for 64k
  227. register u_int i,s_cnt=0;
  228. register u_char j;
  229. register u_char val;
  230. register u_char s_one = 0;
  231. register u_char s_val = 0;
  232. register u_char bitcnt = 0;
  233. u_int fcs;
  234. if (!bcs->tx_skb) {
  235. debugl1(bcs->cs, "tiger make_raw: NULL skb");
  236. return(1);
  237. }
  238. bcs->hw.tiger.sendbuf[s_cnt++] = HDLC_FLAG_VALUE;
  239. fcs = PPP_INITFCS;
  240. for (i=0; i<bcs->tx_skb->len; i++) {
  241. val = bcs->tx_skb->data[i];
  242. fcs = PPP_FCS (fcs, val);
  243. MAKE_RAW_BYTE;
  244. }
  245. fcs ^= 0xffff;
  246. val = fcs & 0xff;
  247. MAKE_RAW_BYTE;
  248. val = (fcs>>8) & 0xff;
  249. MAKE_RAW_BYTE;
  250. val = HDLC_FLAG_VALUE;
  251. for (j=0; j<8; j++) { 
  252. bitcnt++;
  253. s_val >>= 1;
  254. if (val & 1)
  255. s_val |= 0x80;
  256. else
  257. s_val &= 0x7f;
  258. if (bitcnt==8) {
  259. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  260. bitcnt = 0;
  261. }
  262. val >>= 1;
  263. }
  264. if (bcs->cs->debug & L1_DEB_HSCX)
  265. debugl1(bcs->cs,"tiger make_raw: in %ld out %d.%d",
  266. bcs->tx_skb->len, s_cnt, bitcnt);
  267. if (bitcnt) {
  268. while (8>bitcnt++) {
  269. s_val >>= 1;
  270. s_val |= 0x80;
  271. }
  272. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  273. bcs->hw.tiger.sendbuf[s_cnt++] = 0xff; // NJ<->NJ thoughput bug fix
  274. }
  275. bcs->hw.tiger.sendcnt = s_cnt;
  276. bcs->tx_cnt -= bcs->tx_skb->len;
  277. bcs->hw.tiger.sp = bcs->hw.tiger.sendbuf;
  278. return(0);
  279. }
  280. // macro for 56k
  281. #define MAKE_RAW_BYTE_56K for (j=0; j<8; j++) { 
  282. bitcnt++;
  283. s_val >>= 1;
  284. if (val & 1) {
  285. s_one++;
  286. s_val |= 0x80;
  287. } else {
  288. s_one = 0;
  289. s_val &= 0x7f;
  290. }
  291. if (bitcnt==7) {
  292. s_val >>= 1;
  293. s_val |= 0x80;
  294. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  295. bitcnt = 0;
  296. }
  297. if (s_one == 5) {
  298. s_val >>= 1;
  299. s_val &= 0x7f;
  300. bitcnt++;
  301. s_one = 0;
  302. }
  303. if (bitcnt==7) {
  304. s_val >>= 1;
  305. s_val |= 0x80;
  306. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  307. bitcnt = 0;
  308. }
  309. val >>= 1;
  310. }
  311. static int make_raw_data_56k(struct BCState *bcs) {
  312. // this make_raw is for 56k
  313. register u_int i,s_cnt=0;
  314. register u_char j;
  315. register u_char val;
  316. register u_char s_one = 0;
  317. register u_char s_val = 0;
  318. register u_char bitcnt = 0;
  319. u_int fcs;
  320. if (!bcs->tx_skb) {
  321. debugl1(bcs->cs, "tiger make_raw_56k: NULL skb");
  322. return(1);
  323. }
  324. val = HDLC_FLAG_VALUE;
  325. for (j=0; j<8; j++) { 
  326. bitcnt++;
  327. s_val >>= 1;
  328. if (val & 1)
  329. s_val |= 0x80;
  330. else
  331. s_val &= 0x7f;
  332. if (bitcnt==7) {
  333. s_val >>= 1;
  334. s_val |= 0x80;
  335. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  336. bitcnt = 0;
  337. }
  338. val >>= 1;
  339. };
  340. fcs = PPP_INITFCS;
  341. for (i=0; i<bcs->tx_skb->len; i++) {
  342. val = bcs->tx_skb->data[i];
  343. fcs = PPP_FCS (fcs, val);
  344. MAKE_RAW_BYTE_56K;
  345. }
  346. fcs ^= 0xffff;
  347. val = fcs & 0xff;
  348. MAKE_RAW_BYTE_56K;
  349. val = (fcs>>8) & 0xff;
  350. MAKE_RAW_BYTE_56K;
  351. val = HDLC_FLAG_VALUE;
  352. for (j=0; j<8; j++) { 
  353. bitcnt++;
  354. s_val >>= 1;
  355. if (val & 1)
  356. s_val |= 0x80;
  357. else
  358. s_val &= 0x7f;
  359. if (bitcnt==7) {
  360. s_val >>= 1;
  361. s_val |= 0x80;
  362. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  363. bitcnt = 0;
  364. }
  365. val >>= 1;
  366. }
  367. if (bcs->cs->debug & L1_DEB_HSCX)
  368. debugl1(bcs->cs,"tiger make_raw_56k: in %ld out %d.%d",
  369. bcs->tx_skb->len, s_cnt, bitcnt);
  370. if (bitcnt) {
  371. while (8>bitcnt++) {
  372. s_val >>= 1;
  373. s_val |= 0x80;
  374. }
  375. bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
  376. bcs->hw.tiger.sendbuf[s_cnt++] = 0xff; // NJ<->NJ thoughput bug fix
  377. }
  378. bcs->hw.tiger.sendcnt = s_cnt;
  379. bcs->tx_cnt -= bcs->tx_skb->len;
  380. bcs->hw.tiger.sp = bcs->hw.tiger.sendbuf;
  381. return(0);
  382. }
  383. static void got_frame(struct BCState *bcs, int count) {
  384. struct sk_buff *skb;
  385. if (!(skb = dev_alloc_skb(count)))
  386. printk(KERN_WARNING "TIGER: receive out of memoryn");
  387. else {
  388. memcpy(skb_put(skb, count), bcs->hw.tiger.rcvbuf, count);
  389. skb_queue_tail(&bcs->rqueue, skb);
  390. }
  391. bcs->event |= 1 << B_RCVBUFREADY;
  392. queue_task(&bcs->tqueue, &tq_immediate);
  393. mark_bh(IMMEDIATE_BH);
  394. if (bcs->cs->debug & L1_DEB_RECEIVE_FRAME)
  395. printframe(bcs->cs, bcs->hw.tiger.rcvbuf, count, "rec");
  396. }
  397. static void read_raw(struct BCState *bcs, u_int *buf, int cnt){
  398. int i;
  399. register u_char j;
  400. register u_char val;
  401. u_int  *pend = bcs->hw.tiger.rec +NETJET_DMA_RXSIZE -1;
  402. register u_char state = bcs->hw.tiger.r_state;
  403. register u_char r_one = bcs->hw.tiger.r_one;
  404. register u_char r_val = bcs->hw.tiger.r_val;
  405. register u_int bitcnt = bcs->hw.tiger.r_bitcnt;
  406. u_int *p = buf;
  407. int bits;
  408. u_char mask;
  409.         if (bcs->mode == L1_MODE_HDLC) { // it's 64k
  410. mask = 0xff;
  411. bits = 8;
  412. }
  413. else { // it's 56K
  414. mask = 0x7f;
  415. bits = 7;
  416. };
  417. for (i=0;i<cnt;i++) {
  418. val = bcs->channel ? ((*p>>8) & 0xff) : (*p & 0xff);
  419. p++;
  420. if (p > pend)
  421. p = bcs->hw.tiger.rec;
  422. if ((val & mask) == mask) {
  423. state = HDLC_ZERO_SEARCH;
  424. bcs->hw.tiger.r_tot++;
  425. bitcnt = 0;
  426. r_one = 0;
  427. continue;
  428. }
  429. for (j=0;j<bits;j++) {
  430. if (state == HDLC_ZERO_SEARCH) {
  431. if (val & 1) {
  432. r_one++;
  433. } else {
  434. r_one=0;
  435. state= HDLC_FLAG_SEARCH;
  436. if (bcs->cs->debug & L1_DEB_HSCX)
  437. debugl1(bcs->cs,"tiger read_raw: zBit(%d,%d,%d) %x",
  438. bcs->hw.tiger.r_tot,i,j,val);
  439. }
  440. } else if (state == HDLC_FLAG_SEARCH) { 
  441. if (val & 1) {
  442. r_one++;
  443. if (r_one>6) {
  444. state=HDLC_ZERO_SEARCH;
  445. }
  446. } else {
  447. if (r_one==6) {
  448. bitcnt=0;
  449. r_val=0;
  450. state=HDLC_FLAG_FOUND;
  451. if (bcs->cs->debug & L1_DEB_HSCX)
  452. debugl1(bcs->cs,"tiger read_raw: flag(%d,%d,%d) %x",
  453. bcs->hw.tiger.r_tot,i,j,val);
  454. }
  455. r_one=0;
  456. }
  457. } else if (state ==  HDLC_FLAG_FOUND) {
  458. if (val & 1) {
  459. r_one++;
  460. if (r_one>6) {
  461. state=HDLC_ZERO_SEARCH;
  462. } else {
  463. r_val >>= 1;
  464. r_val |= 0x80;
  465. bitcnt++;
  466. }
  467. } else {
  468. if (r_one==6) {
  469. bitcnt=0;
  470. r_val=0;
  471. r_one=0;
  472. val >>= 1;
  473. continue;
  474. } else if (r_one!=5) {
  475. r_val >>= 1;
  476. r_val &= 0x7f;
  477. bitcnt++;
  478. }
  479. r_one=0;
  480. }
  481. if ((state != HDLC_ZERO_SEARCH) &&
  482. !(bitcnt & 7)) {
  483. state=HDLC_FRAME_FOUND;
  484. bcs->hw.tiger.r_fcs = PPP_INITFCS;
  485. bcs->hw.tiger.rcvbuf[0] = r_val;
  486. bcs->hw.tiger.r_fcs = PPP_FCS (bcs->hw.tiger.r_fcs, r_val);
  487. if (bcs->cs->debug & L1_DEB_HSCX)
  488. debugl1(bcs->cs,"tiger read_raw: byte1(%d,%d,%d) rval %x val %x i %x",
  489. bcs->hw.tiger.r_tot,i,j,r_val,val,
  490. bcs->cs->hw.njet.irqstat0);
  491. }
  492. } else if (state ==  HDLC_FRAME_FOUND) {
  493. if (val & 1) {
  494. r_one++;
  495. if (r_one>6) {
  496. state=HDLC_ZERO_SEARCH;
  497. bitcnt=0;
  498. } else {
  499. r_val >>= 1;
  500. r_val |= 0x80;
  501. bitcnt++;
  502. }
  503. } else {
  504. if (r_one==6) {
  505. r_val=0; 
  506. r_one=0;
  507. bitcnt++;
  508. if (bitcnt & 7) {
  509. debugl1(bcs->cs, "tiger: frame not byte aligned");
  510. state=HDLC_FLAG_SEARCH;
  511. bcs->hw.tiger.r_err++;
  512. #ifdef ERROR_STATISTIC
  513. bcs->err_inv++;
  514. #endif
  515. } else {
  516. if (bcs->cs->debug & L1_DEB_HSCX)
  517. debugl1(bcs->cs,"tiger frame end(%d,%d): fcs(%x) i %x",
  518. i,j,bcs->hw.tiger.r_fcs, bcs->cs->hw.njet.irqstat0);
  519. if (bcs->hw.tiger.r_fcs == PPP_GOODFCS) {
  520. got_frame(bcs, (bitcnt>>3)-3);
  521. } else {
  522. if (bcs->cs->debug) {
  523. debugl1(bcs->cs, "tiger FCS error");
  524. printframe(bcs->cs, bcs->hw.tiger.rcvbuf,
  525. (bitcnt>>3)-1, "rec");
  526. bcs->hw.tiger.r_err++;
  527. }
  528. #ifdef ERROR_STATISTIC
  529. bcs->err_crc++;
  530. #endif
  531. }
  532. state=HDLC_FLAG_FOUND;
  533. }
  534. bitcnt=0;
  535. } else if (r_one==5) {
  536. val >>= 1;
  537. r_one=0;
  538. continue;
  539. } else {
  540. r_val >>= 1;
  541. r_val &= 0x7f;
  542. bitcnt++;
  543. }
  544. r_one=0;
  545. }
  546. if ((state == HDLC_FRAME_FOUND) &&
  547. !(bitcnt & 7)) {
  548. if ((bitcnt>>3)>=HSCX_BUFMAX) {
  549. debugl1(bcs->cs, "tiger: frame too big");
  550. r_val=0; 
  551. state=HDLC_FLAG_SEARCH;
  552. bcs->hw.tiger.r_err++;
  553. #ifdef ERROR_STATISTIC
  554. bcs->err_inv++;
  555. #endif
  556. } else {
  557. bcs->hw.tiger.rcvbuf[(bitcnt>>3)-1] = r_val;
  558. bcs->hw.tiger.r_fcs = 
  559. PPP_FCS (bcs->hw.tiger.r_fcs, r_val);
  560. }
  561. }
  562. }
  563. val >>= 1;
  564. }
  565. bcs->hw.tiger.r_tot++;
  566. }
  567. bcs->hw.tiger.r_state = state;
  568. bcs->hw.tiger.r_one = r_one;
  569. bcs->hw.tiger.r_val = r_val;
  570. bcs->hw.tiger.r_bitcnt = bitcnt;
  571. }
  572. void read_tiger(struct IsdnCardState *cs) {
  573. u_int *p;
  574. int cnt = NETJET_DMA_RXSIZE/2;
  575. if ((cs->hw.njet.irqstat0 & cs->hw.njet.last_is0) & NETJET_IRQM0_READ) {
  576. debugl1(cs,"tiger warn read double dma %x/%x",
  577. cs->hw.njet.irqstat0, cs->hw.njet.last_is0);
  578. #ifdef ERROR_STATISTIC
  579. if (cs->bcs[0].mode)
  580. cs->bcs[0].err_rdo++;
  581. if (cs->bcs[1].mode)
  582. cs->bcs[1].err_rdo++;
  583. #endif
  584. return;
  585. } else {
  586. cs->hw.njet.last_is0 &= ~NETJET_IRQM0_READ;
  587. cs->hw.njet.last_is0 |= (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ);
  588. }
  589. if (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ_1)
  590. p = cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE - 1;
  591. else
  592. p = cs->bcs[0].hw.tiger.rec + cnt - 1;
  593. if ((cs->bcs[0].mode == L1_MODE_HDLC) || (cs->bcs[0].mode == L1_MODE_HDLC_56K))
  594. read_raw(cs->bcs, p, cnt);
  595. if ((cs->bcs[1].mode == L1_MODE_HDLC) || (cs->bcs[1].mode == L1_MODE_HDLC_56K))
  596. read_raw(cs->bcs + 1, p, cnt);
  597. cs->hw.njet.irqstat0 &= ~NETJET_IRQM0_READ;
  598. }
  599. static void write_raw(struct BCState *bcs, u_int *buf, int cnt);
  600. void netjet_fill_dma(struct BCState *bcs)
  601. {
  602. register u_int *p, *sp;
  603. register int cnt;
  604. if (!bcs->tx_skb)
  605. return;
  606. if (bcs->cs->debug & L1_DEB_HSCX)
  607. debugl1(bcs->cs,"tiger fill_dma1: c%d %4x", bcs->channel,
  608. bcs->Flag);
  609. if (test_and_set_bit(BC_FLG_BUSY, &bcs->Flag))
  610. return;
  611. if (bcs->mode == L1_MODE_HDLC) { // it's 64k
  612. if (make_raw_data(bcs))
  613. return;
  614. }
  615. else { // it's 56k
  616. if (make_raw_data_56k(bcs))
  617. return;
  618. };
  619. if (bcs->cs->debug & L1_DEB_HSCX)
  620. debugl1(bcs->cs,"tiger fill_dma2: c%d %4x", bcs->channel,
  621. bcs->Flag);
  622. if (test_and_clear_bit(BC_FLG_NOFRAME, &bcs->Flag)) {
  623. write_raw(bcs, bcs->hw.tiger.sendp, bcs->hw.tiger.free);
  624. } else if (test_and_clear_bit(BC_FLG_HALF, &bcs->Flag)) {
  625. p = bus_to_virt(inl(bcs->cs->hw.njet.base + NETJET_DMA_READ_ADR));
  626. sp = bcs->hw.tiger.sendp;
  627. if (p == bcs->hw.tiger.s_end)
  628. p = bcs->hw.tiger.send -1;
  629. if (sp == bcs->hw.tiger.s_end)
  630. sp = bcs->hw.tiger.send -1;
  631. cnt = p - sp;
  632. if (cnt <0) {
  633. write_raw(bcs, bcs->hw.tiger.sendp, bcs->hw.tiger.free);
  634. } else {
  635. p++;
  636. cnt++;
  637. if (p > bcs->hw.tiger.s_end)
  638. p = bcs->hw.tiger.send;
  639. p++;
  640. cnt++;
  641. if (p > bcs->hw.tiger.s_end)
  642. p = bcs->hw.tiger.send;
  643. write_raw(bcs, p, bcs->hw.tiger.free - cnt);
  644. }
  645. } else if (test_and_clear_bit(BC_FLG_EMPTY, &bcs->Flag)) {
  646. p = bus_to_virt(inl(bcs->cs->hw.njet.base + NETJET_DMA_READ_ADR));
  647. cnt = bcs->hw.tiger.s_end - p;
  648. if (cnt < 2) {
  649. p = bcs->hw.tiger.send + 1;
  650. cnt = NETJET_DMA_TXSIZE/2 - 2;
  651. } else {
  652. p++;
  653. p++;
  654. if (cnt <= (NETJET_DMA_TXSIZE/2))
  655. cnt += NETJET_DMA_TXSIZE/2;
  656. cnt--;
  657. cnt--;
  658. }
  659. write_raw(bcs, p, cnt);
  660. }
  661. if (bcs->cs->debug & L1_DEB_HSCX)
  662. debugl1(bcs->cs,"tiger fill_dma3: c%d %4x", bcs->channel,
  663. bcs->Flag);
  664. }
  665. static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
  666. u_int mask, val, *p=buf;
  667. u_int i, s_cnt;
  668.         
  669.         if (cnt <= 0)
  670.          return;
  671. if (test_bit(BC_FLG_BUSY, &bcs->Flag)) {
  672. if (bcs->hw.tiger.sendcnt> cnt) {
  673. s_cnt = cnt;
  674. bcs->hw.tiger.sendcnt -= cnt;
  675. } else {
  676. s_cnt = bcs->hw.tiger.sendcnt;
  677. bcs->hw.tiger.sendcnt = 0;
  678. }
  679. if (bcs->channel)
  680. mask = 0xffff00ff;
  681. else
  682. mask = 0xffffff00;
  683. for (i=0; i<s_cnt; i++) {
  684. val = bcs->channel ? ((bcs->hw.tiger.sp[i] <<8) & 0xff00) :
  685. (bcs->hw.tiger.sp[i]);
  686. *p   &= mask;
  687. *p++ |= val;
  688. if (p>bcs->hw.tiger.s_end)
  689. p = bcs->hw.tiger.send;
  690. }
  691. bcs->hw.tiger.s_tot += s_cnt;
  692. if (bcs->cs->debug & L1_DEB_HSCX)
  693. debugl1(bcs->cs,"tiger write_raw: c%d %x-%x %d/%d %d %x", bcs->channel,
  694. (u_int)buf, (u_int)p, s_cnt, cnt,
  695. bcs->hw.tiger.sendcnt, bcs->cs->hw.njet.irqstat0);
  696. if (bcs->cs->debug & L1_DEB_HSCX_FIFO)
  697. printframe(bcs->cs, bcs->hw.tiger.sp, s_cnt, "snd");
  698. bcs->hw.tiger.sp += s_cnt;
  699. bcs->hw.tiger.sendp = p;
  700. if (!bcs->hw.tiger.sendcnt) {
  701. if (!bcs->tx_skb) {
  702. debugl1(bcs->cs,"tiger write_raw: NULL skb s_cnt %d", s_cnt);
  703. } else {
  704. if (bcs->st->lli.l1writewakeup &&
  705. (PACKET_NOACK != bcs->tx_skb->pkt_type))
  706. bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
  707. dev_kfree_skb_any(bcs->tx_skb);
  708. bcs->tx_skb = NULL;
  709. }
  710. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  711. bcs->hw.tiger.free = cnt - s_cnt;
  712. if (bcs->hw.tiger.free > (NETJET_DMA_TXSIZE/2))
  713. test_and_set_bit(BC_FLG_HALF, &bcs->Flag);
  714. else {
  715. test_and_clear_bit(BC_FLG_HALF, &bcs->Flag);
  716. test_and_set_bit(BC_FLG_NOFRAME, &bcs->Flag);
  717. }
  718. if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
  719. netjet_fill_dma(bcs);
  720. } else {
  721. mask ^= 0xffffffff;
  722. if (s_cnt < cnt) {
  723. for (i=s_cnt; i<cnt;i++) {
  724. *p++ |= mask;
  725. if (p>bcs->hw.tiger.s_end)
  726. p = bcs->hw.tiger.send;
  727. }
  728. if (bcs->cs->debug & L1_DEB_HSCX)
  729. debugl1(bcs->cs, "tiger write_raw: fill rest %d",
  730. cnt - s_cnt);
  731. }
  732. bcs->event |= 1 << B_XMTBUFREADY;
  733. queue_task(&bcs->tqueue, &tq_immediate);
  734. mark_bh(IMMEDIATE_BH);
  735. }
  736. }
  737. } else if (test_and_clear_bit(BC_FLG_NOFRAME, &bcs->Flag)) {
  738. test_and_set_bit(BC_FLG_HALF, &bcs->Flag);
  739. fill_mem(bcs, buf, cnt, bcs->channel, 0xff);
  740. bcs->hw.tiger.free += cnt;
  741. if (bcs->cs->debug & L1_DEB_HSCX)
  742. debugl1(bcs->cs,"tiger write_raw: fill half");
  743. } else if (test_and_clear_bit(BC_FLG_HALF, &bcs->Flag)) {
  744. test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
  745. fill_mem(bcs, buf, cnt, bcs->channel, 0xff);
  746. if (bcs->cs->debug & L1_DEB_HSCX)
  747. debugl1(bcs->cs,"tiger write_raw: fill full");
  748. }
  749. }
  750. void write_tiger(struct IsdnCardState *cs) {
  751. u_int *p, cnt = NETJET_DMA_TXSIZE/2;
  752. if ((cs->hw.njet.irqstat0 & cs->hw.njet.last_is0) & NETJET_IRQM0_WRITE) {
  753. debugl1(cs,"tiger warn write double dma %x/%x",
  754. cs->hw.njet.irqstat0, cs->hw.njet.last_is0);
  755. #ifdef ERROR_STATISTIC
  756. if (cs->bcs[0].mode)
  757. cs->bcs[0].err_tx++;
  758. if (cs->bcs[1].mode)
  759. cs->bcs[1].err_tx++;
  760. #endif
  761. return;
  762. } else {
  763. cs->hw.njet.last_is0 &= ~NETJET_IRQM0_WRITE;
  764. cs->hw.njet.last_is0 |= (cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE);
  765. }
  766. if (cs->hw.njet.irqstat0  & NETJET_IRQM0_WRITE_1)
  767. p = cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE - 1;
  768. else
  769. p = cs->bcs[0].hw.tiger.send + cnt - 1;
  770. if ((cs->bcs[0].mode == L1_MODE_HDLC) || (cs->bcs[0].mode == L1_MODE_HDLC_56K))
  771. write_raw(cs->bcs, p, cnt);
  772. if ((cs->bcs[1].mode == L1_MODE_HDLC) || (cs->bcs[1].mode == L1_MODE_HDLC_56K))
  773. write_raw(cs->bcs + 1, p, cnt);
  774. cs->hw.njet.irqstat0 &= ~NETJET_IRQM0_WRITE;
  775. }
  776. static void
  777. tiger_l2l1(struct PStack *st, int pr, void *arg)
  778. {
  779. struct sk_buff *skb = arg;
  780. long flags;
  781. switch (pr) {
  782. case (PH_DATA | REQUEST):
  783. save_flags(flags);
  784. cli();
  785. if (st->l1.bcs->tx_skb) {
  786. skb_queue_tail(&st->l1.bcs->squeue, skb);
  787. restore_flags(flags);
  788. } else {
  789. st->l1.bcs->tx_skb = skb;
  790. st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  791. restore_flags(flags);
  792. }
  793. break;
  794. case (PH_PULL | INDICATION):
  795. if (st->l1.bcs->tx_skb) {
  796. printk(KERN_WARNING "tiger_l2l1: this shouldn't happenn");
  797. break;
  798. }
  799. save_flags(flags);
  800. cli();
  801. st->l1.bcs->tx_skb = skb;
  802. st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  803. restore_flags(flags);
  804. break;
  805. case (PH_PULL | REQUEST):
  806. if (!st->l1.bcs->tx_skb) {
  807. test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  808. st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
  809. } else
  810. test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  811. break;
  812. case (PH_ACTIVATE | REQUEST):
  813. test_and_set_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  814. mode_tiger(st->l1.bcs, st->l1.mode, st->l1.bc);
  815. l1_msg_b(st, pr, arg);
  816. break;
  817. case (PH_DEACTIVATE | REQUEST):
  818. l1_msg_b(st, pr, arg);
  819. break;
  820. case (PH_DEACTIVATE | CONFIRM):
  821. test_and_clear_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  822. test_and_clear_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  823. mode_tiger(st->l1.bcs, 0, st->l1.bc);
  824. st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
  825. break;
  826. }
  827. }
  828. void
  829. close_tigerstate(struct BCState *bcs)
  830. {
  831. mode_tiger(bcs, 0, bcs->channel);
  832. if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
  833. if (bcs->hw.tiger.rcvbuf) {
  834. kfree(bcs->hw.tiger.rcvbuf);
  835. bcs->hw.tiger.rcvbuf = NULL;
  836. }
  837. if (bcs->hw.tiger.sendbuf) {
  838. kfree(bcs->hw.tiger.sendbuf);
  839. bcs->hw.tiger.sendbuf = NULL;
  840. }
  841. skb_queue_purge(&bcs->rqueue);
  842. skb_queue_purge(&bcs->squeue);
  843. if (bcs->tx_skb) {
  844. dev_kfree_skb_any(bcs->tx_skb);
  845. bcs->tx_skb = NULL;
  846. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  847. }
  848. }
  849. }
  850. static int
  851. open_tigerstate(struct IsdnCardState *cs, struct BCState *bcs)
  852. {
  853. if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
  854. if (!(bcs->hw.tiger.rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
  855. printk(KERN_WARNING
  856.        "HiSax: No memory for tiger.rcvbufn");
  857. return (1);
  858. }
  859. if (!(bcs->hw.tiger.sendbuf = kmalloc(RAW_BUFMAX, GFP_ATOMIC))) {
  860. printk(KERN_WARNING
  861.        "HiSax: No memory for tiger.sendbufn");
  862. return (1);
  863. }
  864. skb_queue_head_init(&bcs->rqueue);
  865. skb_queue_head_init(&bcs->squeue);
  866. }
  867. bcs->tx_skb = NULL;
  868. bcs->hw.tiger.sendcnt = 0;
  869. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  870. bcs->event = 0;
  871. bcs->tx_cnt = 0;
  872. return (0);
  873. }
  874. int
  875. setstack_tiger(struct PStack *st, struct BCState *bcs)
  876. {
  877. bcs->channel = st->l1.bc;
  878. if (open_tigerstate(st->l1.hardware, bcs))
  879. return (-1);
  880. st->l1.bcs = bcs;
  881. st->l2.l2l1 = tiger_l2l1;
  882. setstack_manager(st);
  883. bcs->st = st;
  884. setstack_l1_B(st);
  885. return (0);
  886. }
  887.  
  888. void __init
  889. inittiger(struct IsdnCardState *cs)
  890. {
  891. if (!(cs->bcs[0].hw.tiger.send = kmalloc(NETJET_DMA_TXSIZE * sizeof(unsigned int),
  892. GFP_KERNEL | GFP_DMA))) {
  893. printk(KERN_WARNING
  894.        "HiSax: No memory for tiger.sendn");
  895. return;
  896. }
  897. cs->bcs[0].hw.tiger.s_irq = cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE/2 - 1;
  898. cs->bcs[0].hw.tiger.s_end = cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE - 1;
  899. cs->bcs[1].hw.tiger.send = cs->bcs[0].hw.tiger.send;
  900. cs->bcs[1].hw.tiger.s_irq = cs->bcs[0].hw.tiger.s_irq;
  901. cs->bcs[1].hw.tiger.s_end = cs->bcs[0].hw.tiger.s_end;
  902. memset(cs->bcs[0].hw.tiger.send, 0xff, NETJET_DMA_TXSIZE * sizeof(unsigned int));
  903. debugl1(cs, "tiger: send buf %x - %x", (u_int)cs->bcs[0].hw.tiger.send,
  904. (u_int)(cs->bcs[0].hw.tiger.send + NETJET_DMA_TXSIZE - 1));
  905. outl(virt_to_bus(cs->bcs[0].hw.tiger.send),
  906. cs->hw.njet.base + NETJET_DMA_READ_START);
  907. outl(virt_to_bus(cs->bcs[0].hw.tiger.s_irq),
  908. cs->hw.njet.base + NETJET_DMA_READ_IRQ);
  909. outl(virt_to_bus(cs->bcs[0].hw.tiger.s_end),
  910. cs->hw.njet.base + NETJET_DMA_READ_END);
  911. if (!(cs->bcs[0].hw.tiger.rec = kmalloc(NETJET_DMA_RXSIZE * sizeof(unsigned int),
  912. GFP_KERNEL | GFP_DMA))) {
  913. printk(KERN_WARNING
  914.        "HiSax: No memory for tiger.recn");
  915. return;
  916. }
  917. debugl1(cs, "tiger: rec buf %x - %x", (u_int)cs->bcs[0].hw.tiger.rec,
  918. (u_int)(cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE - 1));
  919. cs->bcs[1].hw.tiger.rec = cs->bcs[0].hw.tiger.rec;
  920. memset(cs->bcs[0].hw.tiger.rec, 0xff, NETJET_DMA_RXSIZE * sizeof(unsigned int));
  921. outl(virt_to_bus(cs->bcs[0].hw.tiger.rec),
  922. cs->hw.njet.base + NETJET_DMA_WRITE_START);
  923. outl(virt_to_bus(cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE/2 - 1),
  924. cs->hw.njet.base + NETJET_DMA_WRITE_IRQ);
  925. outl(virt_to_bus(cs->bcs[0].hw.tiger.rec + NETJET_DMA_RXSIZE - 1),
  926. cs->hw.njet.base + NETJET_DMA_WRITE_END);
  927. debugl1(cs, "tiger: dmacfg  %x/%x  pulse=%d",
  928. inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR),
  929. inl(cs->hw.njet.base + NETJET_DMA_READ_ADR),
  930. bytein(cs->hw.njet.base + NETJET_PULSE_CNT));
  931. cs->hw.njet.last_is0 = 0;
  932. cs->bcs[0].BC_SetStack = setstack_tiger;
  933. cs->bcs[1].BC_SetStack = setstack_tiger;
  934. cs->bcs[0].BC_Close = close_tigerstate;
  935. cs->bcs[1].BC_Close = close_tigerstate;
  936. }
  937. void
  938. releasetiger(struct IsdnCardState *cs)
  939. {
  940. if (cs->bcs[0].hw.tiger.send) {
  941. kfree(cs->bcs[0].hw.tiger.send);
  942. cs->bcs[0].hw.tiger.send = NULL;
  943. }
  944. if (cs->bcs[1].hw.tiger.send) {
  945. cs->bcs[1].hw.tiger.send = NULL;
  946. }
  947. if (cs->bcs[0].hw.tiger.rec) {
  948. kfree(cs->bcs[0].hw.tiger.rec);
  949. cs->bcs[0].hw.tiger.rec = NULL;
  950. }
  951. if (cs->bcs[1].hw.tiger.rec) {
  952. cs->bcs[1].hw.tiger.rec = NULL;
  953. }
  954. }
  955. void
  956. release_io_netjet(struct IsdnCardState *cs)
  957. {
  958. byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
  959. byteout(cs->hw.njet.base + NETJET_IRQMASK1, 0);
  960. releasetiger(cs);
  961. release_region(cs->hw.njet.base, 256);
  962. }