summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkpfleming <kpfleming@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-01-22 18:58:34 +0000
committerkpfleming <kpfleming@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-01-22 18:58:34 +0000
commit9ec284b474eb0fea2d620c79c34beed9e675abce (patch)
tree5487f8919fac1053bc1dec9c2682a0ec955cf5a3
parentf70673c41f6354e6b2ccba48bc43de79d2483010 (diff)
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
-rw-r--r--wct4xxp/base.c74
-rw-r--r--wct4xxp/vpm450m.c61
-rw-r--r--wct4xxp/vpm450m.h19
3 files changed, 72 insertions, 82 deletions
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 <linux/moduleparam.h>
-#ifdef HOTPLUG_FIRMWARE
-#include <linux/firmware.h>
-#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 <linux/vmalloc.h>
#include <linux/string.h>
#include <linux/time.h>
-#ifdef HOTPLUG_FIRMWARE
-#include <linux/firmware.h>
-#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 <linux/firmware.h>
+#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);