kcapi.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291
  1. /* $Id: kcapi.c,v 1.1.2.8 2004/03/26 19:57:20 armin Exp $
  2. *
  3. * Kernel CAPI 2.0 Module
  4. *
  5. * Copyright 1999 by Carsten Paeth <calle@calle.de>
  6. * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name>
  7. *
  8. * This software may be used and distributed according to the terms
  9. * of the GNU General Public License, incorporated herein by reference.
  10. *
  11. */
  12. #define AVMB1_COMPAT
  13. #include "kcapi.h"
  14. #include <linux/module.h>
  15. #include <linux/mm.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/ioport.h>
  18. #include <linux/proc_fs.h>
  19. #include <linux/sched.h>
  20. #include <linux/seq_file.h>
  21. #include <linux/skbuff.h>
  22. #include <linux/workqueue.h>
  23. #include <linux/capi.h>
  24. #include <linux/kernelcapi.h>
  25. #include <linux/init.h>
  26. #include <linux/moduleparam.h>
  27. #include <linux/delay.h>
  28. #include <linux/slab.h>
  29. #include <asm/uaccess.h>
  30. #include <linux/isdn/capicmd.h>
  31. #include <linux/isdn/capiutil.h>
  32. #ifdef AVMB1_COMPAT
  33. #include <linux/b1lli.h>
  34. #endif
  35. #include <linux/mutex.h>
  36. #include <linux/rcupdate.h>
  37. static int showcapimsgs = 0;
  38. MODULE_DESCRIPTION("CAPI4Linux: kernel CAPI layer");
  39. MODULE_AUTHOR("Carsten Paeth");
  40. MODULE_LICENSE("GPL");
  41. module_param(showcapimsgs, uint, 0);
  42. /* ------------------------------------------------------------- */
  43. struct capictr_event {
  44. struct work_struct work;
  45. unsigned int type;
  46. u32 controller;
  47. };
  48. /* ------------------------------------------------------------- */
  49. static struct capi_version driver_version = {2, 0, 1, 1<<4};
  50. static char driver_serial[CAPI_SERIAL_LEN] = "0004711";
  51. static char capi_manufakturer[64] = "AVM Berlin";
  52. #define NCCI2CTRL(ncci) (((ncci) >> 24) & 0x7f)
  53. LIST_HEAD(capi_drivers);
  54. DEFINE_MUTEX(capi_drivers_lock);
  55. struct capi_ctr *capi_controller[CAPI_MAXCONTR];
  56. DEFINE_MUTEX(capi_controller_lock);
  57. struct capi20_appl *capi_applications[CAPI_MAXAPPL];
  58. static int ncontrollers;
  59. static BLOCKING_NOTIFIER_HEAD(ctr_notifier_list);
  60. /* -------- controller ref counting -------------------------------------- */
  61. static inline struct capi_ctr *
  62. capi_ctr_get(struct capi_ctr *ctr)
  63. {
  64. if (!try_module_get(ctr->owner))
  65. return NULL;
  66. return ctr;
  67. }
  68. static inline void
  69. capi_ctr_put(struct capi_ctr *ctr)
  70. {
  71. module_put(ctr->owner);
  72. }
  73. /* ------------------------------------------------------------- */
  74. static inline struct capi_ctr *get_capi_ctr_by_nr(u16 contr)
  75. {
  76. if (contr - 1 >= CAPI_MAXCONTR)
  77. return NULL;
  78. return capi_controller[contr - 1];
  79. }
  80. static inline struct capi20_appl *get_capi_appl_by_nr(u16 applid)
  81. {
  82. if (applid - 1 >= CAPI_MAXAPPL)
  83. return NULL;
  84. return rcu_dereference(capi_applications[applid - 1]);
  85. }
  86. /* -------- util functions ------------------------------------ */
  87. static inline int capi_cmd_valid(u8 cmd)
  88. {
  89. switch (cmd) {
  90. case CAPI_ALERT:
  91. case CAPI_CONNECT:
  92. case CAPI_CONNECT_ACTIVE:
  93. case CAPI_CONNECT_B3_ACTIVE:
  94. case CAPI_CONNECT_B3:
  95. case CAPI_CONNECT_B3_T90_ACTIVE:
  96. case CAPI_DATA_B3:
  97. case CAPI_DISCONNECT_B3:
  98. case CAPI_DISCONNECT:
  99. case CAPI_FACILITY:
  100. case CAPI_INFO:
  101. case CAPI_LISTEN:
  102. case CAPI_MANUFACTURER:
  103. case CAPI_RESET_B3:
  104. case CAPI_SELECT_B_PROTOCOL:
  105. return 1;
  106. }
  107. return 0;
  108. }
  109. static inline int capi_subcmd_valid(u8 subcmd)
  110. {
  111. switch (subcmd) {
  112. case CAPI_REQ:
  113. case CAPI_CONF:
  114. case CAPI_IND:
  115. case CAPI_RESP:
  116. return 1;
  117. }
  118. return 0;
  119. }
  120. /* ------------------------------------------------------------ */
  121. static void
  122. register_appl(struct capi_ctr *ctr, u16 applid, capi_register_params *rparam)
  123. {
  124. ctr = capi_ctr_get(ctr);
  125. if (ctr)
  126. ctr->register_appl(ctr, applid, rparam);
  127. else
  128. printk(KERN_WARNING "%s: cannot get controller resources\n",
  129. __func__);
  130. }
  131. static void release_appl(struct capi_ctr *ctr, u16 applid)
  132. {
  133. DBG("applid %#x", applid);
  134. ctr->release_appl(ctr, applid);
  135. capi_ctr_put(ctr);
  136. }
  137. static void notify_up(u32 contr)
  138. {
  139. struct capi20_appl *ap;
  140. struct capi_ctr *ctr;
  141. u16 applid;
  142. mutex_lock(&capi_controller_lock);
  143. if (showcapimsgs & 1)
  144. printk(KERN_DEBUG "kcapi: notify up contr %d\n", contr);
  145. ctr = get_capi_ctr_by_nr(contr);
  146. if (ctr) {
  147. if (ctr->state == CAPI_CTR_RUNNING)
  148. goto unlock_out;
  149. ctr->state = CAPI_CTR_RUNNING;
  150. for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
  151. ap = get_capi_appl_by_nr(applid);
  152. if (!ap)
  153. continue;
  154. register_appl(ctr, applid, &ap->rparam);
  155. }
  156. wake_up_interruptible_all(&ctr->state_wait_queue);
  157. } else
  158. printk(KERN_WARNING "%s: invalid contr %d\n", __func__, contr);
  159. unlock_out:
  160. mutex_unlock(&capi_controller_lock);
  161. }
  162. static void ctr_down(struct capi_ctr *ctr, int new_state)
  163. {
  164. struct capi20_appl *ap;
  165. u16 applid;
  166. if (ctr->state == CAPI_CTR_DETECTED || ctr->state == CAPI_CTR_DETACHED)
  167. return;
  168. ctr->state = new_state;
  169. memset(ctr->manu, 0, sizeof(ctr->manu));
  170. memset(&ctr->version, 0, sizeof(ctr->version));
  171. memset(&ctr->profile, 0, sizeof(ctr->profile));
  172. memset(ctr->serial, 0, sizeof(ctr->serial));
  173. for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
  174. ap = get_capi_appl_by_nr(applid);
  175. if (ap)
  176. capi_ctr_put(ctr);
  177. }
  178. wake_up_interruptible_all(&ctr->state_wait_queue);
  179. }
  180. static void notify_down(u32 contr)
  181. {
  182. struct capi_ctr *ctr;
  183. mutex_lock(&capi_controller_lock);
  184. if (showcapimsgs & 1)
  185. printk(KERN_DEBUG "kcapi: notify down contr %d\n", contr);
  186. ctr = get_capi_ctr_by_nr(contr);
  187. if (ctr)
  188. ctr_down(ctr, CAPI_CTR_DETECTED);
  189. else
  190. printk(KERN_WARNING "%s: invalid contr %d\n", __func__, contr);
  191. mutex_unlock(&capi_controller_lock);
  192. }
  193. static int
  194. notify_handler(struct notifier_block *nb, unsigned long val, void *v)
  195. {
  196. u32 contr = (long)v;
  197. switch (val) {
  198. case CAPICTR_UP:
  199. notify_up(contr);
  200. break;
  201. case CAPICTR_DOWN:
  202. notify_down(contr);
  203. break;
  204. }
  205. return NOTIFY_OK;
  206. }
  207. static void do_notify_work(struct work_struct *work)
  208. {
  209. struct capictr_event *event =
  210. container_of(work, struct capictr_event, work);
  211. blocking_notifier_call_chain(&ctr_notifier_list, event->type,
  212. (void *)(long)event->controller);
  213. kfree(event);
  214. }
  215. /*
  216. * The notifier will result in adding/deleteing of devices. Devices can
  217. * only removed in user process, not in bh.
  218. */
  219. static int notify_push(unsigned int event_type, u32 controller)
  220. {
  221. struct capictr_event *event = kmalloc(sizeof(*event), GFP_ATOMIC);
  222. if (!event)
  223. return -ENOMEM;
  224. INIT_WORK(&event->work, do_notify_work);
  225. event->type = event_type;
  226. event->controller = controller;
  227. schedule_work(&event->work);
  228. return 0;
  229. }
  230. int register_capictr_notifier(struct notifier_block *nb)
  231. {
  232. return blocking_notifier_chain_register(&ctr_notifier_list, nb);
  233. }
  234. EXPORT_SYMBOL_GPL(register_capictr_notifier);
  235. int unregister_capictr_notifier(struct notifier_block *nb)
  236. {
  237. return blocking_notifier_chain_unregister(&ctr_notifier_list, nb);
  238. }
  239. EXPORT_SYMBOL_GPL(unregister_capictr_notifier);
  240. /* -------- Receiver ------------------------------------------ */
  241. static void recv_handler(struct work_struct *work)
  242. {
  243. struct sk_buff *skb;
  244. struct capi20_appl *ap =
  245. container_of(work, struct capi20_appl, recv_work);
  246. if ((!ap) || (ap->release_in_progress))
  247. return;
  248. mutex_lock(&ap->recv_mtx);
  249. while ((skb = skb_dequeue(&ap->recv_queue))) {
  250. if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_IND)
  251. ap->nrecvdatapkt++;
  252. else
  253. ap->nrecvctlpkt++;
  254. ap->recv_message(ap, skb);
  255. }
  256. mutex_unlock(&ap->recv_mtx);
  257. }
  258. /**
  259. * capi_ctr_handle_message() - handle incoming CAPI message
  260. * @ctr: controller descriptor structure.
  261. * @appl: application ID.
  262. * @skb: message.
  263. *
  264. * Called by hardware driver to pass a CAPI message to the application.
  265. */
  266. void capi_ctr_handle_message(struct capi_ctr *ctr, u16 appl,
  267. struct sk_buff *skb)
  268. {
  269. struct capi20_appl *ap;
  270. int showctl = 0;
  271. u8 cmd, subcmd;
  272. _cdebbuf *cdb;
  273. if (ctr->state != CAPI_CTR_RUNNING) {
  274. cdb = capi_message2str(skb->data);
  275. if (cdb) {
  276. printk(KERN_INFO "kcapi: controller [%03d] not active, got: %s",
  277. ctr->cnr, cdb->buf);
  278. cdebbuf_free(cdb);
  279. } else
  280. printk(KERN_INFO "kcapi: controller [%03d] not active, cannot trace\n",
  281. ctr->cnr);
  282. goto error;
  283. }
  284. cmd = CAPIMSG_COMMAND(skb->data);
  285. subcmd = CAPIMSG_SUBCOMMAND(skb->data);
  286. if (cmd == CAPI_DATA_B3 && subcmd == CAPI_IND) {
  287. ctr->nrecvdatapkt++;
  288. if (ctr->traceflag > 2)
  289. showctl |= 2;
  290. } else {
  291. ctr->nrecvctlpkt++;
  292. if (ctr->traceflag)
  293. showctl |= 2;
  294. }
  295. showctl |= (ctr->traceflag & 1);
  296. if (showctl & 2) {
  297. if (showctl & 1) {
  298. printk(KERN_DEBUG "kcapi: got [%03d] id#%d %s len=%u\n",
  299. ctr->cnr, CAPIMSG_APPID(skb->data),
  300. capi_cmd2str(cmd, subcmd),
  301. CAPIMSG_LEN(skb->data));
  302. } else {
  303. cdb = capi_message2str(skb->data);
  304. if (cdb) {
  305. printk(KERN_DEBUG "kcapi: got [%03d] %s\n",
  306. ctr->cnr, cdb->buf);
  307. cdebbuf_free(cdb);
  308. } else
  309. printk(KERN_DEBUG "kcapi: got [%03d] id#%d %s len=%u, cannot trace\n",
  310. ctr->cnr, CAPIMSG_APPID(skb->data),
  311. capi_cmd2str(cmd, subcmd),
  312. CAPIMSG_LEN(skb->data));
  313. }
  314. }
  315. rcu_read_lock();
  316. ap = get_capi_appl_by_nr(CAPIMSG_APPID(skb->data));
  317. if (!ap) {
  318. rcu_read_unlock();
  319. cdb = capi_message2str(skb->data);
  320. if (cdb) {
  321. printk(KERN_ERR "kcapi: handle_message: applid %d state released (%s)\n",
  322. CAPIMSG_APPID(skb->data), cdb->buf);
  323. cdebbuf_free(cdb);
  324. } else
  325. printk(KERN_ERR "kcapi: handle_message: applid %d state released (%s) cannot trace\n",
  326. CAPIMSG_APPID(skb->data),
  327. capi_cmd2str(cmd, subcmd));
  328. goto error;
  329. }
  330. skb_queue_tail(&ap->recv_queue, skb);
  331. schedule_work(&ap->recv_work);
  332. rcu_read_unlock();
  333. return;
  334. error:
  335. kfree_skb(skb);
  336. }
  337. EXPORT_SYMBOL(capi_ctr_handle_message);
  338. /**
  339. * capi_ctr_ready() - signal CAPI controller ready
  340. * @ctr: controller descriptor structure.
  341. *
  342. * Called by hardware driver to signal that the controller is up and running.
  343. */
  344. void capi_ctr_ready(struct capi_ctr *ctr)
  345. {
  346. printk(KERN_NOTICE "kcapi: controller [%03d] \"%s\" ready.\n",
  347. ctr->cnr, ctr->name);
  348. notify_push(CAPICTR_UP, ctr->cnr);
  349. }
  350. EXPORT_SYMBOL(capi_ctr_ready);
  351. /**
  352. * capi_ctr_down() - signal CAPI controller not ready
  353. * @ctr: controller descriptor structure.
  354. *
  355. * Called by hardware driver to signal that the controller is down and
  356. * unavailable for use.
  357. */
  358. void capi_ctr_down(struct capi_ctr *ctr)
  359. {
  360. printk(KERN_NOTICE "kcapi: controller [%03d] down.\n", ctr->cnr);
  361. notify_push(CAPICTR_DOWN, ctr->cnr);
  362. }
  363. EXPORT_SYMBOL(capi_ctr_down);
  364. /**
  365. * capi_ctr_suspend_output() - suspend controller
  366. * @ctr: controller descriptor structure.
  367. *
  368. * Called by hardware driver to stop data flow.
  369. *
  370. * Note: The caller is responsible for synchronizing concurrent state changes
  371. * as well as invocations of capi_ctr_handle_message.
  372. */
  373. void capi_ctr_suspend_output(struct capi_ctr *ctr)
  374. {
  375. if (!ctr->blocked) {
  376. printk(KERN_DEBUG "kcapi: controller [%03d] suspend\n",
  377. ctr->cnr);
  378. ctr->blocked = 1;
  379. }
  380. }
  381. EXPORT_SYMBOL(capi_ctr_suspend_output);
  382. /**
  383. * capi_ctr_resume_output() - resume controller
  384. * @ctr: controller descriptor structure.
  385. *
  386. * Called by hardware driver to resume data flow.
  387. *
  388. * Note: The caller is responsible for synchronizing concurrent state changes
  389. * as well as invocations of capi_ctr_handle_message.
  390. */
  391. void capi_ctr_resume_output(struct capi_ctr *ctr)
  392. {
  393. if (ctr->blocked) {
  394. printk(KERN_DEBUG "kcapi: controller [%03d] resumed\n",
  395. ctr->cnr);
  396. ctr->blocked = 0;
  397. }
  398. }
  399. EXPORT_SYMBOL(capi_ctr_resume_output);
  400. /* ------------------------------------------------------------- */
  401. /**
  402. * attach_capi_ctr() - register CAPI controller
  403. * @ctr: controller descriptor structure.
  404. *
  405. * Called by hardware driver to register a controller with the CAPI subsystem.
  406. * Return value: 0 on success, error code < 0 on error
  407. */
  408. int attach_capi_ctr(struct capi_ctr *ctr)
  409. {
  410. int i;
  411. mutex_lock(&capi_controller_lock);
  412. for (i = 0; i < CAPI_MAXCONTR; i++) {
  413. if (!capi_controller[i])
  414. break;
  415. }
  416. if (i == CAPI_MAXCONTR) {
  417. mutex_unlock(&capi_controller_lock);
  418. printk(KERN_ERR "kcapi: out of controller slots\n");
  419. return -EBUSY;
  420. }
  421. capi_controller[i] = ctr;
  422. ctr->nrecvctlpkt = 0;
  423. ctr->nrecvdatapkt = 0;
  424. ctr->nsentctlpkt = 0;
  425. ctr->nsentdatapkt = 0;
  426. ctr->cnr = i + 1;
  427. ctr->state = CAPI_CTR_DETECTED;
  428. ctr->blocked = 0;
  429. ctr->traceflag = showcapimsgs;
  430. init_waitqueue_head(&ctr->state_wait_queue);
  431. sprintf(ctr->procfn, "capi/controllers/%d", ctr->cnr);
  432. ctr->procent = proc_create_data(ctr->procfn, 0, NULL, ctr->proc_fops, ctr);
  433. ncontrollers++;
  434. mutex_unlock(&capi_controller_lock);
  435. printk(KERN_NOTICE "kcapi: controller [%03d]: %s attached\n",
  436. ctr->cnr, ctr->name);
  437. return 0;
  438. }
  439. EXPORT_SYMBOL(attach_capi_ctr);
  440. /**
  441. * detach_capi_ctr() - unregister CAPI controller
  442. * @ctr: controller descriptor structure.
  443. *
  444. * Called by hardware driver to remove the registration of a controller
  445. * with the CAPI subsystem.
  446. * Return value: 0 on success, error code < 0 on error
  447. */
  448. int detach_capi_ctr(struct capi_ctr *ctr)
  449. {
  450. int err = 0;
  451. mutex_lock(&capi_controller_lock);
  452. ctr_down(ctr, CAPI_CTR_DETACHED);
  453. if (capi_controller[ctr->cnr - 1] != ctr) {
  454. err = -EINVAL;
  455. goto unlock_out;
  456. }
  457. capi_controller[ctr->cnr - 1] = NULL;
  458. ncontrollers--;
  459. if (ctr->procent)
  460. remove_proc_entry(ctr->procfn, NULL);
  461. printk(KERN_NOTICE "kcapi: controller [%03d]: %s unregistered\n",
  462. ctr->cnr, ctr->name);
  463. unlock_out:
  464. mutex_unlock(&capi_controller_lock);
  465. return err;
  466. }
  467. EXPORT_SYMBOL(detach_capi_ctr);
  468. /**
  469. * register_capi_driver() - register CAPI driver
  470. * @driver: driver descriptor structure.
  471. *
  472. * Called by hardware driver to register itself with the CAPI subsystem.
  473. */
  474. void register_capi_driver(struct capi_driver *driver)
  475. {
  476. mutex_lock(&capi_drivers_lock);
  477. list_add_tail(&driver->list, &capi_drivers);
  478. mutex_unlock(&capi_drivers_lock);
  479. }
  480. EXPORT_SYMBOL(register_capi_driver);
  481. /**
  482. * unregister_capi_driver() - unregister CAPI driver
  483. * @driver: driver descriptor structure.
  484. *
  485. * Called by hardware driver to unregister itself from the CAPI subsystem.
  486. */
  487. void unregister_capi_driver(struct capi_driver *driver)
  488. {
  489. mutex_lock(&capi_drivers_lock);
  490. list_del(&driver->list);
  491. mutex_unlock(&capi_drivers_lock);
  492. }
  493. EXPORT_SYMBOL(unregister_capi_driver);
  494. /* ------------------------------------------------------------- */
  495. /* -------- CAPI2.0 Interface ---------------------------------- */
  496. /* ------------------------------------------------------------- */
  497. /**
  498. * capi20_isinstalled() - CAPI 2.0 operation CAPI_INSTALLED
  499. *
  500. * Return value: CAPI result code (CAPI_NOERROR if at least one ISDN controller
  501. * is ready for use, CAPI_REGNOTINSTALLED otherwise)
  502. */
  503. u16 capi20_isinstalled(void)
  504. {
  505. u16 ret = CAPI_REGNOTINSTALLED;
  506. int i;
  507. mutex_lock(&capi_controller_lock);
  508. for (i = 0; i < CAPI_MAXCONTR; i++)
  509. if (capi_controller[i] &&
  510. capi_controller[i]->state == CAPI_CTR_RUNNING) {
  511. ret = CAPI_NOERROR;
  512. break;
  513. }
  514. mutex_unlock(&capi_controller_lock);
  515. return ret;
  516. }
  517. EXPORT_SYMBOL(capi20_isinstalled);
  518. /**
  519. * capi20_register() - CAPI 2.0 operation CAPI_REGISTER
  520. * @ap: CAPI application descriptor structure.
  521. *
  522. * Register an application's presence with CAPI.
  523. * A unique application ID is assigned and stored in @ap->applid.
  524. * After this function returns successfully, the message receive
  525. * callback function @ap->recv_message() may be called at any time
  526. * until capi20_release() has been called for the same @ap.
  527. * Return value: CAPI result code
  528. */
  529. u16 capi20_register(struct capi20_appl *ap)
  530. {
  531. int i;
  532. u16 applid;
  533. DBG("");
  534. if (ap->rparam.datablklen < 128)
  535. return CAPI_LOGBLKSIZETOSMALL;
  536. ap->nrecvctlpkt = 0;
  537. ap->nrecvdatapkt = 0;
  538. ap->nsentctlpkt = 0;
  539. ap->nsentdatapkt = 0;
  540. mutex_init(&ap->recv_mtx);
  541. skb_queue_head_init(&ap->recv_queue);
  542. INIT_WORK(&ap->recv_work, recv_handler);
  543. ap->release_in_progress = 0;
  544. mutex_lock(&capi_controller_lock);
  545. for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
  546. if (capi_applications[applid - 1] == NULL)
  547. break;
  548. }
  549. if (applid > CAPI_MAXAPPL) {
  550. mutex_unlock(&capi_controller_lock);
  551. return CAPI_TOOMANYAPPLS;
  552. }
  553. ap->applid = applid;
  554. capi_applications[applid - 1] = ap;
  555. for (i = 0; i < CAPI_MAXCONTR; i++) {
  556. if (!capi_controller[i] ||
  557. capi_controller[i]->state != CAPI_CTR_RUNNING)
  558. continue;
  559. register_appl(capi_controller[i], applid, &ap->rparam);
  560. }
  561. mutex_unlock(&capi_controller_lock);
  562. if (showcapimsgs & 1) {
  563. printk(KERN_DEBUG "kcapi: appl %d up\n", applid);
  564. }
  565. return CAPI_NOERROR;
  566. }
  567. EXPORT_SYMBOL(capi20_register);
  568. /**
  569. * capi20_release() - CAPI 2.0 operation CAPI_RELEASE
  570. * @ap: CAPI application descriptor structure.
  571. *
  572. * Terminate an application's registration with CAPI.
  573. * After this function returns successfully, the message receive
  574. * callback function @ap->recv_message() will no longer be called.
  575. * Return value: CAPI result code
  576. */
  577. u16 capi20_release(struct capi20_appl *ap)
  578. {
  579. int i;
  580. DBG("applid %#x", ap->applid);
  581. mutex_lock(&capi_controller_lock);
  582. ap->release_in_progress = 1;
  583. capi_applications[ap->applid - 1] = NULL;
  584. synchronize_rcu();
  585. for (i = 0; i < CAPI_MAXCONTR; i++) {
  586. if (!capi_controller[i] ||
  587. capi_controller[i]->state != CAPI_CTR_RUNNING)
  588. continue;
  589. release_appl(capi_controller[i], ap->applid);
  590. }
  591. mutex_unlock(&capi_controller_lock);
  592. flush_scheduled_work();
  593. skb_queue_purge(&ap->recv_queue);
  594. if (showcapimsgs & 1) {
  595. printk(KERN_DEBUG "kcapi: appl %d down\n", ap->applid);
  596. }
  597. return CAPI_NOERROR;
  598. }
  599. EXPORT_SYMBOL(capi20_release);
  600. /**
  601. * capi20_put_message() - CAPI 2.0 operation CAPI_PUT_MESSAGE
  602. * @ap: CAPI application descriptor structure.
  603. * @skb: CAPI message.
  604. *
  605. * Transfer a single message to CAPI.
  606. * Return value: CAPI result code
  607. */
  608. u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb)
  609. {
  610. struct capi_ctr *ctr;
  611. int showctl = 0;
  612. u8 cmd, subcmd;
  613. DBG("applid %#x", ap->applid);
  614. if (ncontrollers == 0)
  615. return CAPI_REGNOTINSTALLED;
  616. if ((ap->applid == 0) || ap->release_in_progress)
  617. return CAPI_ILLAPPNR;
  618. if (skb->len < 12
  619. || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data))
  620. || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb->data)))
  621. return CAPI_ILLCMDORSUBCMDORMSGTOSMALL;
  622. /*
  623. * The controller reference is protected by the existence of the
  624. * application passed to us. We assume that the caller properly
  625. * synchronizes this service with capi20_release.
  626. */
  627. ctr = get_capi_ctr_by_nr(CAPIMSG_CONTROLLER(skb->data));
  628. if (!ctr || ctr->state != CAPI_CTR_RUNNING)
  629. return CAPI_REGNOTINSTALLED;
  630. if (ctr->blocked)
  631. return CAPI_SENDQUEUEFULL;
  632. cmd = CAPIMSG_COMMAND(skb->data);
  633. subcmd = CAPIMSG_SUBCOMMAND(skb->data);
  634. if (cmd == CAPI_DATA_B3 && subcmd== CAPI_REQ) {
  635. ctr->nsentdatapkt++;
  636. ap->nsentdatapkt++;
  637. if (ctr->traceflag > 2)
  638. showctl |= 2;
  639. } else {
  640. ctr->nsentctlpkt++;
  641. ap->nsentctlpkt++;
  642. if (ctr->traceflag)
  643. showctl |= 2;
  644. }
  645. showctl |= (ctr->traceflag & 1);
  646. if (showctl & 2) {
  647. if (showctl & 1) {
  648. printk(KERN_DEBUG "kcapi: put [%03d] id#%d %s len=%u\n",
  649. CAPIMSG_CONTROLLER(skb->data),
  650. CAPIMSG_APPID(skb->data),
  651. capi_cmd2str(cmd, subcmd),
  652. CAPIMSG_LEN(skb->data));
  653. } else {
  654. _cdebbuf *cdb = capi_message2str(skb->data);
  655. if (cdb) {
  656. printk(KERN_DEBUG "kcapi: put [%03d] %s\n",
  657. CAPIMSG_CONTROLLER(skb->data),
  658. cdb->buf);
  659. cdebbuf_free(cdb);
  660. } else
  661. printk(KERN_DEBUG "kcapi: put [%03d] id#%d %s len=%u cannot trace\n",
  662. CAPIMSG_CONTROLLER(skb->data),
  663. CAPIMSG_APPID(skb->data),
  664. capi_cmd2str(cmd, subcmd),
  665. CAPIMSG_LEN(skb->data));
  666. }
  667. }
  668. return ctr->send_message(ctr, skb);
  669. }
  670. EXPORT_SYMBOL(capi20_put_message);
  671. /**
  672. * capi20_get_manufacturer() - CAPI 2.0 operation CAPI_GET_MANUFACTURER
  673. * @contr: controller number.
  674. * @buf: result buffer (64 bytes).
  675. *
  676. * Retrieve information about the manufacturer of the specified ISDN controller
  677. * or (for @contr == 0) the driver itself.
  678. * Return value: CAPI result code
  679. */
  680. u16 capi20_get_manufacturer(u32 contr, u8 *buf)
  681. {
  682. struct capi_ctr *ctr;
  683. u16 ret;
  684. if (contr == 0) {
  685. strlcpy(buf, capi_manufakturer, CAPI_MANUFACTURER_LEN);
  686. return CAPI_NOERROR;
  687. }
  688. mutex_lock(&capi_controller_lock);
  689. ctr = get_capi_ctr_by_nr(contr);
  690. if (ctr && ctr->state == CAPI_CTR_RUNNING) {
  691. strlcpy(buf, ctr->manu, CAPI_MANUFACTURER_LEN);
  692. ret = CAPI_NOERROR;
  693. } else
  694. ret = CAPI_REGNOTINSTALLED;
  695. mutex_unlock(&capi_controller_lock);
  696. return ret;
  697. }
  698. EXPORT_SYMBOL(capi20_get_manufacturer);
  699. /**
  700. * capi20_get_version() - CAPI 2.0 operation CAPI_GET_VERSION
  701. * @contr: controller number.
  702. * @verp: result structure.
  703. *
  704. * Retrieve version information for the specified ISDN controller
  705. * or (for @contr == 0) the driver itself.
  706. * Return value: CAPI result code
  707. */
  708. u16 capi20_get_version(u32 contr, struct capi_version *verp)
  709. {
  710. struct capi_ctr *ctr;
  711. u16 ret;
  712. if (contr == 0) {
  713. *verp = driver_version;
  714. return CAPI_NOERROR;
  715. }
  716. mutex_lock(&capi_controller_lock);
  717. ctr = get_capi_ctr_by_nr(contr);
  718. if (ctr && ctr->state == CAPI_CTR_RUNNING) {
  719. memcpy(verp, &ctr->version, sizeof(capi_version));
  720. ret = CAPI_NOERROR;
  721. } else
  722. ret = CAPI_REGNOTINSTALLED;
  723. mutex_unlock(&capi_controller_lock);
  724. return ret;
  725. }
  726. EXPORT_SYMBOL(capi20_get_version);
  727. /**
  728. * capi20_get_serial() - CAPI 2.0 operation CAPI_GET_SERIAL_NUMBER
  729. * @contr: controller number.
  730. * @serial: result buffer (8 bytes).
  731. *
  732. * Retrieve the serial number of the specified ISDN controller
  733. * or (for @contr == 0) the driver itself.
  734. * Return value: CAPI result code
  735. */
  736. u16 capi20_get_serial(u32 contr, u8 *serial)
  737. {
  738. struct capi_ctr *ctr;
  739. u16 ret;
  740. if (contr == 0) {
  741. strlcpy(serial, driver_serial, CAPI_SERIAL_LEN);
  742. return CAPI_NOERROR;
  743. }
  744. mutex_lock(&capi_controller_lock);
  745. ctr = get_capi_ctr_by_nr(contr);
  746. if (ctr && ctr->state == CAPI_CTR_RUNNING) {
  747. strlcpy(serial, ctr->serial, CAPI_SERIAL_LEN);
  748. ret = CAPI_NOERROR;
  749. } else
  750. ret = CAPI_REGNOTINSTALLED;
  751. mutex_unlock(&capi_controller_lock);
  752. return ret;
  753. }
  754. EXPORT_SYMBOL(capi20_get_serial);
  755. /**
  756. * capi20_get_profile() - CAPI 2.0 operation CAPI_GET_PROFILE
  757. * @contr: controller number.
  758. * @profp: result structure.
  759. *
  760. * Retrieve capability information for the specified ISDN controller
  761. * or (for @contr == 0) the number of installed controllers.
  762. * Return value: CAPI result code
  763. */
  764. u16 capi20_get_profile(u32 contr, struct capi_profile *profp)
  765. {
  766. struct capi_ctr *ctr;
  767. u16 ret;
  768. if (contr == 0) {
  769. profp->ncontroller = ncontrollers;
  770. return CAPI_NOERROR;
  771. }
  772. mutex_lock(&capi_controller_lock);
  773. ctr = get_capi_ctr_by_nr(contr);
  774. if (ctr && ctr->state == CAPI_CTR_RUNNING) {
  775. memcpy(profp, &ctr->profile, sizeof(struct capi_profile));
  776. ret = CAPI_NOERROR;
  777. } else
  778. ret = CAPI_REGNOTINSTALLED;
  779. mutex_unlock(&capi_controller_lock);
  780. return ret;
  781. }
  782. EXPORT_SYMBOL(capi20_get_profile);
  783. /* Must be called with capi_controller_lock held. */
  784. static int wait_on_ctr_state(struct capi_ctr *ctr, unsigned int state)
  785. {
  786. DEFINE_WAIT(wait);
  787. int retval = 0;
  788. ctr = capi_ctr_get(ctr);
  789. if (!ctr)
  790. return -ESRCH;
  791. for (;;) {
  792. prepare_to_wait(&ctr->state_wait_queue, &wait,
  793. TASK_INTERRUPTIBLE);
  794. if (ctr->state == state)
  795. break;
  796. if (ctr->state == CAPI_CTR_DETACHED) {
  797. retval = -ESRCH;
  798. break;
  799. }
  800. if (signal_pending(current)) {
  801. retval = -EINTR;
  802. break;
  803. }
  804. mutex_unlock(&capi_controller_lock);
  805. schedule();
  806. mutex_lock(&capi_controller_lock);
  807. }
  808. finish_wait(&ctr->state_wait_queue, &wait);
  809. capi_ctr_put(ctr);
  810. return retval;
  811. }
  812. #ifdef AVMB1_COMPAT
  813. static int old_capi_manufacturer(unsigned int cmd, void __user *data)
  814. {
  815. avmb1_loadandconfigdef ldef;
  816. avmb1_extcarddef cdef;
  817. avmb1_resetdef rdef;
  818. capicardparams cparams;
  819. struct capi_ctr *ctr;
  820. struct capi_driver *driver = NULL;
  821. capiloaddata ldata;
  822. struct list_head *l;
  823. int retval;
  824. switch (cmd) {
  825. case AVMB1_ADDCARD:
  826. case AVMB1_ADDCARD_WITH_TYPE:
  827. if (cmd == AVMB1_ADDCARD) {
  828. if ((retval = copy_from_user(&cdef, data,
  829. sizeof(avmb1_carddef))))
  830. return retval;
  831. cdef.cardtype = AVM_CARDTYPE_B1;
  832. } else {
  833. if ((retval = copy_from_user(&cdef, data,
  834. sizeof(avmb1_extcarddef))))
  835. return retval;
  836. }
  837. cparams.port = cdef.port;
  838. cparams.irq = cdef.irq;
  839. cparams.cardnr = cdef.cardnr;
  840. mutex_lock(&capi_drivers_lock);
  841. switch (cdef.cardtype) {
  842. case AVM_CARDTYPE_B1:
  843. list_for_each(l, &capi_drivers) {
  844. driver = list_entry(l, struct capi_driver, list);
  845. if (strcmp(driver->name, "b1isa") == 0)
  846. break;
  847. }
  848. break;
  849. case AVM_CARDTYPE_T1:
  850. list_for_each(l, &capi_drivers) {
  851. driver = list_entry(l, struct capi_driver, list);
  852. if (strcmp(driver->name, "t1isa") == 0)
  853. break;
  854. }
  855. break;
  856. default:
  857. driver = NULL;
  858. break;
  859. }
  860. if (!driver) {
  861. printk(KERN_ERR "kcapi: driver not loaded.\n");
  862. retval = -EIO;
  863. } else if (!driver->add_card) {
  864. printk(KERN_ERR "kcapi: driver has no add card function.\n");
  865. retval = -EIO;
  866. } else
  867. retval = driver->add_card(driver, &cparams);
  868. mutex_unlock(&capi_drivers_lock);
  869. return retval;
  870. case AVMB1_LOAD:
  871. case AVMB1_LOAD_AND_CONFIG:
  872. if (cmd == AVMB1_LOAD) {
  873. if (copy_from_user(&ldef, data,
  874. sizeof(avmb1_loaddef)))
  875. return -EFAULT;
  876. ldef.t4config.len = 0;
  877. ldef.t4config.data = NULL;
  878. } else {
  879. if (copy_from_user(&ldef, data,
  880. sizeof(avmb1_loadandconfigdef)))
  881. return -EFAULT;
  882. }
  883. mutex_lock(&capi_controller_lock);
  884. ctr = get_capi_ctr_by_nr(ldef.contr);
  885. if (!ctr) {
  886. retval = -EINVAL;
  887. goto load_unlock_out;
  888. }
  889. if (ctr->load_firmware == NULL) {
  890. printk(KERN_DEBUG "kcapi: load: no load function\n");
  891. retval = -ESRCH;
  892. goto load_unlock_out;
  893. }
  894. if (ldef.t4file.len <= 0) {
  895. printk(KERN_DEBUG "kcapi: load: invalid parameter: length of t4file is %d ?\n", ldef.t4file.len);
  896. retval = -EINVAL;
  897. goto load_unlock_out;
  898. }
  899. if (ldef.t4file.data == NULL) {
  900. printk(KERN_DEBUG "kcapi: load: invalid parameter: dataptr is 0\n");
  901. retval = -EINVAL;
  902. goto load_unlock_out;
  903. }
  904. ldata.firmware.user = 1;
  905. ldata.firmware.data = ldef.t4file.data;
  906. ldata.firmware.len = ldef.t4file.len;
  907. ldata.configuration.user = 1;
  908. ldata.configuration.data = ldef.t4config.data;
  909. ldata.configuration.len = ldef.t4config.len;
  910. if (ctr->state != CAPI_CTR_DETECTED) {
  911. printk(KERN_INFO "kcapi: load: contr=%d not in detect state\n", ldef.contr);
  912. retval = -EBUSY;
  913. goto load_unlock_out;
  914. }
  915. ctr->state = CAPI_CTR_LOADING;
  916. retval = ctr->load_firmware(ctr, &ldata);
  917. if (retval) {
  918. ctr->state = CAPI_CTR_DETECTED;
  919. goto load_unlock_out;
  920. }
  921. retval = wait_on_ctr_state(ctr, CAPI_CTR_RUNNING);
  922. load_unlock_out:
  923. mutex_unlock(&capi_controller_lock);
  924. return retval;
  925. case AVMB1_RESETCARD:
  926. if (copy_from_user(&rdef, data, sizeof(avmb1_resetdef)))
  927. return -EFAULT;
  928. retval = 0;
  929. mutex_lock(&capi_controller_lock);
  930. ctr = get_capi_ctr_by_nr(rdef.contr);
  931. if (!ctr) {
  932. retval = -ESRCH;
  933. goto reset_unlock_out;
  934. }
  935. if (ctr->state == CAPI_CTR_DETECTED)
  936. goto reset_unlock_out;
  937. ctr->reset_ctr(ctr);
  938. retval = wait_on_ctr_state(ctr, CAPI_CTR_DETECTED);
  939. reset_unlock_out:
  940. mutex_unlock(&capi_controller_lock);
  941. return retval;
  942. }
  943. return -EINVAL;
  944. }
  945. #endif
  946. /**
  947. * capi20_manufacturer() - CAPI 2.0 operation CAPI_MANUFACTURER
  948. * @cmd: command.
  949. * @data: parameter.
  950. *
  951. * Perform manufacturer specific command.
  952. * Return value: CAPI result code
  953. */
  954. int capi20_manufacturer(unsigned int cmd, void __user *data)
  955. {
  956. struct capi_ctr *ctr;
  957. int retval;
  958. switch (cmd) {
  959. #ifdef AVMB1_COMPAT
  960. case AVMB1_LOAD:
  961. case AVMB1_LOAD_AND_CONFIG:
  962. case AVMB1_RESETCARD:
  963. case AVMB1_GET_CARDINFO:
  964. case AVMB1_REMOVECARD:
  965. return old_capi_manufacturer(cmd, data);
  966. #endif
  967. case KCAPI_CMD_TRACE:
  968. {
  969. kcapi_flagdef fdef;
  970. if (copy_from_user(&fdef, data, sizeof(kcapi_flagdef)))
  971. return -EFAULT;
  972. mutex_lock(&capi_controller_lock);
  973. ctr = get_capi_ctr_by_nr(fdef.contr);
  974. if (ctr) {
  975. ctr->traceflag = fdef.flag;
  976. printk(KERN_INFO "kcapi: contr [%03d] set trace=%d\n",
  977. ctr->cnr, ctr->traceflag);
  978. retval = 0;
  979. } else
  980. retval = -ESRCH;
  981. mutex_unlock(&capi_controller_lock);
  982. return retval;
  983. }
  984. case KCAPI_CMD_ADDCARD:
  985. {
  986. struct list_head *l;
  987. struct capi_driver *driver = NULL;
  988. capicardparams cparams;
  989. kcapi_carddef cdef;
  990. if ((retval = copy_from_user(&cdef, data, sizeof(cdef))))
  991. return retval;
  992. cparams.port = cdef.port;
  993. cparams.irq = cdef.irq;
  994. cparams.membase = cdef.membase;
  995. cparams.cardnr = cdef.cardnr;
  996. cparams.cardtype = 0;
  997. cdef.driver[sizeof(cdef.driver)-1] = 0;
  998. mutex_lock(&capi_drivers_lock);
  999. list_for_each(l, &capi_drivers) {
  1000. driver = list_entry(l, struct capi_driver, list);
  1001. if (strcmp(driver->name, cdef.driver) == 0)
  1002. break;
  1003. }
  1004. if (driver == NULL) {
  1005. printk(KERN_ERR "kcapi: driver \"%s\" not loaded.\n",
  1006. cdef.driver);
  1007. retval = -ESRCH;
  1008. } else if (!driver->add_card) {
  1009. printk(KERN_ERR "kcapi: driver \"%s\" has no add card function.\n", cdef.driver);
  1010. retval = -EIO;
  1011. } else
  1012. retval = driver->add_card(driver, &cparams);
  1013. mutex_unlock(&capi_drivers_lock);
  1014. return retval;
  1015. }
  1016. default:
  1017. printk(KERN_ERR "kcapi: manufacturer command %d unknown.\n",
  1018. cmd);
  1019. break;
  1020. }
  1021. return -EINVAL;
  1022. }
  1023. EXPORT_SYMBOL(capi20_manufacturer);
  1024. /* ------------------------------------------------------------- */
  1025. /* -------- Init & Cleanup ------------------------------------- */
  1026. /* ------------------------------------------------------------- */
  1027. /*
  1028. * init / exit functions
  1029. */
  1030. static struct notifier_block capictr_nb = {
  1031. .notifier_call = notify_handler,
  1032. .priority = INT_MAX,
  1033. };
  1034. static int __init kcapi_init(void)
  1035. {
  1036. int err;
  1037. register_capictr_notifier(&capictr_nb);
  1038. err = cdebug_init();
  1039. if (!err)
  1040. kcapi_proc_init();
  1041. return err;
  1042. }
  1043. static void __exit kcapi_exit(void)
  1044. {
  1045. kcapi_proc_exit();
  1046. /* make sure all notifiers are finished */
  1047. flush_scheduled_work();
  1048. cdebug_exit();
  1049. }
  1050. module_init(kcapi_init);
  1051. module_exit(kcapi_exit);