summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);