From 417a20c6eddc4e1685e1d0a55759603323e444f8 Mon Sep 17 00:00:00 2001 From: Shaun Ruffell Date: Mon, 31 Jan 2011 17:58:56 +0000 Subject: wctdm24xxp: Remove code for unsupported modules. The VPM100 and S100M modules are no longer supported. Analog cards supported by the wctdm24xxp are still compatible with the S110 and VPMADT032 modules. DAHDI-302 Signed-off-by: Shaun Ruffell Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=9720 git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.4@9724 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- drivers/dahdi/wctdm24xxp/base.c | 329 +++------------------------------- drivers/dahdi/wctdm24xxp/wctdm24xxp.h | 29 +-- 2 files changed, 32 insertions(+), 326 deletions(-) diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index 2fb4e0f..f42ea2d 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -161,19 +161,6 @@ static alpha indirect_regs[] = {43,66,"LOOP_CLOSE_TRES_LOW",0x1000}, }; -#ifdef FANCY_ECHOCAN -static char ectab[] = { -0, 0, 0, 1, 2, 3, 4, 6, 8, 9, 11, 13, 16, 18, 20, 22, 24, 25, 27, 28, 29, 30, 31, 31, 32, -32, 32, 32, 32, 32, 32, 32, 32, 32, 32 ,32 ,32, 32, -32, 32, 32, 32, 32, 32, 32, 32, 32, 32 ,32 ,32, 32, -32, 32, 32, 32, 32, 32, 32, 32, 32, 32 ,32 ,32, 32, -31, 31, 30, 29, 28, 27, 25, 23, 22, 20, 18, 16, 13, 11, 9, 8, 6, 4, 3, 2, 1, 0, 0, -}; -static int ectrans[4] = { 0, 1, 3, 2 }; -#define EC_SIZE (sizeof(ectab)) -#define EC_SIZE_Q (sizeof(ectab) / 4) -#endif - /* Undefine to enable Power alarm / Transistor debug -- note: do not enable for normal operation! */ /* #define PAQ_DEBUG */ @@ -255,23 +242,12 @@ static int vpmnlpmaxsupp = DEFAULT_NLPMAXSUPP; static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec); -static const struct dahdi_echocan_features vpm100m_ec_features = { - .NLP_automatic = 1, - .CED_tx_detect = 1, - .CED_rx_detect = 1, -}; - static const struct dahdi_echocan_features vpm150m_ec_features = { .NLP_automatic = 1, .CED_tx_detect = 1, .CED_rx_detect = 1, }; -static const struct dahdi_echocan_ops vpm100m_ec_ops = { - .name = "VPM100M", - .echocan_free = echocan_free, -}; - static const struct dahdi_echocan_ops vpm150m_ec_ops = { .name = "VPM150M", .echocan_free = echocan_free, @@ -619,12 +595,6 @@ static inline void cmd_dequeue(struct wctdm *wc, unsigned char *writechunk, int unsigned int curcmd=0; int x; int subaddr = card & 0x3; -#ifdef FANCY_ECHOCAN - int ecval; - ecval = wc->echocanpos; - ecval += EC_SIZE_Q * ectrans[(card & 0x3)]; - ecval = ecval % EC_SIZE; -#endif /* QRV and BRI modules only use commands relating to the first channel */ if ((card & 0x03) && (wc->modtype[card] == MOD_TYPE_QRV)) { @@ -659,16 +629,6 @@ static inline void cmd_dequeue(struct wctdm *wc, unsigned char *writechunk, int curcmd = 0x101010; else if (wc->modtype[card] == MOD_TYPE_QRV) curcmd = CMD_RD(3); - else if (wc->modtype[card] == MOD_TYPE_VPM) { -#ifdef FANCY_ECHOCAN - if (wc->blinktimer >= 0xf) { - curcmd = CMD_WR(0x1ab, 0x0f); - } else if (wc->blinktimer == (ectab[ecval] >> 1)) { - curcmd = CMD_WR(0x1ab, 0x00); - } else -#endif - curcmd = CMD_RD(0x1a0); - } } if (wc->modtype[card] == MOD_TYPE_FXS) { @@ -709,13 +669,7 @@ static inline void cmd_dequeue(struct wctdm *wc, unsigned char *writechunk, int writechunk[CMD_BYTE(card, 0, 0)] = 0x10; writechunk[CMD_BYTE(card, 1, 0)] = (curcmd >> 8) & 0xff; writechunk[CMD_BYTE(card, 2, 0)] = curcmd & 0xff; - } else if (wc->modtype[card] == MOD_TYPE_VPM) { - if (curcmd & __CMD_WR) - writechunk[CMD_BYTE(card, 0, wc->altcs[card])] = ((card & 0x3) << 4) | 0xc | ((curcmd >> 16) & 0x1); - else - writechunk[CMD_BYTE(card, 0, wc->altcs[card])] = ((card & 0x3) << 4) | 0xa | ((curcmd >> 16) & 0x1); - writechunk[CMD_BYTE(card, 1, wc->altcs[card])] = (curcmd >> 8) & 0xff; - writechunk[CMD_BYTE(card, 2, wc->altcs[card])] = curcmd & 0xff; + } else if (wc->modtype[card] == MOD_TYPE_QRV) { writechunk[CMD_BYTE(card, 0, wc->altcs[card])] = 0x00; @@ -851,10 +805,6 @@ static inline void cmd_checkisr(struct wctdm *wc, int card) wc->cmdq[card & 0xfc].cmds[USER_COMMANDS + 0] = CMD_RD(3); /* COR/CTCSS state */ } else if (wc->modtype[card] == MOD_TYPE_BRI) { wc->cmdq[card].cmds[USER_COMMANDS + 0] = wctdm_bri_checkisr(wc, card, 0); -#ifdef VPM_SUPPORT - } else if (wc->modtype[card] == MOD_TYPE_VPM) { - wc->cmdq[card].cmds[USER_COMMANDS + 0] = CMD_RD(0xb9); /* DTMF interrupt */ -#endif } } if (!wc->cmdq[card].cmds[USER_COMMANDS + 1]) { @@ -870,10 +820,6 @@ static inline void cmd_checkisr(struct wctdm *wc, int card) wc->cmdq[card & 0xfc].cmds[USER_COMMANDS + 1] = CMD_RD(3); /* Battery */ } else if (wc->modtype[card] == MOD_TYPE_BRI) { wc->cmdq[card].cmds[USER_COMMANDS + 1] = wctdm_bri_checkisr(wc, card, 1); -#ifdef VPM_SUPPORT - } else if (wc->modtype[card] == MOD_TYPE_VPM) { - wc->cmdq[card].cmds[USER_COMMANDS + 1] = CMD_RD(0xbd); /* DTMF interrupt */ -#endif } } } @@ -968,36 +914,19 @@ static inline void wctdm_transmitprep(struct wctdm *wc, unsigned char *writechun if (y < wc->mods_per_board) cmd_dequeue(wc, writechunk, y, x); } - if (!x) - wc->blinktimer++; - if (wc->vpm100) { - for (y = NUM_MODULES; y < NUM_MODULES + NUM_EC; y++) { - if (!x) - cmd_checkisr(wc, y); - cmd_dequeue(wc, writechunk, y, x); - } -#ifdef FANCY_ECHOCAN - if (wc->vpm100 && wc->blinktimer >= 0xf) { - wc->blinktimer = -1; - wc->echocanpos++; - } -#endif - } else if (wc->vpmadt032) { + + if (wc->vpmadt032) cmd_dequeue_vpmadt032(wc, writechunk, x); - } if (x < DAHDI_CHUNKSIZE - 1) { writechunk[EFRAME_SIZE] = wc->ctlreg; writechunk[EFRAME_SIZE + 1] = wc->txident++; - if ((wc->desc->ports == 4) && ((wc->ctlreg & 0x10) || (wc->modtype[NUM_MODULES] == MOD_TYPE_NONE))) { + if ((wc->desc->ports == 4) && ((wc->ctlreg & 0x10))) { writechunk[EFRAME_SIZE + 2] = 0; - for (y = 0; y < 4; y++) { - if (wc->modtype[y] == MOD_TYPE_NONE) - writechunk[EFRAME_SIZE + 2] |= (1 << y); - } - } else - writechunk[EFRAME_SIZE + 2] = 0xf; + for (y = 0; y < 4; y++) + writechunk[EFRAME_SIZE + 2] |= (1 << y); + } } writechunk += (EFRAME_SIZE + EFRAME_GAP); } @@ -1187,10 +1116,8 @@ static inline void wctdm_receiveprep(struct wctdm *wc, const u8 *readchunk) for (y = 0; y < wc->avchannels; y++) { cmd_decipher(wc, readchunk, y); } - if (wc->vpm100) { - for (y = NUM_MODULES; y < NUM_MODULES + NUM_EC; y++) - cmd_decipher(wc, readchunk, y); - } else if (wc->vpmadt032) + + if (wc->vpmadt032) cmd_decipher_vpmadt032(wc, readchunk); readchunk += (EFRAME_SIZE + EFRAME_GAP); @@ -1985,56 +1912,27 @@ static int wctdm_echocan_create(struct dahdi_chan *chan, struct wctdm_chan *wchan = container_of(chan, struct wctdm_chan, chan); const struct dahdi_echocan_ops *ops; const struct dahdi_echocan_features *features; + enum adt_companding comp; #ifdef VPM_SUPPORT if (!vpmsupport) return -ENODEV; #endif - if (!wc->vpm100 && !wc->vpmadt032) + if (!wc->vpmadt032) return -ENODEV; - if (wc->vpmadt032) { - ops = &vpm150m_ec_ops; - features = &vpm150m_ec_features; - } else { - ops = &vpm100m_ec_ops; - features = &vpm100m_ec_features; - } - - if (wc->vpm100 && (ecp->param_count > 0)) { - dev_warn(&wc->vb.pdev->dev, "%s echo canceller does not support parameters; failing request\n", ops->name); - return -EINVAL; - } + ops = &vpm150m_ec_ops; + features = &vpm150m_ec_features; *ec = &wchan->ec; (*ec)->ops = ops; (*ec)->features = *features; - if (wc->vpm100) { - int channel; - int unit; - - channel = wchan->timeslot; - unit = wchan->timeslot & 0x3; - if (wc->vpm100 < 2) - channel >>= 2; - - if (debug & DEBUG_ECHOCAN) - dev_info(&wc->vb.pdev->dev, "echocan: Unit is %d, Channel is %d length %d\n", unit, channel, ecp->tap_length); - - wctdm_vpm_out(wc, unit, channel, 0x3e); - return 0; - } else if (wc->vpmadt032) { - enum adt_companding comp; - - comp = (DAHDI_LAW_ALAW == chan->span->deflaw) ? - ADT_COMP_ALAW : ADT_COMP_ULAW; + comp = (DAHDI_LAW_ALAW == chan->span->deflaw) ? + ADT_COMP_ALAW : ADT_COMP_ULAW; - return vpmadt032_echocan_create(wc->vpmadt032, - wchan->timeslot, comp, ecp, p); - } else { - return -ENODEV; - } + return vpmadt032_echocan_create(wc->vpmadt032, + wchan->timeslot, comp, ecp, p); } static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec) @@ -2042,21 +1940,8 @@ static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec struct wctdm *wc = chan->pvt; struct wctdm_chan *wchan = container_of(chan, struct wctdm_chan, chan); - memset(ec, 0, sizeof(*ec)); - if (wc->vpm100) { - int channel; - int unit; - - channel = wchan->timeslot; - unit = wchan->timeslot & 0x3; - if (wc->vpm100 < 2) - channel >>= 2; - - if (debug & DEBUG_ECHOCAN) - dev_info(&wc->vb.pdev->dev, "echocan: Unit is %d, Channel is %d length 0\n", - unit, channel); - wctdm_vpm_out(wc, unit, channel, 0x01); - } else if (wc->vpmadt032) { + if (wc->vpmadt032) { + memset(ec, 0, sizeof(*ec)); vpmadt032_echocan_free(wc->vpmadt032, wchan->timeslot, ec); } } @@ -2151,10 +2036,6 @@ static inline void wctdm_isr_misc(struct wctdm *wc) } } } - if (wc->vpm100 > 0) { - for (x = NUM_MODULES; x < NUM_MODULES+NUM_EC; x++) - wctdm_vpm_check(wc, x); - } } static void handle_receive(struct voicebus *vb, struct list_head *buffers) @@ -2261,7 +2142,7 @@ static int wctdm_proslic_insane(struct wctdm *wc, int card) /* let's be really sure this is an FXS before we continue */ reg1 = wctdm_getreg(wc, card, 1); - if ((0x80 != (blah & 0xf0)) || ((0x88 != reg1) && (0x08 != reg1))) { + if ((0x80 != (blah & 0xf0)) || (0x88 != reg1)) { if (debug & DEBUG_CARD) dev_info(&wc->vb.pdev->dev, "DEBUG: not FXS b/c reg0=%x or reg1 != 0x88 (%x).\n", blah, reg1); return -1; @@ -3911,152 +3792,11 @@ static void wctdm_fixup_analog_span(struct wctdm *wc, int spanno) for (x = 0; x < MAX_SPANS; x++) { if (!wc->spans[x]) continue; - if (wc->vpm100) - strncat(wc->spans[x]->span.devicetype, " (VPM100M)", sizeof(wc->spans[x]->span.devicetype) - 1); - else if (wc->vpmadt032) + if (wc->vpmadt032) strncat(wc->spans[x]->span.devicetype, " (VPMADT032)", sizeof(wc->spans[x]->span.devicetype) - 1); } } -static int wctdm_vpm_init(struct wctdm *wc) -{ - unsigned char reg; - unsigned int mask; - unsigned int ver; - unsigned char vpmver=0; - unsigned int i, x, y; - - for (x=0;xvb.pdev->dev, "VPM100: Chip %d: ver %02x\n", x, ver); - if (ver != 0x33) { - if (x) - dev_info(&wc->vb.pdev->dev, - "VPM100: Inoperable\n"); - wc->vpm100 = 0; - return -ENODEV; - } - - if (!x) { - vpmver = wctdm_vpm_in(wc, x, 0x1a6) & 0xf; - dev_info(&wc->vb.pdev->dev, "VPM Revision: %02x\n", vpmver); - } - - - /* Setup GPIO's */ - for (y=0;y<4;y++) { - wctdm_vpm_out(wc, x, 0x1a8 + y, 0x00); /* GPIO out */ - if (y == 3) - wctdm_vpm_out(wc, x, 0x1ac + y, 0x00); /* GPIO dir */ - else - wctdm_vpm_out(wc, x, 0x1ac + y, 0xff); /* GPIO dir */ - wctdm_vpm_out(wc, x, 0x1b0 + y, 0x00); /* GPIO sel */ - } - - /* Setup TDM path - sets fsync and tdm_clk as inputs */ - reg = wctdm_vpm_in(wc, x, 0x1a3); /* misc_con */ - wctdm_vpm_out(wc, x, 0x1a3, reg & ~2); - - /* Setup Echo length (256 taps) */ - wctdm_vpm_out(wc, x, 0x022, 0); - - /* Setup timeslots */ - if (vpmver == 0x01) { - wctdm_vpm_out(wc, x, 0x02f, 0x00); - wctdm_vpm_out(wc, x, 0x023, 0xff); - mask = 0x11111111 << x; - } else { - wctdm_vpm_out(wc, x, 0x02f, 0x20 | (x << 3)); - wctdm_vpm_out(wc, x, 0x023, 0x3f); - mask = 0x0000003f; - } - - /* Setup the tdm channel masks for all chips*/ - for (i = 0; i < 4; i++) - wctdm_vpm_out(wc, x, 0x33 - i, (mask >> (i << 3)) & 0xff); - - /* Setup convergence rate */ - reg = wctdm_vpm_in(wc,x,0x20); - reg &= 0xE0; - - if (wc->companding == DAHDI_LAW_DEFAULT) { - if (wc->digi_mods) - /* If we have a BRI module, Auto set to alaw */ - reg |= 0x01; - else - /* Auto set to ulaw */ - reg &= ~0x01; - } else if (wc->companding == DAHDI_LAW_ALAW) { - /* Force everything to alaw */ - reg |= 0x01; - } else { - /* Auto set to ulaw */ - reg &= ~0x01; - } - - wctdm_vpm_out(wc,x,0x20,(reg | 0x20)); - - /* Initialize echo cans */ - for (i = 0 ; i < MAX_TDM_CHAN; i++) { - if (mask & (0x00000001 << i)) - wctdm_vpm_out(wc,x,i,0x00); - } - - for (i=0;i<30;i++) - schluffen(&wc->regq); - - /* Put in bypass mode */ - for (i = 0 ; i < MAX_TDM_CHAN ; i++) { - if (mask & (0x00000001 << i)) { - wctdm_vpm_out(wc,x,i,0x01); - } - } - - /* Enable bypass */ - for (i = 0 ; i < MAX_TDM_CHAN ; i++) { - if (mask & (0x00000001 << i)) - wctdm_vpm_out(wc,x,0x78 + i,0x01); - } - - /* Enable DTMF detectors (always DTMF detect all spans) */ - for (i = 0; i < 6; i++) { - if (vpmver == 0x01) - wctdm_vpm_out(wc, x, 0x98 + i, 0x40 | (i << 2) | x); - else - wctdm_vpm_out(wc, x, 0x98 + i, 0x40 | i); - } - - for (i = 0xB8; i < 0xC0; i++) - wctdm_vpm_out(wc, x, i, 0xFF); - for (i = 0xC0; i < 0xC4; i++) - wctdm_vpm_out(wc, x, i, 0xff); - - } - - /* TODO: What do the different values for vpm100 mean? */ - if (vpmver == 0x01) { - wc->vpm100 = 2; - } else { - wc->vpm100 = 1; - } - - dev_info(&wc->vb.pdev->dev, "Enabling VPM100 gain adjustments on any FXO ports found\n"); - for (i = 0; i < wc->desc->ports; i++) { - if (wc->modtype[i] == MOD_TYPE_FXO) { - /* Apply negative Tx gain of 4.5db to DAA */ - wctdm_setreg(wc, i, 38, 0x14); /* 4db */ - wctdm_setreg(wc, i, 40, 0x15); /* 0.5db */ - - /* Apply negative Rx gain of 4.5db to DAA */ - wctdm_setreg(wc, i, 39, 0x14); /* 4db */ - wctdm_setreg(wc, i, 41, 0x15); /* 0.5db */ - } - } - - return 0; -} - static void get_default_portconfig(GpakPortConfig_t *portconfig) { memset(portconfig, 0, sizeof(GpakPortConfig_t)); @@ -4130,18 +3870,11 @@ static void get_default_portconfig(GpakPortConfig_t *portconfig) static int wctdm_initialize_vpmadt032(struct wctdm *wc) { - int x; int res; - unsigned long flags; struct vpmadt032_options options; GpakPortConfig_t portconfig; - spin_lock_irqsave(&wc->reglock, flags); - for (x = NUM_MODULES; x < NUM_MODULES + NUM_EC; x++) - wc->modtype[x] = MOD_TYPE_NONE; - spin_unlock_irqrestore(&wc->reglock, flags); - options.debug = debug; options.vpmnlptype = vpmnlptype; options.vpmnlpthresh = vpmnlpthresh; @@ -4176,22 +3909,18 @@ static int wctdm_initialize_vpmadt032(struct wctdm *wc) return 0; } -static int wctdm_initialize_vpm(struct wctdm *wc) +static void wctdm_initialize_vpm(struct wctdm *wc) { int res = 0; if (!vpmsupport) { dev_notice(&wc->vb.pdev->dev, "VPM: Support Disabled\n"); - } else if (!wctdm_vpm_init(wc)) { - dev_info(&wc->vb.pdev->dev, "VPM: Present and operational (Rev %c)\n", - 'A' + wc->vpm100 - 1); - wc->ctlreg |= 0x10; - } else { - res = wctdm_initialize_vpmadt032(wc); - if (!res) - wc->ctlreg |= 0x10; + return; } - return res; + + res = wctdm_initialize_vpmadt032(wc); + if (!res) + wc->ctlreg |= 0x10; } static int wctdm_identify_modules(struct wctdm *wc) @@ -4232,10 +3961,6 @@ static int wctdm_identify_modules(struct wctdm *wc) for (x = 0; x < wc->mods_per_board; x++) wc->modtype[x] = MOD_TYPE_FXSINIT; - wc->vpm100 = -1; - for (x = wc->mods_per_board; x < wc->mods_per_board+NUM_EC; x++) - wc->modtype[x] = MOD_TYPE_VPM; - spin_unlock_irqrestore(&wc->reglock, flags); /* Wait just a bit; this makes sure that cmd_dequeue is emitting SPI commands in the appropriate mode(s). */ diff --git a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h index ebacff1..cacd062 100644 --- a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h +++ b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h @@ -63,9 +63,7 @@ #define MOD_TYPE_FXS 1 #define MOD_TYPE_FXO 2 #define MOD_TYPE_FXSINIT 3 -#define MOD_TYPE_VPM 4 #define MOD_TYPE_QRV 5 -#define MOD_TYPE_VPM150M 6 #define MOD_TYPE_BRI 7 #define MINPEGTIME 10 * 8 /* 30 ms peak to peak gets us no more than 100 Hz */ @@ -90,9 +88,7 @@ + ((card) >> 2) + (altcs) + ((altcs) ? -21 : 0)) #endif #define NUM_MODULES 24 -#define NUM_EC 4 #define NUM_SLOTS 6 -#define MAX_TDM_CHAN 31 #define MAX_SPANS 9 #define NUM_CAL_REGS 12 @@ -108,17 +104,7 @@ #define VPM150M_HPI_DATA 0x03 #define VPM_SUPPORT - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) #define VPM150M_SUPPORT -#endif - -#ifdef VPM_SUPPORT - -/* Define to get more attention-grabbing but slightly more CPU using echocan status */ -#define FANCY_ECHOCAN - -#endif #ifdef VPM150M_SUPPORT #include "voicebus/GpakCust.h" @@ -186,7 +172,7 @@ struct wctdm { int avchannels; /* active "voice" (voice, B and D) channels */ int modmap; /* Bit-map of present cards (1=present) */ - int altcs[NUM_MODULES + NUM_EC]; + int altcs[NUM_MODULES]; /* FIXME: why are all of these QRV-only members part of the main card structure? */ char qrvhook[NUM_MODULES]; @@ -253,18 +239,13 @@ struct wctdm { struct b400m *bri; } mods[NUM_MODULES]; - struct cmdq cmdq[NUM_MODULES + NUM_EC]; - int modtype[NUM_MODULES + NUM_EC]; /* type of module (FXO/FXS/QRV/VPM/etc.) in this position */ - int sethook[NUM_MODULES + NUM_EC]; /* pending hook state command for each module */ + struct cmdq cmdq[NUM_MODULES]; + int modtype[NUM_MODULES]; /* type of module (FXO/FXS/QRV/etc.) */ + int sethook[NUM_MODULES]; /* pending hook state command */ int dacssrc[NUM_MODULES]; - int vpm100; - struct vpmadt032 *vpmadt032; -#ifdef FANCY_ECHOCAN - int echocanpos; - int blinktimer; -#endif + struct voicebus vb; struct wctdm_span *aspan; /* pointer to the spans[] holding the analog span */ struct wctdm_span *spans[MAX_SPANS]; -- cgit v1.2.3