[zaptel-commits] tzafrir: branch tzafrir/kernelmove r2496 - in
/team/tzafrir/kernelmove: ./ ke...
zaptel-commits at lists.digium.com
zaptel-commits at lists.digium.com
Fri May 4 16:21:44 MST 2007
Author: tzafrir
Date: Fri May 4 18:21:43 2007
New Revision: 2496
URL: http://svn.digium.com/view/zaptel?view=rev&rev=2496
Log:
Synced from trunk rev. 2402:2495 .
Added:
team/tzafrir/kernelmove/kernel/jpah.h (props changed)
- copied unchanged from r2495, trunk/jpah.h
team/tzafrir/kernelmove/kernel/xpp/ChangeLog (props changed)
- copied unchanged from r2495, trunk/xpp/ChangeLog
team/tzafrir/kernelmove/kernel/xpp/init_card_3_26 (props changed)
- copied unchanged from r2495, trunk/xpp/init_card_3_26
team/tzafrir/kernelmove/kernel/xpp/init_card_4_26 (props changed)
- copied unchanged from r2495, trunk/xpp/init_card_4_26
team/tzafrir/kernelmove/kernel/xpp/init_card_6_26 (props changed)
- copied unchanged from r2495, trunk/xpp/init_card_6_26
team/tzafrir/kernelmove/kernel/xpp/init_card_7_26 (props changed)
- copied unchanged from r2495, trunk/xpp/init_card_7_26
team/tzafrir/kernelmove/kernel/xpp/utils/xpp_blink (props changed)
- copied unchanged from r2495, trunk/xpp/utils/xpp_blink
Removed:
team/tzafrir/kernelmove/kernel/xpp/init_card_3_24
team/tzafrir/kernelmove/kernel/xpp/init_card_4_24
team/tzafrir/kernelmove/kernel/xpp/init_card_6_24
team/tzafrir/kernelmove/kernel/xpp/init_card_7_24
team/tzafrir/kernelmove/kernel/xpp/utils/adj_clock.8
team/tzafrir/kernelmove/kernel/xpp/utils/adj_clock.c
Modified:
team/tzafrir/kernelmove/ (props changed)
team/tzafrir/kernelmove/kernel/ (props changed)
team/tzafrir/kernelmove/kernel/wct1xxp.c
team/tzafrir/kernelmove/kernel/wct4xxp/base.c
team/tzafrir/kernelmove/kernel/wcte11xp.c
team/tzafrir/kernelmove/kernel/xpp/.version
team/tzafrir/kernelmove/kernel/xpp/README.Astribank
team/tzafrir/kernelmove/kernel/xpp/calibrate_slics
team/tzafrir/kernelmove/kernel/xpp/card_bri.c
team/tzafrir/kernelmove/kernel/xpp/card_fxo.c
team/tzafrir/kernelmove/kernel/xpp/card_fxs.c
team/tzafrir/kernelmove/kernel/xpp/card_global.c
team/tzafrir/kernelmove/kernel/xpp/card_global.h
team/tzafrir/kernelmove/kernel/xpp/firmwares/FPGA_1141.hex
team/tzafrir/kernelmove/kernel/xpp/firmwares/FPGA_1151.hex
team/tzafrir/kernelmove/kernel/xpp/firmwares/FPGA_FXS.hex
team/tzafrir/kernelmove/kernel/xpp/firmwares/USB_1130.hex
team/tzafrir/kernelmove/kernel/xpp/firmwares/USB_1140.hex
team/tzafrir/kernelmove/kernel/xpp/firmwares/USB_1150.hex
team/tzafrir/kernelmove/kernel/xpp/utils/Makefile
team/tzafrir/kernelmove/kernel/xpp/utils/fpga_load.8
team/tzafrir/kernelmove/kernel/xpp/utils/fpga_load.c
team/tzafrir/kernelmove/kernel/xpp/utils/genzaptelconf
team/tzafrir/kernelmove/kernel/xpp/utils/hexfile.c
team/tzafrir/kernelmove/kernel/xpp/utils/hexfile.h
team/tzafrir/kernelmove/kernel/xpp/utils/lszaptel
team/tzafrir/kernelmove/kernel/xpp/utils/xpp_fxloader
team/tzafrir/kernelmove/kernel/xpp/utils/xpp_sync
team/tzafrir/kernelmove/kernel/xpp/utils/zconf/Zaptel.pm
team/tzafrir/kernelmove/kernel/xpp/utils/zconf/Zaptel/Chans.pm
team/tzafrir/kernelmove/kernel/xpp/utils/zconf/Zaptel/Span.pm
team/tzafrir/kernelmove/kernel/xpp/utils/zconf/Zaptel/Xpp.pm
team/tzafrir/kernelmove/kernel/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm
team/tzafrir/kernelmove/kernel/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
team/tzafrir/kernelmove/kernel/xpp/utils/zt_registration
team/tzafrir/kernelmove/kernel/xpp/xbus-core.c
team/tzafrir/kernelmove/kernel/xpp/xpd.h
team/tzafrir/kernelmove/kernel/xpp/xpp_usb.c
team/tzafrir/kernelmove/kernel/xpp/xpp_zap.c
team/tzafrir/kernelmove/kernel/xpp/xpp_zap.h
team/tzafrir/kernelmove/kernel/xpp/xproto.c
team/tzafrir/kernelmove/kernel/xpp/xproto.h
team/tzafrir/kernelmove/kernel/zaptel.c
team/tzafrir/kernelmove/kernel/zaptel.h
team/tzafrir/kernelmove/kernel/zconfig.h
team/tzafrir/kernelmove/zaptel.init
team/tzafrir/kernelmove/zonedata.c
team/tzafrir/kernelmove/ztmonitor.c
Propchange: team/tzafrir/kernelmove/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Propchange: team/tzafrir/kernelmove/kernel/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Propchange: team/tzafrir/kernelmove/kernel/jpah.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/tzafrir/kernelmove/kernel/jpah.h
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/tzafrir/kernelmove/kernel/jpah.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: team/tzafrir/kernelmove/kernel/wct1xxp.c
URL: http://svn.digium.com/view/zaptel/team/tzafrir/kernelmove/kernel/wct1xxp.c?view=diff&rev=2496&r1=2495&r2=2496
==============================================================================
--- team/tzafrir/kernelmove/kernel/wct1xxp.c (original)
+++ team/tzafrir/kernelmove/kernel/wct1xxp.c Fri May 4 18:21:43 2007
@@ -959,10 +959,12 @@
zt_receive(&wc->span);
}
-static void __t1xxp_check_sigbits(struct t1xxp *wc, int x)
+static void t1xxp_check_sigbits(struct t1xxp *wc, int x)
{
int a,b,i,y,rxs;
-
+ unsigned long flags;
+
+ spin_lock_irqsave(&wc->lock, flags);
if (wc->ise1) {
/* Read 5 registers at a time, loading 10 channels at a time */
for (i = (x * 5); i < (x * 5) + 5; i++) {
@@ -970,13 +972,19 @@
/* Get high channel in low bits */
rxs = (a & 0xf);
if (!(wc->chans[i+16].sig & ZT_SIG_CLEAR)) {
- if (wc->chans[i+16].rxsig != rxs)
+ if (wc->chans[i+16].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->chans[i+16], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
rxs = (a >> 4) & 0xf;
if (!(wc->chans[i].sig & ZT_SIG_CLEAR)) {
- if (wc->chans[i].rxsig != rxs)
+ if (wc->chans[i].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->chans[i], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
}
} else {
@@ -990,18 +998,25 @@
if (b & (1 << y))
rxs |= ZT_BBIT;
if (!(wc->chans[i].sig & ZT_SIG_CLEAR)) {
- if (wc->chans[i].rxsig != rxs)
+ if (wc->chans[i].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->chans[i], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
}
}
-}
-
-static void __t1xxp_check_alarms(struct t1xxp *wc)
+ spin_unlock_irqrestore(&wc->lock, flags);
+}
+
+static void t1xxp_check_alarms(struct t1xxp *wc)
{
unsigned char c,d;
int alarms;
int x,j;
+ unsigned long flags;
+
+ spin_lock_irqsave(&wc->lock, flags);
if (wc->ise1) {
__t1_set_reg(wc, 0x06, 0xff);
@@ -1105,11 +1120,16 @@
wc->span.alarms = alarms;
+ spin_unlock_irqrestore(&wc->lock, flags);
+
zt_alarm_notify(&wc->span);
}
-static void __t1xxp_do_counters(struct t1xxp *wc)
-{
+static void t1xxp_do_counters(struct t1xxp *wc)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&wc->lock, flags);
if (wc->alarmtimer) {
if (!--wc->alarmtimer) {
wc->span.alarms &= ~(ZT_ALARM_RECOVER);
@@ -1121,9 +1141,12 @@
__t1_set_reg(wc, 0x21, 0x5f);
else
__t1_set_reg(wc, 0x35, 0x10);
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_alarm_notify(&wc->span);
+ spin_lock_irqsave(&wc->lock, flags);
}
}
+ spin_unlock_irqrestore(&wc->lock, flags);
}
ZAP_IRQ_HANDLER(t1xxp_interrupt)
@@ -1161,8 +1184,10 @@
__handle_leds(wc);
#endif
+ spin_unlock_irqrestore(&wc->lock, flags);
+
/* Count down timers */
- __t1xxp_do_counters(wc);
+ t1xxp_do_counters(wc);
/* Do some things that we don't have to do very often */
x = wc->intcount & 15 /* 63 */;
@@ -1170,17 +1195,15 @@
case 0:
case 1:
case 2:
- __t1xxp_check_sigbits(wc, x);
+ t1xxp_check_sigbits(wc, x);
break;
case 4:
/* Check alarms 1/4 as frequently */
if (!(wc->intcount & 0x30))
- __t1xxp_check_alarms(wc);
+ t1xxp_check_alarms(wc);
break;
}
- spin_unlock_irqrestore(&wc->lock, flags);
-
if (ints & 0x10)
printk("PCI Master abort\n");
Modified: team/tzafrir/kernelmove/kernel/wct4xxp/base.c
URL: http://svn.digium.com/view/zaptel/team/tzafrir/kernelmove/kernel/wct4xxp/base.c?view=diff&rev=2496&r1=2495&r2=2496
==============================================================================
--- team/tzafrir/kernelmove/kernel/wct4xxp/base.c (original)
+++ team/tzafrir/kernelmove/kernel/wct4xxp/base.c Fri May 4 18:21:43 2007
@@ -165,7 +165,7 @@
#endif
-static int debug=0;
+static int debug=0x0;
static int timingcable = 0;
static int highestorder;
static int t1e1override = -1; //0xFF; // -1 = jumper; 0xFF = E1
@@ -187,8 +187,6 @@
aggressive cards. Please note that burst mode has no effect on CPU
utilization / max number of calls / etc. */
static int noburst = 1;
-static int debugslips = 0;
-static int polling = 0;
/* For 56kbps links, set this module parameter to 0x7f */
static int hardhdlcmode = 0xff;
@@ -359,8 +357,8 @@
static void t4_tsi_assign(struct t4 *wc, int fromspan, int fromchan, int tospan, int tochan);
static void t4_tsi_unassign(struct t4 *wc, int tospan, int tochan);
static void __t4_set_timing_source(struct t4 *wc, int unit, int master, int slave);
-static void __t4_check_alarms(struct t4 *wc, int span);
-static void __t4_check_sigbits(struct t4 *wc, int span);
+static void t4_check_alarms(struct t4 *wc, int span);
+static void t4_check_sigbits(struct t4 *wc, int span);
#define WC_RDADDR 0
#define WC_WRADDR 1
@@ -725,7 +723,7 @@
channel -= 5;
else
channel -= 1;
- if (debug)
+ if (unlikely(debug))
printk("Got tone %s of '%c' on channel %d of span %d\n",
(start ? "START" : "STOP"), tone, channel, span + 1);
if (test_bit(channel, &wc->tspans[span]->dtmfmask) && (tone != 'u')) {
@@ -753,7 +751,7 @@
}
}
-static void __t4_check_vpm400(struct t4 *wc, unsigned int newio)
+static void t4_check_vpm400(struct t4 *wc, unsigned int newio)
{
unsigned int digit, regval = 0;
unsigned int regbyte;
@@ -772,11 +770,11 @@
continue;
ts = wc->tspans[x%4];
/* Start of DTMF detection process */
- regbyte = __t4_vpm_in(wc, x, 0xb8);
- __t4_vpm_out(wc, x, 0xb8, regbyte); /* Write 1 to clear */
+ regbyte = t4_vpm_in(wc, x, 0xb8);
+ t4_vpm_out(wc, x, 0xb8, regbyte); /* Write 1 to clear */
regval = regbyte << 8;
- regbyte = __t4_vpm_in(wc, x, 0xb9);
- __t4_vpm_out(wc, x, 0xb9, regbyte);
+ regbyte = t4_vpm_in(wc, x, 0xb9);
+ t4_vpm_out(wc, x, 0xb9, regbyte);
regval |= regbyte;
for(i = 0; (i < MAX_DTMF_DET) && regval; i++) {
@@ -786,10 +784,10 @@
if (!wc->t1e1)
base -= 4;
- regbyte = __t4_vpm_in(wc, x, 0xa8 + i);
+ regbyte = t4_vpm_in(wc, x, 0xa8 + i);
digit = vpm_digits[regbyte];
if (!(wc->tspans[0]->spanflags & FLAG_VPM2GEN)) {
- energy = __t4_vpm_in(wc, x, 0x58 + channel);
+ energy = t4_vpm_in(wc, x, 0x58 + channel);
energy = ZT_XLAW(energy, ts->chans);
ts->dtmfenergy[base] = energy;
}
@@ -823,11 +821,11 @@
continue;
/* Start of DTMF off detection process */
- regbyte = __t4_vpm_in(wc, x, 0xbc);
- __t4_vpm_out(wc, x, 0xbc, regbyte); /* Write 1 to clear */
+ regbyte = t4_vpm_in(wc, x, 0xbc);
+ t4_vpm_out(wc, x, 0xbc, regbyte); /* Write 1 to clear */
regval = regbyte << 8;
- regbyte = __t4_vpm_in(wc, x, 0xbd);
- __t4_vpm_out(wc, x, 0xbd, regbyte);
+ regbyte = t4_vpm_in(wc, x, 0xbd);
+ t4_vpm_out(wc, x, 0xbd, regbyte);
regval |= regbyte;
for(i = 0; (i < MAX_DTMF_DET) && regval; i++) {
@@ -855,7 +853,7 @@
}
#endif
-static void __hdlc_stop(struct t4 *wc, unsigned int span)
+static void hdlc_stop(struct t4 *wc, unsigned int span)
{
struct t4_span *t = wc->tspans[span];
unsigned char imr0, imr1, mode;
@@ -865,23 +863,23 @@
/* Clear receive and transmit timeslots */
for (i = 0; i < 4; i++) {
- __t4_framer_out(wc, span, FRMR_RTR_BASE + i, 0x00);
- __t4_framer_out(wc, span, FRMR_TTR_BASE + i, 0x00);
- }
-
- imr0 = __t4_framer_in(wc, span, FRMR_IMR0);
- imr1 = __t4_framer_in(wc, span, FRMR_IMR1);
+ t4_framer_out(wc, span, FRMR_RTR_BASE + i, 0x00);
+ t4_framer_out(wc, span, FRMR_TTR_BASE + i, 0x00);
+ }
+
+ imr0 = t4_framer_in(wc, span, FRMR_IMR0);
+ imr1 = t4_framer_in(wc, span, FRMR_IMR1);
/* Disable HDLC interrupts */
imr0 |= HDLC_IMR0_MASK;
- __t4_framer_out(wc, span, FRMR_IMR0, imr0);
+ t4_framer_out(wc, span, FRMR_IMR0, imr0);
imr1 |= HDLC_IMR1_MASK;
- __t4_framer_out(wc, span, FRMR_IMR1, imr1);
-
- mode = __t4_framer_in(wc, span, FRMR_MODE);
+ t4_framer_out(wc, span, FRMR_IMR1, imr1);
+
+ mode = t4_framer_in(wc, span, FRMR_MODE);
mode &= ~FRMR_MODE_HRAC;
- __t4_framer_out(wc, span, FRMR_MODE, mode);
+ t4_framer_out(wc, span, FRMR_MODE, mode);
t->sigactive = 0;
}
@@ -891,14 +889,14 @@
__t4_framer_out(wc, span, FRMR_CMDR, cmd);
}
-static inline void __t4_framer_cmd_wait(struct t4 *wc, unsigned int span, int cmd)
+static inline void t4_framer_cmd_wait(struct t4 *wc, unsigned int span, int cmd)
{
int sis;
int loops = 0;
/* XXX could be time consuming XXX */
for (;;) {
- sis = __t4_framer_in(wc, span, FRMR_SIS);
+ sis = t4_framer_in(wc, span, FRMR_SIS);
if (!(sis & 0x04))
break;
if (!loops++) {
@@ -908,14 +906,15 @@
if (loops)
printk("!!!SIS waited %d loops\n", loops);
- __t4_framer_out(wc, span, FRMR_CMDR, cmd);
-}
-
-static int __hdlc_start(struct t4 *wc, unsigned int span, struct zt_chan *chan, unsigned char mode)
+ t4_framer_out(wc, span, FRMR_CMDR, cmd);
+}
+
+static int hdlc_start(struct t4 *wc, unsigned int span, struct zt_chan *chan, unsigned char mode)
{
struct t4_span *t = wc->tspans[span];
unsigned char imr0, imr1;
int offset = chan->chanpos;
+ unsigned long flags;
if (debug & DEBUG_FRAMER) printk("Starting HDLC controller for channel %d span %d\n", offset, span+1);
@@ -925,33 +924,36 @@
mode |= FRMR_MODE_HRAC;
/* Make sure we're in the right mode */
- __t4_framer_out(wc, span, FRMR_MODE, mode);
- __t4_framer_out(wc, span, FRMR_TSEO, 0x00);
- __t4_framer_out(wc, span, FRMR_TSBS1, hardhdlcmode);
+ t4_framer_out(wc, span, FRMR_MODE, mode);
+ t4_framer_out(wc, span, FRMR_TSEO, 0x00);
+ t4_framer_out(wc, span, FRMR_TSBS1, hardhdlcmode);
/* Set the interframe gaps, etc */
- __t4_framer_out(wc, span, FRMR_CCR1, FRMR_CCR1_ITF|FRMR_CCR1_EITS);
-
- __t4_framer_out(wc, span, FRMR_CCR2, FRMR_CCR2_RCRC);
+ t4_framer_out(wc, span, FRMR_CCR1, FRMR_CCR1_ITF|FRMR_CCR1_EITS);
+
+ t4_framer_out(wc, span, FRMR_CCR2, FRMR_CCR2_RCRC);
/* Set up the time slot that we want to tx/rx on */
- __t4_framer_out(wc, span, FRMR_TTR_BASE + (offset / 8), (0x80 >> (offset % 8)));
- __t4_framer_out(wc, span, FRMR_RTR_BASE + (offset / 8), (0x80 >> (offset % 8)));
-
- imr0 = __t4_framer_in(wc, span, FRMR_IMR0);
- imr1 = __t4_framer_in(wc, span, FRMR_IMR1);
+ t4_framer_out(wc, span, FRMR_TTR_BASE + (offset / 8), (0x80 >> (offset % 8)));
+ t4_framer_out(wc, span, FRMR_RTR_BASE + (offset / 8), (0x80 >> (offset % 8)));
+
+ imr0 = t4_framer_in(wc, span, FRMR_IMR0);
+ imr1 = t4_framer_in(wc, span, FRMR_IMR1);
/* Enable our interrupts again */
imr0 &= ~HDLC_IMR0_MASK;
- __t4_framer_out(wc, span, FRMR_IMR0, imr0);
+ t4_framer_out(wc, span, FRMR_IMR0, imr0);
imr1 &= ~HDLC_IMR1_MASK;
- __t4_framer_out(wc, span, FRMR_IMR1, imr1);
+ t4_framer_out(wc, span, FRMR_IMR1, imr1);
/* Reset the signaling controller */
- __t4_framer_cmd_wait(wc, span, FRMR_CMDR_SRES);
-
+ t4_framer_cmd_wait(wc, span, FRMR_CMDR_SRES);
+
+ spin_lock_irqsave(&wc->reglock, flags);
t->sigchan = chan;
+ spin_unlock_irqrestore(&wc->reglock, flags);
+
t->sigactive = 0;
return 0;
@@ -1174,7 +1176,7 @@
return 0;
}
-static void inline __t4_hdlc_xmit_fifo(struct t4 *wc, unsigned int span, struct t4_span *ts)
+static void inline t4_hdlc_xmit_fifo(struct t4 *wc, unsigned int span, struct t4_span *ts)
{
int res, i, size = 32;
unsigned char buf[32];
@@ -1192,11 +1194,11 @@
}
for (i = 0; i < size; i++)
- __t4_framer_out(wc, span, FRMR_TXFIFO, buf[i]);
+ t4_framer_out(wc, span, FRMR_TXFIFO, buf[i]);
if (res) /* End of message */ {
if (debug & DEBUG_FRAMER) printk("transmiting XHF|XME\n");
- __t4_framer_cmd_wait(wc, span, FRMR_CMDR_XHF | FRMR_CMDR_XME);
+ t4_framer_cmd_wait(wc, span, FRMR_CMDR_XHF | FRMR_CMDR_XME);
#if 0
ts->sigactive = (__t4_framer_in(wc, span, FRMR_SIS) & FRMR_SIS_XFW) ? 0 : 1;
#endif
@@ -1205,7 +1207,7 @@
printk("Transmitted %d frames on span %d\n", ts->frames_out, span);
} else { /* Still more to transmit */
if (debug & DEBUG_FRAMER) printk("transmiting XHF\n");
- __t4_framer_cmd_wait(wc, span, FRMR_CMDR_XHF);
+ t4_framer_cmd_wait(wc, span, FRMR_CMDR_XHF);
}
}
else if (res < 0)
@@ -1225,10 +1227,12 @@
spin_unlock_irqrestore(&wc->reglock, flags);
return;
}
+ spin_unlock_irqrestore(&wc->reglock, flags);
+
if (debug & DEBUG_FRAMER) printk("t4_hdlc_hard_xmit on channel %s (sigchan %s), sigactive=%d\n", chan->name, ts->sigchan->name, ts->sigactive);
+
if ((ts->sigchan == chan) && !ts->sigactive)
- __t4_hdlc_xmit_fifo(wc, span, ts);
- spin_unlock_irqrestore(&wc->reglock, flags);
+ t4_hdlc_xmit_fifo(wc, span, ts);
}
static int t4_maint(struct zt_span *span, int cmd)
@@ -1357,6 +1361,10 @@
}
if (debug & DEBUG_MAIN) printk("Shutting down span %d (%s)\n", span->spanno, span->name);
+
+ /* Stop HDLC controller if runned */
+ if (ts->sigchan)
+ hdlc_stop(wc, span->offset);
spin_lock_irqsave(&wc->reglock, flags);
wasrunning = span->flags & ZT_FLAG_RUNNING;
@@ -1364,10 +1372,6 @@
span->flags &= ~ZT_FLAG_RUNNING;
if (wasrunning)
wc->spansstarted--;
-
- /* Stop HDLC controller if runned */
- if (ts->sigchan)
- __hdlc_stop(wc, span->offset);
__t4_set_led(wc, span->offset, WC_OFF);
if (((wc->numspans == 4) &&
@@ -1449,30 +1453,34 @@
if (alreadyrunning)
__set_clear(wc, chan->span->offset);
+ spin_unlock_irqrestore(&wc->reglock, flags);
+
/* (re)configure signalling channel */
if ((sigtype == ZT_SIG_HARDHDLC) || (ts->sigchan == chan)) {
if (debug & DEBUG_FRAMER)
printk("%sonfiguring hardware HDLC on %s\n", ((sigtype == ZT_SIG_HARDHDLC) ? "C" : "Unc"), chan->name);
if (alreadyrunning) {
if (ts->sigchan)
- __hdlc_stop(wc, ts->sigchan->span->offset);
+ hdlc_stop(wc, ts->sigchan->span->offset);
if (sigtype == ZT_SIG_HARDHDLC) {
- if (__hdlc_start(wc, chan->span->offset, chan, ts->sigmode)) {
+ if (hdlc_start(wc, chan->span->offset, chan, ts->sigmode)) {
printk("Error initializing signalling controller\n");
- spin_unlock_irqrestore(&wc->reglock, flags);
return -1;
}
- }
- else
+ } else {
+ spin_lock_irqsave(&wc->reglock, flags);
ts->sigchan = NULL;
+ spin_unlock_irqrestore(&wc->reglock, flags);
+ }
}
else {
+ spin_lock_irqsave(&wc->reglock, flags);
ts->sigchan = (sigtype == ZT_SIG_HARDHDLC) ? chan : NULL;
+ spin_unlock_irqrestore(&wc->reglock, flags);
ts->sigactive = 0;
}
}
- spin_unlock_irqrestore(&wc->reglock, flags);
return 0;
}
@@ -1847,19 +1855,9 @@
__t4_framer_out(wc, unit, FRMR_IMR0, 0xff & ~((wc->tspans[unit]->sigchan) ? HDLC_IMR0_MASK : 0)); /* IMR0: We care about CAS changes, etc */
__t4_framer_out(wc, unit, FRMR_IMR1, 0xff & ~((wc->tspans[unit]->sigchan) ? HDLC_IMR1_MASK : 0)); /* IMR1: We care about nothing */
__t4_framer_out(wc, unit, 0x16, 0x00); /* IMR2: We care about all the alarm stuff! */
- if (debugslips) {
- __t4_framer_out(wc, unit, 0x17, 0xf4); /* IMR3: We care about AIS and friends */
- __t4_framer_out(wc, unit, 0x18, 0x3f); /* IMR4: We care about slips on transmit */
- } else {
- __t4_framer_out(wc, unit, 0x17, 0xf7); /* IMR3: We care about AIS and friends */
- __t4_framer_out(wc, unit, 0x18, 0xff); /* IMR4: We don't care about slips on transmit */
- }
-
- if (!polling) {
- __t4_check_alarms(wc, unit);
- __t4_check_sigbits(wc, unit);
- }
-
+ __t4_framer_out(wc, unit, 0x17, 0xf4); /* IMR3: We care about AIS and friends */
+ __t4_framer_out(wc, unit, 0x18, 0x3f); /* IMR4: We care about slips on transmit */
+
printk("TE%dXXP: Span %d configured for %s/%s\n", wc->numspans, unit + 1, framing, line);
}
@@ -1936,17 +1934,9 @@
__t4_framer_out(wc, unit, FRMR_IMR0, 0xff & ~((wc->tspans[unit]->sigchan) ? HDLC_IMR0_MASK : 0)); /* IMR0: We care about CRC errors, CAS changes, etc */
__t4_framer_out(wc, unit, FRMR_IMR1, 0x3f & ~((wc->tspans[unit]->sigchan) ? HDLC_IMR1_MASK : 0)); /* IMR1: We care about loopup / loopdown */
__t4_framer_out(wc, unit, 0x16, 0x00); /* IMR2: We care about all the alarm stuff! */
- if (debugslips) {
- __t4_framer_out(wc, unit, 0x17, 0xc4 | imr3extra); /* IMR3: We care about AIS and friends */
- __t4_framer_out(wc, unit, 0x18, 0x3f); /* IMR4: We care about slips on transmit */
- } else {
- __t4_framer_out(wc, unit, 0x17, 0xc7 | imr3extra); /* IMR3: We care about AIS and friends */
- __t4_framer_out(wc, unit, 0x18, 0xff); /* IMR4: We don't care about slips on transmit */
- }
- if (!polling) {
- __t4_check_alarms(wc, unit);
- __t4_check_sigbits(wc, unit);
- }
+ __t4_framer_out(wc, unit, 0x17, 0xc4 | imr3extra); /* IMR3: We care about AIS and friends */
+ __t4_framer_out(wc, unit, 0x18, 0x3f); /* IMR4: We care about slips on transmit */
+
printk("TE%dXXP: Span %d configured for %s/%s%s\n", wc->numspans, unit + 1, framing, line, crc4);
}
@@ -2011,22 +2001,26 @@
if (noburst)
wc->dmactrl |= (1 << 26);
__t4_pci_out(wc, WC_DMACTRL, wc->dmactrl);
- if (!polling) {
- __t4_check_alarms(wc, span->offset);
- __t4_check_sigbits(wc, span->offset);
- }
+
/* Startup HDLC controller too */
- if (ts->sigchan) {
- if (__hdlc_start(wc, span->offset, ts->sigchan, ts->sigmode)) {
- printk("Error initializing signalling controller\n");
- /* XXX Should de-initialize span XXX */
- spin_unlock_irqrestore(&wc->reglock, flags);
- return -1;
- }
- }
+ }
+
+ if (ts->sigchan) {
+ struct zt_chan *sigchan = ts->sigchan;
+
+ spin_unlock_irqrestore(&wc->reglock, flags);
+ if (hdlc_start(wc, span->offset, sigchan, ts->sigmode)) {
+ printk("Error initializing signalling controller\n");
+ return -1;
+ }
+ spin_lock_irqsave(&wc->reglock, flags);
}
spin_unlock_irqrestore(&wc->reglock, flags);
+
+ t4_check_alarms(wc, span->offset);
+ t4_check_sigbits(wc, span->offset);
+
if (wc->tspans[0]->sync == span->spanno) printk("SPAN %d: Primary Sync Source\n",span->spanno);
if (wc->tspans[1]->sync == span->spanno) printk("SPAN %d: Secondary Sync Source\n",span->spanno);
if (wc->numspans == 4) {
@@ -2284,7 +2278,7 @@
}
#endif
-static void __t4_check_sigbits(struct t4 *wc, int span)
+static void t4_check_sigbits(struct t4 *wc, int span)
{
int a,i,rxs;
struct t4_span *ts = wc->tspans[span];
@@ -2296,7 +2290,7 @@
return;
if (ts->spantype == TYPE_E1) {
for (i = 0; i < 15; i++) {
- a = __t4_framer_in(wc, span, 0x71 + i);
+ a = t4_framer_in(wc, span, 0x71 + i);
/* Get high channel in low bits */
rxs = (a & 0xf);
if (!(ts->span.chans[i+16].sig & ZT_SIG_CLEAR)) {
@@ -2311,7 +2305,7 @@
}
} else if (ts->span.lineconfig & ZT_CONFIG_D4) {
for (i = 0; i < 24; i+=4) {
- a = __t4_framer_in(wc, span, 0x70 + (i>>2));
+ a = t4_framer_in(wc, span, 0x70 + (i>>2));
/* Get high channel in low bits */
rxs = (a & 0x3) << 2;
if (!(ts->span.chans[i+3].sig & ZT_SIG_CLEAR)) {
@@ -2336,7 +2330,7 @@
}
} else {
for (i = 0; i < 24; i+=2) {
- a = __t4_framer_in(wc, span, 0x70 + (i>>1));
+ a = t4_framer_in(wc, span, 0x70 + (i>>1));
/* Get high channel in low bits */
rxs = (a & 0xf);
if (!(ts->span.chans[i+1].sig & ZT_SIG_CLEAR)) {
@@ -2356,15 +2350,18 @@
}
}
-static void __t4_check_alarms(struct t4 *wc, int span)
+static void t4_check_alarms(struct t4 *wc, int span)
{
unsigned char c,d;
int alarms;
int x,j;
struct t4_span *ts = wc->tspans[span];
+ unsigned long flags;
if (!(ts->span.flags & ZT_FLAG_RUNNING))
return;
+
+ spin_lock_irqsave(&wc->reglock, flags);
c = __t4_framer_in(wc, span, 0x4c);
d = __t4_framer_in(wc, span, 0x4d);
@@ -2475,15 +2472,18 @@
if (ts->span.mainttimer || ts->span.maintstat)
alarms |= ZT_ALARM_LOOPBACK;
ts->span.alarms = alarms;
+ spin_unlock_irqrestore(&wc->reglock, flags);
zt_alarm_notify(&ts->span);
}
-static void __t4_do_counters(struct t4 *wc)
+static void t4_do_counters(struct t4 *wc)
{
int span;
for (span=0;span<wc->numspans;span++) {
struct t4_span *ts = wc->tspans[span];
int docheck=0;
+
+ spin_lock(&wc->reglock);
if (ts->loopupcnt || ts->loopdowncnt)
docheck++;
if (ts->alarmtimer) {
@@ -2492,9 +2492,9 @@
ts->span.alarms &= ~(ZT_ALARM_RECOVER);
}
}
+ spin_unlock(&wc->reglock);
if (docheck) {
- if (!polling)
- __t4_check_alarms(wc, span);
+ t4_check_alarms(wc, span);
zt_alarm_notify(&ts->span);
}
}
@@ -2562,40 +2562,43 @@
#endif
}
-static inline void __t4_framer_interrupt(struct t4 *wc, int span)
+static inline void t4_framer_interrupt(struct t4 *wc, int span)
{
/* Check interrupts for a given span */
unsigned char gis, isr0, isr1, isr2, isr3, isr4;
int readsize = -1;
struct t4_span *ts = wc->tspans[span];
+ struct zt_chan *sigchan;
+ unsigned long flags;
if (debug & DEBUG_FRAMER)
printk("framer interrupt span %d:%d!\n", wc->num, span + 1);
/* 1st gen cards isn't used interrupts */
- gis = __t4_framer_in(wc, span, FRMR_GIS);
- isr0 = (gis & FRMR_GIS_ISR0) ? __t4_framer_in(wc, span, FRMR_ISR0) : 0;
- isr1 = (gis & FRMR_GIS_ISR1) ? __t4_framer_in(wc, span, FRMR_ISR1) : 0;
- isr2 = (gis & FRMR_GIS_ISR2) ? __t4_framer_in(wc, span, FRMR_ISR2) : 0;
- isr3 = (gis & FRMR_GIS_ISR3) ? __t4_framer_in(wc, span, FRMR_ISR3) : 0;
- isr4 = (gis & FRMR_GIS_ISR4) ? __t4_framer_in(wc, span, FRMR_ISR4) : 0;
+ gis = t4_framer_in(wc, span, FRMR_GIS);
+ isr0 = (gis & FRMR_GIS_ISR0) ? t4_framer_in(wc, span, FRMR_ISR0) : 0;
+ isr1 = (gis & FRMR_GIS_ISR1) ? t4_framer_in(wc, span, FRMR_ISR1) : 0;
+ isr2 = (gis & FRMR_GIS_ISR2) ? t4_framer_in(wc, span, FRMR_ISR2) : 0;
+ isr3 = (gis & FRMR_GIS_ISR3) ? t4_framer_in(wc, span, FRMR_ISR3) : 0;
+ isr4 = (gis & FRMR_GIS_ISR4) ? t4_framer_in(wc, span, FRMR_ISR4) : 0;
if (debug & DEBUG_FRAMER)
printk("gis: %02x, isr0: %02x, isr1: %02x, isr2: %02x, isr3: %02x, isr4: %02x\n", gis, isr0, isr1, isr2, isr3, isr4);
if (isr0)
- __t4_check_sigbits(wc, span);
+ t4_check_sigbits(wc, span);
if (ts->spantype == TYPE_E1) {
/* E1 checks */
if ((isr3 & 0x38) || isr2 || isr1)
- __t4_check_alarms(wc, span);
+ t4_check_alarms(wc, span);
} else {
/* T1 checks */
if (isr2 || (isr3 & 0x08))
- __t4_check_alarms(wc, span);
- }
- if (debugslips && !ts->span.alarms) {
+ t4_check_alarms(wc, span);
+ }
+ if (!ts->span.alarms) {
+ ts->span.timingslips++;
if (isr3 & 0x02)
printk("TE%d10P: RECEIVE slip NEGATIVE on span %d\n", wc->numspans, span + 1);
if (isr3 & 0x01)
@@ -2606,12 +2609,18 @@
printk("TE%d10P: TRANSMIT slip NEGATIVE on span %d\n", wc->numspans, span + 1);
}
+ spin_lock_irqsave(&wc->reglock, flags);
/* HDLC controller checks - receive side */
- if (!ts->sigchan)
+ if (!ts->sigchan) {
+ spin_unlock_irqrestore(&wc->reglock, flags);
return;
+ }
+
+ sigchan = ts->sigchan;
+ spin_unlock_irqrestore(&wc->reglock, flags);
if (isr0 & FRMR_ISR0_RME) {
- readsize = (__t4_framer_in(wc, span, FRMR_RBCH) << 8) | __t4_framer_in(wc, span, FRMR_RBCL);
+ readsize = (t4_framer_in(wc, span, FRMR_RBCH) << 8) | t4_framer_in(wc, span, FRMR_RBCL);
if (debug & DEBUG_FRAMER) printk("Received data length is %d (%d)\n", readsize, readsize & FRMR_RBCL_MAX_SIZE);
/* RPF isn't set on last part of frame */
if ((readsize > 0) && ((readsize &= FRMR_RBCL_MAX_SIZE) == 0))
@@ -2620,17 +2629,16 @@
readsize = 32;
if (readsize > 0) {
- struct zt_chan *sigchan = ts->sigchan;
int i;
unsigned char readbuf[readsize];
if (debug & DEBUG_FRAMER) printk("Framer %d: Got RPF/RME! readsize is %d\n", sigchan->span->offset, readsize);
for (i = 0; i < readsize; i++)
- readbuf[i] = __t4_framer_in(wc, span, FRMR_RXFIFO);
+ readbuf[i] = t4_framer_in(wc, span, FRMR_RXFIFO);
/* Tell the framer to clear the RFIFO */
- __t4_framer_cmd_wait(wc, span, FRMR_CMDR_RMC);
+ t4_framer_cmd_wait(wc, span, FRMR_CMDR_RMC);
if (debug & DEBUG_FRAMER) {
printk("RX(");
@@ -2642,8 +2650,10 @@
if (isr0 & FRMR_ISR0_RME) {
/* Do checks for HDLC problems */
unsigned char rsis = readbuf[readsize-1];
+#if 0
unsigned int olddebug = debug;
- unsigned char rsis_reg = __t4_framer_in(wc, span, FRMR_RSIS);
+#endif
+ unsigned char rsis_reg = t4_framer_in(wc, span, FRMR_RSIS);
#if 0
if ((rsis != 0xA2) || (rsis != rsis_reg))
@@ -2671,7 +2681,9 @@
zt_hdlc_finish(sigchan);
if (debug & DEBUG_FRAMER) printk("Received valid HDLC frame on span %d\n", span);
}
+#if 0
debug = olddebug;
+#endif
} else if (isr0 & FRMR_ISR0_RPF)
zt_hdlc_putbuf(sigchan, readbuf, readsize);
}
@@ -2679,15 +2691,13 @@
/* Transmit side */
if (isr1 & FRMR_ISR1_XDU) {
if (debug & DEBUG_FRAMER) printk("XDU: Resetting signal controler!\n");
- __t4_framer_cmd_wait(wc, span, FRMR_CMDR_SRES);
+ t4_framer_cmd_wait(wc, span, FRMR_CMDR_SRES);
} else if (isr1 & FRMR_ISR1_XPR) {
- struct zt_chan *sigchan = ts->sigchan;
-
if (debug & DEBUG_FRAMER)
printk("Sigchan %d is %p\n", sigchan->chanpos, sigchan);
if (debug & DEBUG_FRAMER) printk("Framer %d: Got XPR!\n", sigchan->span->offset);
- __t4_hdlc_xmit_fifo(wc, span, ts);
+ t4_hdlc_xmit_fifo(wc, span, ts);
}
if (isr1 & FRMR_ISR1_ALLS) {
@@ -2717,12 +2727,10 @@
/* Process framer interrupts */
status2 = t4_framer_in(wc, 0, FRMR_CIS);
if (status2 & 0x0f) {
- spin_lock_irqsave(&wc->reglock, flags);
for (x = 0; x < wc->numspans; ++x) {
if (status2 & (1 << x))
- __t4_framer_interrupt(wc, x);
- }
- spin_unlock_irqrestore(&wc->reglock, flags);
+ t4_framer_interrupt(wc, x);
+ }
}
/* Ignore if it's not for us */
@@ -2765,11 +2773,7 @@
}
}
#endif
- spin_lock_irqsave(&wc->reglock, flags);
-
- __handle_leds(wc);
-
- __t4_do_counters(wc);
+ t4_do_counters(wc);
x = wc->intcount & 15 /* 63 */;
switch(x) {
@@ -2777,18 +2781,23 @@
case 1:
case 2:
case 3:
- __t4_check_sigbits(wc, x);
+ t4_check_sigbits(wc, x);
break;
case 4:
case 5:
case 6:
case 7:
- __t4_check_alarms(wc, x - 4);
+ t4_check_alarms(wc, x - 4);
break;
}
+
+ spin_lock_irqsave(&wc->reglock, flags);
+
+ __handle_leds(wc);
if (wc->checktiming > 0)
__t4_set_timing_source_auto(wc);
+
spin_unlock_irqrestore(&wc->reglock, flags);
#ifdef LINUX26
return IRQ_RETVAL(1);
@@ -2799,21 +2808,18 @@
static void t4_isr_bh(unsigned long data)
{
struct t4 *wc = (struct t4 *)data;
- unsigned long flags;
unsigned char cis;
if (test_and_clear_bit(T4_CHECK_FRAMER, &wc->checkflag)) {
- spin_lock_irqsave(&wc->reglock, flags);
- cis = __t4_framer_in(wc, 0, FRMR_CIS);
+ cis = t4_framer_in(wc, 0, FRMR_CIS);
if (cis & FRMR_CIS_GIS1)
- __t4_framer_interrupt(wc, 0);
+ t4_framer_interrupt(wc, 0);
if (cis & FRMR_CIS_GIS2)
- __t4_framer_interrupt(wc, 1);
+ t4_framer_interrupt(wc, 1);
if (cis & FRMR_CIS_GIS3)
- __t4_framer_interrupt(wc, 2);
+ t4_framer_interrupt(wc, 2);
if (cis & FRMR_CIS_GIS4)
- __t4_framer_interrupt(wc, 3);
- spin_unlock_irqrestore(&wc->reglock, flags);
+ t4_framer_interrupt(wc, 3);
}
#ifdef VPM_SUPPORT
@@ -2824,11 +2830,8 @@
interrupt when there's a tone, in spite of what their
documentation says? */
t4_check_vpm450(wc);
- } else {
- spin_lock_irqsave(&wc->reglock, flags);
- __t4_check_vpm400(wc, wc->vpm400checkstatus);
- spin_unlock_irqrestore(&wc->reglock, flags);
- }
+ } else
+ t4_check_vpm400(wc, wc->vpm400checkstatus);
}
}
#endif
@@ -2868,7 +2871,7 @@
if (unlikely((wc->intcount < 20) && debug))
- printk("2G: Got interrupt, status = %08x, CIS = %04x\n", status, __t4_framer_in(wc, 0, FRMR_CIS));
+ printk("2G: Got interrupt, status = %08x, CIS = %04x\n", status, t4_framer_in(wc, 0, FRMR_CIS));
if (likely(status & 0x2)) {
#ifdef ENABLE_WORKQUEUES
@@ -2914,9 +2917,10 @@
}
}
+ t4_do_counters(wc);
+
spin_lock(&wc->reglock);
- __t4_do_counters(wc);
__handle_leds(wc);
if (unlikely(wc->checktiming > 0)) {
@@ -3336,7 +3340,7 @@
unsigned int version;
version = t4_pci_in(wc, WC_VERSION);
- printk("TE%dXXP version %08x, burst %s, slip debug: %s\n", wc->numspans, version, noburst ? "OFF" : "ON", debugslips ? "ON" : "OFF");
+ printk("TE%dXXP version %08x, burst %s\n", wc->numspans, version, noburst ? "OFF" : "ON");
#ifdef ENABLE_WORKQUEUES
printk("TE%dXXP running with work queues.\n", wc->numspans);
#endif
@@ -3776,8 +3780,6 @@
module_param(debug, int, 0600);
module_param(loopback, int, 0600);
module_param(noburst, int, 0600);
-module_param(debugslips, int, 0600);
-module_param(polling, int, 0600);
module_param(timingcable, int, 0600);
module_param(t1e1override, int, 0600);
module_param(alarmdebounce, int, 0600);
@@ -3793,8 +3795,6 @@
MODULE_PARM(debug, "i");
MODULE_PARM(loopback, "i");
MODULE_PARM(noburst, "i");
-MODULE_PARM(debugslips, "i");
-MODULE_PARM(polling, "i");
MODULE_PARM(hardhdlcmode, "i");
MODULE_PARM(timingcable, "i");
MODULE_PARM(t1e1override, "i");
Modified: team/tzafrir/kernelmove/kernel/wcte11xp.c
URL: http://svn.digium.com/view/zaptel/team/tzafrir/kernelmove/kernel/wcte11xp.c?view=diff&rev=2496&r1=2495&r2=2496
==============================================================================
--- team/tzafrir/kernelmove/kernel/wcte11xp.c (original)
+++ team/tzafrir/kernelmove/kernel/wcte11xp.c Fri May 4 18:21:43 2007
@@ -561,24 +561,35 @@
return 0;
}
-static void __t1_check_sigbits(struct t1 *wc)
+static void t1_check_sigbits(struct t1 *wc)
{
int a,i,rxs;
+ unsigned long flags;
+
if (!(wc->span.flags & ZT_FLAG_RUNNING))
return;
+
+ spin_lock_irqsave(&wc->lock, flags);
+
if (wc->spantype == TYPE_E1) {
for (i = 0; i < 15; i++) {
a = __t1_framer_in(wc, 0x71 + i);
/* Get high channel in low bits */
rxs = (a & 0xf);
if (!(wc->span.chans[i+16].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i+16].rxsig != rxs)
+ if (wc->span.chans[i+16].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i+16], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
rxs = (a >> 4) & 0xf;
if (!(wc->span.chans[i].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i].rxsig != rxs)
+ if (wc->span.chans[i].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
}
} else if (wc->span.lineconfig & ZT_CONFIG_D4) {
@@ -587,23 +598,35 @@
/* Get high channel in low bits */
rxs = (a & 0x3) << 2;
if (!(wc->span.chans[i+3].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i+3].rxsig != rxs)
+ if (wc->span.chans[i+3].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i+3], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
rxs = (a & 0xc);
if (!(wc->span.chans[i+2].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i+2].rxsig != rxs)
+ if (wc->span.chans[i+2].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i+2], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
rxs = (a >> 2) & 0xc;
if (!(wc->span.chans[i+1].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i+1].rxsig != rxs)
+ if (wc->span.chans[i+1].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i+1], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
rxs = (a >> 4) & 0xc;
if (!(wc->span.chans[i].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i].rxsig != rxs)
+ if (wc->span.chans[i].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
}
} else {
@@ -612,16 +635,23 @@
/* Get high channel in low bits */
rxs = (a & 0xf);
if (!(wc->span.chans[i+1].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i+1].rxsig != rxs)
+ if (wc->span.chans[i+1].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i+1], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
rxs = (a >> 4) & 0xf;
if (!(wc->span.chans[i].sig & ZT_SIG_CLEAR)) {
- if (wc->span.chans[i].rxsig != rxs)
+ if (wc->span.chans[i].rxsig != rxs) {
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_rbsbits(&wc->span.chans[i], rxs);
+ spin_lock_irqsave(&wc->lock, flags);
+ }
}
}
}
+ spin_unlock_irqrestore(&wc->lock, flags);
}
static void t4_serial_setup(struct t1 *wc)
@@ -1145,14 +1175,17 @@
zt_receive(&wc->span);
}
-static void __t1_check_alarms(struct t1 *wc)
+static void t1_check_alarms(struct t1 *wc)
{
unsigned char c,d;
int alarms;
int x,j;
+ unsigned long flags;
if (!(wc->span.flags & ZT_FLAG_RUNNING))
return;
+
+ spin_lock_irqsave(&wc->lock, flags);
c = __t1_framer_in(wc, 0x4c);
if (wc->spanflags & FLAG_FALC12)
@@ -1267,18 +1300,25 @@
if (wc->span.mainttimer || wc->span.maintstat)
alarms |= ZT_ALARM_LOOPBACK;
wc->span.alarms = alarms;
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_alarm_notify(&wc->span);
}
-static void __t1_do_counters(struct t1 *wc)
-{
+static void t1_do_counters(struct t1 *wc)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&wc->lock, flags);
if (wc->alarmtimer) {
if (!--wc->alarmtimer) {
wc->span.alarms &= ~(ZT_ALARM_RECOVER);
+ spin_unlock_irqrestore(&wc->lock, flags);
zt_alarm_notify(&wc->span);
+ spin_lock_irqsave(&wc->lock, flags);
}
}
+ spin_unlock_irqrestore(&wc->lock, flags);
}
ZAP_IRQ_HANDLER(t1xxp_interrupt)
@@ -1316,8 +1356,10 @@
__handle_leds(wc);
#endif
+ spin_unlock_irqrestore(&wc->lock, flags);
+
/* Count down timers */
- __t1_do_counters(wc);
+ t1_do_counters(wc);
/* Do some things that we don't have to do very often */
x = wc->intcount & 15 /* 63 */;
@@ -1326,17 +1368,15 @@
case 1:
break;
case 2:
- __t1_check_sigbits(wc);
+ t1_check_sigbits(wc);
break;
case 4:
/* Check alarms 1/4 as frequently */
if (!(wc->intcount & 0x30))
- __t1_check_alarms(wc);
+ t1_check_alarms(wc);
break;
}
- spin_unlock_irqrestore(&wc->lock, flags);
-
if (ints & 0x10)
printk("PCI Master abort\n");
Modified: team/tzafrir/kernelmove/kernel/xpp/.version
URL: http://svn.digium.com/view/zaptel/team/tzafrir/kernelmove/kernel/xpp/.version?view=diff&rev=2496&r1=2495&r2=2496
==============================================================================
--- team/tzafrir/kernelmove/kernel/xpp/.version (original)
+++ team/tzafrir/kernelmove/kernel/xpp/.version Fri May 4 18:21:43 2007
@@ -1,1 +1,1 @@
-trunk-r3495
+trunk-r3814
Propchange: team/tzafrir/kernelmove/kernel/xpp/ChangeLog
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/tzafrir/kernelmove/kernel/xpp/ChangeLog
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/tzafrir/kernelmove/kernel/xpp/ChangeLog
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: team/tzafrir/kernelmove/kernel/xpp/README.Astribank
[... 9340 lines stripped ...]
More information about the zaptel-commits
mailing list