• Home
  • Raw
  • Download

Lines Matching +full:controller +full:- +full:data

48 /* ------------------------------------------------------------- */
53 u32 controller; member
56 /* ------------------------------------------------------------- */
76 /* -------- controller ref counting -------------------------------------- */
81 if (!try_module_get(ctr->owner)) in capi_ctr_get()
89 module_put(ctr->owner); in capi_ctr_put()
92 /* ------------------------------------------------------------- */
96 if (contr < 1 || contr - 1 >= CAPI_MAXCONTR) in get_capi_ctr_by_nr()
99 return capi_controller[contr - 1]; in get_capi_ctr_by_nr()
106 if (applid < 1 || applid - 1 >= CAPI_MAXAPPL) in __get_capi_appl_by_nr()
109 return capi_applications[applid - 1]; in __get_capi_appl_by_nr()
114 if (applid < 1 || applid - 1 >= CAPI_MAXAPPL) in get_capi_appl_by_nr()
117 return rcu_dereference(capi_applications[applid - 1]); in get_capi_appl_by_nr()
120 /* -------- util functions ------------------------------------ */
157 /* ------------------------------------------------------------ */
165 ctr->register_appl(ctr, applid, rparam); in register_appl()
167 printk(KERN_WARNING "%s: cannot get controller resources\n", in register_appl()
176 ctr->release_appl(ctr, applid); in release_appl()
193 if (ctr->state == CAPI_CTR_RUNNING) in notify_up()
196 ctr->state = CAPI_CTR_RUNNING; in notify_up()
201 register_appl(ctr, applid, &ap->rparam); in notify_up()
204 wake_up_interruptible_all(&ctr->state_wait_queue); in notify_up()
217 if (ctr->state == CAPI_CTR_DETECTED || ctr->state == CAPI_CTR_DETACHED) in ctr_down()
220 ctr->state = new_state; in ctr_down()
222 memset(ctr->manu, 0, sizeof(ctr->manu)); in ctr_down()
223 memset(&ctr->version, 0, sizeof(ctr->version)); in ctr_down()
224 memset(&ctr->profile, 0, sizeof(ctr->profile)); in ctr_down()
225 memset(ctr->serial, 0, sizeof(ctr->serial)); in ctr_down()
233 wake_up_interruptible_all(&ctr->state_wait_queue); in ctr_down()
275 blocking_notifier_call_chain(&ctr_notifier_list, event->type, in do_notify_work()
276 (void *)(long)event->controller); in do_notify_work()
284 static int notify_push(unsigned int event_type, u32 controller) in notify_push() argument
289 return -ENOMEM; in notify_push()
291 INIT_WORK(&event->work, do_notify_work); in notify_push()
292 event->type = event_type; in notify_push()
293 event->controller = controller; in notify_push()
295 queue_work(kcapi_wq, &event->work); in notify_push()
311 /* -------- Receiver ------------------------------------------ */
319 if ((!ap) || (ap->release_in_progress)) in recv_handler()
322 mutex_lock(&ap->recv_mtx); in recv_handler()
323 while ((skb = skb_dequeue(&ap->recv_queue))) { in recv_handler()
324 if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_IND) in recv_handler()
325 ap->nrecvdatapkt++; in recv_handler()
327 ap->nrecvctlpkt++; in recv_handler()
329 ap->recv_message(ap, skb); in recv_handler()
331 mutex_unlock(&ap->recv_mtx); in recv_handler()
335 * capi_ctr_handle_message() - handle incoming CAPI message
336 * @ctr: controller descriptor structure.
351 if (ctr->state != CAPI_CTR_RUNNING) { in capi_ctr_handle_message()
352 cdb = capi_message2str(skb->data); in capi_ctr_handle_message()
354 printk(KERN_INFO "kcapi: controller [%03d] not active, got: %s", in capi_ctr_handle_message()
355 ctr->cnr, cdb->buf); in capi_ctr_handle_message()
358 printk(KERN_INFO "kcapi: controller [%03d] not active, cannot trace\n", in capi_ctr_handle_message()
359 ctr->cnr); in capi_ctr_handle_message()
363 cmd = CAPIMSG_COMMAND(skb->data); in capi_ctr_handle_message()
364 subcmd = CAPIMSG_SUBCOMMAND(skb->data); in capi_ctr_handle_message()
366 ctr->nrecvdatapkt++; in capi_ctr_handle_message()
367 if (ctr->traceflag > 2) in capi_ctr_handle_message()
370 ctr->nrecvctlpkt++; in capi_ctr_handle_message()
371 if (ctr->traceflag) in capi_ctr_handle_message()
374 showctl |= (ctr->traceflag & 1); in capi_ctr_handle_message()
378 ctr->cnr, CAPIMSG_APPID(skb->data), in capi_ctr_handle_message()
380 CAPIMSG_LEN(skb->data)); in capi_ctr_handle_message()
382 cdb = capi_message2str(skb->data); in capi_ctr_handle_message()
385 ctr->cnr, cdb->buf); in capi_ctr_handle_message()
389 ctr->cnr, CAPIMSG_APPID(skb->data), in capi_ctr_handle_message()
391 CAPIMSG_LEN(skb->data)); in capi_ctr_handle_message()
397 ap = get_capi_appl_by_nr(CAPIMSG_APPID(skb->data)); in capi_ctr_handle_message()
400 cdb = capi_message2str(skb->data); in capi_ctr_handle_message()
403 CAPIMSG_APPID(skb->data), cdb->buf); in capi_ctr_handle_message()
407 CAPIMSG_APPID(skb->data), in capi_ctr_handle_message()
411 skb_queue_tail(&ap->recv_queue, skb); in capi_ctr_handle_message()
412 queue_work(kcapi_wq, &ap->recv_work); in capi_ctr_handle_message()
424 * capi_ctr_ready() - signal CAPI controller ready
425 * @ctr: controller descriptor structure.
427 * Called by hardware driver to signal that the controller is up and running.
432 printk(KERN_NOTICE "kcapi: controller [%03d] \"%s\" ready.\n", in capi_ctr_ready()
433 ctr->cnr, ctr->name); in capi_ctr_ready()
435 notify_push(CAPICTR_UP, ctr->cnr); in capi_ctr_ready()
441 * capi_ctr_down() - signal CAPI controller not ready
442 * @ctr: controller descriptor structure.
444 * Called by hardware driver to signal that the controller is down and
450 printk(KERN_NOTICE "kcapi: controller [%03d] down.\n", ctr->cnr); in capi_ctr_down()
452 notify_push(CAPICTR_DOWN, ctr->cnr); in capi_ctr_down()
458 * capi_ctr_suspend_output() - suspend controller
459 * @ctr: controller descriptor structure.
461 * Called by hardware driver to stop data flow.
469 if (!ctr->blocked) { in capi_ctr_suspend_output()
470 printk(KERN_DEBUG "kcapi: controller [%03d] suspend\n", in capi_ctr_suspend_output()
471 ctr->cnr); in capi_ctr_suspend_output()
472 ctr->blocked = 1; in capi_ctr_suspend_output()
479 * capi_ctr_resume_output() - resume controller
480 * @ctr: controller descriptor structure.
482 * Called by hardware driver to resume data flow.
490 if (ctr->blocked) { in capi_ctr_resume_output()
491 printk(KERN_DEBUG "kcapi: controller [%03d] resumed\n", in capi_ctr_resume_output()
492 ctr->cnr); in capi_ctr_resume_output()
493 ctr->blocked = 0; in capi_ctr_resume_output()
499 /* ------------------------------------------------------------- */
502 * attach_capi_ctr() - register CAPI controller
503 * @ctr: controller descriptor structure.
505 * Called by hardware driver to register a controller with the CAPI subsystem.
521 printk(KERN_ERR "kcapi: out of controller slots\n"); in attach_capi_ctr()
522 return -EBUSY; in attach_capi_ctr()
526 ctr->nrecvctlpkt = 0; in attach_capi_ctr()
527 ctr->nrecvdatapkt = 0; in attach_capi_ctr()
528 ctr->nsentctlpkt = 0; in attach_capi_ctr()
529 ctr->nsentdatapkt = 0; in attach_capi_ctr()
530 ctr->cnr = i + 1; in attach_capi_ctr()
531 ctr->state = CAPI_CTR_DETECTED; in attach_capi_ctr()
532 ctr->blocked = 0; in attach_capi_ctr()
533 ctr->traceflag = showcapimsgs; in attach_capi_ctr()
534 init_waitqueue_head(&ctr->state_wait_queue); in attach_capi_ctr()
536 sprintf(ctr->procfn, "capi/controllers/%d", ctr->cnr); in attach_capi_ctr()
537 ctr->procent = proc_create_single_data(ctr->procfn, 0, NULL, in attach_capi_ctr()
538 ctr->proc_show, ctr); in attach_capi_ctr()
544 printk(KERN_NOTICE "kcapi: controller [%03d]: %s attached\n", in attach_capi_ctr()
545 ctr->cnr, ctr->name); in attach_capi_ctr()
552 * detach_capi_ctr() - unregister CAPI controller
553 * @ctr: controller descriptor structure.
555 * Called by hardware driver to remove the registration of a controller
568 if (ctr->cnr < 1 || ctr->cnr - 1 >= CAPI_MAXCONTR) { in detach_capi_ctr()
569 err = -EINVAL; in detach_capi_ctr()
573 if (capi_controller[ctr->cnr - 1] != ctr) { in detach_capi_ctr()
574 err = -EINVAL; in detach_capi_ctr()
577 capi_controller[ctr->cnr - 1] = NULL; in detach_capi_ctr()
578 ncontrollers--; in detach_capi_ctr()
580 if (ctr->procent) in detach_capi_ctr()
581 remove_proc_entry(ctr->procfn, NULL); in detach_capi_ctr()
583 printk(KERN_NOTICE "kcapi: controller [%03d]: %s unregistered\n", in detach_capi_ctr()
584 ctr->cnr, ctr->name); in detach_capi_ctr()
595 * register_capi_driver() - register CAPI driver
604 list_add_tail(&driver->list, &capi_drivers); in register_capi_driver()
611 * unregister_capi_driver() - unregister CAPI driver
620 list_del(&driver->list); in unregister_capi_driver()
626 /* ------------------------------------------------------------- */
627 /* -------- CAPI2.0 Interface ---------------------------------- */
628 /* ------------------------------------------------------------- */
631 * capi20_isinstalled() - CAPI 2.0 operation CAPI_INSTALLED
633 * Return value: CAPI result code (CAPI_NOERROR if at least one ISDN controller
646 capi_controller[i]->state == CAPI_CTR_RUNNING) { in capi20_isinstalled()
659 * capi20_register() - CAPI 2.0 operation CAPI_REGISTER
663 * A unique application ID is assigned and stored in @ap->applid.
665 * callback function @ap->recv_message() may be called at any time
677 if (ap->rparam.datablklen < 128) in capi20_register()
680 ap->nrecvctlpkt = 0; in capi20_register()
681 ap->nrecvdatapkt = 0; in capi20_register()
682 ap->nsentctlpkt = 0; in capi20_register()
683 ap->nsentdatapkt = 0; in capi20_register()
684 mutex_init(&ap->recv_mtx); in capi20_register()
685 skb_queue_head_init(&ap->recv_queue); in capi20_register()
686 INIT_WORK(&ap->recv_work, recv_handler); in capi20_register()
687 ap->release_in_progress = 0; in capi20_register()
692 if (capi_applications[applid - 1] == NULL) in capi20_register()
700 ap->applid = applid; in capi20_register()
701 capi_applications[applid - 1] = ap; in capi20_register()
705 capi_controller[i]->state != CAPI_CTR_RUNNING) in capi20_register()
707 register_appl(capi_controller[i], applid, &ap->rparam); in capi20_register()
722 * capi20_release() - CAPI 2.0 operation CAPI_RELEASE
727 * callback function @ap->recv_message() will no longer be called.
735 DBG("applid %#x", ap->applid); in capi20_release()
739 ap->release_in_progress = 1; in capi20_release()
740 capi_applications[ap->applid - 1] = NULL; in capi20_release()
746 capi_controller[i]->state != CAPI_CTR_RUNNING) in capi20_release()
748 release_appl(capi_controller[i], ap->applid); in capi20_release()
754 skb_queue_purge(&ap->recv_queue); in capi20_release()
757 printk(KERN_DEBUG "kcapi: appl %d down\n", ap->applid); in capi20_release()
766 * capi20_put_message() - CAPI 2.0 operation CAPI_PUT_MESSAGE
780 DBG("applid %#x", ap->applid); in capi20_put_message()
784 if ((ap->applid == 0) || ap->release_in_progress) in capi20_put_message()
786 if (skb->len < 12 in capi20_put_message()
787 || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data)) in capi20_put_message()
788 || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb->data))) in capi20_put_message()
792 * The controller reference is protected by the existence of the in capi20_put_message()
796 ctr = get_capi_ctr_by_nr(CAPIMSG_CONTROLLER(skb->data)); in capi20_put_message()
797 if (!ctr || ctr->state != CAPI_CTR_RUNNING) in capi20_put_message()
799 if (ctr->blocked) in capi20_put_message()
802 cmd = CAPIMSG_COMMAND(skb->data); in capi20_put_message()
803 subcmd = CAPIMSG_SUBCOMMAND(skb->data); in capi20_put_message()
806 ctr->nsentdatapkt++; in capi20_put_message()
807 ap->nsentdatapkt++; in capi20_put_message()
808 if (ctr->traceflag > 2) in capi20_put_message()
811 ctr->nsentctlpkt++; in capi20_put_message()
812 ap->nsentctlpkt++; in capi20_put_message()
813 if (ctr->traceflag) in capi20_put_message()
816 showctl |= (ctr->traceflag & 1); in capi20_put_message()
820 CAPIMSG_CONTROLLER(skb->data), in capi20_put_message()
821 CAPIMSG_APPID(skb->data), in capi20_put_message()
823 CAPIMSG_LEN(skb->data)); in capi20_put_message()
825 _cdebbuf *cdb = capi_message2str(skb->data); in capi20_put_message()
828 CAPIMSG_CONTROLLER(skb->data), in capi20_put_message()
829 cdb->buf); in capi20_put_message()
833 CAPIMSG_CONTROLLER(skb->data), in capi20_put_message()
834 CAPIMSG_APPID(skb->data), in capi20_put_message()
836 CAPIMSG_LEN(skb->data)); in capi20_put_message()
839 return ctr->send_message(ctr, skb); in capi20_put_message()
845 * capi20_get_manufacturer() - CAPI 2.0 operation CAPI_GET_MANUFACTURER
846 * @contr: controller number.
849 * Retrieve information about the manufacturer of the specified ISDN controller
867 if (ctr && ctr->state == CAPI_CTR_RUNNING) { in capi20_get_manufacturer()
868 strncpy(buf, ctr->manu, CAPI_MANUFACTURER_LEN); in capi20_get_manufacturer()
880 * capi20_get_version() - CAPI 2.0 operation CAPI_GET_VERSION
881 * @contr: controller number.
884 * Retrieve version information for the specified ISDN controller
902 if (ctr && ctr->state == CAPI_CTR_RUNNING) { in capi20_get_version()
903 memcpy(verp, &ctr->version, sizeof(capi_version)); in capi20_get_version()
915 * capi20_get_serial() - CAPI 2.0 operation CAPI_GET_SERIAL_NUMBER
916 * @contr: controller number.
919 * Retrieve the serial number of the specified ISDN controller
937 if (ctr && ctr->state == CAPI_CTR_RUNNING) { in capi20_get_serial()
938 strlcpy(serial, ctr->serial, CAPI_SERIAL_LEN); in capi20_get_serial()
950 * capi20_get_profile() - CAPI 2.0 operation CAPI_GET_PROFILE
951 * @contr: controller number.
954 * Retrieve capability information for the specified ISDN controller
965 profp->ncontroller = ncontrollers; in capi20_get_profile()
972 if (ctr && ctr->state == CAPI_CTR_RUNNING) { in capi20_get_profile()
973 memcpy(profp, &ctr->profile, sizeof(struct capi_profile)); in capi20_get_profile()
992 return -ESRCH; in wait_on_ctr_state()
995 prepare_to_wait(&ctr->state_wait_queue, &wait, in wait_on_ctr_state()
998 if (ctr->state == state) in wait_on_ctr_state()
1000 if (ctr->state == CAPI_CTR_DETACHED) { in wait_on_ctr_state()
1001 retval = -ESRCH; in wait_on_ctr_state()
1005 retval = -EINTR; in wait_on_ctr_state()
1013 finish_wait(&ctr->state_wait_queue, &wait); in wait_on_ctr_state()
1021 static int old_capi_manufacturer(unsigned int cmd, void __user *data) in old_capi_manufacturer() argument
1037 if ((retval = copy_from_user(&cdef, data, in old_capi_manufacturer()
1039 return -EFAULT; in old_capi_manufacturer()
1043 if ((retval = copy_from_user(&cdef, data, in old_capi_manufacturer()
1045 return -EFAULT; in old_capi_manufacturer()
1057 if (strcmp(driver->name, "b1isa") == 0) in old_capi_manufacturer()
1064 if (strcmp(driver->name, "t1isa") == 0) in old_capi_manufacturer()
1074 retval = -EIO; in old_capi_manufacturer()
1075 } else if (!driver->add_card) { in old_capi_manufacturer()
1077 retval = -EIO; in old_capi_manufacturer()
1079 retval = driver->add_card(driver, &cparams); in old_capi_manufacturer()
1088 if (copy_from_user(&ldef, data, in old_capi_manufacturer()
1090 return -EFAULT; in old_capi_manufacturer()
1092 ldef.t4config.data = NULL; in old_capi_manufacturer()
1094 if (copy_from_user(&ldef, data, in old_capi_manufacturer()
1096 return -EFAULT; in old_capi_manufacturer()
1103 retval = -EINVAL; in old_capi_manufacturer()
1107 if (ctr->load_firmware == NULL) { in old_capi_manufacturer()
1109 retval = -ESRCH; in old_capi_manufacturer()
1115 retval = -EINVAL; in old_capi_manufacturer()
1118 if (ldef.t4file.data == NULL) { in old_capi_manufacturer()
1120 retval = -EINVAL; in old_capi_manufacturer()
1125 ldata.firmware.data = ldef.t4file.data; in old_capi_manufacturer()
1128 ldata.configuration.data = ldef.t4config.data; in old_capi_manufacturer()
1131 if (ctr->state != CAPI_CTR_DETECTED) { in old_capi_manufacturer()
1133 retval = -EBUSY; in old_capi_manufacturer()
1136 ctr->state = CAPI_CTR_LOADING; in old_capi_manufacturer()
1138 retval = ctr->load_firmware(ctr, &ldata); in old_capi_manufacturer()
1140 ctr->state = CAPI_CTR_DETECTED; in old_capi_manufacturer()
1151 if (copy_from_user(&rdef, data, sizeof(avmb1_resetdef))) in old_capi_manufacturer()
1152 return -EFAULT; in old_capi_manufacturer()
1160 retval = -ESRCH; in old_capi_manufacturer()
1164 if (ctr->state == CAPI_CTR_DETECTED) in old_capi_manufacturer()
1167 if (ctr->reset_ctr == NULL) { in old_capi_manufacturer()
1169 retval = -ESRCH; in old_capi_manufacturer()
1173 ctr->reset_ctr(ctr); in old_capi_manufacturer()
1181 return -EINVAL; in old_capi_manufacturer()
1186 * capi20_manufacturer() - CAPI 2.0 operation CAPI_MANUFACTURER
1188 * @data: parameter.
1194 int capi20_manufacturer(unsigned long cmd, void __user *data) in capi20_manufacturer() argument
1206 return old_capi_manufacturer(cmd, data); in capi20_manufacturer()
1212 if (copy_from_user(&fdef, data, sizeof(kcapi_flagdef))) in capi20_manufacturer()
1213 return -EFAULT; in capi20_manufacturer()
1219 ctr->traceflag = fdef.flag; in capi20_manufacturer()
1221 ctr->cnr, ctr->traceflag); in capi20_manufacturer()
1224 retval = -ESRCH; in capi20_manufacturer()
1237 if ((retval = copy_from_user(&cdef, data, sizeof(cdef)))) in capi20_manufacturer()
1238 return -EFAULT; in capi20_manufacturer()
1245 cdef.driver[sizeof(cdef.driver) - 1] = 0; in capi20_manufacturer()
1251 if (strcmp(driver->name, cdef.driver) == 0) in capi20_manufacturer()
1257 retval = -ESRCH; in capi20_manufacturer()
1258 } else if (!driver->add_card) { in capi20_manufacturer()
1260 retval = -EIO; in capi20_manufacturer()
1262 retval = driver->add_card(driver, &cparams); in capi20_manufacturer()
1274 return -EINVAL; in capi20_manufacturer()
1279 /* ------------------------------------------------------------- */
1280 /* -------- Init & Cleanup ------------------------------------- */
1281 /* ------------------------------------------------------------- */
1298 return -ENOMEM; in kcapi_init()