summaryrefslogtreecommitdiff
path: root/drivers/dahdi/xpp
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-09-29 16:45:15 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-09-29 16:45:15 +0000
commit8d2bf266da60c9e13c8fe9b791edef35bf397fd9 (patch)
tree37768239fc0800ae60711b8838ce01e2de8f104a /drivers/dahdi/xpp
parent5d91a043f4d0c55ec1d1dbd08942387465ae9ccb (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.c11
-rw-r--r--drivers/dahdi/xpp/card_pri.c8
-rw-r--r--drivers/dahdi/xpp/xbus-pcm.c19
-rw-r--r--drivers/dahdi/xpp/xbus-pcm.h1
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);