--- base-2394.c 2007-04-21 12:57:54.063576800 +0300 +++ base.c 2007-04-21 13:01:42.438576800 +0300 @@ -2300,13 +2300,19 @@ /* Get high channel in low bits */ rxs = (a & 0xf); if (!(ts->span.chans[i+16].sig & ZT_SIG_CLEAR)) { - if (ts->span.chans[i+16].rxsig != rxs) + if (ts->span.chans[i+16].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i+16], rxs); + spin_lock(&wc->reglock); + } } rxs = (a >> 4) & 0xf; if (!(ts->span.chans[i].sig & ZT_SIG_CLEAR)) { - if (ts->span.chans[i].rxsig != rxs) + if (ts->span.chans[i].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i], rxs); + spin_lock(&wc->reglock); + } } } } else if (ts->span.lineconfig & ZT_CONFIG_D4) { @@ -2315,23 +2321,35 @@ /* Get high channel in low bits */ rxs = (a & 0x3) << 2; if (!(ts->span.chans[i+3].sig & ZT_SIG_CLEAR)) { - if (ts->span.chans[i+3].rxsig != rxs) + if (ts->span.chans[i+3].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i+3], rxs); + spin_lock(&wc->reglock); + } } rxs = (a & 0xc); if (!(ts->span.chans[i+2].sig & ZT_SIG_CLEAR)) { - if (ts->span.chans[i+2].rxsig != rxs) + if (ts->span.chans[i+2].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i+2], rxs); + spin_lock(&wc->reglock); + } } rxs = (a >> 2) & 0xc; if (!(ts->span.chans[i+1].sig & ZT_SIG_CLEAR)) { - if (ts->span.chans[i+1].rxsig != rxs) + if (ts->span.chans[i+1].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i+1], rxs); + spin_lock(&wc->reglock); + } } rxs = (a >> 4) & 0xc; if (!(ts->span.chans[i].sig & ZT_SIG_CLEAR)) { - if (ts->span.chans[i].rxsig != rxs) + if (ts->span.chans[i].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i], rxs); + spin_lock(&wc->reglock); + } } } } else { @@ -2342,14 +2360,18 @@ if (!(ts->span.chans[i+1].sig & ZT_SIG_CLEAR)) { /* XXX Not really reset on every trans! XXX */ if (ts->span.chans[i+1].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i+1], rxs); + spin_lock(&wc->reglock); } } rxs = (a >> 4) & 0xf; if (!(ts->span.chans[i].sig & ZT_SIG_CLEAR)) { /* XXX Not really reset on every trans! XXX */ if (ts->span.chans[i].rxsig != rxs) { + spin_unlock(&wc->reglock); zt_rbsbits(&ts->span.chans[i], rxs); + spin_lock(&wc->reglock); } } } @@ -2475,7 +2497,9 @@ if (ts->span.mainttimer || ts->span.maintstat) alarms |= ZT_ALARM_LOOPBACK; ts->span.alarms = alarms; + spin_unlock(&wc->reglock); zt_alarm_notify(&ts->span); + spin_lock(&wc->reglock); } static void __t4_do_counters(struct t4 *wc) @@ -2495,7 +2519,9 @@ if (docheck) { if (!polling) __t4_check_alarms(wc, span); + spin_unlock(&wc->reglock); zt_alarm_notify(&ts->span); + spin_lock(&wc->reglock); } } }