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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: kcapi.c,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
  2.  * 
  3.  * Kernel CAPI 2.0 Module
  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. #define CONFIG_AVMB1_COMPAT
  12. #include <linux/config.h>
  13. #include <linux/module.h>
  14. #include <linux/kernel.h>
  15. #include <linux/mm.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/ioport.h>
  18. #include <asm/segment.h>
  19. #include <linux/proc_fs.h>
  20. #include <linux/skbuff.h>
  21. #include <linux/tqueue.h>
  22. #include <linux/capi.h>
  23. #include <linux/kernelcapi.h>
  24. #include <linux/locks.h>
  25. #include <linux/init.h>
  26. #include <asm/uaccess.h>
  27. #include "capicmd.h"
  28. #include "capiutil.h"
  29. #include "capilli.h"
  30. #ifdef CONFIG_AVMB1_COMPAT
  31. #include <linux/b1lli.h>
  32. #endif
  33. static char *revision = "$Revision: 1.1.4.1 $";
  34. /* ------------------------------------------------------------- */
  35. #define CARD_FREE 0
  36. #define CARD_DETECTED 1
  37. #define CARD_LOADING 2
  38. #define CARD_RUNNING 3
  39. /* ------------------------------------------------------------- */
  40. static int showcapimsgs = 0;
  41. MODULE_DESCRIPTION("CAPI4Linux: kernel CAPI layer");
  42. MODULE_AUTHOR("Carsten Paeth");
  43. MODULE_LICENSE("GPL");
  44. MODULE_PARM(showcapimsgs, "i");
  45. /* ------------------------------------------------------------- */
  46. struct msgidqueue {
  47. struct msgidqueue *next;
  48. __u16 msgid;
  49. };
  50. struct capi_ncci {
  51. struct capi_ncci *next;
  52. __u16 applid;
  53. __u32 ncci;
  54. __u32 winsize;
  55. int   nmsg;
  56. struct msgidqueue *msgidqueue;
  57. struct msgidqueue *msgidlast;
  58. struct msgidqueue *msgidfree;
  59. struct msgidqueue msgidpool[CAPI_MAXDATAWINDOW];
  60. };
  61. struct capi_appl {
  62. __u16 applid;
  63. capi_register_params rparam;
  64. int releasing;
  65. void *param;
  66. void (*signal) (__u16 applid, void *param);
  67. struct sk_buff_head recv_queue;
  68. int nncci;
  69. struct capi_ncci *nccilist;
  70. unsigned long nrecvctlpkt;
  71. unsigned long nrecvdatapkt;
  72. unsigned long nsentctlpkt;
  73. unsigned long nsentdatapkt;
  74. };
  75. struct capi_notifier {
  76. struct capi_notifier *next;
  77. unsigned int cmd;
  78. __u32 controller;
  79. __u16 applid;
  80. __u32 ncci;
  81. };
  82. /* ------------------------------------------------------------- */
  83. static struct capi_version driver_version = {2, 0, 1, 1<<4};
  84. static char driver_serial[CAPI_SERIAL_LEN] = "0004711";
  85. static char capi_manufakturer[64] = "AVM Berlin";
  86. #define APPL(a)    (&applications[(a)-1])
  87. #define VALID_APPLID(a)    ((a) && (a) <= CAPI_MAXAPPL && APPL(a)->applid == a)
  88. #define APPL_IS_FREE(a)    (APPL(a)->applid == 0)
  89. #define APPL_MARK_FREE(a)  do{ APPL(a)->applid=0; MOD_DEC_USE_COUNT; }while(0)
  90. #define APPL_MARK_USED(a)  do{ APPL(a)->applid=(a); MOD_INC_USE_COUNT; }while(0)
  91. #define NCCI2CTRL(ncci)    (((ncci) >> 24) & 0x7f)
  92. #define VALID_CARD(c)    ((c) > 0 && (c) <= CAPI_MAXCONTR)
  93. #define CARD(c)    (&cards[(c)-1])
  94. #define CARDNR(cp)    ((((cp)-cards)+1) & 0xff)
  95. static struct capi_appl applications[CAPI_MAXAPPL];
  96. static struct capi_ctr cards[CAPI_MAXCONTR];
  97. static int ncards = 0;
  98. static struct sk_buff_head recv_queue;
  99. static struct capi_interface_user *capi_users = 0;
  100. static spinlock_t capi_users_lock = SPIN_LOCK_UNLOCKED;
  101. static struct capi_driver *drivers;
  102. static spinlock_t drivers_lock = SPIN_LOCK_UNLOCKED;
  103. static struct tq_struct tq_state_notify;
  104. static struct tq_struct tq_recv_notify;
  105. /* -------- util functions ------------------------------------ */
  106. static char *cardstate2str(unsigned short cardstate)
  107. {
  108. switch (cardstate) {
  109.          default:
  110. case CARD_FREE: return "free";
  111. case CARD_DETECTED: return "detected";
  112. case CARD_LOADING: return "loading";
  113. case CARD_RUNNING: return "running";
  114. }
  115. }
  116. static inline int capi_cmd_valid(__u8 cmd)
  117. {
  118. switch (cmd) {
  119. case CAPI_ALERT:
  120. case CAPI_CONNECT:
  121. case CAPI_CONNECT_ACTIVE:
  122. case CAPI_CONNECT_B3_ACTIVE:
  123. case CAPI_CONNECT_B3:
  124. case CAPI_CONNECT_B3_T90_ACTIVE:
  125. case CAPI_DATA_B3:
  126. case CAPI_DISCONNECT_B3:
  127. case CAPI_DISCONNECT:
  128. case CAPI_FACILITY:
  129. case CAPI_INFO:
  130. case CAPI_LISTEN:
  131. case CAPI_MANUFACTURER:
  132. case CAPI_RESET_B3:
  133. case CAPI_SELECT_B_PROTOCOL:
  134. return 1;
  135. }
  136. return 0;
  137. }
  138. static inline int capi_subcmd_valid(__u8 subcmd)
  139. {
  140. switch (subcmd) {
  141. case CAPI_REQ:
  142. case CAPI_CONF:
  143. case CAPI_IND:
  144. case CAPI_RESP:
  145. return 1;
  146. }
  147. return 0;
  148. }
  149. /* -------- /proc functions ----------------------------------- */
  150. /*
  151.  * /proc/capi/applications:
  152.  *      applid l3cnt dblkcnt dblklen #ncci recvqueuelen
  153.  */
  154. static int proc_applications_read_proc(char *page, char **start, off_t off,
  155.                                        int count, int *eof, void *data)
  156. {
  157. struct capi_appl *ap;
  158. int i;
  159. int len = 0;
  160. for (i=0; i < CAPI_MAXAPPL; i++) {
  161. ap = &applications[i];
  162. if (ap->applid == 0) continue;
  163. len += sprintf(page+len, "%u %d %d %d %d %dn",
  164. ap->applid,
  165. ap->rparam.level3cnt,
  166. ap->rparam.datablkcnt,
  167. ap->rparam.datablklen,
  168. ap->nncci,
  169.                         skb_queue_len(&ap->recv_queue));
  170. if (len <= off) {
  171. off -= len;
  172. len = 0;
  173. } else {
  174. if (len-off > count)
  175. goto endloop;
  176. }
  177. }
  178. endloop:
  179. *start = page+off;
  180. if (len < count)
  181. *eof = 1;
  182. if (len>count) len = count;
  183. if (len<0) len = 0;
  184. return len;
  185. }
  186. /*
  187.  * /proc/capi/ncci:
  188.  * applid ncci winsize nblk
  189.  */
  190. static int proc_ncci_read_proc(char *page, char **start, off_t off,
  191.                                        int count, int *eof, void *data)
  192. {
  193. struct capi_appl *ap;
  194. struct capi_ncci *np;
  195. int i;
  196. int len = 0;
  197. for (i=0; i < CAPI_MAXAPPL; i++) {
  198. ap = &applications[i];
  199. if (ap->applid == 0) continue;
  200. for (np = ap->nccilist; np; np = np->next) {
  201. len += sprintf(page+len, "%d 0x%x %d %dn",
  202. np->applid,
  203. np->ncci,
  204. np->winsize,
  205. np->nmsg);
  206. if (len <= off) {
  207. off -= len;
  208. len = 0;
  209. } else {
  210. if (len-off > count)
  211. goto endloop;
  212. }
  213. }
  214. }
  215. endloop:
  216. *start = page+off;
  217. if (len < count)
  218. *eof = 1;
  219. if (len>count) len = count;
  220. if (len<0) len = 0;
  221. return len;
  222. }
  223. /*
  224.  * /proc/capi/driver:
  225.  * driver ncontroller
  226.  */
  227. static int proc_driver_read_proc(char *page, char **start, off_t off,
  228.                                        int count, int *eof, void *data)
  229. {
  230. struct capi_driver *driver;
  231. int len = 0;
  232. spin_lock(&drivers_lock);
  233. for (driver = drivers; driver; driver = driver->next) {
  234. len += sprintf(page+len, "%-32s %d %sn",
  235. driver->name,
  236. driver->ncontroller,
  237. driver->revision);
  238. if (len <= off) {
  239. off -= len;
  240. len = 0;
  241. } else {
  242. if (len-off > count)
  243. goto endloop;
  244. }
  245. }
  246. endloop:
  247. spin_unlock(&drivers_lock);
  248. *start = page+off;
  249. if (len < count)
  250. *eof = 1;
  251. if (len>count) len = count;
  252. if (len<0) len = 0;
  253. return len;
  254. }
  255. /*
  256.  * /proc/capi/users:
  257.  * name
  258.  */
  259. static int proc_users_read_proc(char *page, char **start, off_t off,
  260.                                        int count, int *eof, void *data)
  261. {
  262.         struct capi_interface_user *cp;
  263. int len = 0;
  264. spin_lock(&capi_users_lock);
  265.         for (cp = capi_users; cp ; cp = cp->next) {
  266. len += sprintf(page+len, "%sn", cp->name);
  267. if (len <= off) {
  268. off -= len;
  269. len = 0;
  270. } else {
  271. if (len-off > count)
  272. goto endloop;
  273. }
  274. }
  275. endloop:
  276. spin_unlock(&capi_users_lock);
  277. *start = page+off;
  278. if (len < count)
  279. *eof = 1;
  280. if (len>count) len = count;
  281. if (len<0) len = 0;
  282. return len;
  283. }
  284. /*
  285.  * /proc/capi/controller:
  286.  * cnr driver cardstate name driverinfo
  287.  */
  288. static int proc_controller_read_proc(char *page, char **start, off_t off,
  289.                                        int count, int *eof, void *data)
  290. {
  291. struct capi_ctr *cp;
  292. int i;
  293. int len = 0;
  294. for (i=0; i < CAPI_MAXCONTR; i++) {
  295. cp = &cards[i];
  296. if (cp->cardstate == CARD_FREE) continue;
  297. len += sprintf(page+len, "%d %-10s %-8s %-16s %sn",
  298. cp->cnr, cp->driver->name, 
  299. cardstate2str(cp->cardstate),
  300. cp->name,
  301. cp->driver->procinfo ?  cp->driver->procinfo(cp) : ""
  302. );
  303. if (len <= off) {
  304. off -= len;
  305. len = 0;
  306. } else {
  307. if (len-off > count)
  308. goto endloop;
  309. }
  310. }
  311. endloop:
  312. *start = page+off;
  313. if (len < count)
  314. *eof = 1;
  315. if (len>count) len = count;
  316. if (len<0) len = 0;
  317. return len;
  318. }
  319. /*
  320.  * /proc/capi/applstats:
  321.  * applid nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
  322.  */
  323. static int proc_applstats_read_proc(char *page, char **start, off_t off,
  324.                                        int count, int *eof, void *data)
  325. {
  326. struct capi_appl *ap;
  327. int i;
  328. int len = 0;
  329. for (i=0; i < CAPI_MAXAPPL; i++) {
  330. ap = &applications[i];
  331. if (ap->applid == 0) continue;
  332. len += sprintf(page+len, "%u %lu %lu %lu %lun",
  333. ap->applid,
  334. ap->nrecvctlpkt,
  335. ap->nrecvdatapkt,
  336. ap->nsentctlpkt,
  337. ap->nsentdatapkt);
  338. if (len <= off) {
  339. off -= len;
  340. len = 0;
  341. } else {
  342. if (len-off > count)
  343. goto endloop;
  344. }
  345. }
  346. endloop:
  347. *start = page+off;
  348. if (len < count)
  349. *eof = 1;
  350. if (len>count) len = count;
  351. if (len<0) len = 0;
  352. return len;
  353. }
  354. /*
  355.  * /proc/capi/contrstats:
  356.  * cnr nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
  357.  */
  358. static int proc_contrstats_read_proc(char *page, char **start, off_t off,
  359.                                        int count, int *eof, void *data)
  360. {
  361. struct capi_ctr *cp;
  362. int i;
  363. int len = 0;
  364. for (i=0; i < CAPI_MAXCONTR; i++) {
  365. cp = &cards[i];
  366. if (cp->cardstate == CARD_FREE) continue;
  367. len += sprintf(page+len, "%d %lu %lu %lu %lun",
  368. cp->cnr, 
  369. cp->nrecvctlpkt,
  370. cp->nrecvdatapkt,
  371. cp->nsentctlpkt,
  372. cp->nsentdatapkt);
  373. if (len <= off) {
  374. off -= len;
  375. len = 0;
  376. } else {
  377. if (len-off > count)
  378. goto endloop;
  379. }
  380. }
  381. endloop:
  382. *start = page+off;
  383. if (len < count)
  384. *eof = 1;
  385. if (len>count) len = count;
  386. if (len<0) len = 0;
  387. return len;
  388. }
  389. static struct procfsentries {
  390.   char *name;
  391.   mode_t mode;
  392.   int (*read_proc)(char *page, char **start, off_t off,
  393.                                        int count, int *eof, void *data);
  394.   struct proc_dir_entry *procent;
  395. } procfsentries[] = {
  396.    { "capi",   S_IFDIR, 0 },
  397.    { "capi/applications", 0  , proc_applications_read_proc },
  398.    { "capi/ncci",    0  , proc_ncci_read_proc },
  399.    { "capi/driver",       0  , proc_driver_read_proc },
  400.    { "capi/users",    0  , proc_users_read_proc },
  401.    { "capi/controller",   0  , proc_controller_read_proc },
  402.    { "capi/applstats",    0  , proc_applstats_read_proc },
  403.    { "capi/contrstats",   0  , proc_contrstats_read_proc },
  404.    { "capi/drivers",   S_IFDIR, 0 },
  405.    { "capi/controllers",  S_IFDIR, 0 },
  406. };
  407. static void proc_capi_init(void)
  408. {
  409.     int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
  410.     int i;
  411.     for (i=0; i < nelem; i++) {
  412.         struct procfsentries *p = procfsentries + i;
  413. p->procent = create_proc_entry(p->name, p->mode, 0);
  414. if (p->procent) p->procent->read_proc = p->read_proc;
  415.     }
  416. }
  417. static void proc_capi_exit(void)
  418. {
  419.     int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
  420.     int i;
  421.     for (i=nelem-1; i >= 0; i--) {
  422.         struct procfsentries *p = procfsentries + i;
  423. if (p->procent) {
  424.    remove_proc_entry(p->name, 0);
  425.    p->procent = 0;
  426. }
  427.     }
  428. }
  429. /* -------- Notifier handling --------------------------------- */
  430. static struct capi_notifier_list{
  431. struct capi_notifier *head;
  432. struct capi_notifier *tail;
  433. } notifier_list;
  434. static spinlock_t notifier_lock = SPIN_LOCK_UNLOCKED;
  435. static inline void notify_enqueue(struct capi_notifier *np)
  436. {
  437. struct capi_notifier_list *q = &notifier_list;
  438. unsigned long flags;
  439. spin_lock_irqsave(&notifier_lock, flags);
  440. if (q->tail) {
  441. q->tail->next = np;
  442. q->tail = np;
  443. } else {
  444. q->head = q->tail = np;
  445. }
  446. spin_unlock_irqrestore(&notifier_lock, flags);
  447. }
  448. static inline struct capi_notifier *notify_dequeue(void)
  449. {
  450. struct capi_notifier_list *q = &notifier_list;
  451. struct capi_notifier *np = 0;
  452. unsigned long flags;
  453. spin_lock_irqsave(&notifier_lock, flags);
  454. if (q->head) {
  455. np = q->head;
  456. if ((q->head = np->next) == 0)
  457.   q->tail = 0;
  458. np->next = 0;
  459. }
  460. spin_unlock_irqrestore(&notifier_lock, flags);
  461. return np;
  462. }
  463. static int notify_push(unsigned int cmd, __u32 controller,
  464. __u16 applid, __u32 ncci)
  465. {
  466. struct capi_notifier *np;
  467. MOD_INC_USE_COUNT;
  468. np = (struct capi_notifier *)kmalloc(sizeof(struct capi_notifier), GFP_ATOMIC);
  469. if (!np) {
  470. MOD_DEC_USE_COUNT;
  471. return -1;
  472. }
  473. memset(np, 0, sizeof(struct capi_notifier));
  474. np->cmd = cmd;
  475. np->controller = controller;
  476. np->applid = applid;
  477. np->ncci = ncci;
  478. notify_enqueue(np);
  479. /*
  480.  * The notifier will result in adding/deleteing
  481.  * of devices. Devices can only removed in
  482.  * user process, not in bh.
  483.  */
  484. MOD_INC_USE_COUNT;
  485. if (schedule_task(&tq_state_notify) == 0)
  486. MOD_DEC_USE_COUNT;
  487. return 0;
  488. }
  489. /* -------- KCI_CONTRUP --------------------------------------- */
  490. static void notify_up(__u32 contr)
  491. {
  492. struct capi_interface_user *p;
  493.         printk(KERN_NOTICE "kcapi: notify up contr %dn", contr);
  494. spin_lock(&capi_users_lock);
  495. for (p = capi_users; p; p = p->next) {
  496. if (!p->callback) continue;
  497. (*p->callback) (KCI_CONTRUP, contr, &CARD(contr)->profile);
  498. }
  499. spin_unlock(&capi_users_lock);
  500. }
  501. /* -------- KCI_CONTRDOWN ------------------------------------- */
  502. static void notify_down(__u32 contr)
  503. {
  504. struct capi_interface_user *p;
  505.         printk(KERN_NOTICE "kcapi: notify down contr %dn", contr);
  506. spin_lock(&capi_users_lock);
  507. for (p = capi_users; p; p = p->next) {
  508. if (!p->callback) continue;
  509. (*p->callback) (KCI_CONTRDOWN, contr, 0);
  510. }
  511. spin_unlock(&capi_users_lock);
  512. }
  513. /* -------- KCI_NCCIUP ---------------------------------------- */
  514. static void notify_ncciup(__u32 contr, __u16 applid, __u32 ncci)
  515. {
  516. struct capi_interface_user *p;
  517. struct capi_ncciinfo n;
  518. n.applid = applid;
  519. n.ncci = ncci;
  520.         /*printk(KERN_NOTICE "kcapi: notify up contr %dn", contr);*/
  521. spin_lock(&capi_users_lock);
  522. for (p = capi_users; p; p = p->next) {
  523. if (!p->callback) continue;
  524. (*p->callback) (KCI_NCCIUP, contr, &n);
  525. }
  526. spin_unlock(&capi_users_lock);
  527. };
  528. /* -------- KCI_NCCIDOWN -------------------------------------- */
  529. static void notify_nccidown(__u32 contr, __u16 applid, __u32 ncci)
  530. {
  531. struct capi_interface_user *p;
  532. struct capi_ncciinfo n;
  533. n.applid = applid;
  534. n.ncci = ncci;
  535.         /*printk(KERN_NOTICE "kcapi: notify down contr %dn", contr);*/
  536. spin_lock(&capi_users_lock);
  537. for (p = capi_users; p; p = p->next) {
  538. if (!p->callback) continue;
  539. (*p->callback) (KCI_NCCIDOWN, contr, &n);
  540. }
  541. spin_unlock(&capi_users_lock);
  542. };
  543. /* ------------------------------------------------------------ */
  544. static void inline notify_doit(struct capi_notifier *np)
  545. {
  546. switch (np->cmd) {
  547. case KCI_CONTRUP:
  548. notify_up(np->controller);
  549. break;
  550. case KCI_CONTRDOWN:
  551. notify_down(np->controller);
  552. break;
  553. case KCI_NCCIUP:
  554. notify_ncciup(np->controller, np->applid, np->ncci);
  555. break;
  556. case KCI_NCCIDOWN:
  557. notify_nccidown(np->controller, np->applid, np->ncci);
  558. break;
  559. }
  560. }
  561. static void notify_handler(void *dummy)
  562. {
  563. struct capi_notifier *np;
  564. while ((np = notify_dequeue()) != 0) {
  565. notify_doit(np);
  566. kfree(np);
  567. MOD_DEC_USE_COUNT;
  568. }
  569. MOD_DEC_USE_COUNT;
  570. }
  571. /* -------- NCCI Handling ------------------------------------- */
  572. static inline void mq_init(struct capi_ncci * np)
  573. {
  574. int i;
  575. np->msgidqueue = 0;
  576. np->msgidlast = 0;
  577. np->nmsg = 0;
  578. memset(np->msgidpool, 0, sizeof(np->msgidpool));
  579. np->msgidfree = &np->msgidpool[0];
  580. for (i = 1; i < np->winsize; i++) {
  581. np->msgidpool[i].next = np->msgidfree;
  582. np->msgidfree = &np->msgidpool[i];
  583. }
  584. }
  585. static inline int mq_enqueue(struct capi_ncci * np, __u16 msgid)
  586. {
  587. struct msgidqueue *mq;
  588. if ((mq = np->msgidfree) == 0)
  589. return 0;
  590. np->msgidfree = mq->next;
  591. mq->msgid = msgid;
  592. mq->next = 0;
  593. if (np->msgidlast)
  594. np->msgidlast->next = mq;
  595. np->msgidlast = mq;
  596. if (!np->msgidqueue)
  597. np->msgidqueue = mq;
  598. np->nmsg++;
  599. return 1;
  600. }
  601. static inline int mq_dequeue(struct capi_ncci * np, __u16 msgid)
  602. {
  603. struct msgidqueue **pp;
  604. for (pp = &np->msgidqueue; *pp; pp = &(*pp)->next) {
  605. if ((*pp)->msgid == msgid) {
  606. struct msgidqueue *mq = *pp;
  607. *pp = mq->next;
  608. if (mq == np->msgidlast)
  609. np->msgidlast = 0;
  610. mq->next = np->msgidfree;
  611. np->msgidfree = mq;
  612. np->nmsg--;
  613. return 1;
  614. }
  615. }
  616. return 0;
  617. }
  618. static void controllercb_appl_registered(struct capi_ctr * card, __u16 appl)
  619. {
  620. }
  621. static void controllercb_appl_released(struct capi_ctr * card, __u16 appl)
  622. {
  623. struct capi_ncci **pp, **nextpp;
  624. for (pp = &APPL(appl)->nccilist; *pp; pp = nextpp) {
  625. if (NCCI2CTRL((*pp)->ncci) == card->cnr) {
  626. struct capi_ncci *np = *pp;
  627. *pp = np->next;
  628. printk(KERN_INFO "kcapi: appl %d ncci 0x%x down!n", appl, np->ncci);
  629. kfree(np);
  630. APPL(appl)->nncci--;
  631. nextpp = pp;
  632. } else {
  633. nextpp = &(*pp)->next;
  634. }
  635. }
  636. APPL(appl)->releasing--;
  637. if (APPL(appl)->releasing <= 0) {
  638. APPL(appl)->signal = 0;
  639. APPL_MARK_FREE(appl);
  640. printk(KERN_INFO "kcapi: appl %d downn", appl);
  641. }
  642. }
  643. /*
  644.  * ncci management
  645.  */
  646. static void controllercb_new_ncci(struct capi_ctr * card,
  647. __u16 appl, __u32 ncci, __u32 winsize)
  648. {
  649. struct capi_ncci *np;
  650. if (!VALID_APPLID(appl)) {
  651. printk(KERN_ERR "avmb1_handle_new_ncci: illegal appl %dn", appl);
  652. return;
  653. }
  654. if ((np = (struct capi_ncci *) kmalloc(sizeof(struct capi_ncci), GFP_ATOMIC)) == 0) {
  655. printk(KERN_ERR "capi_new_ncci: alloc failed ncci 0x%xn", ncci);
  656. return;
  657. }
  658. if (winsize > CAPI_MAXDATAWINDOW) {
  659. printk(KERN_ERR "capi_new_ncci: winsize %d too big, set to %dn",
  660.        winsize, CAPI_MAXDATAWINDOW);
  661. winsize = CAPI_MAXDATAWINDOW;
  662. }
  663. np->applid = appl;
  664. np->ncci = ncci;
  665. np->winsize = winsize;
  666. mq_init(np);
  667. np->next = APPL(appl)->nccilist;
  668. APPL(appl)->nccilist = np;
  669. APPL(appl)->nncci++;
  670. printk(KERN_INFO "kcapi: appl %d ncci 0x%x upn", appl, ncci);
  671. notify_push(KCI_NCCIUP, CARDNR(card), appl, ncci);
  672. }
  673. static void controllercb_free_ncci(struct capi_ctr * card,
  674. __u16 appl, __u32 ncci)
  675. {
  676. struct capi_ncci **pp;
  677. if (!VALID_APPLID(appl)) {
  678. printk(KERN_ERR "free_ncci: illegal appl %dn", appl);
  679. return;
  680. }
  681. for (pp = &APPL(appl)->nccilist; *pp; pp = &(*pp)->next) {
  682. if ((*pp)->ncci == ncci) {
  683. struct capi_ncci *np = *pp;
  684. *pp = np->next;
  685. kfree(np);
  686. APPL(appl)->nncci--;
  687. printk(KERN_INFO "kcapi: appl %d ncci 0x%x downn", appl, ncci);
  688. notify_push(KCI_NCCIDOWN, CARDNR(card), appl, ncci);
  689. return;
  690. }
  691. }
  692. printk(KERN_ERR "free_ncci: ncci 0x%x not foundn", ncci);
  693. }
  694. static struct capi_ncci *find_ncci(struct capi_appl * app, __u32 ncci)
  695. {
  696. struct capi_ncci *np;
  697. for (np = app->nccilist; np; np = np->next) {
  698. if (np->ncci == ncci)
  699. return np;
  700. }
  701. return 0;
  702. }
  703. /* -------- Receiver ------------------------------------------ */
  704. static void recv_handler(void *dummy)
  705. {
  706. struct sk_buff *skb;
  707. while ((skb = skb_dequeue(&recv_queue)) != 0) {
  708. __u16 appl = CAPIMSG_APPID(skb->data);
  709. struct capi_ncci *np;
  710. if (!VALID_APPLID(appl)) {
  711. printk(KERN_ERR "kcapi: recv_handler: applid %d ? (%s)n",
  712.        appl, capi_message2str(skb->data));
  713. kfree_skb(skb);
  714. continue;
  715. }
  716. if (APPL(appl)->signal == 0) {
  717. printk(KERN_ERR "kcapi: recv_handler: applid %d has no signal functionn",
  718.        appl);
  719. kfree_skb(skb);
  720. continue;
  721. }
  722. if (   CAPIMSG_COMMAND(skb->data) == CAPI_DATA_B3
  723.     && CAPIMSG_SUBCOMMAND(skb->data) == CAPI_CONF
  724.             && (np = find_ncci(APPL(appl), CAPIMSG_NCCI(skb->data))) != 0
  725.     && mq_dequeue(np, CAPIMSG_MSGID(skb->data)) == 0) {
  726. printk(KERN_ERR "kcapi: msgid %hu ncci 0x%x not on queuen",
  727. CAPIMSG_MSGID(skb->data), np->ncci);
  728. }
  729. if (   CAPIMSG_COMMAND(skb->data) == CAPI_DATA_B3
  730.     && CAPIMSG_SUBCOMMAND(skb->data) == CAPI_IND) {
  731. APPL(appl)->nrecvdatapkt++;
  732. } else {
  733. APPL(appl)->nrecvctlpkt++;
  734. }
  735. skb_queue_tail(&APPL(appl)->recv_queue, skb);
  736. (APPL(appl)->signal) (APPL(appl)->applid, APPL(appl)->param);
  737. }
  738. }
  739. static void controllercb_handle_capimsg(struct capi_ctr * card,
  740. __u16 appl, struct sk_buff *skb)
  741. {
  742. int showctl = 0;
  743. __u8 cmd, subcmd;
  744. if (card->cardstate != CARD_RUNNING) {
  745. printk(KERN_INFO "kcapi: controller %d not active, got: %s",
  746.        card->cnr, capi_message2str(skb->data));
  747. goto error;
  748. }
  749. cmd = CAPIMSG_COMMAND(skb->data);
  750.         subcmd = CAPIMSG_SUBCOMMAND(skb->data);
  751. if (cmd == CAPI_DATA_B3 && subcmd == CAPI_IND) {
  752. card->nrecvdatapkt++;
  753.         if (card->traceflag > 2) showctl |= 2;
  754. } else {
  755. card->nrecvctlpkt++;
  756.         if (card->traceflag) showctl |= 2;
  757. }
  758. showctl |= (card->traceflag & 1);
  759. if (showctl & 2) {
  760. if (showctl & 1) {
  761. printk(KERN_DEBUG "kcapi: got [0x%lx] id#%d %s len=%un",
  762.        (unsigned long) card->cnr,
  763.        CAPIMSG_APPID(skb->data),
  764.        capi_cmd2str(cmd, subcmd),
  765.        CAPIMSG_LEN(skb->data));
  766. } else {
  767. printk(KERN_DEBUG "kcapi: got [0x%lx] %sn",
  768. (unsigned long) card->cnr,
  769. capi_message2str(skb->data));
  770. }
  771. }
  772. skb_queue_tail(&recv_queue, skb);
  773. queue_task(&tq_recv_notify, &tq_immediate);
  774. mark_bh(IMMEDIATE_BH);
  775. return;
  776. error:
  777. kfree_skb(skb);
  778. }
  779. static void controllercb_ready(struct capi_ctr * card)
  780. {
  781. __u16 appl;
  782. card->cardstate = CARD_RUNNING;
  783. for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
  784. if (!VALID_APPLID(appl)) continue;
  785. if (APPL(appl)->releasing) continue;
  786. card->driver->register_appl(card, appl, &APPL(appl)->rparam);
  787. }
  788.         printk(KERN_NOTICE "kcapi: card %d "%s" ready.n",
  789. CARDNR(card), card->name);
  790. notify_push(KCI_CONTRUP, CARDNR(card), 0, 0);
  791. }
  792. static void controllercb_reseted(struct capi_ctr * card)
  793. {
  794. __u16 appl;
  795.         if (card->cardstate == CARD_FREE)
  796. return;
  797.         if (card->cardstate == CARD_DETECTED)
  798. return;
  799.         card->cardstate = CARD_DETECTED;
  800. memset(card->manu, 0, sizeof(card->manu));
  801. memset(&card->version, 0, sizeof(card->version));
  802. memset(&card->profile, 0, sizeof(card->profile));
  803. memset(card->serial, 0, sizeof(card->serial));
  804. for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
  805. struct capi_ncci **pp, **nextpp;
  806. for (pp = &APPL(appl)->nccilist; *pp; pp = nextpp) {
  807. if (NCCI2CTRL((*pp)->ncci) == card->cnr) {
  808. struct capi_ncci *np = *pp;
  809. *pp = np->next;
  810. printk(KERN_INFO "kcapi: appl %d ncci 0x%x forced down!n", appl, np->ncci);
  811. notify_push(KCI_NCCIDOWN, CARDNR(card), appl, np->ncci);
  812. kfree(np);
  813. nextpp = pp;
  814. } else {
  815. nextpp = &(*pp)->next;
  816. }
  817. }
  818. }
  819. printk(KERN_NOTICE "kcapi: card %d down.n", CARDNR(card));
  820. notify_push(KCI_CONTRDOWN, CARDNR(card), 0, 0);
  821. }
  822. static void controllercb_suspend_output(struct capi_ctr *card)
  823. {
  824. if (!card->blocked) {
  825. printk(KERN_DEBUG "kcapi: card %d suspendn", CARDNR(card));
  826. card->blocked = 1;
  827. }
  828. }
  829. static void controllercb_resume_output(struct capi_ctr *card)
  830. {
  831. if (card->blocked) {
  832. printk(KERN_DEBUG "kcapi: card %d resumen", CARDNR(card));
  833. card->blocked = 0;
  834. }
  835. }
  836. /* ------------------------------------------------------------- */
  837. struct capi_ctr *
  838. drivercb_attach_ctr(struct capi_driver *driver, char *name, void *driverdata)
  839. {
  840. struct capi_ctr *card, **pp;
  841. int i;
  842. for (i=0; i < CAPI_MAXCONTR && cards[i].cardstate != CARD_FREE; i++) ;
  843.    
  844. if (i == CAPI_MAXCONTR) {
  845. printk(KERN_ERR "kcapi: out of controller slotsn");
  846.     return 0;
  847. }
  848. card = &cards[i];
  849. memset(card, 0, sizeof(struct capi_ctr));
  850. card->driver = driver;
  851. card->cnr = CARDNR(card);
  852. strncpy(card->name, name, sizeof(card->name));
  853. card->cardstate = CARD_DETECTED;
  854. card->blocked = 0;
  855. card->driverdata = driverdata;
  856. card->traceflag = showcapimsgs;
  857.         card->ready = controllercb_ready; 
  858.         card->reseted = controllercb_reseted; 
  859.         card->suspend_output = controllercb_suspend_output;
  860.         card->resume_output = controllercb_resume_output;
  861.         card->handle_capimsg = controllercb_handle_capimsg;
  862. card->appl_registered = controllercb_appl_registered;
  863. card->appl_released = controllercb_appl_released;
  864.         card->new_ncci = controllercb_new_ncci;
  865.         card->free_ncci = controllercb_free_ncci;
  866. for (pp = &driver->controller; *pp; pp = &(*pp)->next) ;
  867. card->next = 0;
  868. *pp = card;
  869. driver->ncontroller++;
  870. sprintf(card->procfn, "capi/controllers/%d", card->cnr);
  871. card->procent = create_proc_entry(card->procfn, 0, 0);
  872. if (card->procent) {
  873.    card->procent->read_proc = 
  874. (int (*)(char *,char **,off_t,int,int *,void *))
  875. driver->ctr_read_proc;
  876.    card->procent->data = card;
  877. }
  878. ncards++;
  879. printk(KERN_NOTICE "kcapi: Controller %d: %s attachedn",
  880. card->cnr, card->name);
  881. return card;
  882. }
  883. static int drivercb_detach_ctr(struct capi_ctr *card)
  884. {
  885. struct capi_driver *driver = card->driver;
  886. struct capi_ctr **pp;
  887.         if (card->cardstate == CARD_FREE)
  888. return 0;
  889.         if (card->cardstate != CARD_DETECTED)
  890. controllercb_reseted(card);
  891. for (pp = &driver->controller; *pp ; pp = &(*pp)->next) {
  892.          if (*pp == card) {
  893.          *pp = card->next;
  894. driver->ncontroller--;
  895. ncards--;
  896.          break;
  897. }
  898. }
  899. if (card->procent) {
  900.    remove_proc_entry(card->procfn, 0);
  901.    card->procent = 0;
  902. }
  903. card->cardstate = CARD_FREE;
  904. printk(KERN_NOTICE "kcapi: Controller %d: %s unregisteredn",
  905. card->cnr, card->name);
  906. return 0;
  907. }
  908. /* ------------------------------------------------------------- */
  909. /* fallback if no driver read_proc function defined by driver */
  910. static int driver_read_proc(char *page, char **start, off_t off,
  911.          int count, int *eof, void *data)
  912. {
  913. struct capi_driver *driver = (struct capi_driver *)data;
  914. int len = 0;
  915. len += sprintf(page+len, "%-16s %sn", "name", driver->name);
  916. len += sprintf(page+len, "%-16s %sn", "revision", driver->revision);
  917. if (len < off) 
  918.            return 0;
  919. *eof = 1;
  920. *start = page + off;
  921. return ((count < len-off) ? count : len-off);
  922. }
  923. /* ------------------------------------------------------------- */
  924. static struct capi_driver_interface di = {
  925.     drivercb_attach_ctr,
  926.     drivercb_detach_ctr,
  927. };
  928. struct capi_driver_interface *attach_capi_driver(struct capi_driver *driver)
  929. {
  930. struct capi_driver **pp;
  931. MOD_INC_USE_COUNT;
  932. spin_lock(&drivers_lock);
  933. for (pp = &drivers; *pp; pp = &(*pp)->next) ;
  934. driver->next = 0;
  935. *pp = driver;
  936. spin_unlock(&drivers_lock);
  937. printk(KERN_NOTICE "kcapi: driver %s attachedn", driver->name);
  938. sprintf(driver->procfn, "capi/drivers/%s", driver->name);
  939. driver->procent = create_proc_entry(driver->procfn, 0, 0);
  940. if (driver->procent) {
  941.    if (driver->driver_read_proc) {
  942.    driver->procent->read_proc = 
  943.         (int (*)(char *,char **,off_t,int,int *,void *))
  944. driver->driver_read_proc;
  945.    } else {
  946.    driver->procent->read_proc = driver_read_proc;
  947.    }
  948.    driver->procent->data = driver;
  949. }
  950. return &di;
  951. }
  952. void detach_capi_driver(struct capi_driver *driver)
  953. {
  954. struct capi_driver **pp;
  955. spin_lock(&drivers_lock);
  956. for (pp = &drivers; *pp && *pp != driver; pp = &(*pp)->next) ;
  957. if (*pp) {
  958. *pp = (*pp)->next;
  959. printk(KERN_NOTICE "kcapi: driver %s detachedn", driver->name);
  960. } else {
  961. printk(KERN_ERR "kcapi: driver %s double detach ?n", driver->name);
  962. }
  963. spin_unlock(&drivers_lock);
  964. if (driver->procent) {
  965.    remove_proc_entry(driver->procfn, 0);
  966.    driver->procent = 0;
  967. }
  968. MOD_DEC_USE_COUNT;
  969. }
  970. /* ------------------------------------------------------------- */
  971. /* -------- CAPI2.0 Interface ---------------------------------- */
  972. /* ------------------------------------------------------------- */
  973. static __u16 capi_isinstalled(void)
  974. {
  975. int i;
  976. for (i = 0; i < CAPI_MAXCONTR; i++) {
  977. if (cards[i].cardstate == CARD_RUNNING)
  978. return CAPI_NOERROR;
  979. }
  980. return CAPI_REGNOTINSTALLED;
  981. }
  982. static __u16 capi_register(capi_register_params * rparam, __u16 * applidp)
  983. {
  984. int appl;
  985. int i;
  986. if (rparam->datablklen < 128)
  987. return CAPI_LOGBLKSIZETOSMALL;
  988. for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
  989. if (APPL_IS_FREE(appl))
  990. break;
  991. }
  992. if (appl > CAPI_MAXAPPL)
  993. return CAPI_TOOMANYAPPLS;
  994. APPL_MARK_USED(appl);
  995. skb_queue_head_init(&APPL(appl)->recv_queue);
  996. APPL(appl)->nncci = 0;
  997. memcpy(&APPL(appl)->rparam, rparam, sizeof(capi_register_params));
  998. for (i = 0; i < CAPI_MAXCONTR; i++) {
  999. if (cards[i].cardstate != CARD_RUNNING)
  1000. continue;
  1001. cards[i].driver->register_appl(&cards[i], appl,
  1002. &APPL(appl)->rparam);
  1003. }
  1004. *applidp = appl;
  1005. printk(KERN_INFO "kcapi: appl %d upn", appl);
  1006. return CAPI_NOERROR;
  1007. }
  1008. static __u16 capi_release(__u16 applid)
  1009. {
  1010. int i;
  1011. if (!VALID_APPLID(applid) || APPL(applid)->releasing)
  1012. return CAPI_ILLAPPNR;
  1013. APPL(applid)->releasing++;
  1014. skb_queue_purge(&APPL(applid)->recv_queue);
  1015. for (i = 0; i < CAPI_MAXCONTR; i++) {
  1016. if (cards[i].cardstate != CARD_RUNNING)
  1017. continue;
  1018. APPL(applid)->releasing++;
  1019. cards[i].driver->release_appl(&cards[i], applid);
  1020. }
  1021. APPL(applid)->releasing--;
  1022. if (APPL(applid)->releasing <= 0) {
  1023.         APPL(applid)->signal = 0;
  1024. APPL_MARK_FREE(applid);
  1025. printk(KERN_INFO "kcapi: appl %d downn", applid);
  1026. }
  1027. return CAPI_NOERROR;
  1028. }
  1029. static __u16 capi_put_message(__u16 applid, struct sk_buff *skb)
  1030. {
  1031. struct capi_ncci *np;
  1032. __u32 contr;
  1033. int showctl = 0;
  1034. __u8 cmd, subcmd;
  1035. if (ncards == 0)
  1036. return CAPI_REGNOTINSTALLED;
  1037. if (!VALID_APPLID(applid))
  1038. return CAPI_ILLAPPNR;
  1039. if (skb->len < 12
  1040.     || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data))
  1041.     || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb->data)))
  1042. return CAPI_ILLCMDORSUBCMDORMSGTOSMALL;
  1043. contr = CAPIMSG_CONTROLLER(skb->data);
  1044. if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING) {
  1045. contr = 1;
  1046.         if (CARD(contr)->cardstate != CARD_RUNNING) 
  1047. return CAPI_REGNOTINSTALLED;
  1048. }
  1049. if (CARD(contr)->blocked)
  1050. return CAPI_SENDQUEUEFULL;
  1051. cmd = CAPIMSG_COMMAND(skb->data);
  1052.         subcmd = CAPIMSG_SUBCOMMAND(skb->data);
  1053. if (cmd == CAPI_DATA_B3 && subcmd== CAPI_REQ) {
  1054.      if ((np = find_ncci(APPL(applid), CAPIMSG_NCCI(skb->data))) != 0
  1055.             && mq_enqueue(np, CAPIMSG_MSGID(skb->data)) == 0)
  1056. return CAPI_SENDQUEUEFULL;
  1057. CARD(contr)->nsentdatapkt++;
  1058. APPL(applid)->nsentdatapkt++;
  1059.         if (CARD(contr)->traceflag > 2) showctl |= 2;
  1060. } else {
  1061. CARD(contr)->nsentctlpkt++;
  1062. APPL(applid)->nsentctlpkt++;
  1063.         if (CARD(contr)->traceflag) showctl |= 2;
  1064. }
  1065. showctl |= (CARD(contr)->traceflag & 1);
  1066. if (showctl & 2) {
  1067. if (showctl & 1) {
  1068. printk(KERN_DEBUG "kcapi: put [0x%lx] id#%d %s len=%un",
  1069.        (unsigned long) contr,
  1070.        CAPIMSG_APPID(skb->data),
  1071.        capi_cmd2str(cmd, subcmd),
  1072.        CAPIMSG_LEN(skb->data));
  1073. } else {
  1074. printk(KERN_DEBUG "kcapi: put [0x%lx] %sn",
  1075. (unsigned long) contr,
  1076. capi_message2str(skb->data));
  1077. }
  1078. }
  1079. CARD(contr)->driver->send_message(CARD(contr), skb);
  1080. return CAPI_NOERROR;
  1081. }
  1082. static __u16 capi_get_message(__u16 applid, struct sk_buff **msgp)
  1083. {
  1084. struct sk_buff *skb;
  1085. if (!VALID_APPLID(applid))
  1086. return CAPI_ILLAPPNR;
  1087. if ((skb = skb_dequeue(&APPL(applid)->recv_queue)) == 0)
  1088. return CAPI_RECEIVEQUEUEEMPTY;
  1089. *msgp = skb;
  1090. return CAPI_NOERROR;
  1091. }
  1092. static __u16 capi_set_signal(__u16 applid,
  1093.      void (*signal) (__u16 applid, void *param),
  1094.      void *param)
  1095. {
  1096. if (!VALID_APPLID(applid))
  1097. return CAPI_ILLAPPNR;
  1098. APPL(applid)->signal = signal;
  1099. APPL(applid)->param = param;
  1100. return CAPI_NOERROR;
  1101. }
  1102. static __u16 capi_get_manufacturer(__u32 contr, __u8 buf[CAPI_MANUFACTURER_LEN])
  1103. {
  1104. if (contr == 0) {
  1105. strncpy(buf, capi_manufakturer, CAPI_MANUFACTURER_LEN);
  1106. return CAPI_NOERROR;
  1107. }
  1108. if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING) 
  1109. return CAPI_REGNOTINSTALLED;
  1110. strncpy(buf, CARD(contr)->manu, CAPI_MANUFACTURER_LEN);
  1111. return CAPI_NOERROR;
  1112. }
  1113. static __u16 capi_get_version(__u32 contr, struct capi_version *verp)
  1114. {
  1115. if (contr == 0) {
  1116. *verp = driver_version;
  1117. return CAPI_NOERROR;
  1118. }
  1119. if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING) 
  1120. return CAPI_REGNOTINSTALLED;
  1121. memcpy((void *) verp, &CARD(contr)->version, sizeof(capi_version));
  1122. return CAPI_NOERROR;
  1123. }
  1124. static __u16 capi_get_serial(__u32 contr, __u8 serial[CAPI_SERIAL_LEN])
  1125. {
  1126. if (contr == 0) {
  1127. strncpy(serial, driver_serial, CAPI_SERIAL_LEN);
  1128. return CAPI_NOERROR;
  1129. }
  1130. if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING) 
  1131. return CAPI_REGNOTINSTALLED;
  1132. strncpy((void *) serial, CARD(contr)->serial, CAPI_SERIAL_LEN);
  1133. return CAPI_NOERROR;
  1134. }
  1135. static __u16 capi_get_profile(__u32 contr, struct capi_profile *profp)
  1136. {
  1137. if (contr == 0) {
  1138. profp->ncontroller = ncards;
  1139. return CAPI_NOERROR;
  1140. }
  1141. if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING) 
  1142. return CAPI_REGNOTINSTALLED;
  1143. memcpy((void *) profp, &CARD(contr)->profile,
  1144. sizeof(struct capi_profile));
  1145. return CAPI_NOERROR;
  1146. }
  1147. static struct capi_driver *find_driver(char *name)
  1148. {
  1149. struct capi_driver *dp;
  1150. spin_lock(&drivers_lock);
  1151. for (dp = drivers; dp; dp = dp->next)
  1152. if (strcmp(dp->name, name) == 0)
  1153. break;
  1154. spin_unlock(&drivers_lock);
  1155. return dp;
  1156. }
  1157. #ifdef CONFIG_AVMB1_COMPAT
  1158. static int old_capi_manufacturer(unsigned int cmd, void *data)
  1159. {
  1160. avmb1_loadandconfigdef ldef;
  1161. avmb1_extcarddef cdef;
  1162. avmb1_resetdef rdef;
  1163. avmb1_getdef gdef;
  1164. struct capi_driver *driver;
  1165. struct capi_ctr *card;
  1166. capicardparams cparams;
  1167. capiloaddata ldata;
  1168. int retval;
  1169. switch (cmd) {
  1170. case AVMB1_ADDCARD:
  1171. case AVMB1_ADDCARD_WITH_TYPE:
  1172. if (cmd == AVMB1_ADDCARD) {
  1173.    if ((retval = copy_from_user((void *) &cdef, data,
  1174.     sizeof(avmb1_carddef))))
  1175.    return retval;
  1176.    cdef.cardtype = AVM_CARDTYPE_B1;
  1177. } else {
  1178.    if ((retval = copy_from_user((void *) &cdef, data,
  1179.     sizeof(avmb1_extcarddef))))
  1180.    return retval;
  1181. }
  1182. cparams.port = cdef.port;
  1183. cparams.irq = cdef.irq;
  1184. cparams.cardnr = cdef.cardnr;
  1185.                 switch (cdef.cardtype) {
  1186. case AVM_CARDTYPE_B1:
  1187. driver = find_driver("b1isa");
  1188. break;
  1189. case AVM_CARDTYPE_T1:
  1190. driver = find_driver("t1isa");
  1191. break;
  1192. default:
  1193. driver = 0;
  1194. break;
  1195. }
  1196. if (!driver) {
  1197. printk(KERN_ERR "kcapi: driver not loaded.n");
  1198. return -EIO;
  1199. }
  1200. if (!driver->add_card) {
  1201. printk(KERN_ERR "kcapi: driver has no add card function.n");
  1202. return -EIO;
  1203. }
  1204. return driver->add_card(driver, &cparams);
  1205. case AVMB1_LOAD:
  1206. case AVMB1_LOAD_AND_CONFIG:
  1207. if (cmd == AVMB1_LOAD) {
  1208. if ((retval = copy_from_user((void *) &ldef, data,
  1209. sizeof(avmb1_loaddef))))
  1210. return retval;
  1211. ldef.t4config.len = 0;
  1212. ldef.t4config.data = 0;
  1213. } else {
  1214. if ((retval = copy_from_user((void *) &ldef, data,
  1215.      sizeof(avmb1_loadandconfigdef))))
  1216. return retval;
  1217. }
  1218. if (!VALID_CARD(ldef.contr))
  1219. return -ESRCH;
  1220. card = CARD(ldef.contr);
  1221. if (card->cardstate == CARD_FREE)
  1222. return -ESRCH;
  1223. if (card->driver->load_firmware == 0) {
  1224. printk(KERN_DEBUG "kcapi: load: driver %s" has no load functionn", card->driver->name);
  1225. return -ESRCH;
  1226. }
  1227. if (ldef.t4file.len <= 0) {
  1228. printk(KERN_DEBUG "kcapi: load: invalid parameter: length of t4file is %d ?n", ldef.t4file.len);
  1229. return -EINVAL;
  1230. }
  1231. if (ldef.t4file.data == 0) {
  1232. printk(KERN_DEBUG "kcapi: load: invalid parameter: dataptr is 0n");
  1233. return -EINVAL;
  1234. }
  1235. ldata.firmware.user = 1;
  1236. ldata.firmware.data = ldef.t4file.data;
  1237. ldata.firmware.len = ldef.t4file.len;
  1238. ldata.configuration.user = 1;
  1239. ldata.configuration.data = ldef.t4config.data;
  1240. ldata.configuration.len = ldef.t4config.len;
  1241. if (card->cardstate != CARD_DETECTED) {
  1242. printk(KERN_INFO "kcapi: load: contr=%d not in detect staten", ldef.contr);
  1243. return -EBUSY;
  1244. }
  1245. card->cardstate = CARD_LOADING;
  1246. retval = card->driver->load_firmware(card, &ldata);
  1247. if (retval) {
  1248. card->cardstate = CARD_DETECTED;
  1249. return retval;
  1250. }
  1251. while (card->cardstate != CARD_RUNNING) {
  1252. set_current_state(TASK_INTERRUPTIBLE);
  1253. schedule_timeout(HZ/10); /* 0.1 sec */
  1254. if (signal_pending(current))
  1255. return -EINTR;
  1256. }
  1257. return 0;
  1258. case AVMB1_RESETCARD:
  1259. if ((retval = copy_from_user((void *) &rdef, data,
  1260.  sizeof(avmb1_resetdef))))
  1261. return retval;
  1262. if (!VALID_CARD(rdef.contr))
  1263. return -ESRCH;
  1264. card = CARD(rdef.contr);
  1265. if (card->cardstate == CARD_FREE)
  1266. return -ESRCH;
  1267. if (card->cardstate == CARD_DETECTED)
  1268. return 0;
  1269. card->driver->reset_ctr(card);
  1270. while (card->cardstate > CARD_DETECTED) {
  1271. set_current_state(TASK_INTERRUPTIBLE);
  1272. schedule_timeout(HZ/10); /* 0.1 sec */
  1273. if (signal_pending(current))
  1274. return -EINTR;
  1275. }
  1276. return 0;
  1277. case AVMB1_GET_CARDINFO:
  1278. if ((retval = copy_from_user((void *) &gdef, data,
  1279.  sizeof(avmb1_getdef))))
  1280. return retval;
  1281. if (!VALID_CARD(gdef.contr))
  1282. return -ESRCH;
  1283. card = CARD(gdef.contr);
  1284. if (card->cardstate == CARD_FREE)
  1285. return -ESRCH;
  1286. gdef.cardstate = card->cardstate;
  1287. if (card->driver == find_driver("t1isa"))
  1288. gdef.cardtype = AVM_CARDTYPE_T1;
  1289. else gdef.cardtype = AVM_CARDTYPE_B1;
  1290. if ((retval = copy_to_user(data, (void *) &gdef,
  1291.  sizeof(avmb1_getdef))))
  1292. return retval;
  1293. return 0;
  1294. case AVMB1_REMOVECARD:
  1295. if ((retval = copy_from_user((void *) &rdef, data,
  1296.  sizeof(avmb1_resetdef))))
  1297. return retval;
  1298. if (!VALID_CARD(rdef.contr))
  1299. return -ESRCH;
  1300. card = CARD(rdef.contr);
  1301. if (card->cardstate == CARD_FREE)
  1302. return -ESRCH;
  1303. if (card->cardstate != CARD_DETECTED)
  1304. return -EBUSY;
  1305. card->driver->remove_ctr(card);
  1306. while (card->cardstate != CARD_FREE) {
  1307. set_current_state(TASK_INTERRUPTIBLE);
  1308. schedule_timeout(HZ/10); /* 0.1 sec */
  1309. if (signal_pending(current))
  1310. return -EINTR;
  1311. }
  1312. return 0;
  1313. }
  1314. return -EINVAL;
  1315. }
  1316. #endif
  1317. static int capi_manufacturer(unsigned int cmd, void *data)
  1318. {
  1319.         struct capi_ctr *card;
  1320. int retval;
  1321. switch (cmd) {
  1322. #ifdef CONFIG_AVMB1_COMPAT
  1323. case AVMB1_ADDCARD:
  1324. case AVMB1_ADDCARD_WITH_TYPE:
  1325. case AVMB1_LOAD:
  1326. case AVMB1_LOAD_AND_CONFIG:
  1327. case AVMB1_RESETCARD:
  1328. case AVMB1_GET_CARDINFO:
  1329. case AVMB1_REMOVECARD:
  1330. return old_capi_manufacturer(cmd, data);
  1331. #endif
  1332. case KCAPI_CMD_TRACE:
  1333. {
  1334. kcapi_flagdef fdef;
  1335. if ((retval = copy_from_user((void *) &fdef, data,
  1336.  sizeof(kcapi_flagdef))))
  1337. return retval;
  1338. if (!VALID_CARD(fdef.contr))
  1339. return -ESRCH;
  1340. card = CARD(fdef.contr);
  1341. if (card->cardstate == CARD_FREE)
  1342. return -ESRCH;
  1343. card->traceflag = fdef.flag;
  1344. printk(KERN_INFO "kcapi: contr %d set trace=%dn",
  1345. card->cnr, card->traceflag);
  1346. return 0;
  1347. }
  1348. case KCAPI_CMD_ADDCARD:
  1349. {
  1350. struct capi_driver *driver;
  1351. capicardparams cparams;
  1352. kcapi_carddef cdef;
  1353. if ((retval = copy_from_user((void *) &cdef, data,
  1354. sizeof(cdef))))
  1355. return retval;
  1356. cparams.port = cdef.port;
  1357. cparams.irq = cdef.irq;
  1358. cparams.membase = cdef.membase;
  1359. cparams.cardnr = cdef.cardnr;
  1360. cparams.cardtype = 0;
  1361. cdef.driver[sizeof(cdef.driver)-1] = 0;
  1362. if ((driver = find_driver(cdef.driver)) == 0) {
  1363. printk(KERN_ERR "kcapi: driver "%s" not loaded.n",
  1364. cdef.driver);
  1365. return -ESRCH;
  1366. }
  1367. if (!driver->add_card) {
  1368. printk(KERN_ERR "kcapi: driver "%s" has no add card function.n", cdef.driver);
  1369. return -EIO;
  1370. }
  1371. return driver->add_card(driver, &cparams);
  1372. }
  1373. default:
  1374. printk(KERN_ERR "kcapi: manufacturer command %d unknown.n",
  1375. cmd);
  1376. break;
  1377. }
  1378. return -EINVAL;
  1379. }
  1380. struct capi_interface avmb1_interface =
  1381. {
  1382. capi_isinstalled,
  1383. capi_register,
  1384. capi_release,
  1385. capi_put_message,
  1386. capi_get_message,
  1387. capi_set_signal,
  1388. capi_get_manufacturer,
  1389. capi_get_version,
  1390. capi_get_serial,
  1391. capi_get_profile,
  1392. capi_manufacturer
  1393. };
  1394. /* ------------------------------------------------------------- */
  1395. /* -------- Exported Functions --------------------------------- */
  1396. /* ------------------------------------------------------------- */
  1397. struct capi_interface *attach_capi_interface(struct capi_interface_user *userp)
  1398. {
  1399. struct capi_interface_user *p;
  1400. MOD_INC_USE_COUNT;
  1401. spin_lock(&capi_users_lock);
  1402. for (p = capi_users; p; p = p->next) {
  1403. if (p == userp) {
  1404. spin_unlock(&capi_users_lock);
  1405. printk(KERN_ERR "kcapi: double attach from %sn",
  1406.        userp->name);
  1407. MOD_DEC_USE_COUNT;
  1408. return 0;
  1409. }
  1410. }
  1411. userp->next = capi_users;
  1412. capi_users = userp;
  1413. spin_unlock(&capi_users_lock);
  1414. printk(KERN_NOTICE "kcapi: %s attachedn", userp->name);
  1415. return &avmb1_interface;
  1416. }
  1417. int detach_capi_interface(struct capi_interface_user *userp)
  1418. {
  1419. struct capi_interface_user **pp;
  1420. spin_lock(&capi_users_lock);
  1421. for (pp = &capi_users; *pp; pp = &(*pp)->next) {
  1422. if (*pp == userp) {
  1423. *pp = userp->next;
  1424. spin_unlock(&capi_users_lock);
  1425. userp->next = 0;
  1426. printk(KERN_NOTICE "kcapi: %s detachedn", userp->name);
  1427. MOD_DEC_USE_COUNT;
  1428. return 0;
  1429. }
  1430. }
  1431. spin_unlock(&capi_users_lock);
  1432. printk(KERN_ERR "kcapi: double detach from %sn", userp->name);
  1433. return -1;
  1434. }
  1435. /* ------------------------------------------------------------- */
  1436. /* -------- Init & Cleanup ------------------------------------- */
  1437. /* ------------------------------------------------------------- */
  1438. EXPORT_SYMBOL(attach_capi_interface);
  1439. EXPORT_SYMBOL(detach_capi_interface);
  1440. EXPORT_SYMBOL(attach_capi_driver);
  1441. EXPORT_SYMBOL(detach_capi_driver);
  1442. /*
  1443.  * init / exit functions
  1444.  */
  1445. static int __init kcapi_init(void)
  1446. {
  1447. char *p;
  1448. char rev[32];
  1449. MOD_INC_USE_COUNT;
  1450. skb_queue_head_init(&recv_queue);
  1451. tq_state_notify.routine = notify_handler;
  1452. tq_state_notify.data = 0;
  1453. tq_recv_notify.routine = recv_handler;
  1454. tq_recv_notify.data = 0;
  1455.         proc_capi_init();
  1456. if ((p = strchr(revision, ':')) != 0 && p[1]) {
  1457. strncpy(rev, p + 2, sizeof(rev));
  1458. rev[sizeof(rev)-1] = 0;
  1459. if ((p = strchr(rev, '$')) != 0 && p > rev)
  1460.    *(p-1) = 0;
  1461. } else
  1462. strcpy(rev, "1.0");
  1463. #ifdef MODULE
  1464.         printk(KERN_NOTICE "CAPI-driver Rev %s: loadedn", rev);
  1465. #else
  1466. printk(KERN_NOTICE "CAPI-driver Rev %s: startedn", rev);
  1467. #endif
  1468. MOD_DEC_USE_COUNT;
  1469. return 0;
  1470. }
  1471. static void __exit kcapi_exit(void)
  1472. {
  1473. char rev[10];
  1474. char *p;
  1475. if ((p = strchr(revision, ':'))) {
  1476. strcpy(rev, p + 1);
  1477. p = strchr(rev, '$');
  1478. *p = 0;
  1479. } else {
  1480. strcpy(rev, "1.0");
  1481. }
  1482.         proc_capi_exit();
  1483. printk(KERN_NOTICE "CAPI-driver Rev%s: unloadedn", rev);
  1484. }
  1485. module_init(kcapi_init);
  1486. module_exit(kcapi_exit);