From 4a37f022ab8af3d8a9412b85e220956bcf0d7ccb Mon Sep 17 00:00:00 2001 From: markster Date: Fri, 4 Oct 2002 20:46:11 +0000 Subject: Version 0.3.1 from FTP git-svn-id: http://svn.digium.com/svn/zaptel/trunk@114 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- tor2.c | 83 +++++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 57 insertions(+), 26 deletions(-) (limited to 'tor2.c') diff --git a/tor2.c b/tor2.c index 8e1879a..cb93702 100755 --- a/tor2.c +++ b/tor2.c @@ -83,6 +83,7 @@ struct tor2 { int alarmtimer[4]; /* Alarm timer */ char *type; /* Type of tormenta 2 card */ int irq; /* IRQ used by device */ + int order; /* Order */ int flags; /* Device flags */ unsigned long plx_region; /* phy addr of PCI9030 registers */ unsigned long plx_len; /* length of PLX window */ @@ -133,6 +134,7 @@ static void tor2_tasklet(unsigned long data); #define CTLREG 0x401 #define LEDREG 0x402 #define STATREG 0x400 +#define SWREG 0x401 #define INTENA (1 + ((loopback & 3) << 5)) #define OUTBIT (2 + ((loopback & 3) << 5)) @@ -159,6 +161,7 @@ struct tor2 *cards[MAX_TOR_CARDS]; static int debug; static int loopback; +static int highestorder; static void set_clear(struct tor2 *tor); static int tor2_startup(struct zt_span *span); @@ -285,9 +288,41 @@ static void init_spans(struct tor2 *tor) } } +static int __devinit tor2_launch(struct tor2 *tor) +{ + printk("tor2: Launching card: %d\n", tor->order); + if (zt_register(&tor->spans[0], 0)) { + printk(KERN_ERR "Unable to register span %s\n", tor->spans[0].name); + return -1; + } + if (zt_register(&tor->spans[1], 0)) { + printk(KERN_ERR "Unable to register span %s\n", tor->spans[1].name); + zt_unregister(&tor->spans[0]); + return -1; + } + if (zt_register(&tor->spans[2], 0)) { + printk(KERN_ERR "Unable to register span %s\n", tor->spans[2].name); + zt_unregister(&tor->spans[0]); + zt_unregister(&tor->spans[1]); + return -1; + } + if (zt_register(&tor->spans[3], 0)) { + printk(KERN_ERR "Unable to register span %s\n", tor->spans[3].name); + zt_unregister(&tor->spans[0]); + zt_unregister(&tor->spans[1]); + zt_unregister(&tor->spans[2]); + return -1; + } + tor->plx[INTCSR] = cpu_to_le16(PLX_INTENA); /* enable PLX interrupt */ +#ifdef ENABLE_TASKLETS + tasklet_init(&tor->tor2_tlet, tor2_tasklet, (unsigned long)tor); +#endif + return 0; +} + static int __devinit tor2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { - int res,x; + int res,x,f; struct tor2 *tor; unsigned long endjif; volatile unsigned long *gpdata_io; @@ -442,6 +477,7 @@ static int __devinit tor2_probe(struct pci_dev *pdev, const struct pci_device_id tor->mem8[LEDREG] = 0; for(x = 0; x < 256; x++) tor->mem32[x] = 0x7f7f7f7f; + if (request_irq(tor->irq, tor2_intr, SA_INTERRUPT | SA_SHIRQ, "tor2", tor)) { printk(KERN_ERR "Unable to request tormenta IRQ %d\n", tor->irq); goto err_out_release_all; @@ -458,32 +494,27 @@ static int __devinit tor2_probe(struct pci_dev *pdev, const struct pci_device_id } init_spans(tor); - if (zt_register(&tor->spans[0], 0)) { - printk(KERN_ERR "Unable to register span %s\n", tor->spans[0].name); - goto err_out_release_all; - } - if (zt_register(&tor->spans[1], 0)) { - printk(KERN_ERR "Unable to register span %s\n", tor->spans[1].name); - zt_unregister(&tor->spans[0]); - goto err_out_release_all; - } - if (zt_register(&tor->spans[2], 0)) { - printk(KERN_ERR "Unable to register span %s\n", tor->spans[2].name); - zt_unregister(&tor->spans[0]); - zt_unregister(&tor->spans[1]); - goto err_out_release_all; - } - if (zt_register(&tor->spans[3], 0)) { - printk(KERN_ERR "Unable to register span %s\n", tor->spans[3].name); - zt_unregister(&tor->spans[0]); - zt_unregister(&tor->spans[1]); - zt_unregister(&tor->spans[2]); - goto err_out_release_all; + tor->order = tor->mem8[SWREG]; + printk("Detected Card number: %d\n", tor->order); + + /* Launch cards as appropriate */ + x = 0; + for(;;) { + /* Find a card to activate */ + f = 0; + for (x=0;cards[x];x++) { + if (cards[x]->order == highestorder) { + tor2_launch(cards[x]); + f = 1; + } + } + /* If we found at least one, increment the highest order and search again, otherwise stop */ + if (f) + highestorder++; + else + break; } - tor->plx[INTCSR] = cpu_to_le16(PLX_INTENA); /* enable PLX interrupt */ -#ifdef ENABLE_TASKLETS - tasklet_init(&tor->tor2_tlet, tor2_tasklet, (unsigned long)tor); -#endif + return 0; err_out_release_all: -- cgit v1.2.3