summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-06-25 14:34:07 +0000
committermarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-06-25 14:34:07 +0000
commit2c2ee331aab1c140a575a94cef823f52f8d89e76 (patch)
tree1c59ebd6b044529d4ffc410a92f57b3deef46160
parent40cd9f834b192258a885685a5dccb5b01a527f9a (diff)
Add support for international impedence matching (improves echo abroad!)
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@421 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rwxr-xr-xwcfxs.c139
-rwxr-xr-xwctdm.c139
2 files changed, 262 insertions, 16 deletions
diff --git a/wcfxs.c b/wcfxs.c
index 759235b..f63b84e 100755
--- a/wcfxs.c
+++ b/wcfxs.c
@@ -28,7 +28,6 @@
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/init.h>
-#include <linux/usb.h>
#include <linux/errno.h>
#include <linux/pci.h>
@@ -90,6 +89,95 @@ static alpha indirect_regs[] =
{43,"LOOP_CLOSE_TRES_LOW",0x1000},
};
+static struct fxo_mode {
+ char *name;
+ int ohs;
+ int ohs2;
+ int rz;
+ int rt;
+ int ilim;
+ int dcv;
+ int mini;
+ int acim;
+} fxo_modes[] =
+{
+ { "FCC", 0, 0, 0, 0, 0, 0x3, 0, 0 }, /* US, Canada */
+ { "TBR21", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },/* Austria, Belgium, Denmark, Finland, France, Germany,
+ Greece, Iceland, Ireland, Italy, Luxembourg, Netherlands,
+ Norway, Portugal, Spain, Sweden, Switzerland, and UK */
+ { "ARGENTINA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "AUSTRALIA", 1, 0, 0, 0, 0, 0, 0x3, 0x3 },
+ { "AUSTRIA", 0, 1, 0, 0, 1, 0x3, 0, 0x3 },
+ { "BAHRAIN", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "BELGIUM", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "BRAZIL", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "BULGARIA", 0, 0, 0, 0, 1, 0x3, 0x0, 0x3 },
+ { "CANADA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "CHILE", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "CHINA", 0, 0, 0, 0, 0, 0, 0x3, 0xf },
+ { "COLUMBIA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "CROATIA", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "CYRPUS", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "CZECH", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "DENMARK", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ECUADOR", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "EGYPT", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "ELSALVADOR", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "FINLAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "FRANCE", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "GERMANY", 0, 1, 0, 0, 1, 0x3, 0, 0x3 },
+ { "GREECE", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "GUAM", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "HONGKONG", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "HUNGARY", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "ICELAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "INDIA", 0, 0, 0, 0, 0, 0x3, 0, 0x4 },
+ { "INDONESIA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "IRELAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ISRAEL", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ITALY", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "JAPAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "JORDAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "KAZAKHSTAN", 0, 0, 0, 0, 0, 0x3, 0 },
+ { "KUWAIT", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "LATVIA", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "LEBANON", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "LUXEMBOURG", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "MACAO", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "MALAYSIA", 0, 0, 0, 0, 0, 0, 0x3, 0 }, /* Current loop >= 20ma */
+ { "MALTA", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "MEXICO", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "MOROCCO", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "NETHERLANDS", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "NEWZEALAND", 0, 0, 0, 0, 0, 0x3, 0, 0x4 },
+ { "NIGERIA", 0, 0, 0, 0, 0x1, 0x3, 0, 0x2 },
+ { "NORWAY", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "OMAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "PAKISTAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "PERU", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "PHILIPPINES", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "POLAND", 0, 0, 1, 1, 0, 0x3, 0, 0 },
+ { "PORTUGAL", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ROMANIA", 0, 0, 0, 0, 0, 3, 0, 0 },
+ { "RUSSIA", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "SAUDIARABIA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "SINGAPORE", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "SLOVAKIA", 0, 0, 0, 0, 0, 0x3, 0, 0x3 },
+ { "SLOVENIA", 0, 0, 0, 0, 0, 0x3, 0, 0x2 },
+ { "SOUTHAFRICA", 1, 0, 1, 0, 0, 0x3, 0, 0x3 },
+ { "SOUTHKOREA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "SPAIN", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "SWEDEN", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "SWITZERLAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "SYRIA", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "TAIWAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "THAILAND", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "UAE", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "UK", 0, 1, 0, 0, 1, 0x3, 0, 0x5 },
+ { "USA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "YEMEN", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+};
+
#ifdef STANDALONE_ZAPATA
#include "zaptel.h"
#else
@@ -237,6 +325,8 @@ static int robust = 0;
static int timingonly = 0;
static int lowpower = 0;
static int boostringer = 0;
+static int _opermode = 0;
+static char *opermode = "FCC";
static int wcfxs_init_proslic(struct wcfxs *wc, int card, int fast , int manual, int sane);
@@ -974,6 +1064,8 @@ static int wcfxs_proslic_calibrate(struct wcfxs *wc, int card)
static int wcfxs_init_voicedaa(struct wcfxs *wc, int card, int fast, int manual, int sane)
{
long newjiffies;
+ unsigned char reg16=0, reg26=0, reg30=0, reg31=0;
+
wc->modtype[card] = MOD_TYPE_FXO;
/* Sanity check the ProSLIC */
reset_spi(wc, card);
@@ -990,14 +1082,27 @@ static int wcfxs_init_voicedaa(struct wcfxs *wc, int card, int fast, int manual,
/* Enable PCM, ulaw */
wcfxs_setreg(wc, card, 33, 0x28);
- /* Misc. DAA parameters */
- wcfxs_setreg(wc, card, 31, 0xa3);
+ /* Set On-hook speed, Ringer impedence, and ringer threshold */
+ reg16 |= (fxo_modes[_opermode].ohs << 6);
+ reg16 |= (fxo_modes[_opermode].rz << 1);
+ reg16 |= (fxo_modes[_opermode].rt);
+ wcfxs_setreg(wc, card, 16, reg16);
+
+ /* Set DC Termination:
+ Tip/Ring voltage adjust, minimum operational current, current limitation */
+ reg26 |= (fxo_modes[_opermode].dcv << 6);
+ reg26 |= (fxo_modes[_opermode].mini << 4);
+ reg26 |= (fxo_modes[_opermode].ilim << 1);
+ wcfxs_setreg(wc, card, 26, reg26);
/* Set AC Impedence */
- wcfxs_setreg(wc, card, 30, 0x00);
+ reg30 = (fxo_modes[_opermode].acim);
+ wcfxs_setreg(wc, card, 30, reg30);
- /* Set DC Termination */
- wcfxs_setreg(wc, card, 26, 0xc0);
+ /* Misc. DAA parameters */
+ reg31 = 0xa3;
+ reg31 |= (fxo_modes[_opermode].ohs2 << 3);
+ wcfxs_setreg(wc, card, 31, reg31);
/* Set Transmit/Receive timeslot */
wcfxs_setreg(wc, card, 34, (3-card) * 8);
@@ -1562,6 +1667,7 @@ static int wcfxs_hooksig(struct zt_chan *chan, zt_txsig_t txsig)
static int wcfxs_initialize(struct wcfxs *wc)
{
int x;
+
/* Zapata stuff */
sprintf(wc->span.name, "WCTDM/%d", wc->pos);
sprintf(wc->span.desc, "%s Board %d", wc->variety, wc->pos + 1);
@@ -1713,7 +1819,7 @@ static int wcfxs_hardware_init(struct wcfxs *wc)
}
} else if (!(ret = wcfxs_init_voicedaa(wc, x, 0, 0, sane))) {
wc->cardflag |= (1 << x);
- printk("Module %d: Installed -- AUTO FXO\n",x);
+ printk("Module %d: Installed -- AUTO FXO (%s mode)\n",x, fxo_modes[_opermode].name);
} else
printk("Module %d: Not installed\n", x);
}
@@ -1947,6 +2053,21 @@ static struct pci_driver wcfxs_driver = {
static int __init wcfxs_init(void)
{
int res;
+ int x;
+ for (x=0;x<(sizeof(fxo_modes) / sizeof(fxo_modes[0])); x++) {
+ if (!strcmp(fxo_modes[x].name, opermode))
+ break;
+ }
+ if (x < sizeof(fxo_modes) / sizeof(fxo_modes[0])) {
+ _opermode = x;
+ } else {
+ printk("Invalid/unknown operating mode '%s' specified. Please choose one of:\n", opermode);
+ for (x=0;x<sizeof(fxo_modes) / sizeof(fxo_modes[0]); x++)
+ printk(" %s\n", fxo_modes[x].name);
+ printk("Note this option is CASE SENSITIVE!\n");
+ return -ENODEV;
+ }
+
res = pci_module_init(&wcfxs_driver);
if (res)
return -ENODEV;
@@ -1960,11 +2081,13 @@ static void __exit wcfxs_cleanup(void)
MODULE_PARM(debug, "i");
MODULE_PARM(robust, "i");
+MODULE_PARM(_opermode, "i");
+MODULE_PARM(opermode, "s");
MODULE_PARM(timingonly, "i");
MODULE_PARM(lowpower, "i");
MODULE_PARM(boostringer, "i");
MODULE_DESCRIPTION("Wildcard TDM400P Zaptel Driver");
-MODULE_AUTHOR("Mark Spencer <markster@linux-support.net>");
+MODULE_AUTHOR("Mark Spencer <markster@digium.com>");
#ifdef MODULE_LICENSE
MODULE_LICENSE("GPL");
#endif
diff --git a/wctdm.c b/wctdm.c
index 759235b..f63b84e 100755
--- a/wctdm.c
+++ b/wctdm.c
@@ -28,7 +28,6 @@
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/init.h>
-#include <linux/usb.h>
#include <linux/errno.h>
#include <linux/pci.h>
@@ -90,6 +89,95 @@ static alpha indirect_regs[] =
{43,"LOOP_CLOSE_TRES_LOW",0x1000},
};
+static struct fxo_mode {
+ char *name;
+ int ohs;
+ int ohs2;
+ int rz;
+ int rt;
+ int ilim;
+ int dcv;
+ int mini;
+ int acim;
+} fxo_modes[] =
+{
+ { "FCC", 0, 0, 0, 0, 0, 0x3, 0, 0 }, /* US, Canada */
+ { "TBR21", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },/* Austria, Belgium, Denmark, Finland, France, Germany,
+ Greece, Iceland, Ireland, Italy, Luxembourg, Netherlands,
+ Norway, Portugal, Spain, Sweden, Switzerland, and UK */
+ { "ARGENTINA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "AUSTRALIA", 1, 0, 0, 0, 0, 0, 0x3, 0x3 },
+ { "AUSTRIA", 0, 1, 0, 0, 1, 0x3, 0, 0x3 },
+ { "BAHRAIN", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "BELGIUM", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "BRAZIL", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "BULGARIA", 0, 0, 0, 0, 1, 0x3, 0x0, 0x3 },
+ { "CANADA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "CHILE", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "CHINA", 0, 0, 0, 0, 0, 0, 0x3, 0xf },
+ { "COLUMBIA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "CROATIA", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "CYRPUS", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "CZECH", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "DENMARK", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ECUADOR", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "EGYPT", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "ELSALVADOR", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "FINLAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "FRANCE", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "GERMANY", 0, 1, 0, 0, 1, 0x3, 0, 0x3 },
+ { "GREECE", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "GUAM", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "HONGKONG", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "HUNGARY", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "ICELAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "INDIA", 0, 0, 0, 0, 0, 0x3, 0, 0x4 },
+ { "INDONESIA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "IRELAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ISRAEL", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ITALY", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "JAPAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "JORDAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "KAZAKHSTAN", 0, 0, 0, 0, 0, 0x3, 0 },
+ { "KUWAIT", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "LATVIA", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "LEBANON", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "LUXEMBOURG", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "MACAO", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "MALAYSIA", 0, 0, 0, 0, 0, 0, 0x3, 0 }, /* Current loop >= 20ma */
+ { "MALTA", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "MEXICO", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "MOROCCO", 0, 0, 0, 0, 1, 0x3, 0, 0x2 },
+ { "NETHERLANDS", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "NEWZEALAND", 0, 0, 0, 0, 0, 0x3, 0, 0x4 },
+ { "NIGERIA", 0, 0, 0, 0, 0x1, 0x3, 0, 0x2 },
+ { "NORWAY", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "OMAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "PAKISTAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "PERU", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "PHILIPPINES", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "POLAND", 0, 0, 1, 1, 0, 0x3, 0, 0 },
+ { "PORTUGAL", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "ROMANIA", 0, 0, 0, 0, 0, 3, 0, 0 },
+ { "RUSSIA", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "SAUDIARABIA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "SINGAPORE", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "SLOVAKIA", 0, 0, 0, 0, 0, 0x3, 0, 0x3 },
+ { "SLOVENIA", 0, 0, 0, 0, 0, 0x3, 0, 0x2 },
+ { "SOUTHAFRICA", 1, 0, 1, 0, 0, 0x3, 0, 0x3 },
+ { "SOUTHKOREA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "SPAIN", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "SWEDEN", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "SWITZERLAND", 0, 1, 0, 0, 1, 0x3, 0, 0x2 },
+ { "SYRIA", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "TAIWAN", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "THAILAND", 0, 0, 0, 0, 0, 0, 0x3, 0 },
+ { "UAE", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "UK", 0, 1, 0, 0, 1, 0x3, 0, 0x5 },
+ { "USA", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+ { "YEMEN", 0, 0, 0, 0, 0, 0x3, 0, 0 },
+};
+
#ifdef STANDALONE_ZAPATA
#include "zaptel.h"
#else
@@ -237,6 +325,8 @@ static int robust = 0;
static int timingonly = 0;
static int lowpower = 0;
static int boostringer = 0;
+static int _opermode = 0;
+static char *opermode = "FCC";
static int wcfxs_init_proslic(struct wcfxs *wc, int card, int fast , int manual, int sane);
@@ -974,6 +1064,8 @@ static int wcfxs_proslic_calibrate(struct wcfxs *wc, int card)
static int wcfxs_init_voicedaa(struct wcfxs *wc, int card, int fast, int manual, int sane)
{
long newjiffies;
+ unsigned char reg16=0, reg26=0, reg30=0, reg31=0;
+
wc->modtype[card] = MOD_TYPE_FXO;
/* Sanity check the ProSLIC */
reset_spi(wc, card);
@@ -990,14 +1082,27 @@ static int wcfxs_init_voicedaa(struct wcfxs *wc, int card, int fast, int manual,
/* Enable PCM, ulaw */
wcfxs_setreg(wc, card, 33, 0x28);
- /* Misc. DAA parameters */
- wcfxs_setreg(wc, card, 31, 0xa3);
+ /* Set On-hook speed, Ringer impedence, and ringer threshold */
+ reg16 |= (fxo_modes[_opermode].ohs << 6);
+ reg16 |= (fxo_modes[_opermode].rz << 1);
+ reg16 |= (fxo_modes[_opermode].rt);
+ wcfxs_setreg(wc, card, 16, reg16);
+
+ /* Set DC Termination:
+ Tip/Ring voltage adjust, minimum operational current, current limitation */
+ reg26 |= (fxo_modes[_opermode].dcv << 6);
+ reg26 |= (fxo_modes[_opermode].mini << 4);
+ reg26 |= (fxo_modes[_opermode].ilim << 1);
+ wcfxs_setreg(wc, card, 26, reg26);
/* Set AC Impedence */
- wcfxs_setreg(wc, card, 30, 0x00);
+ reg30 = (fxo_modes[_opermode].acim);
+ wcfxs_setreg(wc, card, 30, reg30);
- /* Set DC Termination */
- wcfxs_setreg(wc, card, 26, 0xc0);
+ /* Misc. DAA parameters */
+ reg31 = 0xa3;
+ reg31 |= (fxo_modes[_opermode].ohs2 << 3);
+ wcfxs_setreg(wc, card, 31, reg31);
/* Set Transmit/Receive timeslot */
wcfxs_setreg(wc, card, 34, (3-card) * 8);
@@ -1562,6 +1667,7 @@ static int wcfxs_hooksig(struct zt_chan *chan, zt_txsig_t txsig)
static int wcfxs_initialize(struct wcfxs *wc)
{
int x;
+
/* Zapata stuff */
sprintf(wc->span.name, "WCTDM/%d", wc->pos);
sprintf(wc->span.desc, "%s Board %d", wc->variety, wc->pos + 1);
@@ -1713,7 +1819,7 @@ static int wcfxs_hardware_init(struct wcfxs *wc)
}
} else if (!(ret = wcfxs_init_voicedaa(wc, x, 0, 0, sane))) {
wc->cardflag |= (1 << x);
- printk("Module %d: Installed -- AUTO FXO\n",x);
+ printk("Module %d: Installed -- AUTO FXO (%s mode)\n",x, fxo_modes[_opermode].name);
} else
printk("Module %d: Not installed\n", x);
}
@@ -1947,6 +2053,21 @@ static struct pci_driver wcfxs_driver = {
static int __init wcfxs_init(void)
{
int res;
+ int x;
+ for (x=0;x<(sizeof(fxo_modes) / sizeof(fxo_modes[0])); x++) {
+ if (!strcmp(fxo_modes[x].name, opermode))
+ break;
+ }
+ if (x < sizeof(fxo_modes) / sizeof(fxo_modes[0])) {
+ _opermode = x;
+ } else {
+ printk("Invalid/unknown operating mode '%s' specified. Please choose one of:\n", opermode);
+ for (x=0;x<sizeof(fxo_modes) / sizeof(fxo_modes[0]); x++)
+ printk(" %s\n", fxo_modes[x].name);
+ printk("Note this option is CASE SENSITIVE!\n");
+ return -ENODEV;
+ }
+
res = pci_module_init(&wcfxs_driver);
if (res)
return -ENODEV;
@@ -1960,11 +2081,13 @@ static void __exit wcfxs_cleanup(void)
MODULE_PARM(debug, "i");
MODULE_PARM(robust, "i");
+MODULE_PARM(_opermode, "i");
+MODULE_PARM(opermode, "s");
MODULE_PARM(timingonly, "i");
MODULE_PARM(lowpower, "i");
MODULE_PARM(boostringer, "i");
MODULE_DESCRIPTION("Wildcard TDM400P Zaptel Driver");
-MODULE_AUTHOR("Mark Spencer <markster@linux-support.net>");
+MODULE_AUTHOR("Mark Spencer <markster@digium.com>");
#ifdef MODULE_LICENSE
MODULE_LICENSE("GPL");
#endif