Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b5df5a5c authored by Andreas Eversberg's avatar Andreas Eversberg Committed by David S. Miller
Browse files

mISDN: Fix DTMF locking bug issue



DTMF digits were sent up to socket in locked state.
Receive audio stream was not enabled in certain condition.

Signed-off-by: default avatarAndreas Eversberg <andreas@eversberg.eu>
Signed-off-by: default avatarKarsten Keil <keil@b1-systems.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e73f6b22
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1817,8 +1817,8 @@ hfcmulti_dtmf(struct hfc_multi *hc)
			coeff[(co<<1)|1] = mantissa;
		}
		if (debug & DEBUG_HFCMULTI_DTMF)
			printk("%s: DTMF ready %08x %08x %08x %08x "
			    "%08x %08x %08x %08x\n", __func__,
			printk(" DTMF ready %08x %08x %08x %08x "
			    "%08x %08x %08x %08x\n",
			    coeff[0], coeff[1], coeff[2], coeff[3],
			    coeff[4], coeff[5], coeff[6], coeff[7]);
		hc->chan[ch].coeff_count++;
+1 −1
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ struct dsp_dtmf {
		/* buffers one full dtmf frame */
	u8		lastwhat, lastdigit;
	int		count;
	u8		digits[16]; /* just the dtmf result */
	u8		digits[16]; /* dtmf result */
};


+20 −17
Original line number Diff line number Diff line
@@ -311,6 +311,7 @@ dsp_control_req(struct dsp *dsp, struct mISDNhead *hh, struct sk_buff *skb)

		/* check dtmf hardware */
		dsp_dtmf_hardware(dsp);
		dsp_rx_off(dsp);
		break;
	case DTMF_TONE_STOP: /* turn off DTMF */
		if (dsp_debug & DEBUG_DSP_CORE)
@@ -660,8 +661,7 @@ dsp_function(struct mISDNchannel *ch, struct sk_buff *skb)
	struct dsp		*dsp = container_of(ch, struct dsp, ch);
	struct mISDNhead	*hh;
	int			ret = 0;
	u8			*digits;
	int			cont;
	u8			*digits = NULL;
	u_long			flags;

	hh = mISDN_HEAD_P(skb);
@@ -716,20 +716,31 @@ dsp_function(struct mISDNchannel *ch, struct sk_buff *skb)
		/* change volume if requested */
		if (dsp->rx_volume)
			dsp_change_volume(skb, dsp->rx_volume);

		/* check if dtmf soft decoding is turned on */
		if (dsp->dtmf.software) {
			digits = dsp_dtmf_goertzel_decode(dsp, skb->data,
				skb->len, (dsp_options&DSP_OPT_ULAW)?1:0);
		}
		/* we need to process receive data if software */
		if (dsp->pcm_slot_tx < 0 && dsp->pcm_slot_rx < 0) {
			/* process data from card at cmx */
			dsp_cmx_receive(dsp, skb);
		}

		spin_unlock_irqrestore(&dsp_lock, flags);

		/* send dtmf result, if any */
		if (digits) {
			while (*digits) {
				int k;
				struct sk_buff *nskb;
				if (dsp_debug & DEBUG_DSP_DTMF)
					printk(KERN_DEBUG "%s: digit"
					    "(%c) to layer %s\n",
					    __func__, *digits, dsp->name);
				cont = DTMF_TONE_VAL | *digits;
				k = *digits | DTMF_TONE_VAL;
				nskb = _alloc_mISDN_skb(PH_CONTROL_IND,
				    MISDN_ID_ANY, sizeof(int), &cont,
					MISDN_ID_ANY, sizeof(int), &k,
					GFP_ATOMIC);
				if (nskb) {
					if (dsp->up) {
@@ -742,14 +753,6 @@ dsp_function(struct mISDNchannel *ch, struct sk_buff *skb)
				digits++;
			}
		}
		/* we need to process receive data if software */
		if (dsp->pcm_slot_tx < 0 && dsp->pcm_slot_rx < 0) {
			/* process data from card at cmx */
			dsp_cmx_receive(dsp, skb);
		}

		spin_unlock_irqrestore(&dsp_lock, flags);

		if (dsp->rx_disabled) {
			/* if receive is not allowed */
			break;