aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2012-04-24 16:52:11 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-26 05:21:03 -0400
commita4d729d0ce7e52f21d1976b96fc6211ee34bf84b (patch)
treee0e7d833fd4b981d77b83ab898f4c39efa860514 /drivers/isdn
parent25456e5ceea57e99091f5ff44d71012b31651391 (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')
-rw-r--r--drivers/isdn/hardware/mISDN/hfcmulti.c24
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] |=