patch-2.3.4 linux/drivers/isdn/hisax/hscx_irq.c
Next file: linux/drivers/isdn/hisax/ipac.h
Previous file: linux/drivers/isdn/hisax/hscx.h
Back to the patch index
Back to the overall index
- Lines: 264
- Date:
Sun May 23 10:03:41 1999
- Orig file:
v2.3.3/linux/drivers/isdn/hisax/hscx_irq.c
- Orig date:
Thu May 14 18:42:40 1998
diff -u --recursive --new-file v2.3.3/linux/drivers/isdn/hisax/hscx_irq.c linux/drivers/isdn/hisax/hscx_irq.c
@@ -1,12 +1,24 @@
-/* $Id: hscx_irq.c,v 1.7 1998/02/12 23:07:37 keil Exp $
+/* $Id: hscx_irq.c,v 1.11 1998/11/15 23:54:49 keil Exp $
* hscx_irq.c low level b-channel stuff for Siemens HSCX
*
- * Author Karsten Keil (keil@temic-ech.spacenet.de)
+ * Author Karsten Keil (keil@isdn4linux.de)
*
* This is an include file for fast inline IRQ stuff
*
* $Log: hscx_irq.c,v $
+ * Revision 1.11 1998/11/15 23:54:49 keil
+ * changes from 2.0
+ *
+ * Revision 1.10 1998/08/13 23:36:35 keil
+ * HiSax 3.1 - don't work stable with current LinkLevel
+ *
+ * Revision 1.9 1998/06/24 14:44:51 keil
+ * Fix recovery of TX IRQ loss
+ *
+ * Revision 1.8 1998/04/10 10:35:22 paul
+ * fixed (silly?) warnings from egcs on Alpha.
+ *
* Revision 1.7 1998/02/12 23:07:37 keil
* change for 2.1.86 (removing FREE_READ/FREE_WRITE from [dev]_kfree_skb()
*
@@ -85,7 +97,7 @@
if (bcs->hw.hscx.rcvidx + count > HSCX_BUFMAX) {
if (cs->debug & L1_DEB_WARN)
debugl1(cs, "hscx_empty_fifo: incoming packet too large");
- WriteHSCXCMDR(cs, bcs->channel, 0x80);
+ WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x80);
bcs->hw.hscx.rcvidx = 0;
return;
}
@@ -93,17 +105,16 @@
bcs->hw.hscx.rcvidx += count;
save_flags(flags);
cli();
- READHSCXFIFO(cs, bcs->channel, ptr, count);
- WriteHSCXCMDR(cs, bcs->channel, 0x80);
+ READHSCXFIFO(cs, bcs->hw.hscx.hscx, ptr, count);
+ WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x80);
restore_flags(flags);
if (cs->debug & L1_DEB_HSCX_FIFO) {
- char tmp[256];
- char *t = tmp;
+ char *t = bcs->blog;
t += sprintf(t, "hscx_empty_fifo %c cnt %d",
- bcs->channel ? 'B' : 'A', count);
+ bcs->hw.hscx.hscx ? 'B' : 'A', count);
QuickHex(t, ptr, count);
- debugl1(cs, tmp);
+ debugl1(cs, bcs->blog);
}
}
@@ -120,36 +131,35 @@
if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
debugl1(cs, "hscx_fill_fifo");
- if (!bcs->hw.hscx.tx_skb)
+ if (!bcs->tx_skb)
return;
- if (bcs->hw.hscx.tx_skb->len <= 0)
+ if (bcs->tx_skb->len <= 0)
return;
more = (bcs->mode == L1_MODE_TRANS) ? 1 : 0;
- if (bcs->hw.hscx.tx_skb->len > fifo_size) {
+ if (bcs->tx_skb->len > fifo_size) {
more = !0;
count = fifo_size;
} else
- count = bcs->hw.hscx.tx_skb->len;
+ count = bcs->tx_skb->len;
- waitforXFW(cs, bcs->channel);
+ waitforXFW(cs, bcs->hw.hscx.hscx);
save_flags(flags);
cli();
- ptr = bcs->hw.hscx.tx_skb->data;
- skb_pull(bcs->hw.hscx.tx_skb, count);
+ ptr = bcs->tx_skb->data;
+ skb_pull(bcs->tx_skb, count);
bcs->tx_cnt -= count;
bcs->hw.hscx.count += count;
- WRITEHSCXFIFO(cs, bcs->channel, ptr, count);
- WriteHSCXCMDR(cs, bcs->channel, more ? 0x8 : 0xa);
+ WRITEHSCXFIFO(cs, bcs->hw.hscx.hscx, ptr, count);
+ WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, more ? 0x8 : 0xa);
restore_flags(flags);
if (cs->debug & L1_DEB_HSCX_FIFO) {
- char tmp[256];
- char *t = tmp;
+ char *t = bcs->blog;
t += sprintf(t, "hscx_fill_fifo %c cnt %d",
- bcs->channel ? 'B' : 'A', count);
+ bcs->hw.hscx.hscx ? 'B' : 'A', count);
QuickHex(t, ptr, count);
- debugl1(cs, tmp);
+ debugl1(cs, bcs->blog);
}
}
@@ -161,7 +171,6 @@
struct sk_buff *skb;
int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags)? 64: 32;
int count;
- char tmp[32];
if (!test_bit(BC_FLG_INIT, &bcs->Flag))
return;
@@ -173,11 +182,9 @@
if (cs->debug & L1_DEB_WARN)
debugl1(cs, "HSCX invalid frame");
if ((r & 0x40) && bcs->mode)
- if (cs->debug & L1_DEB_WARN) {
- sprintf(tmp, "HSCX RDO mode=%d",
+ if (cs->debug & L1_DEB_WARN)
+ debugl1(cs, "HSCX RDO mode=%d",
bcs->mode);
- debugl1(cs, tmp);
- }
if (!(r & 0x20))
if (cs->debug & L1_DEB_WARN)
debugl1(cs, "HSCX CRC error");
@@ -189,10 +196,8 @@
count = fifo_size;
hscx_empty_fifo(bcs, count);
if ((count = bcs->hw.hscx.rcvidx - 1) > 0) {
- if (cs->debug & L1_DEB_HSCX_FIFO) {
- sprintf(tmp, "HX Frame %d", count);
- debugl1(cs, tmp);
- }
+ if (cs->debug & L1_DEB_HSCX_FIFO)
+ debugl1(cs, "HX Frame %d", count);
if (!(skb = dev_alloc_skb(count)))
printk(KERN_WARNING "HSCX: receive out of memory\n");
else {
@@ -219,20 +224,20 @@
}
}
if (val & 0x10) { /* XPR */
- if (bcs->hw.hscx.tx_skb) {
- if (bcs->hw.hscx.tx_skb->len) {
+ if (bcs->tx_skb) {
+ if (bcs->tx_skb->len) {
hscx_fill_fifo(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
- (PACKET_NOACK != bcs->hw.hscx.tx_skb->pkt_type))
+ (PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.hscx.count);
- dev_kfree_skb(bcs->hw.hscx.tx_skb);
+ dev_kfree_skb(bcs->tx_skb);
bcs->hw.hscx.count = 0;
- bcs->hw.hscx.tx_skb = NULL;
+ bcs->tx_skb = NULL;
}
}
- if ((bcs->hw.hscx.tx_skb = skb_dequeue(&bcs->squeue))) {
+ if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
bcs->hw.hscx.count = 0;
test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
hscx_fill_fifo(bcs);
@@ -249,73 +254,60 @@
u_char exval;
struct BCState *bcs;
- char tmp[32];
if (val & 0x01) {
bcs = cs->bcs + 1;
exval = READHSCX(cs, 1, HSCX_EXIR);
- if (exval == 0x40) {
+ if (exval & 0x40) {
if (bcs->mode == 1)
hscx_fill_fifo(bcs);
else {
/* Here we lost an TX interrupt, so
* restart transmitting the whole frame.
*/
- if (bcs->hw.hscx.tx_skb) {
- skb_push(bcs->hw.hscx.tx_skb, bcs->hw.hscx.count);
+ if (bcs->tx_skb) {
+ skb_push(bcs->tx_skb, bcs->hw.hscx.count);
bcs->tx_cnt += bcs->hw.hscx.count;
bcs->hw.hscx.count = 0;
}
- WriteHSCXCMDR(cs, bcs->channel, 0x01);
- if (cs->debug & L1_DEB_WARN) {
- sprintf(tmp, "HSCX B EXIR %x Lost TX", exval);
- debugl1(cs, tmp);
- }
+ WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x01);
+ if (cs->debug & L1_DEB_WARN)
+ debugl1(cs, "HSCX B EXIR %x Lost TX", exval);
}
- } else if (cs->debug & L1_DEB_HSCX) {
- sprintf(tmp, "HSCX B EXIR %x", exval);
- debugl1(cs, tmp);
- }
+ } else if (cs->debug & L1_DEB_HSCX)
+ debugl1(cs, "HSCX B EXIR %x", exval);
}
if (val & 0xf8) {
- if (cs->debug & L1_DEB_HSCX) {
- sprintf(tmp, "HSCX B interrupt %x", val);
- debugl1(cs, tmp);
- }
+ if (cs->debug & L1_DEB_HSCX)
+ debugl1(cs, "HSCX B interrupt %x", val);
hscx_interrupt(cs, val, 1);
}
if (val & 0x02) {
bcs = cs->bcs;
exval = READHSCX(cs, 0, HSCX_EXIR);
- if (exval == 0x40) {
+ if (exval & 0x40) {
if (bcs->mode == L1_MODE_TRANS)
hscx_fill_fifo(bcs);
else {
/* Here we lost an TX interrupt, so
* restart transmitting the whole frame.
*/
- if (bcs->hw.hscx.tx_skb) {
- skb_push(bcs->hw.hscx.tx_skb, bcs->hw.hscx.count);
+ if (bcs->tx_skb) {
+ skb_push(bcs->tx_skb, bcs->hw.hscx.count);
bcs->tx_cnt += bcs->hw.hscx.count;
bcs->hw.hscx.count = 0;
}
- WriteHSCXCMDR(cs, bcs->channel, 0x01);
- if (cs->debug & L1_DEB_WARN) {
- sprintf(tmp, "HSCX A EXIR %x Lost TX", exval);
- debugl1(cs, tmp);
- }
+ WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x01);
+ if (cs->debug & L1_DEB_WARN)
+ debugl1(cs, "HSCX A EXIR %x Lost TX", exval);
}
- } else if (cs->debug & L1_DEB_HSCX) {
- sprintf(tmp, "HSCX A EXIR %x", exval);
- debugl1(cs, tmp);
- }
+ } else if (cs->debug & L1_DEB_HSCX)
+ debugl1(cs, "HSCX A EXIR %x", exval);
}
if (val & 0x04) {
exval = READHSCX(cs, 0, HSCX_ISTA);
- if (cs->debug & L1_DEB_HSCX) {
- sprintf(tmp, "HSCX A interrupt %x", exval);
- debugl1(cs, tmp);
- }
+ if (cs->debug & L1_DEB_HSCX)
+ debugl1(cs, "HSCX A interrupt %x", exval);
hscx_interrupt(cs, exval, 0);
}
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)