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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: c4.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
  2.  * 
  3.  * Module for AVM C4 & C2 card.
  4.  * 
  5.  * Copyright 1999 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/config.h>
  12. #include <linux/module.h>
  13. #include <linux/kernel.h>
  14. #include <linux/skbuff.h>
  15. #include <linux/delay.h>
  16. #include <linux/mm.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/ioport.h>
  19. #include <linux/pci.h>
  20. #include <linux/capi.h>
  21. #include <linux/kernelcapi.h>
  22. #include <linux/init.h>
  23. #include <asm/io.h>
  24. #include <asm/uaccess.h>
  25. #include <linux/netdevice.h>
  26. #include "capicmd.h"
  27. #include "capiutil.h"
  28. #include "capilli.h"
  29. #include "avmcard.h"
  30. static char *revision = "$Revision: 1.1.4.1 $";
  31. #undef CONFIG_C4_DEBUG
  32. #undef CONFIG_C4_POLLDEBUG
  33. /* ------------------------------------------------------------- */
  34. static int suppress_pollack;
  35. static struct pci_device_id c4_pci_tbl[] __initdata = {
  36. { PCI_VENDOR_ID_DEC,PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C4 },
  37. { PCI_VENDOR_ID_DEC,PCI_DEVICE_ID_DEC_21285, PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_C2 },
  38. { } /* Terminating entry */
  39. };
  40. MODULE_DEVICE_TABLE(pci, c4_pci_tbl);
  41. MODULE_DESCRIPTION("CAPI4Linux: Driver for AVM C2/C4 cards");
  42. MODULE_AUTHOR("Carsten Paeth");
  43. MODULE_LICENSE("GPL");
  44. MODULE_PARM(suppress_pollack, "0-1i");
  45. /* ------------------------------------------------------------- */
  46. static struct capi_driver_interface *di;
  47. /* ------------------------------------------------------------- */
  48. static void c4_dispatch_tx(avmcard *card);
  49. /* ------------------------------------------------------------- */
  50. #define DC21285_DRAM_A0MR 0x40000000
  51. #define DC21285_DRAM_A1MR 0x40004000
  52. #define DC21285_DRAM_A2MR 0x40008000
  53. #define DC21285_DRAM_A3MR 0x4000C000
  54. #define CAS_OFFSET 0x88
  55. #define DC21285_ARMCSR_BASE 0x42000000
  56. #define PCI_OUT_INT_STATUS 0x30
  57. #define PCI_OUT_INT_MASK 0x34
  58. #define MAILBOX_0 0x50
  59. #define MAILBOX_1 0x54
  60. #define MAILBOX_2 0x58
  61. #define MAILBOX_3 0x5C
  62. #define DOORBELL 0x60
  63. #define DOORBELL_SETUP 0x64
  64. #define CHAN_1_CONTROL 0x90
  65. #define CHAN_2_CONTROL 0xB0
  66. #define DRAM_TIMING 0x10C
  67. #define DRAM_ADDR_SIZE_0 0x110
  68. #define DRAM_ADDR_SIZE_1 0x114
  69. #define DRAM_ADDR_SIZE_2 0x118
  70. #define DRAM_ADDR_SIZE_3 0x11C
  71. #define SA_CONTROL 0x13C
  72. #define XBUS_CYCLE 0x148
  73. #define XBUS_STROBE 0x14C
  74. #define DBELL_PCI_MASK 0x150
  75. #define DBELL_SA_MASK 0x154
  76. #define SDRAM_SIZE 0x1000000
  77. /* ------------------------------------------------------------- */
  78. #define MBOX_PEEK_POKE MAILBOX_0
  79. #define DBELL_ADDR 0x01
  80. #define DBELL_DATA 0x02
  81. #define DBELL_RNWR 0x40
  82. #define DBELL_INIT 0x80
  83. /* ------------------------------------------------------------- */
  84. #define MBOX_UP_ADDR MAILBOX_0
  85. #define MBOX_UP_LEN MAILBOX_1
  86. #define MBOX_DOWN_ADDR MAILBOX_2
  87. #define MBOX_DOWN_LEN MAILBOX_3
  88. #define DBELL_UP_HOST 0x00000100
  89. #define DBELL_UP_ARM 0x00000200
  90. #define DBELL_DOWN_HOST 0x00000400
  91. #define DBELL_DOWN_ARM 0x00000800
  92. #define DBELL_RESET_HOST 0x40000000
  93. #define DBELL_RESET_ARM 0x80000000
  94. /* ------------------------------------------------------------- */
  95. #define DRAM_TIMING_DEF 0x001A01A5
  96. #define DRAM_AD_SZ_DEF0 0x00000045
  97. #define DRAM_AD_SZ_NULL 0x00000000
  98. #define SA_CTL_ALLRIGHT 0x64AA0271
  99. #define INIT_XBUS_CYCLE 0x100016DB
  100. #define INIT_XBUS_STROBE 0xF1F1F1F1
  101. /* ------------------------------------------------------------- */
  102. #define RESET_TIMEOUT (15*HZ) /* 15 sec */
  103. #define PEEK_POKE_TIMEOUT (HZ/10) /* 0.1 sec */
  104. /* ------------------------------------------------------------- */
  105. #define c4outmeml(addr, value) writel(value, addr)
  106. #define c4inmeml(addr) readl(addr)
  107. #define c4outmemw(addr, value) writew(value, addr)
  108. #define c4inmemw(addr) readw(addr)
  109. #define c4outmemb(addr, value) writeb(value, addr)
  110. #define c4inmemb(addr) readb(addr)
  111. /* ------------------------------------------------------------- */
  112. static inline int wait_for_doorbell(avmcard *card, unsigned long t)
  113. {
  114. unsigned long stop;
  115. stop = jiffies + t;
  116. while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
  117. if (!time_before(jiffies, stop))
  118. return -1;
  119. }
  120. return 0;
  121. }
  122. static int c4_poke(avmcard *card,  unsigned long off, unsigned long value)
  123. {
  124. if (wait_for_doorbell(card, HZ/10) < 0)
  125. return -1;
  126. c4outmeml(card->mbase+MBOX_PEEK_POKE, off);
  127. c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
  128. if (wait_for_doorbell(card, HZ/10) < 0)
  129. return -1;
  130. c4outmeml(card->mbase+MBOX_PEEK_POKE, value);
  131. c4outmeml(card->mbase+DOORBELL, DBELL_DATA | DBELL_ADDR);
  132. return 0;
  133. }
  134. static int c4_peek(avmcard *card,  unsigned long off, unsigned long *valuep)
  135. {
  136. if (wait_for_doorbell(card, HZ/10) < 0)
  137. return -1;
  138. c4outmeml(card->mbase+MBOX_PEEK_POKE, off);
  139. c4outmeml(card->mbase+DOORBELL, DBELL_RNWR | DBELL_ADDR);
  140. if (wait_for_doorbell(card, HZ/10) < 0)
  141. return -1;
  142. *valuep = c4inmeml(card->mbase+MBOX_PEEK_POKE);
  143. return 0;
  144. }
  145. /* ------------------------------------------------------------- */
  146. static int c4_load_t4file(avmcard *card, capiloaddatapart * t4file)
  147. {
  148. __u32 val;
  149. unsigned char *dp;
  150. int left, retval;
  151. __u32 loadoff = 0;
  152. dp = t4file->data;
  153. left = t4file->len;
  154. while (left >= sizeof(__u32)) {
  155.         if (t4file->user) {
  156. retval = copy_from_user(&val, dp, sizeof(val));
  157. if (retval)
  158. return -EFAULT;
  159. } else {
  160. memcpy(&val, dp, sizeof(val));
  161. }
  162. if (c4_poke(card, loadoff, val)) {
  163. printk(KERN_ERR "%s: corrupted firmware file ?n",
  164. card->name);
  165. return -EIO;
  166. }
  167. left -= sizeof(__u32);
  168. dp += sizeof(__u32);
  169. loadoff += sizeof(__u32);
  170. }
  171. if (left) {
  172. val = 0;
  173. if (t4file->user) {
  174. retval = copy_from_user(&val, dp, left);
  175. if (retval)
  176. return -EFAULT;
  177. } else {
  178. memcpy(&val, dp, left);
  179. }
  180. if (c4_poke(card, loadoff, val)) {
  181. printk(KERN_ERR "%s: corrupted firmware file ?n",
  182. card->name);
  183. return -EIO;
  184. }
  185. }
  186. return 0;
  187. }
  188. /* ------------------------------------------------------------- */
  189. static inline void _put_byte(void **pp, __u8 val)
  190. {
  191. __u8 *s = *pp;
  192. *s++ = val;
  193. *pp = s;
  194. }
  195. static inline void _put_word(void **pp, __u32 val)
  196. {
  197. __u8 *s = *pp;
  198. *s++ = val & 0xff;
  199. *s++ = (val >> 8) & 0xff;
  200. *s++ = (val >> 16) & 0xff;
  201. *s++ = (val >> 24) & 0xff;
  202. *pp = s;
  203. }
  204. static inline void _put_slice(void **pp, unsigned char *dp, unsigned int len)
  205. {
  206. unsigned i = len;
  207. _put_word(pp, i);
  208. while (i-- > 0)
  209. _put_byte(pp, *dp++);
  210. }
  211. static inline __u8 _get_byte(void **pp)
  212. {
  213. __u8 *s = *pp;
  214. __u8 val;
  215. val = *s++;
  216. *pp = s;
  217. return val;
  218. }
  219. static inline __u32 _get_word(void **pp)
  220. {
  221. __u8 *s = *pp;
  222. __u32 val;
  223. val = *s++;
  224. val |= (*s++ << 8);
  225. val |= (*s++ << 16);
  226. val |= (*s++ << 24);
  227. *pp = s;
  228. return val;
  229. }
  230. static inline __u32 _get_slice(void **pp, unsigned char *dp)
  231. {
  232. unsigned int len, i;
  233. len = i = _get_word(pp);
  234. while (i-- > 0) *dp++ = _get_byte(pp);
  235. return len;
  236. }
  237. /* ------------------------------------------------------------- */
  238. static void c4_reset(avmcard *card)
  239. {
  240. unsigned long stop;
  241. c4outmeml(card->mbase+DOORBELL, DBELL_RESET_ARM);
  242. stop = jiffies + HZ*10;
  243. while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
  244. if (!time_before(jiffies, stop))
  245. return;
  246. c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
  247. }
  248. c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
  249. c4_poke(card, DC21285_ARMCSR_BASE + CHAN_2_CONTROL, 0);
  250. }
  251. /* ------------------------------------------------------------- */
  252. static int c4_detect(avmcard *card)
  253. {
  254. unsigned long stop, dummy;
  255. c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x0c);
  256. if (c4inmeml(card->mbase+PCI_OUT_INT_MASK) != 0x0c)
  257. return 1;
  258. c4outmeml(card->mbase+DOORBELL, DBELL_RESET_ARM);
  259. stop = jiffies + HZ*10;
  260. while (c4inmeml(card->mbase+DOORBELL) != 0xffffffff) {
  261. if (!time_before(jiffies, stop))
  262. return 2;
  263. c4outmeml(card->mbase+DOORBELL, DBELL_ADDR);
  264. }
  265. c4_poke(card, DC21285_ARMCSR_BASE + CHAN_1_CONTROL, 0);
  266. c4_poke(card, DC21285_ARMCSR_BASE + CHAN_2_CONTROL, 0);
  267. c4outmeml(card->mbase+MAILBOX_0, 0x55aa55aa);
  268. if (c4inmeml(card->mbase+MAILBOX_0) != 0x55aa55aa) return 3;
  269. c4outmeml(card->mbase+MAILBOX_0, 0xaa55aa55);
  270. if (c4inmeml(card->mbase+MAILBOX_0) != 0xaa55aa55) return 4;
  271. if (c4_poke(card, DC21285_ARMCSR_BASE+DBELL_SA_MASK, 0)) return 5;
  272. if (c4_poke(card, DC21285_ARMCSR_BASE+DBELL_PCI_MASK, 0)) return 6;
  273. if (c4_poke(card, DC21285_ARMCSR_BASE+SA_CONTROL, SA_CTL_ALLRIGHT))
  274. return 7;
  275. if (c4_poke(card, DC21285_ARMCSR_BASE+XBUS_CYCLE, INIT_XBUS_CYCLE))
  276. return 8;
  277. if (c4_poke(card, DC21285_ARMCSR_BASE+XBUS_STROBE, INIT_XBUS_STROBE))
  278. return 8;
  279. if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_TIMING, 0)) return 9;
  280.         mdelay(1);
  281. if (c4_peek(card, DC21285_DRAM_A0MR, &dummy)) return 10;
  282. if (c4_peek(card, DC21285_DRAM_A1MR, &dummy)) return 11;
  283. if (c4_peek(card, DC21285_DRAM_A2MR, &dummy)) return 12;
  284. if (c4_peek(card, DC21285_DRAM_A3MR, &dummy)) return 13;
  285. if (c4_poke(card, DC21285_DRAM_A0MR+CAS_OFFSET, 0)) return 14;
  286. if (c4_poke(card, DC21285_DRAM_A1MR+CAS_OFFSET, 0)) return 15;
  287. if (c4_poke(card, DC21285_DRAM_A2MR+CAS_OFFSET, 0)) return 16;
  288. if (c4_poke(card, DC21285_DRAM_A3MR+CAS_OFFSET, 0)) return 17;
  289.         mdelay(1);
  290. if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_TIMING, DRAM_TIMING_DEF))
  291. return 18;
  292. if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_0,DRAM_AD_SZ_DEF0))
  293. return 19;
  294. if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_1,DRAM_AD_SZ_NULL))
  295. return 20;
  296. if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_2,DRAM_AD_SZ_NULL))
  297. return 21;
  298. if (c4_poke(card, DC21285_ARMCSR_BASE+DRAM_ADDR_SIZE_3,DRAM_AD_SZ_NULL))
  299. return 22;
  300. /* Transputer test */
  301. if (   c4_poke(card, 0x000000, 0x11111111)
  302.     || c4_poke(card, 0x400000, 0x22222222)
  303.     || c4_poke(card, 0x800000, 0x33333333)
  304.     || c4_poke(card, 0xC00000, 0x44444444))
  305. return 23;
  306. if (   c4_peek(card, 0x000000, &dummy) || dummy != 0x11111111
  307.     || c4_peek(card, 0x400000, &dummy) || dummy != 0x22222222
  308.     || c4_peek(card, 0x800000, &dummy) || dummy != 0x33333333
  309.     || c4_peek(card, 0xC00000, &dummy) || dummy != 0x44444444)
  310. return 24;
  311. if (   c4_poke(card, 0x000000, 0x55555555)
  312.     || c4_poke(card, 0x400000, 0x66666666)
  313.     || c4_poke(card, 0x800000, 0x77777777)
  314.     || c4_poke(card, 0xC00000, 0x88888888))
  315. return 25;
  316. if (   c4_peek(card, 0x000000, &dummy) || dummy != 0x55555555
  317.     || c4_peek(card, 0x400000, &dummy) || dummy != 0x66666666
  318.     || c4_peek(card, 0x800000, &dummy) || dummy != 0x77777777
  319.     || c4_peek(card, 0xC00000, &dummy) || dummy != 0x88888888)
  320. return 26;
  321. return 0;
  322. }
  323. /* ------------------------------------------------------------- */
  324. static void c4_dispatch_tx(avmcard *card)
  325. {
  326. avmcard_dmainfo *dma = card->dma;
  327. unsigned long flags;
  328. struct sk_buff *skb;
  329. __u8 cmd, subcmd;
  330. __u16 len;
  331. __u32 txlen;
  332. void *p;
  333. save_flags(flags);
  334. cli();
  335. if (card->csr & DBELL_DOWN_ARM) { /* tx busy */
  336.         restore_flags(flags);
  337. return;
  338. }
  339. skb = skb_dequeue(&dma->send_queue);
  340. if (!skb) {
  341. #ifdef CONFIG_C4_DEBUG
  342. printk(KERN_DEBUG "%s: tx underrunn", card->name);
  343. #endif
  344.         restore_flags(flags);
  345. return;
  346. }
  347. len = CAPIMSG_LEN(skb->data);
  348. if (len) {
  349. cmd = CAPIMSG_COMMAND(skb->data);
  350. subcmd = CAPIMSG_SUBCOMMAND(skb->data);
  351. p = dma->sendbuf;
  352. if (CAPICMD(cmd, subcmd) == CAPI_DATA_B3_REQ) {
  353. __u16 dlen = CAPIMSG_DATALEN(skb->data);
  354. _put_byte(&p, SEND_DATA_B3_REQ);
  355. _put_slice(&p, skb->data, len);
  356. _put_slice(&p, skb->data + len, dlen);
  357. } else {
  358. _put_byte(&p, SEND_MESSAGE);
  359. _put_slice(&p, skb->data, len);
  360. }
  361. txlen = (__u8 *)p - (__u8 *)dma->sendbuf;
  362. #ifdef CONFIG_C4_DEBUG
  363. printk(KERN_DEBUG "%s: tx put msg len=%dn", card->name, txlen);
  364. #endif
  365. } else {
  366. txlen = skb->len-2;
  367. #ifdef CONFIG_C4_POLLDEBUG
  368. if (skb->data[2] == SEND_POLLACK)
  369. printk(KERN_INFO "%s: ack to c4n", card->name);
  370. #endif
  371. #ifdef CONFIG_C4_DEBUG
  372. printk(KERN_DEBUG "%s: tx put 0x%x len=%dn",
  373. card->name, skb->data[2], txlen);
  374. #endif
  375. memcpy(dma->sendbuf, skb->data+2, skb->len-2);
  376. }
  377. txlen = (txlen + 3) & ~3;
  378. c4outmeml(card->mbase+MBOX_DOWN_ADDR, virt_to_phys(dma->sendbuf));
  379. c4outmeml(card->mbase+MBOX_DOWN_LEN, txlen);
  380. card->csr |= DBELL_DOWN_ARM;
  381. c4outmeml(card->mbase+DOORBELL, DBELL_DOWN_ARM);
  382. restore_flags(flags);
  383. dev_kfree_skb_any(skb);
  384. }
  385. /* ------------------------------------------------------------- */
  386. static void queue_pollack(avmcard *card)
  387. {
  388. struct sk_buff *skb;
  389. void *p;
  390. skb = alloc_skb(3, GFP_ATOMIC);
  391. if (!skb) {
  392. printk(KERN_CRIT "%s: no memory, lost poll ackn",
  393. card->name);
  394. return;
  395. }
  396. p = skb->data;
  397. _put_byte(&p, 0);
  398. _put_byte(&p, 0);
  399. _put_byte(&p, SEND_POLLACK);
  400. skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
  401. skb_queue_tail(&card->dma->send_queue, skb);
  402. c4_dispatch_tx(card);
  403. }
  404. /* ------------------------------------------------------------- */
  405. static void c4_handle_rx(avmcard *card)
  406. {
  407. avmcard_dmainfo *dma = card->dma;
  408. struct capi_ctr *ctrl;
  409. avmctrl_info *cinfo;
  410. struct sk_buff *skb;
  411. void *p = dma->recvbuf;
  412. __u32 ApplId, MsgLen, DataB3Len, NCCI, WindowSize;
  413. __u8 b1cmd =  _get_byte(&p);
  414. __u32 cidx;
  415. #ifdef CONFIG_C4_DEBUG
  416. printk(KERN_DEBUG "%s: rx 0x%x len=%lun", card->name,
  417. b1cmd, (unsigned long)dma->recvlen);
  418. #endif
  419. switch (b1cmd) {
  420. case RECEIVE_DATA_B3_IND:
  421. ApplId = (unsigned) _get_word(&p);
  422. MsgLen = _get_slice(&p, card->msgbuf);
  423. DataB3Len = _get_slice(&p, card->databuf);
  424. cidx = CAPIMSG_CONTROLLER(card->msgbuf)-card->cardnr;
  425. if (cidx >= card->nlogcontr) cidx = 0;
  426. ctrl = card->ctrlinfo[cidx].capi_ctrl;
  427. if (MsgLen < 30) { /* not CAPI 64Bit */
  428. memset(card->msgbuf+MsgLen, 0, 30-MsgLen);
  429. MsgLen = 30;
  430. CAPIMSG_SETLEN(card->msgbuf, 30);
  431. }
  432. if (!(skb = alloc_skb(DataB3Len+MsgLen, GFP_ATOMIC))) {
  433. printk(KERN_ERR "%s: incoming packet droppedn",
  434. card->name);
  435. } else {
  436. memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
  437. memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);
  438. ctrl->handle_capimsg(ctrl, ApplId, skb);
  439. }
  440. break;
  441. case RECEIVE_MESSAGE:
  442. ApplId = (unsigned) _get_word(&p);
  443. MsgLen = _get_slice(&p, card->msgbuf);
  444. cidx = CAPIMSG_CONTROLLER(card->msgbuf)-card->cardnr;
  445. if (cidx >= card->nlogcontr) cidx = 0;
  446. ctrl = card->ctrlinfo[cidx].capi_ctrl;
  447. if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {
  448. printk(KERN_ERR "%s: incoming packet droppedn",
  449. card->name);
  450. } else {
  451. memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);
  452. ctrl->handle_capimsg(ctrl, ApplId, skb);
  453. }
  454. break;
  455. case RECEIVE_NEW_NCCI:
  456. ApplId = _get_word(&p);
  457. NCCI = _get_word(&p);
  458. WindowSize = _get_word(&p);
  459. cidx = (NCCI&0x7f) - card->cardnr;
  460. if (cidx >= card->nlogcontr) cidx = 0;
  461. ctrl = card->ctrlinfo[cidx].capi_ctrl;
  462. ctrl->new_ncci(ctrl, ApplId, NCCI, WindowSize);
  463. break;
  464. case RECEIVE_FREE_NCCI:
  465. ApplId = _get_word(&p);
  466. NCCI = _get_word(&p);
  467. if (NCCI != 0xffffffff) {
  468. cidx = (NCCI&0x7f) - card->cardnr;
  469. if (cidx >= card->nlogcontr) cidx = 0;
  470. ctrl = card->ctrlinfo[cidx].capi_ctrl;
  471. if (ctrl)
  472. ctrl->free_ncci(ctrl, ApplId, NCCI);
  473. } else {
  474. for (cidx=0; cidx < 4; cidx++) {
  475. ctrl = card->ctrlinfo[cidx].capi_ctrl;
  476. if (ctrl)
  477. ctrl->appl_released(ctrl, ApplId);
  478. }
  479. }
  480. break;
  481. case RECEIVE_START:
  482. #ifdef CONFIG_C4_POLLDEBUG
  483. printk(KERN_INFO "%s: poll from c4n", card->name);
  484. #endif
  485. if (!suppress_pollack)
  486. queue_pollack(card);
  487. for (cidx=0; cidx < 4; cidx++) {
  488. ctrl = card->ctrlinfo[cidx].capi_ctrl;
  489. if (ctrl)
  490. ctrl->resume_output(ctrl);
  491. }
  492. break;
  493. case RECEIVE_STOP:
  494. for (cidx=0; cidx < 4; cidx++) {
  495. ctrl = card->ctrlinfo[cidx].capi_ctrl;
  496. if (ctrl)
  497. ctrl->suspend_output(ctrl);
  498. }
  499. break;
  500. case RECEIVE_INIT:
  501.         cidx = card->nlogcontr;
  502. if (cidx >= 4 || !card->ctrlinfo[cidx].capi_ctrl) {
  503. printk(KERN_ERR "%s: card with %d controllers ??n",
  504. card->name, cidx+1);
  505. break;
  506. }
  507.         card->nlogcontr++;
  508.         cinfo = &card->ctrlinfo[cidx];
  509. ctrl = cinfo->capi_ctrl;
  510. cinfo->versionlen = _get_slice(&p, cinfo->versionbuf);
  511. b1_parse_version(cinfo);
  512. printk(KERN_INFO "%s: %s-card (%s) now activen",
  513.        card->name,
  514.        cinfo->version[VER_CARDTYPE],
  515.        cinfo->version[VER_DRIVER]);
  516. ctrl->ready(cinfo->capi_ctrl);
  517. break;
  518. case RECEIVE_TASK_READY:
  519. ApplId = (unsigned) _get_word(&p);
  520. MsgLen = _get_slice(&p, card->msgbuf);
  521. card->msgbuf[MsgLen] = 0;
  522. while (    MsgLen > 0
  523.        && (   card->msgbuf[MsgLen-1] == 'n'
  524.    || card->msgbuf[MsgLen-1] == 'r')) {
  525. card->msgbuf[MsgLen-1] = 0;
  526. MsgLen--;
  527. }
  528. printk(KERN_INFO "%s: task %d "%s" ready.n",
  529. card->name, ApplId, card->msgbuf);
  530. break;
  531. case RECEIVE_DEBUGMSG:
  532. MsgLen = _get_slice(&p, card->msgbuf);
  533. card->msgbuf[MsgLen] = 0;
  534. while (    MsgLen > 0
  535.        && (   card->msgbuf[MsgLen-1] == 'n'
  536.    || card->msgbuf[MsgLen-1] == 'r')) {
  537. card->msgbuf[MsgLen-1] = 0;
  538. MsgLen--;
  539. }
  540. printk(KERN_INFO "%s: DEBUG: %sn", card->name, card->msgbuf);
  541. break;
  542. default:
  543. printk(KERN_ERR "%s: c4_interrupt: 0x%x ???n",
  544. card->name, b1cmd);
  545. return;
  546. }
  547. }
  548. /* ------------------------------------------------------------- */
  549. static void c4_handle_interrupt(avmcard *card)
  550. {
  551. __u32 status = c4inmeml(card->mbase+DOORBELL);
  552. if (status & DBELL_RESET_HOST) {
  553. int i;
  554. c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x0c);
  555. if (card->nlogcontr == 0)
  556. return;
  557. printk(KERN_ERR "%s: unexpected resetn", card->name);
  558.                 for (i=0; i < 4; i++) {
  559. avmctrl_info *cinfo = &card->ctrlinfo[i];
  560. memset(cinfo->version, 0, sizeof(cinfo->version));
  561. if (cinfo->capi_ctrl)
  562. cinfo->capi_ctrl->reseted(cinfo->capi_ctrl);
  563. }
  564. card->nlogcontr = 0;
  565. return;
  566. }
  567. status &= (DBELL_UP_HOST | DBELL_DOWN_HOST);
  568. if (!status)
  569. return;
  570. c4outmeml(card->mbase+DOORBELL, status);
  571. if ((status & DBELL_UP_HOST) != 0) {
  572. card->dma->recvlen = c4inmeml(card->mbase+MBOX_UP_LEN);
  573. c4outmeml(card->mbase+MBOX_UP_LEN, 0);
  574. c4_handle_rx(card);
  575. card->dma->recvlen = 0;
  576. c4outmeml(card->mbase+MBOX_UP_LEN, sizeof(card->dma->recvbuf));
  577. c4outmeml(card->mbase+DOORBELL, DBELL_UP_ARM);
  578. }
  579. if ((status & DBELL_DOWN_HOST) != 0) {
  580. card->csr &= ~DBELL_DOWN_ARM;
  581.         c4_dispatch_tx(card);
  582. } else if (card->csr & DBELL_DOWN_HOST) {
  583. if (c4inmeml(card->mbase+MBOX_DOWN_LEN) == 0) {
  584.         card->csr &= ~DBELL_DOWN_ARM;
  585. c4_dispatch_tx(card);
  586. }
  587. }
  588. }
  589. static void c4_interrupt(int interrupt, void *devptr, struct pt_regs *regs)
  590. {
  591. avmcard *card;
  592. card = (avmcard *) devptr;
  593. if (!card) {
  594. printk(KERN_WARNING "%s: interrupt: wrong devicen", card->name);
  595. return;
  596. }
  597. if (card->interrupt) {
  598. printk(KERN_ERR "%s: reentering interrupt handern",
  599. card->name);
  600. return;
  601. }
  602. card->interrupt = 1;
  603. c4_handle_interrupt(card);
  604. card->interrupt = 0;
  605. }
  606. /* ------------------------------------------------------------- */
  607. static void c4_send_init(avmcard *card)
  608. {
  609. struct sk_buff *skb;
  610. void *p;
  611. skb = alloc_skb(15, GFP_ATOMIC);
  612. if (!skb) {
  613. printk(KERN_CRIT "%s: no memory, lost register appl.n",
  614. card->name);
  615. return;
  616. }
  617. p = skb->data;
  618. _put_byte(&p, 0);
  619. _put_byte(&p, 0);
  620. _put_byte(&p, SEND_INIT);
  621. _put_word(&p, CAPI_MAXAPPL);
  622. _put_word(&p, AVM_NCCI_PER_CHANNEL*30);
  623. _put_word(&p, card->cardnr - 1);
  624. skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
  625. skb_queue_tail(&card->dma->send_queue, skb);
  626. c4_dispatch_tx(card);
  627. }
  628. static int queue_sendconfigword(avmcard *card, __u32 val)
  629. {
  630. struct sk_buff *skb;
  631. void *p;
  632. skb = alloc_skb(3+4, GFP_ATOMIC);
  633. if (!skb) {
  634. printk(KERN_CRIT "%s: no memory, send confign",
  635. card->name);
  636. return -ENOMEM;
  637. }
  638. p = skb->data;
  639. _put_byte(&p, 0);
  640. _put_byte(&p, 0);
  641. _put_byte(&p, SEND_CONFIG);
  642. _put_word(&p, val);
  643. skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
  644. skb_queue_tail(&card->dma->send_queue, skb);
  645. c4_dispatch_tx(card);
  646. return 0;
  647. }
  648. static int queue_sendconfig(avmcard *card, char cval[4])
  649. {
  650. struct sk_buff *skb;
  651. void *p;
  652. skb = alloc_skb(3+4, GFP_ATOMIC);
  653. if (!skb) {
  654. printk(KERN_CRIT "%s: no memory, send confign",
  655. card->name);
  656. return -ENOMEM;
  657. }
  658. p = skb->data;
  659. _put_byte(&p, 0);
  660. _put_byte(&p, 0);
  661. _put_byte(&p, SEND_CONFIG);
  662. _put_byte(&p, cval[0]);
  663. _put_byte(&p, cval[1]);
  664. _put_byte(&p, cval[2]);
  665. _put_byte(&p, cval[3]);
  666. skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
  667. skb_queue_tail(&card->dma->send_queue, skb);
  668. c4_dispatch_tx(card);
  669. return 0;
  670. }
  671. static int c4_send_config(avmcard *card, capiloaddatapart * config)
  672. {
  673. __u8 val[4];
  674. unsigned char *dp;
  675. int left, retval;
  676. if ((retval = queue_sendconfigword(card, 1)) != 0)
  677. return retval;
  678. if ((retval = queue_sendconfigword(card, config->len)) != 0)
  679. return retval;
  680. dp = config->data;
  681. left = config->len;
  682. while (left >= sizeof(__u32)) {
  683.         if (config->user) {
  684. retval = copy_from_user(val, dp, sizeof(val));
  685. if (retval)
  686. return -EFAULT;
  687. } else {
  688. memcpy(val, dp, sizeof(val));
  689. }
  690. if ((retval = queue_sendconfig(card, val)) != 0)
  691. return retval;
  692. left -= sizeof(val);
  693. dp += sizeof(val);
  694. }
  695. if (left) {
  696. memset(val, 0, sizeof(val));
  697. if (config->user) {
  698. retval = copy_from_user(&val, dp, left);
  699. if (retval)
  700. return -EFAULT;
  701. } else {
  702. memcpy(&val, dp, left);
  703. }
  704. if ((retval = queue_sendconfig(card, val)) != 0)
  705. return retval;
  706. }
  707. return 0;
  708. }
  709. static int c4_load_firmware(struct capi_ctr *ctrl, capiloaddata *data)
  710. {
  711. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  712. avmcard *card = cinfo->card;
  713. unsigned long flags;
  714. int retval;
  715. if ((retval = c4_load_t4file(card, &data->firmware))) {
  716. printk(KERN_ERR "%s: failed to load t4file!!n",
  717. card->name);
  718. c4_reset(card);
  719. return retval;
  720. }
  721. save_flags(flags);
  722. cli();
  723. card->csr = 0;
  724. c4outmeml(card->mbase+MBOX_UP_LEN, 0);
  725. c4outmeml(card->mbase+MBOX_DOWN_LEN, 0);
  726. c4outmeml(card->mbase+DOORBELL, DBELL_INIT);
  727. mdelay(1);
  728. c4outmeml(card->mbase+DOORBELL,
  729. DBELL_UP_HOST | DBELL_DOWN_HOST | DBELL_RESET_HOST);
  730. c4outmeml(card->mbase+PCI_OUT_INT_MASK, 0x08);
  731. card->dma->recvlen = 0;
  732. c4outmeml(card->mbase+MBOX_UP_ADDR, virt_to_phys(card->dma->recvbuf));
  733. c4outmeml(card->mbase+MBOX_UP_LEN, sizeof(card->dma->recvbuf));
  734. c4outmeml(card->mbase+DOORBELL, DBELL_UP_ARM);
  735. restore_flags(flags);
  736. if (data->configuration.len > 0 && data->configuration.data) {
  737. retval = c4_send_config(card, &data->configuration);
  738. if (retval) {
  739. printk(KERN_ERR "%s: failed to set config!!n",
  740. card->name);
  741. c4_reset(card);
  742. return retval;
  743. }
  744. }
  745.         c4_send_init(card);
  746. return 0;
  747. }
  748. void c4_reset_ctr(struct capi_ctr *ctrl)
  749. {
  750. avmcard *card = ((avmctrl_info *)(ctrl->driverdata))->card;
  751. avmctrl_info *cinfo;
  752. int i;
  753.   c4_reset(card);
  754.         for (i=0; i < 4; i++) {
  755. cinfo = &card->ctrlinfo[i];
  756. memset(cinfo->version, 0, sizeof(cinfo->version));
  757. if (cinfo->capi_ctrl)
  758. cinfo->capi_ctrl->reseted(cinfo->capi_ctrl);
  759. }
  760. card->nlogcontr = 0;
  761. }
  762. static void c4_remove_ctr(struct capi_ctr *ctrl)
  763. {
  764. avmcard *card = ((avmctrl_info *)(ctrl->driverdata))->card;
  765. avmctrl_info *cinfo;
  766. int i;
  767.   c4_reset(card);
  768.         for (i=0; i < 4; i++) {
  769. cinfo = &card->ctrlinfo[i];
  770. if (cinfo->capi_ctrl) {
  771. di->detach_ctr(cinfo->capi_ctrl);
  772. cinfo->capi_ctrl = NULL;
  773. }
  774. }
  775. free_irq(card->irq, card);
  776. iounmap(card->mbase);
  777. release_region(card->port, AVMB1_PORTLEN);
  778. ctrl->driverdata = 0;
  779. kfree(card->ctrlinfo);
  780. kfree(card->dma);
  781. kfree(card);
  782. MOD_DEC_USE_COUNT;
  783. }
  784. /* ------------------------------------------------------------- */
  785. void c4_register_appl(struct capi_ctr *ctrl,
  786. __u16 appl,
  787. capi_register_params *rp)
  788. {
  789. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  790. avmcard *card = cinfo->card;
  791. struct sk_buff *skb;
  792. int want = rp->level3cnt;
  793. int nconn;
  794. void *p;
  795. if (ctrl->cnr == card->cardnr) {
  796. if (want > 0) nconn = want;
  797. else nconn = ctrl->profile.nbchannel * 4 * -want;
  798. if (nconn == 0) nconn = ctrl->profile.nbchannel * 4;
  799. skb = alloc_skb(23, GFP_ATOMIC);
  800. if (!skb) {
  801. printk(KERN_CRIT "%s: no memory, lost register appl.n",
  802. card->name);
  803. return;
  804. }
  805. p = skb->data;
  806. _put_byte(&p, 0);
  807. _put_byte(&p, 0);
  808. _put_byte(&p, SEND_REGISTER);
  809. _put_word(&p, appl);
  810. _put_word(&p, 1024 * (nconn+1));
  811. _put_word(&p, nconn);
  812. _put_word(&p, rp->datablkcnt);
  813. _put_word(&p, rp->datablklen);
  814. skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
  815. skb_queue_tail(&card->dma->send_queue, skb);
  816. c4_dispatch_tx(card);
  817. }
  818. ctrl->appl_registered(ctrl, appl);
  819. }
  820. /* ------------------------------------------------------------- */
  821. void c4_release_appl(struct capi_ctr *ctrl, __u16 appl)
  822. {
  823. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  824. avmcard *card = cinfo->card;
  825. struct sk_buff *skb;
  826. void *p;
  827. if (ctrl->cnr == card->cardnr) {
  828. skb = alloc_skb(7, GFP_ATOMIC);
  829. if (!skb) {
  830. printk(KERN_CRIT "%s: no memory, lost release appl.n",
  831. card->name);
  832. return;
  833. }
  834. p = skb->data;
  835. _put_byte(&p, 0);
  836. _put_byte(&p, 0);
  837. _put_byte(&p, SEND_RELEASE);
  838. _put_word(&p, appl);
  839. skb_put(skb, (__u8 *)p - (__u8 *)skb->data);
  840. skb_queue_tail(&card->dma->send_queue, skb);
  841. c4_dispatch_tx(card);
  842. }
  843. }
  844. /* ------------------------------------------------------------- */
  845. static void c4_send_message(struct capi_ctr *ctrl, struct sk_buff *skb)
  846. {
  847. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  848. avmcard *card = cinfo->card;
  849. skb_queue_tail(&card->dma->send_queue, skb);
  850. c4_dispatch_tx(card);
  851. }
  852. /* ------------------------------------------------------------- */
  853. static char *c4_procinfo(struct capi_ctr *ctrl)
  854. {
  855. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  856. if (!cinfo)
  857. return "";
  858. sprintf(cinfo->infobuf, "%s %s 0x%x %d 0x%lx",
  859. cinfo->cardname[0] ? cinfo->cardname : "-",
  860. cinfo->version[VER_DRIVER] ? cinfo->version[VER_DRIVER] : "-",
  861. cinfo->card ? cinfo->card->port : 0x0,
  862. cinfo->card ? cinfo->card->irq : 0,
  863. cinfo->card ? cinfo->card->membase : 0
  864. );
  865. return cinfo->infobuf;
  866. }
  867. static int c4_read_proc(char *page, char **start, off_t off,
  868.          int count, int *eof, struct capi_ctr *ctrl)
  869. {
  870. avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);
  871. avmcard *card = cinfo->card;
  872. __u8 flag;
  873. int len = 0;
  874. char *s;
  875. len += sprintf(page+len, "%-16s %sn", "name", card->name);
  876. len += sprintf(page+len, "%-16s 0x%xn", "io", card->port);
  877. len += sprintf(page+len, "%-16s %dn", "irq", card->irq);
  878. len += sprintf(page+len, "%-16s 0x%lxn", "membase", card->membase);
  879. switch (card->cardtype) {
  880. case avm_b1isa: s = "B1 ISA"; break;
  881. case avm_b1pci: s = "B1 PCI"; break;
  882. case avm_b1pcmcia: s = "B1 PCMCIA"; break;
  883. case avm_m1: s = "M1"; break;
  884. case avm_m2: s = "M2"; break;
  885. case avm_t1isa: s = "T1 ISA (HEMA)"; break;
  886. case avm_t1pci: s = "T1 PCI"; break;
  887. case avm_c4: s = "C4"; break;
  888. case avm_c2: s = "C2"; break;
  889. default: s = "???"; break;
  890. }
  891. len += sprintf(page+len, "%-16s %sn", "type", s);
  892. if ((s = cinfo->version[VER_DRIVER]) != 0)
  893.    len += sprintf(page+len, "%-16s %sn", "ver_driver", s);
  894. if ((s = cinfo->version[VER_CARDTYPE]) != 0)
  895.    len += sprintf(page+len, "%-16s %sn", "ver_cardtype", s);
  896. if ((s = cinfo->version[VER_SERIAL]) != 0)
  897.    len += sprintf(page+len, "%-16s %sn", "ver_serial", s);
  898. if (card->cardtype != avm_m1) {
  899.          flag = ((__u8 *)(ctrl->profile.manu))[3];
  900.          if (flag)
  901. len += sprintf(page+len, "%-16s%s%s%s%s%s%s%sn",
  902. "protocol",
  903. (flag & 0x01) ? " DSS1" : "",
  904. (flag & 0x02) ? " CT1" : "",
  905. (flag & 0x04) ? " VN3" : "",
  906. (flag & 0x08) ? " NI1" : "",
  907. (flag & 0x10) ? " AUSTEL" : "",
  908. (flag & 0x20) ? " ESS" : "",
  909. (flag & 0x40) ? " 1TR6" : ""
  910. );
  911. }
  912. if (card->cardtype != avm_m1) {
  913.          flag = ((__u8 *)(ctrl->profile.manu))[5];
  914. if (flag)
  915. len += sprintf(page+len, "%-16s%s%s%s%sn",
  916. "linetype",
  917. (flag & 0x01) ? " point to point" : "",
  918. (flag & 0x02) ? " point to multipoint" : "",
  919. (flag & 0x08) ? " leased line without D-channel" : "",
  920. (flag & 0x04) ? " leased line with D-channel" : ""
  921. );
  922. }
  923. len += sprintf(page+len, "%-16s %sn", "cardname", cinfo->cardname);
  924. if (off+count >= len)
  925.    *eof = 1;
  926. if (len < off)
  927.            return 0;
  928. *start = page + off;
  929. return ((count < len-off) ? count : len-off);
  930. }
  931. /* ------------------------------------------------------------- */
  932. static int c4_add_card(struct capi_driver *driver,
  933.        struct capicardparams *p,
  934.        int nr)
  935. {
  936. avmctrl_info *cinfo;
  937. avmcard *card;
  938. int retval;
  939. int i;
  940. MOD_INC_USE_COUNT;
  941. card = (avmcard *) kmalloc(sizeof(avmcard), GFP_ATOMIC);
  942. if (!card) {
  943. printk(KERN_WARNING "%s: no memory.n", driver->name);
  944.         MOD_DEC_USE_COUNT;
  945. return -ENOMEM;
  946. }
  947. memset(card, 0, sizeof(avmcard));
  948. card->dma = (avmcard_dmainfo *) kmalloc(sizeof(avmcard_dmainfo), GFP_ATOMIC);
  949. if (!card->dma) {
  950. printk(KERN_WARNING "%s: no memory.n", driver->name);
  951. kfree(card);
  952.         MOD_DEC_USE_COUNT;
  953. return -ENOMEM;
  954. }
  955. memset(card->dma, 0, sizeof(avmcard_dmainfo));
  956.         cinfo = (avmctrl_info *) kmalloc(sizeof(avmctrl_info)*4, GFP_ATOMIC);
  957. if (!cinfo) {
  958. printk(KERN_WARNING "%s: no memory.n", driver->name);
  959. kfree(card->dma);
  960. kfree(card);
  961.         MOD_DEC_USE_COUNT;
  962. return -ENOMEM;
  963. }
  964. memset(cinfo, 0, sizeof(avmctrl_info)*4);
  965. card->ctrlinfo = cinfo;
  966. for (i=0; i < 4; i++) {
  967. cinfo = &card->ctrlinfo[i];
  968. cinfo->card = card;
  969. }
  970. sprintf(card->name, "%s-%x", driver->name, p->port);
  971. card->port = p->port;
  972. card->irq = p->irq;
  973. card->membase = p->membase;
  974. card->cardtype = nr == 4 ? avm_c4 : avm_c2;
  975. if (check_region(card->port, AVMB1_PORTLEN)) {
  976. printk(KERN_WARNING
  977.        "%s: ports 0x%03x-0x%03x in use.n",
  978.        driver->name, card->port, card->port + AVMB1_PORTLEN);
  979.         kfree(card->ctrlinfo);
  980. kfree(card->dma);
  981. kfree(card);
  982.         MOD_DEC_USE_COUNT;
  983. return -EBUSY;
  984. }
  985. card->mbase = ioremap_nocache(card->membase, 128);
  986. if (card->mbase == 0) {
  987. printk(KERN_NOTICE "%s: can't remap memory at 0x%lxn",
  988. driver->name, card->membase);
  989.         kfree(card->ctrlinfo);
  990. kfree(card->dma);
  991. kfree(card);
  992.         MOD_DEC_USE_COUNT;
  993. return -EIO;
  994. }
  995. if ((retval = c4_detect(card)) != 0) {
  996. printk(KERN_NOTICE "%s: NO card at 0x%x (%d)n",
  997. driver->name, card->port, retval);
  998.                 iounmap(card->mbase);
  999.         kfree(card->ctrlinfo);
  1000. kfree(card->dma);
  1001. kfree(card);
  1002.         MOD_DEC_USE_COUNT;
  1003. return -EIO;
  1004. }
  1005. c4_reset(card);
  1006. request_region(p->port, AVMB1_PORTLEN, card->name);
  1007. retval = request_irq(card->irq, c4_interrupt, SA_SHIRQ, card->name, card);
  1008. if (retval) {
  1009. printk(KERN_ERR "%s: unable to get IRQ %d.n",
  1010. driver->name, card->irq);
  1011.                 iounmap(card->mbase);
  1012. release_region(card->port, AVMB1_PORTLEN);
  1013.         kfree(card->ctrlinfo);
  1014. kfree(card->dma);
  1015. kfree(card);
  1016.         MOD_DEC_USE_COUNT;
  1017. return -EBUSY;
  1018. }
  1019. for (i=0; i < nr ; i++) {
  1020. cinfo = &card->ctrlinfo[i];
  1021. cinfo->card = card;
  1022. cinfo->capi_ctrl = di->attach_ctr(driver, card->name, cinfo);
  1023. if (!cinfo->capi_ctrl) {
  1024. printk(KERN_ERR "%s: attach controller failed (%d).n",
  1025. driver->name, i);
  1026. for (i--; i >= 0; i--) {
  1027. cinfo = &card->ctrlinfo[i];
  1028. di->detach_ctr(cinfo->capi_ctrl);
  1029. }
  1030.                  iounmap(card->mbase);
  1031. free_irq(card->irq, card);
  1032. release_region(card->port, AVMB1_PORTLEN);
  1033.          kfree(card->dma);
  1034.          kfree(card->ctrlinfo);
  1035. kfree(card);
  1036.          MOD_DEC_USE_COUNT;
  1037. return -EBUSY;
  1038. }
  1039. if (i == 0)
  1040. card->cardnr = cinfo->capi_ctrl->cnr;
  1041. }
  1042. skb_queue_head_init(&card->dma->send_queue);
  1043. printk(KERN_INFO
  1044. "%s: AVM C%d at i/o %#x, irq %d, mem %#lxn",
  1045. driver->name, nr, card->port, card->irq, card->membase);
  1046. return 0;
  1047. }
  1048. /* ------------------------------------------------------------- */
  1049. static struct capi_driver c2_driver = {
  1050.     name: "c2",
  1051.     revision: "0.0",
  1052.     load_firmware: c4_load_firmware,
  1053.     reset_ctr: c4_reset_ctr,
  1054.     remove_ctr: c4_remove_ctr,
  1055.     register_appl: c4_register_appl,
  1056.     release_appl: c4_release_appl,
  1057.     send_message: c4_send_message,
  1058.     procinfo: c4_procinfo,
  1059.     ctr_read_proc: c4_read_proc,
  1060.     driver_read_proc: 0, /* use standard driver_read_proc */
  1061.     add_card: 0, /* no add_card function */
  1062. };
  1063. static struct capi_driver c4_driver = {
  1064.     name: "c4",
  1065.     revision: "0.0",
  1066.     load_firmware: c4_load_firmware,
  1067.     reset_ctr: c4_reset_ctr,
  1068.     remove_ctr: c4_remove_ctr,
  1069.     register_appl: c4_register_appl,
  1070.     release_appl: c4_release_appl,
  1071.     send_message: c4_send_message,
  1072.     procinfo: c4_procinfo,
  1073.     ctr_read_proc: c4_read_proc,
  1074.     driver_read_proc: 0, /* use standard driver_read_proc */
  1075.     add_card: 0, /* no add_card function */
  1076. };
  1077. static int ncards = 0;
  1078. static int c4_attach_driver (struct capi_driver * driver)
  1079. {
  1080. char *p;
  1081. if ((p = strchr(revision, ':')) != 0 && p[1]) {
  1082. strncpy(driver->revision, p + 2, sizeof(driver->revision));
  1083. driver->revision[sizeof(driver->revision)-1] = 0;
  1084. if ((p = strchr(driver->revision, '$')) != 0 && p > driver->revision)
  1085. *(p-1) = 0;
  1086. }
  1087. printk(KERN_INFO "%s: revision %sn", driver->name, driver->revision);
  1088.         di = attach_capi_driver(driver);
  1089. if (!di) {
  1090. printk(KERN_ERR "%s: failed to attach capi_drivern",
  1091. driver->name);
  1092. MOD_DEC_USE_COUNT;
  1093. return -ENODEV;
  1094. }
  1095. return 0;
  1096. }
  1097. static int __init search_cards(struct capi_driver * driver,
  1098. int pci_id, int nr)
  1099. {
  1100. struct pci_dev * dev = NULL;
  1101. int retval = 0;
  1102. while ((dev = pci_find_subsys(
  1103. PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285,
  1104. PCI_VENDOR_ID_AVM, pci_id, dev))) {
  1105. struct capicardparams param;
  1106. if (pci_enable_device(dev) < 0) {
  1107.         printk(KERN_ERR "%s: failed to enable AVM-C%dn",
  1108.        driver->name, nr);
  1109. continue;
  1110. }
  1111. pci_set_master(dev);
  1112. param.port = pci_resource_start(dev, 1);
  1113. param.irq = dev->irq;
  1114. param.membase = pci_resource_start(dev, 0);
  1115.   
  1116. printk(KERN_INFO
  1117. "%s: PCI BIOS reports AVM-C%d at i/o %#x, irq %d, mem %#xn",
  1118. driver->name, nr, param.port, param.irq, param.membase);
  1119. retval = c4_add_card(driver, &param, nr);
  1120. if (retval != 0) {
  1121.         printk(KERN_ERR
  1122. "%s: no AVM-C%d at i/o %#x, irq %d detected, mem %#xn",
  1123. driver->name, nr, param.port, param.irq, param.membase);
  1124. continue;
  1125. }
  1126. ncards++;
  1127. }
  1128. return retval;
  1129. }
  1130. static int __init c4_init(void)
  1131. {
  1132. int retval;
  1133. MOD_INC_USE_COUNT;
  1134. retval = c4_attach_driver (&c4_driver);
  1135. if (retval) {
  1136. MOD_DEC_USE_COUNT;
  1137. return retval;
  1138. }
  1139. retval = c4_attach_driver (&c2_driver);
  1140. if (retval) {
  1141. MOD_DEC_USE_COUNT;
  1142. return retval;
  1143. }
  1144. retval = search_cards(&c4_driver, PCI_DEVICE_ID_AVM_C4, 4);
  1145. if (retval && ncards == 0) {
  1146.      detach_capi_driver(&c2_driver);
  1147.      detach_capi_driver(&c4_driver);
  1148. MOD_DEC_USE_COUNT;
  1149. return retval;
  1150. }
  1151. retval = search_cards(&c2_driver, PCI_DEVICE_ID_AVM_C2, 2);
  1152. if (retval && ncards == 0) {
  1153.      detach_capi_driver(&c2_driver);
  1154.      detach_capi_driver(&c4_driver);
  1155. MOD_DEC_USE_COUNT;
  1156. return retval;
  1157. }
  1158. if (ncards) {
  1159. printk(KERN_INFO "%s: %d C4/C2 card(s) detectedn",
  1160. c4_driver.name, ncards);
  1161. MOD_DEC_USE_COUNT;
  1162. return 0;
  1163. }
  1164. printk(KERN_ERR "%s: NO C4/C2 card detectedn", c4_driver.name);
  1165. detach_capi_driver(&c4_driver);
  1166. detach_capi_driver(&c2_driver);
  1167. MOD_DEC_USE_COUNT;
  1168. return -ENODEV;
  1169. }
  1170. static void __exit c4_exit(void)
  1171. {
  1172.     detach_capi_driver(&c2_driver);
  1173.     detach_capi_driver(&c4_driver);
  1174. }
  1175. module_init(c4_init);
  1176. module_exit(c4_exit);