Lines Matching refs:dsp

23  * The dsp module provides layer 2 for b-channels (64kbit). It provides
96 * NOTE: The channel must be activated in order to make dsp work, even if
137 * When data is received from upper or lower layer (card), the complete dsp
161 #include "dsp.h"
179 DEFINE_SPINLOCK(dsp_lock); /* global dsp lock */
188 dsp_rx_off_member(struct dsp *dsp)
195 if (!dsp->features_rx_off)
199 if (!dsp->rx_disabled)
202 else if (dsp->dtmf.software)
205 else if (dsp->echo.software)
208 else if (dsp->conf && dsp->conf->software)
213 if (rx_off == dsp->rx_is_off)
216 if (!dsp->ch.peer) {
224 if (dsp->ch.peer->ctrl(dsp->ch.peer, CONTROL_CHANNEL, &cq)) {
229 dsp->rx_is_off = rx_off;
232 __func__, dsp->name, rx_off);
235 dsp_rx_off(struct dsp *dsp)
243 if (!dsp->conf) {
244 dsp_rx_off_member(dsp);
248 list_for_each_entry(member, &dsp->conf->mlist, list) {
249 dsp_rx_off_member(member->dsp);
255 dsp_fill_empty(struct dsp *dsp)
261 if (!dsp->ch.peer) {
270 if (dsp->ch.peer->ctrl(dsp->ch.peer, CONTROL_CHANNEL, &cq)) {
277 __func__, dsp->name);
281 dsp_control_req(struct dsp *dsp, struct mISDNhead *hh, struct sk_buff *skb)
299 if (dsp->hdlc) {
309 dsp->dtmf.treshold = (*(int *)data) * 10000;
311 dsp->dtmf.enable = 1;
313 dsp_dtmf_goertzel_init(dsp);
316 dsp_dtmf_hardware(dsp);
317 dsp_rx_off(dsp);
322 dsp->dtmf.enable = 0;
323 dsp->dtmf.hardware = 0;
324 dsp->dtmf.software = 0;
336 ret = dsp_cmx_conf(dsp, *((u32 *)data));
338 dsp_rx_off(dsp);
340 dsp_cmx_debug(dsp);
346 ret = dsp_cmx_conf(dsp, 0);
349 dsp_cmx_debug(dsp);
350 dsp_rx_off(dsp);
353 if (dsp->hdlc) {
364 ret = dsp_tone(dsp, *((int *)data));
366 dsp_cmx_hardware(dsp->conf, dsp);
367 dsp_rx_off(dsp);
369 if (!dsp->tone.tone)
373 if (dsp->hdlc) {
379 dsp_tone(dsp, 0);
380 dsp_cmx_hardware(dsp->conf, dsp);
381 dsp_rx_off(dsp);
384 dsp->rx_W = 0;
385 dsp->rx_R = 0;
388 if (dsp->hdlc) {
396 dsp->tx_volume = *((int *)data);
399 __func__, dsp->tx_volume);
400 dsp_cmx_hardware(dsp->conf, dsp);
401 dsp_dtmf_hardware(dsp);
402 dsp_rx_off(dsp);
405 if (dsp->hdlc) {
413 dsp->rx_volume = *((int *)data);
416 __func__, dsp->tx_volume);
417 dsp_cmx_hardware(dsp->conf, dsp);
418 dsp_dtmf_hardware(dsp);
419 dsp_rx_off(dsp);
422 dsp->echo.software = 1; /* soft echo */
425 dsp_cmx_hardware(dsp->conf, dsp);
426 dsp_rx_off(dsp);
428 dsp_cmx_debug(dsp);
431 dsp->echo.software = 0;
432 dsp->echo.hardware = 0;
435 dsp_cmx_hardware(dsp->conf, dsp);
436 dsp_rx_off(dsp);
438 dsp_cmx_debug(dsp);
444 dsp->rx_disabled = 0;
445 dsp_rx_off(dsp);
451 dsp->rx_disabled = 1;
452 dsp_rx_off(dsp);
455 if (dsp->hdlc) {
462 dsp->tx_mix = 1;
463 dsp_cmx_hardware(dsp->conf, dsp);
464 dsp_rx_off(dsp);
466 dsp_cmx_debug(dsp);
469 if (dsp->hdlc) {
476 dsp->tx_mix = 0;
477 dsp_cmx_hardware(dsp->conf, dsp);
478 dsp_rx_off(dsp);
480 dsp_cmx_debug(dsp);
483 dsp->tx_data = 1;
486 dsp_cmx_hardware(dsp->conf, dsp);
487 dsp_rx_off(dsp);
489 dsp_cmx_debug(dsp);
492 dsp->tx_data = 0;
495 dsp_cmx_hardware(dsp->conf, dsp);
496 dsp_rx_off(dsp);
498 dsp_cmx_debug(dsp);
502 if (dsp->hdlc) {
510 dsp->cmx_delay = (*((int *)data)) << 3;
512 if (dsp->cmx_delay >= (CMX_BUFF_HALF >> 1))
515 dsp->cmx_delay = (CMX_BUFF_HALF >> 1) - 1;
519 __func__, dsp->cmx_delay);
523 if (dsp->hdlc) {
527 dsp->cmx_delay = 0;
533 if (dsp->hdlc) {
537 dsp->tx_dejitter = 1;
543 if (dsp->hdlc) {
547 dsp->tx_dejitter = 0;
553 if (dsp->hdlc) {
562 dsp->pipeline.inuse = 1;
563 dsp_cmx_hardware(dsp->conf, dsp);
564 ret = dsp_pipeline_build(&dsp->pipeline,
566 dsp_cmx_hardware(dsp->conf, dsp);
567 dsp_rx_off(dsp);
571 if (dsp->hdlc) {
582 ret = dsp_bf_init(dsp, (u8 *)data, len);
592 if (dsp->up) {
593 if (dsp->up->send(dsp->up, nskb))
599 dsp_cmx_hardware(dsp->conf, dsp);
600 dsp_dtmf_hardware(dsp);
601 dsp_rx_off(dsp);
605 if (dsp->hdlc) {
611 dsp_bf_cleanup(dsp);
612 dsp_cmx_hardware(dsp->conf, dsp);
613 dsp_dtmf_hardware(dsp);
614 dsp_rx_off(dsp);
628 struct dsp *dsp = container_of(ch, struct dsp, ch);
645 dsp->features_rx_off = 1;
647 dsp->features_fill_empty = 1;
652 *((u_long *)&cq.p1) = (u_long)&dsp->features;
660 __func__, dsp->name);
666 struct dsp *dsp = container_of(ch, struct dsp, ch);
676 dsp->data_pending = 0;
678 if (dsp->hdlc) {
680 if (dsp->b_active)
681 schedule_work(&dsp->workq);
691 if (dsp->rx_is_off) {
695 __func__, dsp->name);
697 if (dsp->hdlc) {
700 dsp_cmx_hdlc(dsp, skb);
702 if (dsp->rx_disabled) {
707 if (dsp->up)
708 return dsp->up->send(dsp->up, skb);
715 if (dsp->bf_enable)
716 dsp_bf_decrypt(dsp, skb->data, skb->len);
718 if (dsp->pipeline.inuse)
719 dsp_pipeline_process_rx(&dsp->pipeline, skb->data,
722 if (dsp->rx_volume)
723 dsp_change_volume(skb, dsp->rx_volume);
725 if (dsp->dtmf.software) {
726 digits = dsp_dtmf_goertzel_decode(dsp, skb->data,
730 if (dsp->conf && dsp->conf->software) {
732 dsp_cmx_receive(dsp, skb);
745 __func__, *digits, dsp->name);
751 if (dsp->up) {
752 if (dsp->up->send(
753 dsp->up, nskb))
761 if (dsp->rx_disabled) {
766 if (dsp->up)
767 return dsp->up->send(dsp->up, skb);
773 hh->id, skb->len, dsp->name);
776 if (!dsp->dtmf.hardware) {
783 digits = dsp_dtmf_goertzel_decode(dsp, skb->data,
791 __func__, *digits, dsp->name);
797 if (dsp->up) {
798 if (dsp->up->send(
799 dsp->up, nskb))
813 dsp->tx_volume = *((int *)skb->data);
816 "%d\n", __func__, dsp->tx_volume);
817 dsp_cmx_hardware(dsp->conf, dsp);
818 dsp_dtmf_hardware(dsp);
819 dsp_rx_off(dsp);
825 "%s\n", __func__, hh->id, dsp->name);
833 __func__, dsp->name);
836 dsp->b_active = 1;
837 dsp->data_pending = 0;
838 dsp->rx_init = 1;
840 dsp->rx_W = 0;
841 dsp->rx_R = 0;
842 memset(dsp->rx_buff, 0, sizeof(dsp->rx_buff));
843 dsp_cmx_hardware(dsp->conf, dsp);
844 dsp_dtmf_hardware(dsp);
845 dsp_rx_off(dsp);
850 dsp->name);
853 if (dsp->up)
854 return dsp->up->send(dsp->up, skb);
860 __func__, dsp->name);
863 dsp->b_active = 0;
864 dsp->data_pending = 0;
865 dsp_cmx_hardware(dsp->conf, dsp);
866 dsp_rx_off(dsp);
869 if (dsp->up)
870 return dsp->up->send(dsp->up, skb);
879 if (dsp->hdlc) {
881 if (!dsp->b_active) {
887 skb_queue_tail(&dsp->sendq, skb);
888 schedule_work(&dsp->workq);
893 if (!dsp->tone.tone) {
895 dsp_cmx_transmit(dsp, skb);
901 ret = dsp_control_req(dsp, hh, skb);
908 __func__, dsp->name);
909 if (dsp->dtmf.hardware || dsp->dtmf.software)
910 dsp_dtmf_goertzel_init(dsp);
913 if (dsp->features_fill_empty)
914 dsp_fill_empty(dsp);
924 __func__, dsp->name);
926 dsp->tone.tone = 0;
927 dsp->tone.hardware = 0;
928 dsp->tone.software = 0;
929 if (timer_pending(&dsp->tone.tl))
930 del_timer(&dsp->tone.tl);
931 if (dsp->conf)
932 dsp_cmx_conf(dsp, 0); /* dsp_cmx_hardware will also be
934 skb_queue_purge(&dsp->sendq);
943 __func__, hh->prim, dsp->name);
954 struct dsp *dsp = container_of(ch, struct dsp, ch);
964 if (dsp->ch.peer)
965 dsp->ch.peer->ctrl(dsp->ch.peer, CLOSE_CHANNEL, NULL);
971 dsp->b_active = 0;
974 cancel_work_sync(&dsp->workq);
976 if (timer_pending(&dsp->tone.tl))
977 del_timer(&dsp->tone.tl);
978 skb_queue_purge(&dsp->sendq);
981 __func__, dsp->name);
982 dsp->b_active = 0;
983 dsp_cmx_conf(dsp, 0); /* dsp_cmx_hardware will also be called
985 dsp_pipeline_destroy(&dsp->pipeline);
989 __func__, dsp->name);
990 list_del(&dsp->list);
994 printk(KERN_DEBUG "%s: dsp instance released\n",
996 vfree(dsp);
1006 struct dsp *dsp = container_of(work, struct dsp, workq);
1010 if (dsp->hdlc && dsp->data_pending)
1014 while ((skb = skb_dequeue(&dsp->sendq))) {
1016 if (dsp->data_pending) {
1019 "no bug!\n", __func__, dsp->name);
1027 if (dsp->up) {
1028 if (dsp->up->send(dsp->up, skb))
1034 if (dsp->ch.peer) {
1035 dsp->data_pending = 1;
1036 if (dsp->ch.recv(dsp->ch.peer, skb)) {
1038 dsp->data_pending = 0;
1049 struct dsp *ndsp;
1055 ndsp = vzalloc(sizeof(struct dsp));
1057 printk(KERN_ERR "%s: vmalloc struct dsp failed\n", __func__);
1061 printk(KERN_DEBUG "%s: creating new dsp instance\n", __func__);
1111 .name = "dsp",