b1dma.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993
  1. /* $Id: b1dma.c,v 1.1.2.3 2004/02/10 01:07:12 keil Exp $
  2. *
  3. * Common module for AVM B1 cards that support dma with AMCC
  4. *
  5. * Copyright 2000 by Carsten Paeth <calle@calle.de>
  6. *
  7. * This software may be used and distributed according to the terms
  8. * of the GNU General Public License, incorporated herein by reference.
  9. *
  10. */
  11. #include <linux/module.h>
  12. #include <linux/kernel.h>
  13. #include <linux/proc_fs.h>
  14. #include <linux/seq_file.h>
  15. #include <linux/skbuff.h>
  16. #include <linux/delay.h>
  17. #include <linux/mm.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/ioport.h>
  20. #include <linux/capi.h>
  21. #include <linux/kernelcapi.h>
  22. #include <asm/io.h>
  23. #include <linux/init.h>
  24. #include <asm/uaccess.h>
  25. #include <linux/netdevice.h>
  26. #include <linux/isdn/capilli.h>
  27. #include "avmcard.h"
  28. #include <linux/isdn/capicmd.h>
  29. #include <linux/isdn/capiutil.h>
  30. static char *revision = "$Revision: 1.1.2.3 $";
  31. #undef AVM_B1DMA_DEBUG
  32. /* ------------------------------------------------------------- */
  33. MODULE_DESCRIPTION("CAPI4Linux: DMA support for active AVM cards");
  34. MODULE_AUTHOR("Carsten Paeth");
  35. MODULE_LICENSE("GPL");
  36. static int suppress_pollack = 0;
  37. module_param(suppress_pollack, bool, 0);
  38. /* ------------------------------------------------------------- */
  39. static void b1dma_dispatch_tx(avmcard *card);
  40. /* ------------------------------------------------------------- */
  41. /* S5933 */
  42. #define AMCC_RXPTR 0x24
  43. #define AMCC_RXLEN 0x28
  44. #define AMCC_TXPTR 0x2c
  45. #define AMCC_TXLEN 0x30
  46. #define AMCC_INTCSR 0x38
  47. # define EN_READ_TC_INT 0x00008000L
  48. # define EN_WRITE_TC_INT 0x00004000L
  49. # define EN_TX_TC_INT EN_READ_TC_INT
  50. # define EN_RX_TC_INT EN_WRITE_TC_INT
  51. # define AVM_FLAG 0x30000000L
  52. # define ANY_S5933_INT 0x00800000L
  53. # define READ_TC_INT 0x00080000L
  54. # define WRITE_TC_INT 0x00040000L
  55. # define TX_TC_INT READ_TC_INT
  56. # define RX_TC_INT WRITE_TC_INT
  57. # define MASTER_ABORT_INT 0x00100000L
  58. # define TARGET_ABORT_INT 0x00200000L
  59. # define BUS_MASTER_INT 0x00200000L
  60. # define ALL_INT 0x000C0000L
  61. #define AMCC_MCSR 0x3c
  62. # define A2P_HI_PRIORITY 0x00000100L
  63. # define EN_A2P_TRANSFERS 0x00000400L
  64. # define P2A_HI_PRIORITY 0x00001000L
  65. # define EN_P2A_TRANSFERS 0x00004000L
  66. # define RESET_A2P_FLAGS 0x04000000L
  67. # define RESET_P2A_FLAGS 0x02000000L
  68. /* ------------------------------------------------------------- */
  69. static inline void b1dma_writel(avmcard *card, u32 value, int off)
  70. {
  71. writel(value, card->mbase + off);
  72. }
  73. static inline u32 b1dma_readl(avmcard *card, int off)
  74. {
  75. return readl(card->mbase + off);
  76. }
  77. /* ------------------------------------------------------------- */
  78. static inline int b1dma_tx_empty(unsigned int port)
  79. {
  80. return inb(port + 0x03) & 0x1;
  81. }
  82. static inline int b1dma_rx_full(unsigned int port)
  83. {
  84. return inb(port + 0x02) & 0x1;
  85. }
  86. static int b1dma_tolink(avmcard *card, void *buf, unsigned int len)
  87. {
  88. unsigned long stop = jiffies + 1 * HZ; /* maximum wait time 1 sec */
  89. unsigned char *s = (unsigned char *)buf;
  90. while (len--) {
  91. while ( !b1dma_tx_empty(card->port)
  92. && time_before(jiffies, stop));
  93. if (!b1dma_tx_empty(card->port))
  94. return -1;
  95. t1outp(card->port, 0x01, *s++);
  96. }
  97. return 0;
  98. }
  99. static int b1dma_fromlink(avmcard *card, void *buf, unsigned int len)
  100. {
  101. unsigned long stop = jiffies + 1 * HZ; /* maximum wait time 1 sec */
  102. unsigned char *s = (unsigned char *)buf;
  103. while (len--) {
  104. while ( !b1dma_rx_full(card->port)
  105. && time_before(jiffies, stop));
  106. if (!b1dma_rx_full(card->port))
  107. return -1;
  108. *s++ = t1inp(card->port, 0x00);
  109. }
  110. return 0;
  111. }
  112. static int WriteReg(avmcard *card, u32 reg, u8 val)
  113. {
  114. u8 cmd = 0x00;
  115. if ( b1dma_tolink(card, &cmd, 1) == 0
  116. && b1dma_tolink(card, &reg, 4) == 0) {
  117. u32 tmp = val;
  118. return b1dma_tolink(card, &tmp, 4);
  119. }
  120. return -1;
  121. }
  122. static u8 ReadReg(avmcard *card, u32 reg)
  123. {
  124. u8 cmd = 0x01;
  125. if ( b1dma_tolink(card, &cmd, 1) == 0
  126. && b1dma_tolink(card, &reg, 4) == 0) {
  127. u32 tmp;
  128. if (b1dma_fromlink(card, &tmp, 4) == 0)
  129. return (u8)tmp;
  130. }
  131. return 0xff;
  132. }
  133. /* ------------------------------------------------------------- */
  134. static inline void _put_byte(void **pp, u8 val)
  135. {
  136. u8 *s = *pp;
  137. *s++ = val;
  138. *pp = s;
  139. }
  140. static inline void _put_word(void **pp, u32 val)
  141. {
  142. u8 *s = *pp;
  143. *s++ = val & 0xff;
  144. *s++ = (val >> 8) & 0xff;
  145. *s++ = (val >> 16) & 0xff;
  146. *s++ = (val >> 24) & 0xff;
  147. *pp = s;
  148. }
  149. static inline void _put_slice(void **pp, unsigned char *dp, unsigned int len)
  150. {
  151. unsigned i = len;
  152. _put_word(pp, i);
  153. while (i-- > 0)
  154. _put_byte(pp, *dp++);
  155. }
  156. static inline u8 _get_byte(void **pp)
  157. {
  158. u8 *s = *pp;
  159. u8 val;
  160. val = *s++;
  161. *pp = s;
  162. return val;
  163. }
  164. static inline u32 _get_word(void **pp)
  165. {
  166. u8 *s = *pp;
  167. u32 val;
  168. val = *s++;
  169. val |= (*s++ << 8);
  170. val |= (*s++ << 16);
  171. val |= (*s++ << 24);
  172. *pp = s;
  173. return val;
  174. }
  175. static inline u32 _get_slice(void **pp, unsigned char *dp)
  176. {
  177. unsigned int len, i;
  178. len = i = _get_word(pp);
  179. while (i-- > 0) *dp++ = _get_byte(pp);
  180. return len;
  181. }
  182. /* ------------------------------------------------------------- */
  183. void b1dma_reset(avmcard *card)
  184. {
  185. card->csr = 0x0;
  186. b1dma_writel(card, card->csr, AMCC_INTCSR);
  187. b1dma_writel(card, 0, AMCC_MCSR);
  188. b1dma_writel(card, 0, AMCC_RXLEN);
  189. b1dma_writel(card, 0, AMCC_TXLEN);
  190. t1outp(card->port, 0x10, 0x00);
  191. t1outp(card->port, 0x07, 0x00);
  192. b1dma_writel(card, 0, AMCC_MCSR);
  193. mdelay(10);
  194. b1dma_writel(card, 0x0f000000, AMCC_MCSR); /* reset all */
  195. mdelay(10);
  196. b1dma_writel(card, 0, AMCC_MCSR);
  197. if (card->cardtype == avm_t1pci)
  198. mdelay(42);
  199. else
  200. mdelay(10);
  201. }
  202. /* ------------------------------------------------------------- */
  203. static int b1dma_detect(avmcard *card)
  204. {
  205. b1dma_writel(card, 0, AMCC_MCSR);
  206. mdelay(10);
  207. b1dma_writel(card, 0x0f000000, AMCC_MCSR); /* reset all */
  208. mdelay(10);
  209. b1dma_writel(card, 0, AMCC_MCSR);
  210. mdelay(42);
  211. b1dma_writel(card, 0, AMCC_RXLEN);
  212. b1dma_writel(card, 0, AMCC_TXLEN);
  213. card->csr = 0x0;
  214. b1dma_writel(card, card->csr, AMCC_INTCSR);
  215. if (b1dma_readl(card, AMCC_MCSR) != 0x000000E6)
  216. return 1;
  217. b1dma_writel(card, 0xffffffff, AMCC_RXPTR);
  218. b1dma_writel(card, 0xffffffff, AMCC_TXPTR);
  219. if ( b1dma_readl(card, AMCC_RXPTR) != 0xfffffffc
  220. || b1dma_readl(card, AMCC_TXPTR) != 0xfffffffc)
  221. return 2;
  222. b1dma_writel(card, 0x0, AMCC_RXPTR);
  223. b1dma_writel(card, 0x0, AMCC_TXPTR);
  224. if ( b1dma_readl(card, AMCC_RXPTR) != 0x0
  225. || b1dma_readl(card, AMCC_TXPTR) != 0x0)
  226. return 3;
  227. t1outp(card->port, 0x10, 0x00);
  228. t1outp(card->port, 0x07, 0x00);
  229. t1outp(card->port, 0x02, 0x02);
  230. t1outp(card->port, 0x03, 0x02);
  231. if ( (t1inp(card->port, 0x02) & 0xFE) != 0x02
  232. || t1inp(card->port, 0x3) != 0x03)
  233. return 4;
  234. t1outp(card->port, 0x02, 0x00);
  235. t1outp(card->port, 0x03, 0x00);
  236. if ( (t1inp(card->port, 0x02) & 0xFE) != 0x00
  237. || t1inp(card->port, 0x3) != 0x01)
  238. return 5;
  239. return 0;
  240. }
  241. int t1pci_detect(avmcard *card)
  242. {
  243. int ret;
  244. if ((ret = b1dma_detect(card)) != 0)
  245. return ret;
  246. /* Transputer test */
  247. if ( WriteReg(card, 0x80001000, 0x11) != 0
  248. || WriteReg(card, 0x80101000, 0x22) != 0
  249. || WriteReg(card, 0x80201000, 0x33) != 0
  250. || WriteReg(card, 0x80301000, 0x44) != 0)
  251. return 6;
  252. if ( ReadReg(card, 0x80001000) != 0x11
  253. || ReadReg(card, 0x80101000) != 0x22
  254. || ReadReg(card, 0x80201000) != 0x33
  255. || ReadReg(card, 0x80301000) != 0x44)
  256. return 7;
  257. if ( WriteReg(card, 0x80001000, 0x55) != 0
  258. || WriteReg(card, 0x80101000, 0x66) != 0
  259. || WriteReg(card, 0x80201000, 0x77) != 0
  260. || WriteReg(card, 0x80301000, 0x88) != 0)
  261. return 8;
  262. if ( ReadReg(card, 0x80001000) != 0x55
  263. || ReadReg(card, 0x80101000) != 0x66
  264. || ReadReg(card, 0x80201000) != 0x77
  265. || ReadReg(card, 0x80301000) != 0x88)
  266. return 9;
  267. return 0;
  268. }
  269. int b1pciv4_detect(avmcard *card)
  270. {
  271. int ret, i;
  272. if ((ret = b1dma_detect(card)) != 0)
  273. return ret;
  274. for (i=0; i < 5 ; i++) {
  275. if (WriteReg(card, 0x80A00000, 0x21) != 0)
  276. return 6;
  277. if ((ReadReg(card, 0x80A00000) & 0x01) != 0x01)
  278. return 7;
  279. }
  280. for (i=0; i < 5 ; i++) {
  281. if (WriteReg(card, 0x80A00000, 0x20) != 0)
  282. return 8;
  283. if ((ReadReg(card, 0x80A00000) & 0x01) != 0x00)
  284. return 9;
  285. }
  286. return 0;
  287. }
  288. static void b1dma_queue_tx(avmcard *card, struct sk_buff *skb)
  289. {
  290. unsigned long flags;
  291. spin_lock_irqsave(&card->lock, flags);
  292. skb_queue_tail(&card->dma->send_queue, skb);
  293. if (!(card->csr & EN_TX_TC_INT)) {
  294. b1dma_dispatch_tx(card);
  295. b1dma_writel(card, card->csr, AMCC_INTCSR);
  296. }
  297. spin_unlock_irqrestore(&card->lock, flags);
  298. }
  299. /* ------------------------------------------------------------- */
  300. static void b1dma_dispatch_tx(avmcard *card)
  301. {
  302. avmcard_dmainfo *dma = card->dma;
  303. struct sk_buff *skb;
  304. u8 cmd, subcmd;
  305. u16 len;
  306. u32 txlen;
  307. void *p;
  308. skb = skb_dequeue(&dma->send_queue);
  309. len = CAPIMSG_LEN(skb->data);
  310. if (len) {
  311. cmd = CAPIMSG_COMMAND(skb->data);
  312. subcmd = CAPIMSG_SUBCOMMAND(skb->data);
  313. p = dma->sendbuf.dmabuf;
  314. if (CAPICMD(cmd, subcmd) == CAPI_DATA_B3_REQ) {
  315. u16 dlen = CAPIMSG_DATALEN(skb->data);
  316. _put_byte(&p, SEND_DATA_B3_REQ);
  317. _put_slice(&p, skb->data, len);
  318. _put_slice(&p, skb->data + len, dlen);
  319. } else {
  320. _put_byte(&p, SEND_MESSAGE);
  321. _put_slice(&p, skb->data, len);
  322. }
  323. txlen = (u8 *)p - (u8 *)dma->sendbuf.dmabuf;
  324. #ifdef AVM_B1DMA_DEBUG
  325. printk(KERN_DEBUG "tx: put msg len=%d\n", txlen);
  326. #endif
  327. } else {
  328. txlen = skb->len-2;
  329. #ifdef AVM_B1DMA_POLLDEBUG
  330. if (skb->data[2] == SEND_POLLACK)
  331. printk(KERN_INFO "%s: send ack\n", card->name);
  332. #endif
  333. #ifdef AVM_B1DMA_DEBUG
  334. printk(KERN_DEBUG "tx: put 0x%x len=%d\n",
  335. skb->data[2], txlen);
  336. #endif
  337. skb_copy_from_linear_data_offset(skb, 2, dma->sendbuf.dmabuf,
  338. skb->len - 2);
  339. }
  340. txlen = (txlen + 3) & ~3;
  341. b1dma_writel(card, dma->sendbuf.dmaaddr, AMCC_TXPTR);
  342. b1dma_writel(card, txlen, AMCC_TXLEN);
  343. card->csr |= EN_TX_TC_INT;
  344. dev_kfree_skb_any(skb);
  345. }
  346. /* ------------------------------------------------------------- */
  347. static void queue_pollack(avmcard *card)
  348. {
  349. struct sk_buff *skb;
  350. void *p;
  351. skb = alloc_skb(3, GFP_ATOMIC);
  352. if (!skb) {
  353. printk(KERN_CRIT "%s: no memory, lost poll ack\n",
  354. card->name);
  355. return;
  356. }
  357. p = skb->data;
  358. _put_byte(&p, 0);
  359. _put_byte(&p, 0);
  360. _put_byte(&p, SEND_POLLACK);
  361. skb_put(skb, (u8 *)p - (u8 *)skb->data);
  362. b1dma_queue_tx(card, skb);
  363. }
  364. /* ------------------------------------------------------------- */
  365. static void b1dma_handle_rx(avmcard *card)
  366. {
  367. avmctrl_info *cinfo = &card->ctrlinfo[0];
  368. avmcard_dmainfo *dma = card->dma;
  369. struct capi_ctr *ctrl = &cinfo->capi_ctrl;
  370. struct sk_buff *skb;
  371. void *p = dma->recvbuf.dmabuf+4;
  372. u32 ApplId, MsgLen, DataB3Len, NCCI, WindowSize;
  373. u8 b1cmd = _get_byte(&p);
  374. #ifdef AVM_B1DMA_DEBUG
  375. printk(KERN_DEBUG "rx: 0x%x %lu\n", b1cmd, (unsigned long)dma->recvlen);
  376. #endif
  377. switch (b1cmd) {
  378. case RECEIVE_DATA_B3_IND:
  379. ApplId = (unsigned) _get_word(&p);
  380. MsgLen = _get_slice(&p, card->msgbuf);
  381. DataB3Len = _get_slice(&p, card->databuf);
  382. if (MsgLen < 30) { /* not CAPI 64Bit */
  383. memset(card->msgbuf+MsgLen, 0, 30-MsgLen);
  384. MsgLen = 30;
  385. CAPIMSG_SETLEN(card->msgbuf, 30);
  386. }
  387. if (!(skb = alloc_skb(DataB3Len+MsgLen, GFP_ATOMIC))) {
  388. printk(KERN_ERR "%s: incoming packet dropped\n",
  389. card->name);
  390. } else {
  391. memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
  392. memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);
  393. capi_ctr_handle_message(ctrl, ApplId, skb);
  394. }
  395. break;
  396. case RECEIVE_MESSAGE:
  397. ApplId = (unsigned) _get_word(&p);
  398. MsgLen = _get_slice(&p, card->msgbuf);
  399. if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
  400. printk(KERN_ERR "%s: incoming packet dropped\n",
  401. card->name);
  402. } else {
  403. memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
  404. if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_CONF) {
  405. spin_lock(&card->lock);
  406. capilib_data_b3_conf(&cinfo->ncci_head, ApplId,
  407. CAPIMSG_NCCI(skb->data),
  408. CAPIMSG_MSGID(skb->data));
  409. spin_unlock(&card->lock);
  410. }
  411. capi_ctr_handle_message(ctrl, ApplId, skb);
  412. }
  413. break;
  414. case RECEIVE_NEW_NCCI:
  415. ApplId = _get_word(&p);
  416. NCCI = _get_word(&p);
  417. WindowSize = _get_word(&p);
  418. spin_lock(&card->lock);
  419. capilib_new_ncci(&cinfo->ncci_head, ApplId, NCCI, WindowSize);
  420. spin_unlock(&card->lock);
  421. break;
  422. case RECEIVE_FREE_NCCI:
  423. ApplId = _get_word(&p);
  424. NCCI = _get_word(&p);
  425. if (NCCI != 0xffffffff) {
  426. spin_lock(&card->lock);
  427. capilib_free_ncci(&cinfo->ncci_head, ApplId, NCCI);
  428. spin_unlock(&card->lock);
  429. }
  430. break;
  431. case RECEIVE_START:
  432. #ifdef AVM_B1DMA_POLLDEBUG
  433. printk(KERN_INFO "%s: receive poll\n", card->name);
  434. #endif
  435. if (!suppress_pollack)
  436. queue_pollack(card);
  437. capi_ctr_resume_output(ctrl);
  438. break;
  439. case RECEIVE_STOP:
  440. capi_ctr_suspend_output(ctrl);
  441. break;
  442. case RECEIVE_INIT:
  443. cinfo->versionlen = _get_slice(&p, cinfo->versionbuf);
  444. b1_parse_version(cinfo);
  445. printk(KERN_INFO "%s: %s-card (%s) now active\n",
  446. card->name,
  447. cinfo->version[VER_CARDTYPE],
  448. cinfo->version[VER_DRIVER]);
  449. capi_ctr_ready(ctrl);
  450. break;
  451. case RECEIVE_TASK_READY:
  452. ApplId = (unsigned) _get_word(&p);
  453. MsgLen = _get_slice(&p, card->msgbuf);
  454. card->msgbuf[MsgLen] = 0;
  455. while ( MsgLen > 0
  456. && ( card->msgbuf[MsgLen-1] == '\n'
  457. || card->msgbuf[MsgLen-1] == '\r')) {
  458. card->msgbuf[MsgLen-1] = 0;
  459. MsgLen--;
  460. }
  461. printk(KERN_INFO "%s: task %d \"%s\" ready.\n",
  462. card->name, ApplId, card->msgbuf);
  463. break;
  464. case RECEIVE_DEBUGMSG:
  465. MsgLen = _get_slice(&p, card->msgbuf);
  466. card->msgbuf[MsgLen] = 0;
  467. while ( MsgLen > 0
  468. && ( card->msgbuf[MsgLen-1] == '\n'
  469. || card->msgbuf[MsgLen-1] == '\r')) {
  470. card->msgbuf[MsgLen-1] = 0;
  471. MsgLen--;
  472. }
  473. printk(KERN_INFO "%s: DEBUG: %s\n", card->name, card->msgbuf);
  474. break;
  475. default:
  476. printk(KERN_ERR "%s: b1dma_interrupt: 0x%x ???\n",
  477. card->name, b1cmd);
  478. return;
  479. }
  480. }
  481. /* ------------------------------------------------------------- */
  482. static void b1dma_handle_interrupt(avmcard *card)
  483. {
  484. u32 status;
  485. u32 newcsr;
  486. spin_lock(&card->lock);
  487. status = b1dma_readl(card, AMCC_INTCSR);
  488. if ((status & ANY_S5933_INT) == 0) {
  489. spin_unlock(&card->lock);
  490. return;
  491. }
  492. newcsr = card->csr | (status & ALL_INT);
  493. if (status & TX_TC_INT) newcsr &= ~EN_TX_TC_INT;
  494. if (status & RX_TC_INT) newcsr &= ~EN_RX_TC_INT;
  495. b1dma_writel(card, newcsr, AMCC_INTCSR);
  496. if ((status & RX_TC_INT) != 0) {
  497. struct avmcard_dmainfo *dma = card->dma;
  498. u32 rxlen;
  499. if (card->dma->recvlen == 0) {
  500. rxlen = b1dma_readl(card, AMCC_RXLEN);
  501. if (rxlen == 0) {
  502. dma->recvlen = *((u32 *)dma->recvbuf.dmabuf);
  503. rxlen = (dma->recvlen + 3) & ~3;
  504. b1dma_writel(card, dma->recvbuf.dmaaddr+4, AMCC_RXPTR);
  505. b1dma_writel(card, rxlen, AMCC_RXLEN);
  506. #ifdef AVM_B1DMA_DEBUG
  507. } else {
  508. printk(KERN_ERR "%s: rx not complete (%d).\n",
  509. card->name, rxlen);
  510. #endif
  511. }
  512. } else {
  513. spin_unlock(&card->lock);
  514. b1dma_handle_rx(card);
  515. dma->recvlen = 0;
  516. spin_lock(&card->lock);
  517. b1dma_writel(card, dma->recvbuf.dmaaddr, AMCC_RXPTR);
  518. b1dma_writel(card, 4, AMCC_RXLEN);
  519. }
  520. }
  521. if ((status & TX_TC_INT) != 0) {
  522. if (skb_queue_empty(&card->dma->send_queue))
  523. card->csr &= ~EN_TX_TC_INT;
  524. else
  525. b1dma_dispatch_tx(card);
  526. }
  527. b1dma_writel(card, card->csr, AMCC_INTCSR);
  528. spin_unlock(&card->lock);
  529. }
  530. irqreturn_t b1dma_interrupt(int interrupt, void *devptr)
  531. {
  532. avmcard *card = devptr;
  533. b1dma_handle_interrupt(card);
  534. return IRQ_HANDLED;
  535. }
  536. /* ------------------------------------------------------------- */
  537. static int b1dma_loaded(avmcard *card)
  538. {
  539. unsigned long stop;
  540. unsigned char ans;
  541. unsigned long tout = 2;
  542. unsigned int base = card->port;
  543. for (stop = jiffies + tout * HZ; time_before(jiffies, stop);) {
  544. if (b1_tx_empty(base))
  545. break;
  546. }
  547. if (!b1_tx_empty(base)) {
  548. printk(KERN_ERR "%s: b1dma_loaded: tx err, corrupted t4 file ?\n",
  549. card->name);
  550. return 0;
  551. }
  552. b1_put_byte(base, SEND_POLLACK);
  553. for (stop = jiffies + tout * HZ; time_before(jiffies, stop);) {
  554. if (b1_rx_full(base)) {
  555. if ((ans = b1_get_byte(base)) == RECEIVE_POLLDWORD) {
  556. return 1;
  557. }
  558. printk(KERN_ERR "%s: b1dma_loaded: got 0x%x, firmware not running in dword mode\n", card->name, ans);
  559. return 0;
  560. }
  561. }
  562. printk(KERN_ERR "%s: b1dma_loaded: firmware not running\n", card->name);
  563. return 0;
  564. }
  565. /* ------------------------------------------------------------- */
  566. static void b1dma_send_init(avmcard *card)
  567. {
  568. struct sk_buff *skb;
  569. void *p;
  570. skb = alloc_skb(15, GFP_ATOMIC);
  571. if (!skb) {
  572. printk(KERN_CRIT "%s: no memory, lost register appl.\n",
  573. card->name);
  574. return;
  575. }
  576. p = skb->data;
  577. _put_byte(&p, 0);
  578. _put_byte(&p, 0);
  579. _put_byte(&p, SEND_INIT);
  580. _put_word(&p, CAPI_MAXAPPL);
  581. _put_word(&p, AVM_NCCI_PER_CHANNEL*30);
  582. _put_word(&p, card->cardnr - 1);
  583. skb_put(skb, (u8 *)p - (u8 *)skb->data);
  584. b1dma_queue_tx(card, skb);
  585. }
  586. int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
  587. {
  588. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  589. avmcard *card = cinfo->card;
  590. int retval;
  591. b1dma_reset(card);
  592. if ((retval = b1_load_t4file(card, &data->firmware))) {
  593. b1dma_reset(card);
  594. printk(KERN_ERR "%s: failed to load t4file!!\n",
  595. card->name);
  596. return retval;
  597. }
  598. if (data->configuration.len > 0 && data->configuration.data) {
  599. if ((retval = b1_load_config(card, &data->configuration))) {
  600. b1dma_reset(card);
  601. printk(KERN_ERR "%s: failed to load config!!\n",
  602. card->name);
  603. return retval;
  604. }
  605. }
  606. if (!b1dma_loaded(card)) {
  607. b1dma_reset(card);
  608. printk(KERN_ERR "%s: failed to load t4file.\n", card->name);
  609. return -EIO;
  610. }
  611. card->csr = AVM_FLAG;
  612. b1dma_writel(card, card->csr, AMCC_INTCSR);
  613. b1dma_writel(card, EN_A2P_TRANSFERS|EN_P2A_TRANSFERS|A2P_HI_PRIORITY|
  614. P2A_HI_PRIORITY|RESET_A2P_FLAGS|RESET_P2A_FLAGS,
  615. AMCC_MCSR);
  616. t1outp(card->port, 0x07, 0x30);
  617. t1outp(card->port, 0x10, 0xF0);
  618. card->dma->recvlen = 0;
  619. b1dma_writel(card, card->dma->recvbuf.dmaaddr, AMCC_RXPTR);
  620. b1dma_writel(card, 4, AMCC_RXLEN);
  621. card->csr |= EN_RX_TC_INT;
  622. b1dma_writel(card, card->csr, AMCC_INTCSR);
  623. b1dma_send_init(card);
  624. return 0;
  625. }
  626. void b1dma_reset_ctr(struct capi_ctr *ctrl)
  627. {
  628. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  629. avmcard *card = cinfo->card;
  630. unsigned long flags;
  631. spin_lock_irqsave(&card->lock, flags);
  632. b1dma_reset(card);
  633. memset(cinfo->version, 0, sizeof(cinfo->version));
  634. capilib_release(&cinfo->ncci_head);
  635. spin_unlock_irqrestore(&card->lock, flags);
  636. capi_ctr_down(ctrl);
  637. }
  638. /* ------------------------------------------------------------- */
  639. void b1dma_register_appl(struct capi_ctr *ctrl,
  640. u16 appl,
  641. capi_register_params *rp)
  642. {
  643. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  644. avmcard *card = cinfo->card;
  645. struct sk_buff *skb;
  646. int want = rp->level3cnt;
  647. int nconn;
  648. void *p;
  649. if (want > 0) nconn = want;
  650. else nconn = ctrl->profile.nbchannel * -want;
  651. if (nconn == 0) nconn = ctrl->profile.nbchannel;
  652. skb = alloc_skb(23, GFP_ATOMIC);
  653. if (!skb) {
  654. printk(KERN_CRIT "%s: no memory, lost register appl.\n",
  655. card->name);
  656. return;
  657. }
  658. p = skb->data;
  659. _put_byte(&p, 0);
  660. _put_byte(&p, 0);
  661. _put_byte(&p, SEND_REGISTER);
  662. _put_word(&p, appl);
  663. _put_word(&p, 1024 * (nconn+1));
  664. _put_word(&p, nconn);
  665. _put_word(&p, rp->datablkcnt);
  666. _put_word(&p, rp->datablklen);
  667. skb_put(skb, (u8 *)p - (u8 *)skb->data);
  668. b1dma_queue_tx(card, skb);
  669. }
  670. /* ------------------------------------------------------------- */
  671. void b1dma_release_appl(struct capi_ctr *ctrl, u16 appl)
  672. {
  673. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  674. avmcard *card = cinfo->card;
  675. struct sk_buff *skb;
  676. void *p;
  677. unsigned long flags;
  678. spin_lock_irqsave(&card->lock, flags);
  679. capilib_release_appl(&cinfo->ncci_head, appl);
  680. spin_unlock_irqrestore(&card->lock, flags);
  681. skb = alloc_skb(7, GFP_ATOMIC);
  682. if (!skb) {
  683. printk(KERN_CRIT "%s: no memory, lost release appl.\n",
  684. card->name);
  685. return;
  686. }
  687. p = skb->data;
  688. _put_byte(&p, 0);
  689. _put_byte(&p, 0);
  690. _put_byte(&p, SEND_RELEASE);
  691. _put_word(&p, appl);
  692. skb_put(skb, (u8 *)p - (u8 *)skb->data);
  693. b1dma_queue_tx(card, skb);
  694. }
  695. /* ------------------------------------------------------------- */
  696. u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
  697. {
  698. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  699. avmcard *card = cinfo->card;
  700. u16 retval = CAPI_NOERROR;
  701. if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {
  702. unsigned long flags;
  703. spin_lock_irqsave(&card->lock, flags);
  704. retval = capilib_data_b3_req(&cinfo->ncci_head,
  705. CAPIMSG_APPID(skb->data),
  706. CAPIMSG_NCCI(skb->data),
  707. CAPIMSG_MSGID(skb->data));
  708. spin_unlock_irqrestore(&card->lock, flags);
  709. }
  710. if (retval == CAPI_NOERROR)
  711. b1dma_queue_tx(card, skb);
  712. return retval;
  713. }
  714. /* ------------------------------------------------------------- */
  715. static int b1dmactl_proc_show(struct seq_file *m, void *v)
  716. {
  717. struct capi_ctr *ctrl = m->private;
  718. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  719. avmcard *card = cinfo->card;
  720. u8 flag;
  721. char *s;
  722. u32 txoff, txlen, rxoff, rxlen, csr;
  723. unsigned long flags;
  724. seq_printf(m, "%-16s %s\n", "name", card->name);
  725. seq_printf(m, "%-16s 0x%x\n", "io", card->port);
  726. seq_printf(m, "%-16s %d\n", "irq", card->irq);
  727. seq_printf(m, "%-16s 0x%lx\n", "membase", card->membase);
  728. switch (card->cardtype) {
  729. case avm_b1isa: s = "B1 ISA"; break;
  730. case avm_b1pci: s = "B1 PCI"; break;
  731. case avm_b1pcmcia: s = "B1 PCMCIA"; break;
  732. case avm_m1: s = "M1"; break;
  733. case avm_m2: s = "M2"; break;
  734. case avm_t1isa: s = "T1 ISA (HEMA)"; break;
  735. case avm_t1pci: s = "T1 PCI"; break;
  736. case avm_c4: s = "C4"; break;
  737. case avm_c2: s = "C2"; break;
  738. default: s = "???"; break;
  739. }
  740. seq_printf(m, "%-16s %s\n", "type", s);
  741. if ((s = cinfo->version[VER_DRIVER]) != NULL)
  742. seq_printf(m, "%-16s %s\n", "ver_driver", s);
  743. if ((s = cinfo->version[VER_CARDTYPE]) != NULL)
  744. seq_printf(m, "%-16s %s\n", "ver_cardtype", s);
  745. if ((s = cinfo->version[VER_SERIAL]) != NULL)
  746. seq_printf(m, "%-16s %s\n", "ver_serial", s);
  747. if (card->cardtype != avm_m1) {
  748. flag = ((u8 *)(ctrl->profile.manu))[3];
  749. if (flag)
  750. seq_printf(m, "%-16s%s%s%s%s%s%s%s\n",
  751. "protocol",
  752. (flag & 0x01) ? " DSS1" : "",
  753. (flag & 0x02) ? " CT1" : "",
  754. (flag & 0x04) ? " VN3" : "",
  755. (flag & 0x08) ? " NI1" : "",
  756. (flag & 0x10) ? " AUSTEL" : "",
  757. (flag & 0x20) ? " ESS" : "",
  758. (flag & 0x40) ? " 1TR6" : ""
  759. );
  760. }
  761. if (card->cardtype != avm_m1) {
  762. flag = ((u8 *)(ctrl->profile.manu))[5];
  763. if (flag)
  764. seq_printf(m, "%-16s%s%s%s%s\n",
  765. "linetype",
  766. (flag & 0x01) ? " point to point" : "",
  767. (flag & 0x02) ? " point to multipoint" : "",
  768. (flag & 0x08) ? " leased line without D-channel" : "",
  769. (flag & 0x04) ? " leased line with D-channel" : ""
  770. );
  771. }
  772. seq_printf(m, "%-16s %s\n", "cardname", cinfo->cardname);
  773. spin_lock_irqsave(&card->lock, flags);
  774. txoff = (dma_addr_t)b1dma_readl(card, AMCC_TXPTR)-card->dma->sendbuf.dmaaddr;
  775. txlen = b1dma_readl(card, AMCC_TXLEN);
  776. rxoff = (dma_addr_t)b1dma_readl(card, AMCC_RXPTR)-card->dma->recvbuf.dmaaddr;
  777. rxlen = b1dma_readl(card, AMCC_RXLEN);
  778. csr = b1dma_readl(card, AMCC_INTCSR);
  779. spin_unlock_irqrestore(&card->lock, flags);
  780. seq_printf(m, "%-16s 0x%lx\n", "csr (cached)", (unsigned long)card->csr);
  781. seq_printf(m, "%-16s 0x%lx\n", "csr", (unsigned long)csr);
  782. seq_printf(m, "%-16s %lu\n", "txoff", (unsigned long)txoff);
  783. seq_printf(m, "%-16s %lu\n", "txlen", (unsigned long)txlen);
  784. seq_printf(m, "%-16s %lu\n", "rxoff", (unsigned long)rxoff);
  785. seq_printf(m, "%-16s %lu\n", "rxlen", (unsigned long)rxlen);
  786. return 0;
  787. }
  788. static int b1dmactl_proc_open(struct inode *inode, struct file *file)
  789. {
  790. return single_open(file, b1dmactl_proc_show, PDE(inode)->data);
  791. }
  792. const struct file_operations b1dmactl_proc_fops = {
  793. .owner = THIS_MODULE,
  794. .open = b1dmactl_proc_open,
  795. .read = seq_read,
  796. .llseek = seq_lseek,
  797. .release = single_release,
  798. };
  799. EXPORT_SYMBOL(b1dmactl_proc_fops);
  800. /* ------------------------------------------------------------- */
  801. EXPORT_SYMBOL(b1dma_reset);
  802. EXPORT_SYMBOL(t1pci_detect);
  803. EXPORT_SYMBOL(b1pciv4_detect);
  804. EXPORT_SYMBOL(b1dma_interrupt);
  805. EXPORT_SYMBOL(b1dma_load_firmware);
  806. EXPORT_SYMBOL(b1dma_reset_ctr);
  807. EXPORT_SYMBOL(b1dma_register_appl);
  808. EXPORT_SYMBOL(b1dma_release_appl);
  809. EXPORT_SYMBOL(b1dma_send_message);
  810. static int __init b1dma_init(void)
  811. {
  812. char *p;
  813. char rev[32];
  814. if ((p = strchr(revision, ':')) != NULL && p[1]) {
  815. strlcpy(rev, p + 2, sizeof(rev));
  816. if ((p = strchr(rev, '$')) != NULL && p > rev)
  817. *(p-1) = 0;
  818. } else
  819. strcpy(rev, "1.0");
  820. printk(KERN_INFO "b1dma: revision %s\n", rev);
  821. return 0;
  822. }
  823. static void __exit b1dma_exit(void)
  824. {
  825. }
  826. module_init(b1dma_init);
  827. module_exit(b1dma_exit);