summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2011-03-15 19:15:40 +0000
committerShaun Ruffell <sruffell@digium.com>2011-03-15 19:15:40 +0000
commitc00d1d908bbf81bb669c27b2d5e0d4f4eb2f7f6d (patch)
treed9e872583ce079b8f2e96f7f499b7fc34dc2657a
parent2ea6804637376a21ac9021058e4293029155d2ff (diff)
wctdm24xxp: Fix regression with LEDS on TDM410.
r9720 disabled the LEDs on the front panel of the TDM410. This commit restores the behavior and clarify which part of the TDM410 eframes control the LED operation. (closes issue #18939) Signed-off-by: Shaun Ruffell <sruffell@digium.com> Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=9827 git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.4@9828 a0bf4364-ded3-4de4-8d8a-66a801d63aff
-rw-r--r--drivers/dahdi/wctdm24xxp/base.c25
-rw-r--r--drivers/dahdi/wctdm24xxp/wctdm24xxp.h3
2 files changed, 21 insertions, 7 deletions
diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c
index f42ea2d..e28dc49 100644
--- a/drivers/dahdi/wctdm24xxp/base.c
+++ b/drivers/dahdi/wctdm24xxp/base.c
@@ -921,12 +921,8 @@ static inline void wctdm_transmitprep(struct wctdm *wc, unsigned char *writechun
if (x < DAHDI_CHUNKSIZE - 1) {
writechunk[EFRAME_SIZE] = wc->ctlreg;
writechunk[EFRAME_SIZE + 1] = wc->txident++;
-
- if ((wc->desc->ports == 4) && ((wc->ctlreg & 0x10))) {
- writechunk[EFRAME_SIZE + 2] = 0;
- for (y = 0; y < 4; y++)
- writechunk[EFRAME_SIZE + 2] |= (1 << y);
- }
+ if (4 == wc->desc->ports)
+ writechunk[EFRAME_SIZE + 2] = wc->tdm410leds;
}
writechunk += (EFRAME_SIZE + EFRAME_GAP);
}
@@ -4592,6 +4588,21 @@ static inline void remove_sysfs_files(struct wctdm *wc) { return; }
#endif /* CONFIG_VOICEBUS_SYSFS */
+static void wctdm_set_tdm410_leds(struct wctdm *wc)
+{
+ int i;
+
+ if (4 != wc->desc->ports)
+ return;
+
+ wc->tdm410leds = 0; /* all on by default */
+ for (i = 0; i < wc->desc->ports; ++i) {
+ /* Turn off the LED for any module that isn't installed. */
+ if (MOD_TYPE_NONE == wc->modtype[i])
+ wc->tdm410leds |= (1 << i);
+ }
+}
+
#ifdef USE_ASYNC_INIT
struct async_data {
struct pci_dev *pdev;
@@ -4734,6 +4745,8 @@ __wctdm_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
/* Now track down what modules are installed */
wctdm_identify_modules(wc);
+ wctdm_set_tdm410_leds(wc);
+
if (fatal_signal_pending(current)) {
wctdm_back_out_gracefully(wc);
return -EINTR;
diff --git a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
index cacd062..46c6c2e 100644
--- a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
+++ b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
@@ -165,7 +165,8 @@ struct wctdm {
unsigned char rxident;
int flags[NUM_MODULES]; /* bitmap of board-specific + module-specific flags */
- unsigned char ctlreg; /* FIXME: something to do with VPM? */
+ u8 ctlreg;
+ u8 tdm410leds;
int mods_per_board; /* maximum number of modules for this board */
int digi_mods; /* number of digital modules present */