Commit a4d729d0 authored by Andreas Eversberg's avatar Andreas Eversberg Committed by David S. Miller

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: default avatarAndreas Eversberg <jolly@eversberg.eu>
Signed-off-by: default avatarKarsten Keil <keil@b1-systems.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 25456e5c
...@@ -3018,8 +3018,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx, ...@@ -3018,8 +3018,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF); HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF);
HFC_outb(hc, A_SUBCH_CFG, 0); HFC_outb(hc, A_SUBCH_CFG, 0);
HFC_outb(hc, A_IRQ_MSK, 0); HFC_outb(hc, A_IRQ_MSK, 0);
if (hc->chan[ch].protocol != protocol) {
HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
HFC_wait(hc); HFC_wait(hc);
}
HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) + HFC_outb(hc, R_SLOT, ((((ch / 4) * 8) +
((ch % 4) * 4) + 1) << 1) | 1); ((ch % 4) * 4) + 1) << 1) | 1);
HFC_outb(hc, A_SL_CFG, 0x80 | 0x20 | (ch << 1) | 1); 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,8 +3041,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF); HFC_outb(hc, A_CON_HDLC, 0x20 | V_HDLC_TRP | V_IFF);
HFC_outb(hc, A_SUBCH_CFG, 0); HFC_outb(hc, A_SUBCH_CFG, 0);
HFC_outb(hc, A_IRQ_MSK, 0); HFC_outb(hc, A_IRQ_MSK, 0);
if (hc->chan[ch].protocol != protocol) {
HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
HFC_wait(hc); HFC_wait(hc);
}
/* tx silence */ /* tx silence */
HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence); HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
HFC_outb(hc, R_SLOT, (((ch / 4) * 8) + 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,8 +3063,10 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
V_HDLC_TRP | V_IFF); V_HDLC_TRP | V_IFF);
HFC_outb(hc, A_SUBCH_CFG, 0); HFC_outb(hc, A_SUBCH_CFG, 0);
HFC_outb(hc, A_IRQ_MSK, 0); HFC_outb(hc, A_IRQ_MSK, 0);
if (hc->chan[ch].protocol != protocol) {
HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
HFC_wait(hc); HFC_wait(hc);
}
/* tx silence */ /* tx silence */
HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence); HFC_outb_nodebug(hc, A_FIFO_DATA0_NOINC, hc->silence);
/* enable RX fifo */ /* enable RX fifo */
...@@ -3075,9 +3081,11 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx, ...@@ -3075,9 +3081,11 @@ mode_hfcmulti(struct hfc_multi *hc, int ch, int protocol, int slot_tx,
V_HDLC_TRP); V_HDLC_TRP);
HFC_outb(hc, A_SUBCH_CFG, 0); HFC_outb(hc, A_SUBCH_CFG, 0);
HFC_outb(hc, A_IRQ_MSK, 0); HFC_outb(hc, A_IRQ_MSK, 0);
if (hc->chan[ch].protocol != protocol) {
HFC_outb(hc, R_INC_RES_FIFO, V_RES_F); HFC_outb(hc, R_INC_RES_FIFO, V_RES_F);
HFC_wait(hc); HFC_wait(hc);
} }
}
if (hc->ctype != HFC_TYPE_E1) { if (hc->ctype != HFC_TYPE_E1) {
hc->hw.a_st_ctrl0[hc->chan[ch].port] |= hc->hw.a_st_ctrl0[hc->chan[ch].port] |=
((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN; ((ch & 0x3) == 0) ? V_B1_EN : V_B2_EN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment