[dahdi-commits] sruffell: branch linux/sruffell/dahdi-linux-parallelload r7366 - /linux/team/...
SVN commits to the DAHDI project
dahdi-commits at lists.digium.com
Fri Oct 9 10:31:46 CDT 2009
Author: sruffell
Date: Fri Oct 9 10:31:36 2009
New Revision: 7366
URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=7366
Log:
wip: Parallel load the modules on an individual card.
Modified:
linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/base.c
linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
Modified: linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/base.c
URL: http://svnview.digium.com/svn/dahdi/linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/base.c?view=diff&rev=7366&r1=7365&r2=7366
==============================================================================
--- linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/base.c (original)
+++ linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/base.c Fri Oct 9 10:31:36 2009
@@ -56,6 +56,7 @@
#include <linux/async.h>
#else
#undef USE_ASYNC_INIT
+typedef u64 async_cookie_t;
#endif
#include <dahdi/kernel.h>
@@ -3555,6 +3556,122 @@
portconfig->EightSlotMask3 = 0x0000;
}
+#ifdef USE_ASYNC_INIT
+static void wctdm_synchronize_cookie(struct wctdm *wc, async_cookie_t cookie)
+{
+ async_synchronize_cookie_domain(cookie, &wc->async_domain);
+}
+#else
+static void wctdm_synchronize_cookie(struct wctdm *wc, async_cookie_t cookie)
+{
+ wc; cookie;
+ return;
+}
+#endif
+
+static void __wctdm_locate_module(struct wctdm *wc, int x, async_cookie_t cookie)
+{
+ unsigned long flags;
+ int sane=0,ret=0,readi=0;
+
+retry:
+ /* Init with Auto Calibration */
+ if (!(ret = wctdm_init_proslic(wc, x, 0, 0, sane))) {
+ wc->cardflag |= (1 << x);
+ if (debug & DEBUG_CARD) {
+ readi = wctdm_getreg(wc,x,LOOP_I_LIMIT);
+ printk(KERN_DEBUG "Proslic module %d loop current is %dmA\n",x,
+ ((readi*3)+20));
+ }
+ wctdm_synchronize_cookie(wc, cookie);
+ printk(KERN_INFO "Port %d: Installed -- AUTO FXS/DPO\n", x + 1);
+ } else {
+ if(ret!=-2) {
+ sane=1;
+ /* Init with Manual Calibration */
+ if (!wctdm_init_proslic(wc, x, 0, 1, sane)) {
+ wc->cardflag |= (1 << x);
+ if (debug & DEBUG_CARD) {
+ readi = wctdm_getreg(wc,x,LOOP_I_LIMIT);
+ printk(KERN_DEBUG "Proslic module %d loop current is %dmA\n",x,
+ ((readi*3)+20));
+ }
+ wctdm_synchronize_cookie(wc, cookie);
+ printk(KERN_INFO "Port %d: Installed -- MANUAL FXS\n",x + 1);
+ } else {
+ printk(KERN_NOTICE "Port %d: FAILED FXS (%s)\n", x + 1, fxshonormode ? fxo_modes[_opermode].name : "FCC");
+ wc->chans[x]->sigcap = DAHDI_SIG_BROKEN | __DAHDI_SIG_FXO;
+ }
+ } else if (!(ret = wctdm_init_voicedaa(wc, x, 0, 0, sane))) {
+ wc->cardflag |= (1 << x);
+ wctdm_synchronize_cookie(wc, cookie);
+ printk(KERN_INFO "Port %d: Installed -- AUTO FXO (%s mode)\n",x + 1, fxo_modes[_opermode].name);
+ } else if (!wctdm_init_qrvdri(wc,x)) {
+ wc->cardflag |= 1 << x;
+ wctdm_synchronize_cookie(wc, cookie);
+ printk(KERN_INFO "Port %d: Installed -- QRV DRI card\n",x + 1);
+ } else {
+ if ((wc->desc->ports != 24) &&
+ ((x & 0x3) == 1) && !wc->altcs[x]) {
+ spin_lock_irqsave(&wc->reglock, flags);
+ wc->altcs[x] = 2;
+ if (wc->desc->ports == 4) {
+ wc->altcs[x+1] = 3;
+ wc->altcs[x+2] = 3;
+ }
+ wc->modtype[x] = MOD_TYPE_FXSINIT;
+ spin_unlock_irqrestore(&wc->reglock, flags);
+
+ schluffen(&wc->regq);
+ schluffen(&wc->regq);
+ spin_lock_irqsave(&wc->reglock, flags);
+ wc->modtype[x] = MOD_TYPE_FXS;
+ spin_unlock_irqrestore(&wc->reglock, flags);
+ if (debug & DEBUG_CARD)
+ printk(KERN_DEBUG "Trying port %d with alternate chip select\n", x + 1);
+ goto retry;
+ } else {
+ wctdm_synchronize_cookie(wc, cookie);
+ printk(KERN_NOTICE "Port %d: Not installed\n", x + 1);
+ wc->modtype[x] = MOD_TYPE_NONE;
+ wc->cardflag |= (1 << x);
+ }
+ }
+ }
+}
+
+#ifdef USE_ASYNC_INIT
+struct locate_module_data {
+ struct wctdm *wc;
+ int module;
+};
+
+static void wctdm_locate_module_async(void *data, async_cookie_t cookie)
+{
+ struct locate_module_data *d = data;
+ __wctdm_locate_module(d->wc, d->module, cookie);
+ kfree(d);
+}
+
+static void wctdm_locate_module(struct wctdm *wc, int module)
+{
+ struct locate_module_data *dat = kmalloc(sizeof(*dat), GFP_KERNEL);
+ if (!dat) {
+ WARN_ON(1);
+ return;
+ }
+ dat->wc = wc;
+ dat->module = module;
+ async_schedule_domain(wctdm_locate_module_async, dat,
+ &wc->async_domain);
+}
+#else
+static void wctdm_locate_module(struct wctdm *wc, int module)
+{
+ __wctdm_locate_module(wc, module, 0);
+}
+#endif
+
static int wctdm_locate_modules(struct wctdm *wc)
{
int x;
@@ -3589,71 +3706,8 @@
spin_unlock_irqrestore(&wc->reglock, flags);
/* Reset modules */
- for (x=0;x<wc->cards;x++) {
- int sane=0,ret=0,readi=0;
-retry:
- if (voicebus_current_latency(wc->vb) > startinglatency) {
- return -EAGAIN;
- }
- /* Init with Auto Calibration */
- if (!(ret = wctdm_init_proslic(wc, x, 0, 0, sane))) {
- wc->cardflag |= (1 << x);
- if (debug & DEBUG_CARD) {
- readi = wctdm_getreg(wc,x,LOOP_I_LIMIT);
- printk(KERN_DEBUG "Proslic module %d loop current is %dmA\n",x,
- ((readi*3)+20));
- }
- printk(KERN_INFO "Port %d: Installed -- AUTO FXS/DPO\n", x + 1);
- } else {
- if(ret!=-2) {
- sane=1;
- /* Init with Manual Calibration */
- if (!wctdm_init_proslic(wc, x, 0, 1, sane)) {
- wc->cardflag |= (1 << x);
- if (debug & DEBUG_CARD) {
- readi = wctdm_getreg(wc,x,LOOP_I_LIMIT);
- printk(KERN_DEBUG "Proslic module %d loop current is %dmA\n",x,
- ((readi*3)+20));
- }
- printk(KERN_INFO "Port %d: Installed -- MANUAL FXS\n",x + 1);
- } else {
- printk(KERN_NOTICE "Port %d: FAILED FXS (%s)\n", x + 1, fxshonormode ? fxo_modes[_opermode].name : "FCC");
- wc->chans[x]->sigcap = DAHDI_SIG_BROKEN | __DAHDI_SIG_FXO;
- }
- } else if (!(ret = wctdm_init_voicedaa(wc, x, 0, 0, sane))) {
- wc->cardflag |= (1 << x);
- printk(KERN_INFO "Port %d: Installed -- AUTO FXO (%s mode)\n",x + 1, fxo_modes[_opermode].name);
- } else if (!wctdm_init_qrvdri(wc,x)) {
- wc->cardflag |= 1 << x;
- printk(KERN_INFO "Port %d: Installed -- QRV DRI card\n",x + 1);
- } else {
- if ((wc->desc->ports != 24) &&
- ((x & 0x3) == 1) && !wc->altcs[x]) {
- spin_lock_irqsave(&wc->reglock, flags);
- wc->altcs[x] = 2;
- if (wc->desc->ports == 4) {
- wc->altcs[x+1] = 3;
- wc->altcs[x+2] = 3;
- }
- wc->modtype[x] = MOD_TYPE_FXSINIT;
- spin_unlock_irqrestore(&wc->reglock, flags);
-
- schluffen(&wc->regq);
- schluffen(&wc->regq);
- spin_lock_irqsave(&wc->reglock, flags);
- wc->modtype[x] = MOD_TYPE_FXS;
- spin_unlock_irqrestore(&wc->reglock, flags);
- if (debug & DEBUG_CARD)
- printk(KERN_DEBUG "Trying port %d with alternate chip select\n", x + 1);
- goto retry;
- } else {
- printk(KERN_NOTICE "Port %d: Not installed\n", x + 1);
- wc->modtype[x] = MOD_TYPE_NONE;
- wc->cardflag |= (1 << x);
- }
- }
- }
- }
+ for (x=0;x<wc->cards;x++)
+ wctdm_locate_module(wc, x);
if (!vpmsupport) {
printk(KERN_NOTICE "VPM: Support Disabled\n");
@@ -3753,6 +3807,7 @@
memset(wc, 0, sizeof(*wc));
wc->desc = (struct wctdm_desc *)ent->driver_data;
+ INIT_LIST_HEAD(&wc->async_domain);
spin_lock(&ifacelock);
/* \todo this is a candidate for removal... */
for (i = 0; i < WC_MAX_IFACES; ++i) {
Modified: linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
URL: http://svnview.digium.com/svn/dahdi/linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/wctdm24xxp.h?view=diff&rev=7366&r1=7365&r2=7366
==============================================================================
--- linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/wctdm24xxp.h (original)
+++ linux/team/sruffell/dahdi-linux-parallelload/drivers/dahdi/wctdm24xxp/wctdm24xxp.h Fri Oct 9 10:31:36 2009
@@ -231,6 +231,7 @@
struct dahdi_chan *chans[NUM_CARDS];
struct dahdi_echocan_state *ec[NUM_CARDS];
int initialized;
+ struct list_head async_domain;
};
More information about the dahdi-commits
mailing list