[Asterisk-cvs] zaptel wcfxs.c,1.23,1.24

markster at lists.digium.com markster at lists.digium.com
Sun Oct 5 14:26:03 CDT 2003


Update of /usr/cvsroot/zaptel
In directory mongoose.digium.com:/tmp/cvs-serv7171

Modified Files:
	wcfxs.c 
Log Message:
First pass at eliminating excessive OHT usage


Index: wcfxs.c
===================================================================
RCS file: /usr/cvsroot/zaptel/wcfxs.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- wcfxs.c	3 Oct 2003 19:22:20 -0000	1.23
+++ wcfxs.c	5 Oct 2003 19:27:13 -0000	1.24
@@ -132,6 +132,8 @@
 #define RING_DEBOUNCE	64		/* Ringer Debounce (in ms) */
 #define BATT_DEBOUNCE	8		/* Battery debounce (in ms) */
 
+#define OHT_TIMER		6000	/* How long after RING to retain OHT */
+
 #define FLAG_DOUBLE_CLOCK	(1 << 0)
 
 #define NUM_CARDS 4
@@ -160,6 +162,7 @@
 	int debouncehook[NUM_CARDS];
 	int lastrxhook[NUM_CARDS];
 	int debounce[NUM_CARDS];
+	int ohttimer[NUM_CARDS];
 
 	int idletxhookstate[NUM_CARDS];		/* IDLE changing hook state */
 	int lasttxhook[NUM_CARDS];
@@ -252,51 +255,6 @@
 static void wcfxs_reset_tdm(struct wcfxs *wc);
 static void wcfxs_restart_dma(struct wcfxs *wc);
 
-static void wcfxs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-	struct wcfxs *wc = dev_id;
-	unsigned char ints;
-	int x;
-
-	ints = inb(wc->ioaddr + WC_INTSTAT);
-	outb(ints, wc->ioaddr + WC_INTSTAT);
-
-	if (!ints)
-		return;
-
-	if (ints & 0x10) {
-		/* Stop DMA, wait for watchdog */
-		printk("FXS PCI Master abort\n");
-		wcfxs_stop_dma(wc);
-		return;
-	}
-	
-	if (ints & 0x20) {
-		printk("PCI Target abort\n");
-		return;
-	}
-
-
-	if (ints & 0x0f) {
-		wc->intcount++;
-		x = wc->intcount % 4;
-		if ((x < wc->cards) && (wc->cardflag & (1 << x))) {
-			wcfxs_check_hook(wc, x);
-			if (!(wc->intcount & 0xfc))
-				wcfxs_recheck_sanity(wc, x);
-		}
-		if (!(wc->intcount % 10000)) {
-			/* Accept an alarm once per 10 seconds */
-			for (x=0;x<4;x++) 
-				if (wc->palarms[x])
-					wc->palarms[x]--;
-		}
-		wcfxs_receiveprep(wc, ints);
-		wcfxs_transmitprep(wc, ints);
-	}
-	
-}
-
 static inline void write_8bits(struct wcfxs *wc, unsigned char bits)
 {
 	/* Drop chip select */
@@ -513,6 +471,73 @@
     return 0;
 }
 
+static void wcfxs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct wcfxs *wc = dev_id;
+	unsigned char ints;
+	int x;
+
+	ints = inb(wc->ioaddr + WC_INTSTAT);
+	outb(ints, wc->ioaddr + WC_INTSTAT);
+
+	if (!ints)
+		return;
+
+	if (ints & 0x10) {
+		/* Stop DMA, wait for watchdog */
+		printk("FXS PCI Master abort\n");
+		wcfxs_stop_dma(wc);
+		return;
+	}
+	
+	if (ints & 0x20) {
+		printk("PCI Target abort\n");
+		return;
+	}
+
+	for (x=0;x<4;x++) {
+		if ((x < wc->cards) && (wc->cardflag & (1 << x))) {
+			if (wc->lasttxhook[x] == 0x4) {
+				/* RINGing, prepare for OHT */
+				wc->ohttimer[x] = OHT_TIMER;
+				wc->idletxhookstate[x] = 0x2;	/* OHT mode when idle */
+			} else {
+				if (wc->ohttimer[x]) {
+					wc->ohttimer[x]-= ZT_CHUNKSIZE;
+					if (!wc->ohttimer[x]) {
+						wc->idletxhookstate[x] = 0x1;	/* Switch to active */
+						if (wc->lasttxhook[x] == 0x2) {
+							/* Apply the change if appropriate */
+							wc->lasttxhook[x] = 0x1;
+							wcfxs_setreg(wc, x, 64, wc->lasttxhook[x]);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	if (ints & 0x0f) {
+		wc->intcount++;
+		x = wc->intcount % 4;
+		if ((x < wc->cards) && (wc->cardflag & (1 << x))) {
+			wcfxs_check_hook(wc, x);
+			if (!(wc->intcount & 0xfc))
+				wcfxs_recheck_sanity(wc, x);
+		}
+		if (!(wc->intcount % 10000)) {
+			/* Accept an alarm once per 10 seconds */
+			for (x=0;x<4;x++) 
+				if (wc->palarms[x])
+					wc->palarms[x]--;
+		}
+		wcfxs_receiveprep(wc, ints);
+		wcfxs_transmitprep(wc, ints);
+	}
+	
+	
+}
+
 static int wcfxs_proslic_insane(struct wcfxs *wc, int card)
 {
 	int blah,insane_report;
@@ -1025,14 +1050,11 @@
 static int wcfxs_open(struct zt_chan *chan)
 {
 	struct wcfxs *wc = chan->pvt;
-	int x;
 	if (!(wc->cardflag & (1 << (chan->chanpos - 1))))
 		return -ENODEV;
 	if (wc->dead)
 		return -ENODEV;
 	wc->usecount++;
-	for (x=0;x<wc->cards;x++)
-		wc->idletxhookstate[x] = 2;
 	MOD_INC_USE_COUNT;
 	return 0;
 }




More information about the svn-commits mailing list