diff options
author | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2009-09-29 16:45:15 +0000 |
---|---|---|
committer | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2009-09-29 16:45:15 +0000 |
commit | 8d2bf266da60c9e13c8fe9b791edef35bf397fd9 (patch) | |
tree | 37768239fc0800ae60711b8838ce01e2de8f104a /drivers/dahdi/xpp | |
parent | 5d91a043f4d0c55ec1d1dbd08942387465ae9ccb (diff) |
xpp: refactor pcm mask handling.
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@7245 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/xpp')
-rw-r--r-- | drivers/dahdi/xpp/card_bri.c | 11 | ||||
-rw-r--r-- | drivers/dahdi/xpp/card_pri.c | 8 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-pcm.c | 19 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-pcm.h | 1 |
4 files changed, 26 insertions, 13 deletions
diff --git a/drivers/dahdi/xpp/card_bri.c b/drivers/dahdi/xpp/card_bri.c index 81fb3ea..ebc1ca9 100644 --- a/drivers/dahdi/xpp/card_bri.c +++ b/drivers/dahdi/xpp/card_bri.c @@ -1280,6 +1280,7 @@ void BRI_card_pcm_recompute(xbus_t *xbus, xpd_t *xpd, xpp_line_t dont_care) int i; int line_count; xpp_line_t pcm_mask; + uint pcm_len; xpd_t *main_xpd; unsigned long flags; @@ -1309,8 +1310,7 @@ void BRI_card_pcm_recompute(xbus_t *xbus, xpd_t *xpd, xpp_line_t dont_care) } /* subunits have fake pcm_len and wanted_pcm_mask */ if(i > 0) { - sub_xpd->pcm_len = 0; - sub_xpd->wanted_pcm_mask = lines; + update_wanted_pcm_mask(sub_xpd, lines, 0); } } } @@ -1325,13 +1325,10 @@ void BRI_card_pcm_recompute(xbus_t *xbus, xpd_t *xpd, xpp_line_t dont_care) /* * The main unit account for all subunits (pcm_len and wanted_pcm_mask). */ - main_xpd->pcm_len = (line_count) + pcm_len = (line_count) ? RPACKET_HEADERSIZE + sizeof(xpp_line_t) + line_count * DAHDI_CHUNKSIZE : 0L; - main_xpd->wanted_pcm_mask = pcm_mask; - XPD_DBG(SIGNAL, main_xpd, "pcm_len=%d wanted_pcm_mask=0x%X (%s)\n", - main_xpd->pcm_len, main_xpd->wanted_pcm_mask, - xpd->xpdname); + update_wanted_pcm_mask(main_xpd, pcm_mask, pcm_len); spin_unlock_irqrestore(&main_xpd->lock_recompute_pcm, flags); } diff --git a/drivers/dahdi/xpp/card_pri.c b/drivers/dahdi/xpp/card_pri.c index d8fb36b..999849b 100644 --- a/drivers/dahdi/xpp/card_pri.c +++ b/drivers/dahdi/xpp/card_pri.c @@ -452,6 +452,8 @@ static void pri_pcm_update(xpd_t *xpd) struct PRI_priv_data *priv; int channels = xpd->channels; xpp_line_t mask = BITMASK(xpd->channels); + uint pcm_len; + unsigned long flags; priv = xpd->priv; if(priv->is_cas) { @@ -459,8 +461,10 @@ static void pri_pcm_update(xpd_t *xpd) channels--; mask &= ~BIT(PRI_DCHAN_IDX(priv)); } - xpd->pcm_len = RPACKET_HEADERSIZE + sizeof(xpp_line_t) + channels * DAHDI_CHUNKSIZE; - xpd->wanted_pcm_mask = mask; + pcm_len = RPACKET_HEADERSIZE + sizeof(xpp_line_t) + channels * DAHDI_CHUNKSIZE; + spin_lock_irqsave(&xpd->lock_recompute_pcm, flags); + update_wanted_pcm_mask(xpd, mask, pcm_len); + spin_unlock_irqrestore(&xpd->lock_recompute_pcm, flags); } /* diff --git a/drivers/dahdi/xpp/xbus-pcm.c b/drivers/dahdi/xpp/xbus-pcm.c index 99f9c03..81efba0 100644 --- a/drivers/dahdi/xpp/xbus-pcm.c +++ b/drivers/dahdi/xpp/xbus-pcm.c @@ -605,6 +605,17 @@ void elect_syncer(const char *msg) } /* + * This function should be called with the xpd already locked + */ +void update_wanted_pcm_mask(xpd_t *xpd, xpp_line_t new_mask, uint new_pcm_len) +{ + xpd->pcm_len = new_pcm_len; + xpd->wanted_pcm_mask = new_mask; + XPD_DBG(SIGNAL, xpd, "pcm_len=%d wanted_pcm_mask=0x%X\n", + xpd->pcm_len, xpd->wanted_pcm_mask); +} + +/* * This function is used by FXS/FXO. The pcm_mask argument signifies * channels which should be *added* to the automatic calculation. * Normally, this argument is 0. @@ -614,6 +625,7 @@ void generic_card_pcm_recompute(xbus_t *xbus, xpd_t *xpd, xpp_line_t pcm_mask) int i; int line_count = 0; unsigned long flags; + uint pcm_len; spin_lock_irqsave(&xpd->lock_recompute_pcm, flags); //XPD_DBG(SIGNAL, xpd, "pcm_mask=0x%X\n", pcm_mask); @@ -633,12 +645,10 @@ void generic_card_pcm_recompute(xbus_t *xbus, xpd_t *xpd, xpp_line_t pcm_mask) pcm_mask = BIT(0); line_count = 1; } - xpd->pcm_len = (line_count) + pcm_len = (line_count) ? RPACKET_HEADERSIZE + sizeof(xpp_line_t) + line_count * DAHDI_CHUNKSIZE : 0L; - xpd->wanted_pcm_mask = pcm_mask; - XPD_DBG(SIGNAL, xpd, "pcm_len=%d wanted_pcm_mask=0x%X\n", - xpd->pcm_len, xpd->wanted_pcm_mask); + update_wanted_pcm_mask(xpd, pcm_mask, pcm_len); spin_unlock_irqrestore(&xpd->lock_recompute_pcm, flags); } @@ -1258,6 +1268,7 @@ EXPORT_SYMBOL(elect_syncer); #ifdef DAHDI_SYNC_TICK EXPORT_SYMBOL(dahdi_sync_tick); #endif +EXPORT_SYMBOL(update_wanted_pcm_mask); EXPORT_SYMBOL(generic_card_pcm_recompute); EXPORT_SYMBOL(generic_card_pcm_tospan); EXPORT_SYMBOL(generic_card_pcm_fromspan); diff --git a/drivers/dahdi/xpp/xbus-pcm.h b/drivers/dahdi/xpp/xbus-pcm.h index 093ea60..bd9e5fa 100644 --- a/drivers/dahdi/xpp/xbus-pcm.h +++ b/drivers/dahdi/xpp/xbus-pcm.h @@ -103,6 +103,7 @@ void xbus_pcm_shutdown(void); int send_pcm_frame(xbus_t *xbus, xframe_t *xframe); void pcm_recompute(xpd_t *xpd, xpp_line_t tmp_pcm_mask); void xframe_receive_pcm(xbus_t *xbus, xframe_t *xframe); +void update_wanted_pcm_mask(xpd_t *xpd, xpp_line_t new_mask, uint new_pcm_len); void generic_card_pcm_recompute(xbus_t *xbus, xpd_t *xpd, xpp_line_t pcm_mask); void generic_card_pcm_fromspan(xbus_t *xbus, xpd_t *xpd, xpacket_t *pack); void generic_card_pcm_tospan(xbus_t *xbus, xpd_t *xpd, xpacket_t *pack); |