xpp: FXS: atomic vbat_h power handling

* In do_chan_power() make vbat_h changes atomic.
* As a result we can ignore duplicate requests.
  This will allow cleaner logic in the next commit.
* Added proper debug messages.

Signed-off-by: Oron Peled <oron.peled@xorcom.com>
Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com>

Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10573

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10575 a0bf4364-ded3-4de4-8d8a-66a801d63aff
This commit is contained in:
Oron Peled 2012-03-21 20:34:05 +00:00 committed by Tzafrir Cohen
parent 4f487f8d7d
commit 91a94133f1

View File

@ -161,15 +161,23 @@ struct FXS_priv_data {
static int do_chan_power(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on) static int do_chan_power(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on)
{ {
struct FXS_priv_data *priv; struct FXS_priv_data *priv;
unsigned long *p;
int was;
BUG_ON(!xbus); BUG_ON(!xbus);
BUG_ON(!xpd); BUG_ON(!xpd);
priv = xpd->priv; priv = xpd->priv;
LINE_DBG(SIGNAL, xpd, chan, "%s\n", (on) ? "up" : "down"); p = (unsigned long *)&priv->vbat_h;
if (on) if (on)
BIT_SET(priv->vbat_h, chan); was = test_and_set_bit(chan, p) != 0;
else else
BIT_CLR(priv->vbat_h, chan); was = test_and_clear_bit(chan, p) != 0;
if (was == on) {
LINE_DBG(SIGNAL, xpd, chan,
"%s (same, ignored)\n", (on) ? "up" : "down");
return 0;
}
LINE_DBG(SIGNAL, xpd, chan, "%s\n", (on) ? "up" : "down");
return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, REG_BATTERY, return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, REG_BATTERY,
(on) ? REG_BATTERY_BATSL : 0x00); (on) ? REG_BATTERY_BATSL : 0x00);
} }
@ -1561,7 +1569,7 @@ static int proc_fxs_info_read(char *page, char **start, off_t off, int count, in
len += sprintf(page + len, "\n%-12s", "vbat_h:"); len += sprintf(page + len, "\n%-12s", "vbat_h:");
for_each_line(xpd, i) { for_each_line(xpd, i) {
len += sprintf(page + len, "%4d", len += sprintf(page + len, "%4d",
IS_SET(priv->vbat_h, i)); test_bit(i, (unsigned long *)&priv->vbat_h));
} }
len += sprintf(page + len, "\n"); len += sprintf(page + len, "\n");
for(led = 0; led < NUM_LEDS; led++) { for(led = 0; led < NUM_LEDS; led++) {