summaryrefslogtreecommitdiff
path: root/drivers/dahdi/wctdm24xxp
diff options
context:
space:
mode:
authorShaun Ruffell <sruffell@digium.com>2011-06-02 20:02:42 +0000
committerShaun Ruffell <sruffell@digium.com>2011-06-02 20:02:42 +0000
commitd3b38dd3721847360552633389b0765605b4bf78 (patch)
treed86c6e0f8dcdc191bb3c549096b8a617dda7fbfe /drivers/dahdi/wctdm24xxp
parent3d3560b06b36e6091d0e43c2144a8f2cdf8e3b8d (diff)
wctdm24xxp: Remove modmap member from 'struct wctdm'.
We can already use the module type to determine presence of a module to check. This also moves the background polling of the modules until after the board is completely initialized because the module type may change while the different types are being probed. This also means that we need to preset the shadow registers for the FXS because otherwise the shadow register will not have been read before the first time it's checked for a power alarm. Signed-off-by: Shaun Ruffell <sruffell@digium.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9954 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/wctdm24xxp')
-rw-r--r--drivers/dahdi/wctdm24xxp/base.c41
-rw-r--r--drivers/dahdi/wctdm24xxp/wctdm24xxp.h1
2 files changed, 20 insertions, 22 deletions
diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c
index 7107808..1cc28c0 100644
--- a/drivers/dahdi/wctdm24xxp/base.c
+++ b/drivers/dahdi/wctdm24xxp/base.c
@@ -877,10 +877,6 @@ static inline void wctdm_transmitprep(struct wctdm *wc, unsigned char *sframe)
* BRI modules have a different number of TDM channels than
* installed modules. */
for (y = 0; y < wc->avchannels; y++) {
- if (!x && y < wc->mods_per_board) {
- cmd_checkisr(wc, y);
- }
-
if (y < wc->mods_per_board)
cmd_dequeue(wc, eframe, y, x);
}
@@ -1993,19 +1989,24 @@ static inline void wctdm_isr_misc(struct wctdm *wc)
{
int x;
- if (unlikely(!wc->initialized)) {
+ if (unlikely(!wc->initialized))
return;
- }
for (x = 0; x < wc->mods_per_board; x++) {
- if (wc->modmap & (1 << x)) {
- if (wc->modtype[x] == MOD_TYPE_FXS) {
- wctdm_isr_misc_fxs(wc, x);
- } else if (wc->modtype[x] == MOD_TYPE_FXO) {
- wctdm_voicedaa_check_hook(wc, x);
- } else if (wc->modtype[x] == MOD_TYPE_QRV) {
- wctdm_qrvdri_check_hook(wc, x);
- }
+ spin_lock(&wc->reglock);
+ cmd_checkisr(wc, x);
+ spin_unlock(&wc->reglock);
+
+ switch (wc->modtype[x]) {
+ case MOD_TYPE_FXS:
+ wctdm_isr_misc_fxs(wc, x);
+ break;
+ case MOD_TYPE_FXO:
+ wctdm_voicedaa_check_hook(wc, x);
+ break;
+ case MOD_TYPE_QRV:
+ wctdm_qrvdri_check_hook(wc, x);
+ break;
}
}
}
@@ -2815,6 +2816,11 @@ static int wctdm_init_proslic(struct wctdm *wc, int card, int fast, int manual,
wc->mods[card].fxs.lasttxhook = wc->mods[card].fxs.idletxhookstate;
wctdm_setreg(wc, card, LINE_STATE, wc->mods[card].fxs.lasttxhook);
+
+ /* Preset the isrshadow register so that we won't get a power alarm
+ * when we finish initialization, otherwise the line state register
+ * may not have been read yet. */
+ wc->cmdq[card].isrshadow[1] = wc->mods[card].fxs.lasttxhook;
return 0;
}
@@ -3358,8 +3364,6 @@ static int wctdm_open(struct dahdi_chan *chan)
channo = chan->chanpos - 1;
#if 0
- if (!(wc->modmap & (1 << (chan->chanpos - 1))))
- return -ENODEV;
if (wc->dead)
return -ENODEV;
#endif
@@ -3932,7 +3936,6 @@ static int wctdm_identify_modules(struct wctdm *wc)
break;
retry:
if (!(ret = wctdm_init_proslic(wc, x, 0, 0, sane))) {
- wc->modmap |= (1 << x);
if (debug & DEBUG_CARD) {
readi = wctdm_getreg(wc,x,LOOP_I_LIMIT);
dev_info(&wc->vb.pdev->dev, "Proslic module %d loop current is %dmA\n", x, ((readi*3)+20));
@@ -3943,7 +3946,6 @@ retry:
sane = 1;
/* Init with Manual Calibration */
if (!wctdm_init_proslic(wc, x, 0, 1, sane)) {
- wc->modmap |= (1 << x);
if (debug & DEBUG_CARD) {
readi = wctdm_getreg(wc, x, LOOP_I_LIMIT);
@@ -3956,17 +3958,14 @@ retry:
}
} else if (!(ret = wctdm_init_voicedaa(wc, x, 0, 0, sane))) {
- wc->modmap |= (1 << x);
dev_info(&wc->vb.pdev->dev,
"Port %d: Installed -- AUTO FXO "
"(%s mode)\n", x + 1,
fxo_modes[_opermode].name);
} else if (!wctdm_init_qrvdri(wc, x)) {
- wc->modmap |= 1 << x;
dev_info(&wc->vb.pdev->dev,
"Port %d: Installed -- QRV DRI card\n", x + 1);
} else if (is_hx8(wc) && !wctdm_init_b400m(wc, x)) {
- wc->modmap |= (1 << x);
dev_info(&wc->vb.pdev->dev,
"Port %d: Installed -- BRI "
"quad-span module\n", x + 1);
diff --git a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
index 9619318..e3c5900 100644
--- a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
+++ b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
@@ -170,7 +170,6 @@ struct wctdm {
int mods_per_board; /* maximum number of modules for this board */
int digi_mods; /* number of digital modules present */
int avchannels; /* active "voice" (voice, B and D) channels */
- int modmap; /* Bit-map of present cards (1=present) */
int altcs[NUM_MODULES];