summaryrefslogtreecommitdiff
path: root/pciradio.c
diff options
context:
space:
mode:
authorjdixon <jdixon@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-06-08 08:51:37 +0000
committerjdixon <jdixon@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-06-08 08:51:37 +0000
commit920f4d10b2782a8521e535e524edffbfa7e82d27 (patch)
tree6f5f5e05cfcdf9870b29bd32c42507b38aeb748a /pciradio.c
parentd9cb775ec511c48066fe6c55ba7169ce1e986886 (diff)
Fixed problem with spinlocks crashing remote control I/O
especially with the 2.6 kernel git-svn-id: http://svn.digium.com/svn/zaptel/trunk@1109 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'pciradio.c')
-rw-r--r--pciradio.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/pciradio.c b/pciradio.c
index 8d058d7..8bdd53a 100644
--- a/pciradio.c
+++ b/pciradio.c
@@ -1172,7 +1172,6 @@ static int pciradio_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long
rad->bursttime[chan->chanpos - 1] = stack.p.data;
break;
case ZT_RADPAR_UIODATA:
- spin_lock_irqsave(&rad->lock,flags);
byte1 = __pciradio_getcreg(rad,8);
byte1 &= ~(1 << (chan->chanpos - 1));
byte1 &= ~(1 << (chan->chanpos + 3));
@@ -1182,7 +1181,6 @@ static int pciradio_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long
spin_unlock_irqrestore(&rad->lock,flags);
break;
case ZT_RADPAR_UIOMODE:
- spin_lock_irqsave(&rad->lock,flags);
byte1 = __pciradio_getcreg(rad,0xe);
byte1 &= ~(1 << (chan->chanpos - 1));
byte1 &= ~(1 << (chan->chanpos + 3));
@@ -1205,7 +1203,6 @@ static int pciradio_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long
if (rad->remmode[chan->chanpos - 1] == ZT_RADPAR_REM_RBI1)
{
/* set UIOA and UIOB for output */
- spin_lock_irqsave(&rad->lock,flags);
byte1 = __pciradio_getcreg(rad,0xe);
mask = (1 << (chan->chanpos - 1)) |
(1 << (chan->chanpos + 3));
@@ -1222,10 +1219,10 @@ static int pciradio_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long
interruptible_sleep_on_timeout(&mywait,10);
rad->lastremcmd = jiffies;
rbi_out(rad,chan->chanpos - 1,(unsigned char *)&stack.p.data);
+ spin_lock_irqsave(&rad->lock,flags);
break;
}
/* set UIOA and UIOB for output */
- spin_lock_irqsave(&rad->lock,flags);
byte1 = __pciradio_getcreg(rad,0xe);
mask = 1 << (chan->chanpos + 3); /* B an output */
byte2 = byte1 & (~mask);