diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2012-04-24 16:52:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-26 05:21:03 -0400 |
commit | a4d729d0ce7e52f21d1976b96fc6211ee34bf84b (patch) | |
tree | e0e7d833fd4b981d77b83ab898f4c39efa860514 /drivers/isdn/hardware | |
parent | 25456e5ceea57e99091f5ff44d71012b31651391 (diff) |
mISDN: Fixed false interruption of audio during bridging change.
Transmitted audio data was interrupted if a bridge was enabled or disabled.
Now transmission seamlessly continues during that action.
Fix in hfcmulti.ko
Signed-off-by: Andreas Eversberg <jolly@eversberg.eu>
Signed-off-by: Karsten Keil <keil@b1-systems.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/isdn/hardware')
-rw-r--r-- | drivers/isdn/hardware/mISDN/hfcmulti.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c index 033223180b55..c4e7fda99435 100644 --- a/drivers/isdn/hardware/mISDN/hfcmulti.c +++ b/drivers/isdn/hardware/mISDN/hfcmulti.c | |||
@@ -3018,8 +3018,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx, | |||
3018 | HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF); | 3018 | HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF); |
3019 | HFC_outb(hc, A_SUBCH_CFG, 0); | 3019 | HFC_outb(hc, A_SUBCH_CFG, 0); |
3020 | HFC_outb(hc, A_IRQ_MSK, 0); | 3020 | HFC_outb(hc, A_IRQ_MSK, 0); |
3021 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); | 3021 | if (hc->chan[ch].protocol != protocol) { |
3022 | HFC_wait(hc); | 3022 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); |
3023 | HFC_wait(hc); | ||
3024 | } | ||
3023 | HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) + | 3025 | HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) + |
3024 | ((ch % 4) * 4) + 1) << 1) | 1); | 3026 | ((ch % 4) * 4) + 1) << 1) | 1); |
3025 | HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1) | 1); | 3027 | HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1) | 1); |
@@ -3039,8 +3041,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx, | |||
3039 | HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF); | 3041 | HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF); |
3040 | HFC_outb(hc, A_SUBCH_CFG, 0); | 3042 | HFC_outb(hc, A_SUBCH_CFG, 0); |
3041 | HFC_outb(hc, A_IRQ_MSK, 0); | 3043 | HFC_outb(hc, A_IRQ_MSK, 0); |
3042 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); | 3044 | if (hc->chan[ch].protocol != protocol) { |
3043 | HFC_wait(hc); | 3045 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); |
3046 | HFC_wait(hc); | ||
3047 | } | ||
3044 | /* tx silence */ | 3048 | /* tx silence */ |
3045 | HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence); | 3049 | HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence); |
3046 | HFC_outb(hc, R_SLOT, (((ch / 4) * 8) + | 3050 | HFC_outb(hc, R_SLOT, (((ch / 4) * 8) + |
@@ -3059,8 +3063,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx, | |||
3059 | V_HDLC_TRP | V_IFF); | 3063 | V_HDLC_TRP | V_IFF); |
3060 | HFC_outb(hc, A_SUBCH_CFG, 0); | 3064 | HFC_outb(hc, A_SUBCH_CFG, 0); |
3061 | HFC_outb(hc, A_IRQ_MSK, 0); | 3065 | HFC_outb(hc, A_IRQ_MSK, 0); |
3062 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); | 3066 | if (hc->chan[ch].protocol != protocol) { |
3063 | HFC_wait(hc); | 3067 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); |
3068 | HFC_wait(hc); | ||
3069 | } | ||
3064 | /* tx silence */ | 3070 | /* tx silence */ |
3065 | HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence); | 3071 | HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence); |
3066 | /* enable RX fifo */ | 3072 | /* enable RX fifo */ |
@@ -3075,8 +3081,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx, | |||
3075 | V_HDLC_TRP); | 3081 | V_HDLC_TRP); |
3076 | HFC_outb(hc, A_SUBCH_CFG, 0); | 3082 | HFC_outb(hc, A_SUBCH_CFG, 0); |
3077 | HFC_outb(hc, A_IRQ_MSK, 0); | 3083 | HFC_outb(hc, A_IRQ_MSK, 0); |
3078 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); | 3084 | if (hc->chan[ch].protocol != protocol) { |
3079 | HFC_wait(hc); | 3085 | HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); |
3086 | HFC_wait(hc); | ||
3087 | } | ||
3080 | } | 3088 | } |
3081 | if (hc->ctype != HFC_TYPE_E1) { | 3089 | if (hc->ctype != HFC_TYPE_E1) { |
3082 | hc->hw.a_st_ctrl0[hc->chan[ch].port] |= | 3090 | hc->hw.a_st_ctrl0[hc->chan[ch].port] |= |