diff options
author | Russ Meyerriecks <rmeyerreicks@digium.com> | 2012-09-21 18:16:35 +0000 |
---|---|---|
committer | Russ Meyerriecks <rmeyerreicks@digium.com> | 2012-09-21 18:16:35 +0000 |
commit | c1bc6301e827171756d642d41f1651c77885707d (patch) | |
tree | 7c4d6d1557fc35d419bbfcfe35dd9f9aa5787659 /drivers/dahdi/wctdm24xxp | |
parent | 3b001da831583986c95945f2a946569cdc9cf893 (diff) |
wctdm24xxp: Only two polarity reversals are needed to validate RING on FXO ports.
This fixes a regression introduced in commit r10186 "wctdm24xxp: Use time
interval for debouncing FXO ring detect." [1] which was first released in
DAHDI-Linux 2.6.0. This only affects users with analog trunks whose providers do
not present 4 polarity reversals on the ring signals. The reporter of this issue
is based in South Africa.
[1] http://svnview.digium.com/svn/dahdi?view=revision&revision=10168
In prior versions, the ring detector did not check for polarity reversals, only
the presence of ringing voltage unless fwringdetect or neonmwi_monitor mode was
set, and even when one of those modes were set, the driver only needed two
reversals to validate a ring. This commit allows the driver to always stay in
fwringdetect mode but restores the requirement for only two reversals.
Also included in this commit is a change to ensure that ringing is not reported
when debouncing lost battery which can happen when voltage is swinging through
0.
Reported-and-Tested-by: Jaco Kroon <jaco@uls.co.za>
Internal-Issue-ID: DAHLIN-298
Signed-off-by: Shaun Ruffell <sruffell@digium.com>
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10719 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/wctdm24xxp')
-rw-r--r-- | drivers/dahdi/wctdm24xxp/base.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index a1eff33..0e68932 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -1833,19 +1833,22 @@ static void wctdm_qrvdri_check_hook(struct wctdm *wc, int card) static inline bool is_fxo_ringing(const struct fxo *const fxo) { return ((fxo->hook_ring_shadow & 0x60) && - (fxo->battery_state == BATTERY_PRESENT)); + ((fxo->battery_state == BATTERY_PRESENT) || + (fxo->battery_state == BATTERY_DEBOUNCING_LOST))); } static inline bool is_fxo_ringing_positive(const struct fxo *const fxo) { return (((fxo->hook_ring_shadow & 0x60) == 0x20) && - (fxo->battery_state == BATTERY_PRESENT)); + ((fxo->battery_state == BATTERY_PRESENT) || + (fxo->battery_state == BATTERY_DEBOUNCING_LOST))); } static inline bool is_fxo_ringing_negative(const struct fxo *const fxo) { return (((fxo->hook_ring_shadow & 0x60) == 0x40) && - (fxo->battery_state == BATTERY_PRESENT)); + ((fxo->battery_state == BATTERY_PRESENT) || + (fxo->battery_state == BATTERY_DEBOUNCING_LOST))); } static inline void set_ring(struct fxo *fxo, enum ring_detector_state new) @@ -1856,19 +1859,21 @@ static inline void set_ring(struct fxo *fxo, enum ring_detector_state new) static void wctdm_fxo_ring_detect(struct wctdm *wc, struct wctdm_module *mod) { struct fxo *const fxo = &mod->mod.fxo; + static const unsigned int POLARITY_CHANGES_NEEDED = 2; /* Look for ring status bits (Ring Detect Signal Negative and Ring - * Detect Signal Positive) to transition back and forth some number of - * times to indicate that a ring is occurring. Provide some number of - * samples to allow for the transitions to occur before giving up. - * NOTE: neon mwi voltages will trigger one of these bits to go active - * but not to have transitions between the two bits (i.e. no negative - * to positive or positive to negative traversals) */ + * Detect Signal Positive) to transition back and forth + * POLARITY_CHANGES_NEEDED times to indicate that a ring is occurring. + * Provide some number of samples to allow for the transitions to occur + * before giving up. NOTE: neon mwi voltages will trigger one of these + * bits to go active but not to have transitions between the two bits + * (i.e. no negative to positive or positive to negative traversals) */ switch (fxo->ring_state) { case DEBOUNCING_RINGING_POSITIVE: if (is_fxo_ringing_negative(fxo)) { - if (++fxo->ring_polarity_change_count > 4) { + if (++fxo->ring_polarity_change_count > + POLARITY_CHANGES_NEEDED) { mod_hooksig(wc, mod, DAHDI_RXSIG_RING); set_ring(fxo, RINGING); if (debug) { @@ -1886,7 +1891,8 @@ static void wctdm_fxo_ring_detect(struct wctdm *wc, struct wctdm_module *mod) break; case DEBOUNCING_RINGING_NEGATIVE: if (is_fxo_ringing_positive(fxo)) { - if (++fxo->ring_polarity_change_count > 4) { + if (++fxo->ring_polarity_change_count > + POLARITY_CHANGES_NEEDED) { mod_hooksig(wc, mod, DAHDI_RXSIG_RING); set_ring(fxo, RINGING); if (debug) { |