From c16f6ead0e9050d59d73f39f3015ecb64aecc214 Mon Sep 17 00:00:00 2001 From: mattf Date: Thu, 17 May 2007 20:44:34 +0000 Subject: Merged revisions 2532 via svnmerge from https://origsvn.digium.com/svn/zaptel/branches/1.4 ........ r2532 | mattf | 2007-05-17 15:35:57 -0500 (Thu, 17 May 2007) | 1 line Reduce stack usage of VPM450M. Fix for FC6 module load problems ........ git-svn-id: http://svn.digium.com/svn/zaptel/trunk@2533 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- wct4xxp/vpm450m.c | 106 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 41 deletions(-) diff --git a/wct4xxp/vpm450m.c b/wct4xxp/vpm450m.c index b56c245..f4a3e8d 100644 --- a/wct4xxp/vpm450m.c +++ b/wct4xxp/vpm450m.c @@ -401,9 +401,9 @@ unsigned int get_vpm450m_capacity(void *wc) struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct firmware *firmware) { - tOCT6100_CHIP_OPEN ChipOpen; + tOCT6100_CHIP_OPEN *ChipOpen; tOCT6100_GET_INSTANCE_SIZE InstanceSize; - tOCT6100_CHANNEL_OPEN ChannelOpen; + tOCT6100_CHANNEL_OPEN *ChannelOpen; UINT32 ulResult; struct vpm450m *vpm450m; int x,y,law; @@ -412,39 +412,57 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct f return NULL; memset(vpm450m, 0, sizeof(struct vpm450m)); + + if (!(ChipOpen = kmalloc(sizeof(tOCT6100_CHIP_OPEN), GFP_KERNEL))) { + kfree(vpm450m); + return NULL; + } + + memset(ChipOpen, 0, sizeof(tOCT6100_CHIP_OPEN)); + + if (!(ChannelOpen = kmalloc(sizeof(tOCT6100_CHANNEL_OPEN), GFP_KERNEL))) { + kfree(vpm450m); + kfree(ChipOpen); + return NULL; + } + + memset(ChannelOpen, 0, sizeof(tOCT6100_CHANNEL_OPEN)); + for (x=0;x<128;x++) vpm450m->ecmode[x] = -1; vpm450m->numchans = numspans * 32; printk("VPM450: echo cancellation for %d channels\n", vpm450m->numchans); - Oct6100ChipOpenDef(&ChipOpen); + Oct6100ChipOpenDef(ChipOpen); /* Setup Chip Open Parameters */ - ChipOpen.ulUpclkFreq = cOCT6100_UPCLK_FREQ_33_33_MHZ; + ChipOpen->ulUpclkFreq = cOCT6100_UPCLK_FREQ_33_33_MHZ; Oct6100GetInstanceSizeDef(&InstanceSize); - ChipOpen.pProcessContext = wc; - - ChipOpen.pbyImageFile = firmware->data; - ChipOpen.ulImageSize = firmware->size; - ChipOpen.fEnableMemClkOut = TRUE; - ChipOpen.ulMemClkFreq = cOCT6100_MCLK_FREQ_133_MHZ; - ChipOpen.ulMaxChannels = vpm450m->numchans; - ChipOpen.ulMemoryType = cOCT6100_MEM_TYPE_DDR; - ChipOpen.ulMemoryChipSize = cOCT6100_MEMORY_CHIP_SIZE_32MB; - ChipOpen.ulNumMemoryChips = 1; - ChipOpen.ulMaxTdmStreams = 4; - ChipOpen.aulTdmStreamFreqs[0] = cOCT6100_TDM_STREAM_FREQ_8MHZ; - ChipOpen.ulTdmSampling = cOCT6100_TDM_SAMPLE_AT_FALLING_EDGE; + ChipOpen->pProcessContext = wc; + + ChipOpen->pbyImageFile = firmware->data; + ChipOpen->ulImageSize = firmware->size; + ChipOpen->fEnableMemClkOut = TRUE; + ChipOpen->ulMemClkFreq = cOCT6100_MCLK_FREQ_133_MHZ; + ChipOpen->ulMaxChannels = vpm450m->numchans; + ChipOpen->ulMemoryType = cOCT6100_MEM_TYPE_DDR; + ChipOpen->ulMemoryChipSize = cOCT6100_MEMORY_CHIP_SIZE_32MB; + ChipOpen->ulNumMemoryChips = 1; + ChipOpen->ulMaxTdmStreams = 4; + ChipOpen->aulTdmStreamFreqs[0] = cOCT6100_TDM_STREAM_FREQ_8MHZ; + ChipOpen->ulTdmSampling = cOCT6100_TDM_SAMPLE_AT_FALLING_EDGE; #if 0 - ChipOpen.fEnableAcousticEcho = TRUE; + ChipOpen->fEnableAcousticEcho = TRUE; #endif - ulResult = Oct6100GetInstanceSize(&ChipOpen, &InstanceSize); + ulResult = Oct6100GetInstanceSize(ChipOpen, &InstanceSize); if (ulResult != cOCT6100_ERR_OK) { printk("Failed to get instance size, code %08x!\n", ulResult); kfree(vpm450m); + kfree(ChipOpen); + kfree(ChannelOpen); return NULL; } @@ -453,13 +471,17 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct f if (!vpm450m->pApiInstance) { printk("Out of memory (can't allocate %d bytes)!\n", InstanceSize.ulApiInstanceSize); kfree(vpm450m); + kfree(ChipOpen); + kfree(ChannelOpen); return NULL; } - ulResult = Oct6100ChipOpen(vpm450m->pApiInstance, &ChipOpen); + ulResult = Oct6100ChipOpen(vpm450m->pApiInstance, ChipOpen); if (ulResult != cOCT6100_ERR_OK) { printk("Failed to open chip, code %08x!\n", ulResult); kfree(vpm450m); + kfree(ChipOpen); + kfree(ChannelOpen); return NULL; } for (x=0;x<128;x++) { @@ -474,29 +496,29 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct f law = cOCT6100_PCM_A_LAW; else law = cOCT6100_PCM_U_LAW; - Oct6100ChannelOpenDef(&ChannelOpen); - ChannelOpen.pulChannelHndl = &vpm450m->aulEchoChanHndl[x]; - ChannelOpen.ulUserChanId = x; - ChannelOpen.TdmConfig.ulRinPcmLaw = law; - ChannelOpen.TdmConfig.ulRinStream = 0; - ChannelOpen.TdmConfig.ulRinTimeslot = x; - ChannelOpen.TdmConfig.ulSinPcmLaw = law; - ChannelOpen.TdmConfig.ulSinStream = 1; - ChannelOpen.TdmConfig.ulSinTimeslot = x; - ChannelOpen.TdmConfig.ulSoutPcmLaw = law; - ChannelOpen.TdmConfig.ulSoutStream = 2; - ChannelOpen.TdmConfig.ulSoutTimeslot = x; - ChannelOpen.TdmConfig.ulRoutPcmLaw = law; - ChannelOpen.TdmConfig.ulRoutStream = 3; - ChannelOpen.TdmConfig.ulRoutTimeslot = x; - ChannelOpen.VqeConfig.fEnableNlp = TRUE; - ChannelOpen.VqeConfig.fRinDcOffsetRemoval = TRUE; - ChannelOpen.VqeConfig.fSinDcOffsetRemoval = TRUE; + Oct6100ChannelOpenDef(ChannelOpen); + ChannelOpen->pulChannelHndl = &vpm450m->aulEchoChanHndl[x]; + ChannelOpen->ulUserChanId = x; + ChannelOpen->TdmConfig.ulRinPcmLaw = law; + ChannelOpen->TdmConfig.ulRinStream = 0; + ChannelOpen->TdmConfig.ulRinTimeslot = x; + ChannelOpen->TdmConfig.ulSinPcmLaw = law; + ChannelOpen->TdmConfig.ulSinStream = 1; + ChannelOpen->TdmConfig.ulSinTimeslot = x; + ChannelOpen->TdmConfig.ulSoutPcmLaw = law; + ChannelOpen->TdmConfig.ulSoutStream = 2; + ChannelOpen->TdmConfig.ulSoutTimeslot = x; + ChannelOpen->TdmConfig.ulRoutPcmLaw = law; + ChannelOpen->TdmConfig.ulRoutStream = 3; + ChannelOpen->TdmConfig.ulRoutTimeslot = x; + ChannelOpen->VqeConfig.fEnableNlp = TRUE; + ChannelOpen->VqeConfig.fRinDcOffsetRemoval = TRUE; + ChannelOpen->VqeConfig.fSinDcOffsetRemoval = TRUE; - ChannelOpen.fEnableToneDisabler = TRUE; - ChannelOpen.ulEchoOperationMode = cOCT6100_ECHO_OP_MODE_DIGITAL; + ChannelOpen->fEnableToneDisabler = TRUE; + ChannelOpen->ulEchoOperationMode = cOCT6100_ECHO_OP_MODE_DIGITAL; - ulResult = Oct6100ChannelOpen(vpm450m->pApiInstance, &ChannelOpen); + ulResult = Oct6100ChannelOpen(vpm450m->pApiInstance, ChannelOpen); if (ulResult != GENERIC_OK) { printk("Failed to open channel %d!\n", x); } @@ -511,6 +533,8 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct f } } + kfree(ChipOpen); + kfree(ChannelOpen); return vpm450m; } -- cgit v1.2.3