summaryrefslogtreecommitdiff
path: root/wcte12xp
diff options
context:
space:
mode:
authormspiceland <mspiceland@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-12-11 00:07:19 +0000
committermspiceland <mspiceland@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-12-11 00:07:19 +0000
commit16175dac3a1e5b73f8bd2ca6a5d65d2c55dc4901 (patch)
treec68cb896b9c5ca36a42b5306cdc9d1c0d6303460 /wcte12xp
parent8d7bc1c2959659c6649ca6ade2467f0ee88b7864 (diff)
If we detect that we have a VPMADT032 module but there is an error during
initialization, we don't proceed and register with Zaptel. This will prevent customers with faulty VPMADT032 modules from going undetected. Customers can always load with vpmsupport=0 to proceed with this error but will do so knowingly. git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@3405 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'wcte12xp')
-rw-r--r--wcte12xp/base.c10
-rw-r--r--wcte12xp/vpmadt032.c12
-rw-r--r--wcte12xp/vpmadt032.h2
3 files changed, 15 insertions, 9 deletions
diff --git a/wcte12xp/base.c b/wcte12xp/base.c
index 26598be..1bd6c5b 100644
--- a/wcte12xp/base.c
+++ b/wcte12xp/base.c
@@ -1425,7 +1425,10 @@ static int t1_hardware_post_init(struct t1 *wc)
t1_setleds(wc, wc->ledtestreg, 0);
#ifdef VPM_SUPPORT
- t1_vpm150m_init(wc);
+ if (t1_vpm150m_init(wc) < 0) {
+ module_printk("VPMADT032 module detected but there was an error during initialization. If you still wish to use this card, please disable echo cancellation using vpmsupport=0 as a module parameter or replace the echo cancellation module.\n");
+ return -1;
+ }
if (wc->vpm150m) {
module_printk("VPM present and operational (Firmware version %x)\n", wc->vpm150m->version);
wc->ctlreg |= 0x10; /* turn on vpm (RX audio from vpm module) */
@@ -1955,7 +1958,10 @@ static int __devinit te12xp_init_one(struct pci_dev *pdev, const struct pci_devi
t1_enable_interrupts(wc);
t1_start_dma(wc);
- t1_hardware_post_init(wc);
+ if (t1_hardware_post_init(wc) < 0) {
+ module_printk("Hardware init failed. Refusing to register broken hardware interface.\n");
+ return 0;
+ }
t1_software_init(wc);
module_printk("Found a %s\n", wc->variety);
diff --git a/wcte12xp/vpmadt032.c b/wcte12xp/vpmadt032.c
index ca15e7c..90af94c 100644
--- a/wcte12xp/vpmadt032.c
+++ b/wcte12xp/vpmadt032.c
@@ -641,7 +641,7 @@ static void vpm150m_dtmf_bh(struct work_struct *data)
return;
}
-void t1_vpm150m_init(struct t1 *wc) {
+int t1_vpm150m_init(struct t1 *wc) {
struct vpm150m *vpm150m;
unsigned short i;
unsigned short reg;
@@ -666,14 +666,14 @@ void t1_vpm150m_init(struct t1 *wc) {
if (!vpmsupport) {
module_printk("VPM Support Disabled\n");
wc->vpm150m = NULL;
- return;
+ return 0; /* not fatal for the card */
}
vpm150m = kmalloc(sizeof(struct vpm150m), GFP_KERNEL);
if (!vpm150m) {
module_printk("Unable to allocate VPMADT032!\n");
- return;
+ return -1;
}
memset(vpm150m, 0, sizeof(struct vpm150m));
@@ -873,7 +873,7 @@ void t1_vpm150m_init(struct t1 *wc) {
if ((request_firmware(&firmware, vpmadt032_firmware, &wc->dev->dev) != 0) ||
!firmware) {
printk("VPMADT032: firmware %s not available from userspace\n", vpmadt032_firmware);
- return;
+ return -1;
}
#else
embedded_firmware.data = _binary_vpmadt032_bin_start;
@@ -942,7 +942,7 @@ void t1_vpm150m_init(struct t1 *wc) {
goto failed_exit;
}
- return;
+ return 0;
failed_exit:
spin_lock_irqsave(&wc->reglock, flags);
@@ -950,7 +950,7 @@ failed_exit:
spin_unlock_irqrestore(&wc->reglock, flags);
kfree(vpm150m);
- return;
+ return -1;
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/wcte12xp/vpmadt032.h b/wcte12xp/vpmadt032.h
index 55620f1..4f9a5dc 100644
--- a/wcte12xp/vpmadt032.h
+++ b/wcte12xp/vpmadt032.h
@@ -112,7 +112,7 @@ extern int vpmsupport;
extern int vpmdtmfsupport;
extern struct pci_driver te12xp_driver;
-void t1_vpm150m_init(struct t1 *wc);
+int t1_vpm150m_init(struct t1 *wc);
void vpm150m_cmd_dequeue(struct t1 *wc, volatile unsigned char *writechunk, int whichframe);
void vpm150m_cmd_decipher(struct t1 *wc, volatile unsigned char *readchunk);
int vpm150m_config_hw(struct t1 *wc);