From 9ec284b474eb0fea2d620c79c34beed9e675abce Mon Sep 17 00:00:00 2001 From: kpfleming Date: Mon, 22 Jan 2007 18:58:34 +0000 Subject: update to PR47 Octasic API kit, and use new GetCapacityPins API call to only attempt downloading the correct firmware for the modules we find git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@1877 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- wct4xxp/base.c | 74 +++++++++++++++++++++++++------------------------------ wct4xxp/vpm450m.c | 61 +++++++++++++++++++++------------------------ wct4xxp/vpm450m.h | 19 +++++++------- 3 files changed, 72 insertions(+), 82 deletions(-) (limited to 'wct4xxp') diff --git a/wct4xxp/base.c b/wct4xxp/base.c index 487befb..ccf349b 100644 --- a/wct4xxp/base.c +++ b/wct4xxp/base.c @@ -40,10 +40,8 @@ #endif #ifdef LINUX26 #include -#ifdef HOTPLUG_FIRMWARE -#include -#endif #endif + #include "wct4xxp.h" #include "vpm450m.h" @@ -2677,7 +2675,14 @@ static void t4_vpm450_init(struct t4 *wc) unsigned int check1, check2; int laws[4] = { 0, }; int x; - int passedinit = 0; + struct firmware embedded_firmware; + const struct firmware *firmware = &embedded_firmware; +#if !defined(HOTPLUG_FIRMWARE) + extern const u32 _binary_OCT6114_64D_size; + extern const u32 _binary_OCT6114_128D_size; + extern const u8 *_binary_OCT6114_64D_start; + extern const u8 *_binary_OCT6114_128D_start; +#endif if (!vpmsupport) { printk("VPM450: Support Disabled\n"); @@ -2703,46 +2708,35 @@ static void t4_vpm450_init(struct t4 *wc) laws[x] = 1; } -#ifndef HOTPLUG_FIRMWARE - if ((wc->vpm450m = init_vpm450m(wc, laws, wc->numspans))) - passedinit = 1; -#else - { - const struct firmware *firmware; - - /* if this is a 4-span card, just try using the 128-channel firmware; - otherwise, try both, because a 2-span card could potentially have - a 128-channel Octasic module - */ - if (wc->numspans < 3) { - if ((request_firmware(&firmware, oct064_firmware, &wc->dev->dev) != 0) || - !firmware) { - printk("VPM450: firmware %s not available from userspace\n", oct064_firmware); - return; - } else { - if ((wc->vpm450m = init_vpm450m(wc, laws, wc->numspans, firmware))) - passedinit=1; - - release_firmware(firmware); - } + switch (get_vpm450m_capacity(wc)) { + case 64: +#if defined(HOTPLUG_FIRMWARE) + if ((request_firmware(&firmware, oct064_firmware, &wc->dev->dev) != 0) || + !firmware) { + printk("VPM450: firmware %s not available from userspace\n", oct064_firmware); + return; } - - if (!passedinit) { - if ((request_firmware(&firmware, oct128_firmware, &wc->dev->dev) != 0) || - !firmware) { - printk("VPM450: firmware %s not available from userspace\n", oct128_firmware); - return; - } else { - if ((wc->vpm450m = init_vpm450m(wc, laws, wc->numspans, firmware))) - passedinit=1; - - release_firmware(firmware); - } +#else + embedded_firmware.data = _binary_OCT6114D_64D_ima_start; + embedded_firmware.size = _binary_OCT6114D_64D_ima_start; +#endif + case 128: +#if defined(HOTPLUG_FIRMWARE) + if ((request_firmware(&firmware, oct128_firmware, &wc->dev->dev) != 0) || + !firmware) { + printk("VPM450: firmware %s not available from userspace\n", oct128_firmware); + return; } - } +#else + embedded_firmware.data = _binary_OCT6114D_128D_ima_start; + embedded_firmware.size = _binary_OCT6114D_128D_ima_start; #endif + default: + printk("Unsupported channel capacity found on VPM module.\n"); + return; + } - if (!passedinit) { + if (!(wc->vpm450m = init_vpm450m(wc, laws, wc->numspans, firmware))) { printk("VPM450: Failed to initialize\n"); return; } diff --git a/wct4xxp/vpm450m.c b/wct4xxp/vpm450m.c index 89874ac..33e1164 100644 --- a/wct4xxp/vpm450m.c +++ b/wct4xxp/vpm450m.c @@ -10,12 +10,9 @@ #include #include #include -#ifdef HOTPLUG_FIRMWARE -#include -#endif -#include "oct6100api/oct6100_api.h" #include "vpm450m.h" +#include "oct6100api/oct6100_api.h" /* API for Octasic access */ UINT32 Oct6100UserGetTime(tPOCT6100_GET_TIME f_pTime) @@ -284,11 +281,8 @@ int vpm450m_checkirq(struct vpm450m *vpm450m) Oct6100InterruptServiceRoutineDef(&InterruptFlags); Oct6100InterruptServiceRoutine(vpm450m->pApiInstance, &InterruptFlags); - if (InterruptFlags.fToneEventsPending) { - printk("VPM450M: Tone events pending!\n"); - return 1; - } - return 0; + + return InterruptFlags.fToneEventsPending ? 1 : 0; } int vpm450m_getdtmf(struct vpm450m *vpm450m, int *channel, int *tone, int *start) @@ -370,11 +364,28 @@ int vpm450m_getdtmf(struct vpm450m *vpm450m, int *channel, int *tone, int *start return 0; } -#ifdef HOTPLUG_FIRMWARE +unsigned int get_vpm450m_capacity(void *wc) +{ + UINT32 ulResult; + + tOCT6100_API_GET_CAPACITY_PINS CapacityPins; + + Oct6100ApiGetCapacityPinsDef(&CapacityPins); + CapacityPins.pProcessContext = wc; + CapacityPins.ulMemoryType = cOCT6100_MEM_TYPE_DDR; + CapacityPins.fEnableMemClkOut = TRUE; + CapacityPins.ulMemClkFreq = cOCT6100_MCLK_FREQ_133_MHZ; + + ulResult = Oct6100ApiGetCapacityPins(&CapacityPins); + if (ulResult != cOCT6100_ERR_OK) { + printk("Failed to get chip capacity, code %08x!\n", ulResult); + return 0; + } + + return CapacityPins.ulCapacityValue; +} + struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct firmware *firmware) -#else -struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans) -#endif { tOCT6100_CHIP_OPEN ChipOpen; tOCT6100_GET_INSTANCE_SIZE InstanceSize; @@ -383,9 +394,9 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans) struct vpm450m *vpm450m; int x,y,law; - vpm450m = kmalloc(sizeof(struct vpm450m), GFP_KERNEL); - if (!vpm450m) + if (!(vpm450m = kmalloc(sizeof(struct vpm450m), GFP_KERNEL))) return NULL; + memset(vpm450m, 0, sizeof(struct vpm450m)); for (x=0;x<128;x++) vpm450m->ecmode[x] = -1; @@ -401,24 +412,8 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans) ChipOpen.pProcessContext = wc; -#ifdef HOTPLUG_FIRMWARE ChipOpen.pbyImageFile = firmware->data; ChipOpen.ulImageSize = firmware->size; -#else - if (vpm450m->numchans > 64) { - extern const unsigned char _binary_OCT6114_128D_ima_start[]; - extern const unsigned int _binary_OCT6114_128D_ima_size; - - ChipOpen.pbyImageFile = _binary_OCT6114_128D_ima_start; - ChipOpen.ulImageSize = _binary_OCT6114_128D_ima_size; - } else { - extern const unsigned char _binary_OCT6114_64D_ima_start[]; - extern const unsigned int _binary_OCT6114_64D_ima_size; - - ChipOpen.pbyImageFile = _binary_OCT6114_64D_ima_start; - ChipOpen.ulImageSize = _binary_OCT6114_64D_ima_size; - } -#endif ChipOpen.fEnableMemClkOut = TRUE; ChipOpen.ulMemClkFreq = cOCT6100_MCLK_FREQ_133_MHZ; @@ -448,9 +443,7 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans) return NULL; } - printk("Before chip open!\n"); ulResult = Oct6100ChipOpen(vpm450m->pApiInstance, &ChipOpen); - printk("After chip open!\n"); if (ulResult != cOCT6100_ERR_OK) { printk("Failed to open chip, code %08x!\n", ulResult); kfree(vpm450m); @@ -504,6 +497,7 @@ struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans) } } } + return vpm450m; } @@ -511,6 +505,7 @@ void release_vpm450m(struct vpm450m *vpm450m) { UINT32 ulResult; tOCT6100_CHIP_CLOSE ChipClose; + Oct6100ChipCloseDef(&ChipClose); ulResult = Oct6100ChipClose(vpm450m->pApiInstance, &ChipClose); if (ulResult != cOCT6100_ERR_OK) { diff --git a/wct4xxp/vpm450m.h b/wct4xxp/vpm450m.h index adf5b90..bce3a93 100644 --- a/wct4xxp/vpm450m.h +++ b/wct4xxp/vpm450m.h @@ -24,23 +24,24 @@ #ifndef _VPM450M_H #define _VPM450M_H -struct vpm450m; - -#ifdef HOTPLUG_FIRMWARE -struct firmware; +#ifdef LINUX26 +#include +#else +struct firmware { + size_t size; + u8 *data; +}; #endif +struct vpm450m; + /* From driver */ unsigned int oct_get_reg(void *data, unsigned int reg); void oct_set_reg(void *data, unsigned int reg, unsigned int val); /* From vpm450m */ -#ifdef HOTPLUG_FIRMWARE struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans, const struct firmware *firmware); -#else -struct vpm450m *init_vpm450m(void *wc, int *isalaw, int numspans); -#endif - +unsigned int get_vpm450m_capacity(void *wc); void vpm450m_setec(struct vpm450m *instance, int channel, int eclen); void vpm450m_setdtmf(struct vpm450m *instance, int channel, int dtmfdetect, int dtmfmute); int vpm450m_checkirq(struct vpm450m *vpm450m); -- cgit v1.2.3