diff options
Diffstat (limited to 'xpp/card_fxo.c')
-rw-r--r-- | xpp/card_fxo.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/xpp/card_fxo.c b/xpp/card_fxo.c index 024e112..15e71e1 100644 --- a/xpp/card_fxo.c +++ b/xpp/card_fxo.c @@ -101,7 +101,6 @@ struct FXO_priv_data { */ static int do_led(xpd_t *xpd, lineno_t pos, byte which, bool on) { - unsigned long flags; int ret = 0; xpacket_t *pack; slic_cmd_t *sc; @@ -111,7 +110,6 @@ static int do_led(xpd_t *xpd, lineno_t pos, byte which, bool on) xbus_t *xbus; BUG_ON(!xpd); - spin_lock_irqsave(&xpd->lock, flags); xbus = xpd->xbus; priv = xpd->priv; which = which % NUM_LEDS; @@ -138,7 +136,6 @@ static int do_led(xpd_t *xpd, lineno_t pos, byte which, bool on) pack->datalen = len; packet_send(xbus, pack); out: - spin_unlock_irqrestore(&xpd->lock, flags); return ret; } @@ -293,6 +290,7 @@ static int FXO_card_zaptel_registration(xpd_t *xpd, bool on) { xbus_t *xbus; struct FXO_priv_data *priv; + unsigned long flags; int i; BUG_ON(!xpd); @@ -303,18 +301,26 @@ static int FXO_card_zaptel_registration(xpd_t *xpd, bool on) DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on); if(on) { for_each_line(xpd, i) { + spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_ON); + spin_unlock_irqrestore(&xpd->lock, flags); mdelay(50); } for_each_line(xpd, i) { + spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_OFF); + spin_unlock_irqrestore(&xpd->lock, flags); mdelay(50); } } else { for_each_line(xpd, i) { + spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_ON); + spin_unlock_irqrestore(&xpd->lock, flags); mdelay(100); + spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_OFF); + spin_unlock_irqrestore(&xpd->lock, flags); } } return 0; @@ -386,6 +392,7 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd) /* 0x0F */ HOSTCMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on) { + unsigned long flags; int ret = 0; int i; @@ -398,10 +405,13 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd) DBG("Channel Activation: 0x%4X %s\n", lines, (on) ? "on" : "off"); if(on) { for_each_enabled_line(xpd, i) { + spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_ON); + spin_unlock_irqrestore(&xpd->lock, flags); mdelay(20); } for_each_enabled_line(xpd, i) { + spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_OFF); mdelay(20); } |