summaryrefslogtreecommitdiff
path: root/tor2.c
diff options
context:
space:
mode:
authormarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2002-10-04 20:46:11 +0000
committermarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2002-10-04 20:46:11 +0000
commit4a37f022ab8af3d8a9412b85e220956bcf0d7ccb (patch)
tree010609731bfabfbd50ebddd929acd7452cf6093f /tor2.c
parent47bb8692285b72530c8bfdfe0ce777aa8b594592 (diff)
Version 0.3.1 from FTP
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@114 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'tor2.c')
-rwxr-xr-xtor2.c83
1 files changed, 57 insertions, 26 deletions
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: