remove the layer-breaking writewakeup callbacks and use PH_DATA / DL_DATA

| CONFIRM instead
This commit is contained in:
Kai Germaschewski 2000-03-03 15:26:24 +00:00
parent b407598343
commit f9ad4cbc72
15 changed files with 102 additions and 71 deletions

View File

@ -7,6 +7,9 @@
*
*
* $Log$
* Revision 1.15.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.15 2000/02/26 00:35:12 keil
* Fix skb freeing in interrupt context
*
@ -501,9 +504,7 @@ HDLC_irq(struct BCState *bcs, u_int stat) {
hdlc_fill_fifo(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.hdlc.count);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_irq(bcs->tx_skb, FREE_WRITE);
bcs->hw.hdlc.count = 0;
bcs->tx_skb = NULL;

View File

@ -11,6 +11,9 @@
* Fritz Elfert
*
* $Log$
* Revision 2.40.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 2.40 1999/12/19 12:59:56 keil
* fix leased line handling
* and cosmetics
@ -1212,7 +1215,6 @@ init_d_st(struct Channel *chanp)
setstack_isdnl2(st, tmp);
setstack_l3dc(st, chanp);
st->lli.userdata = chanp;
st->lli.l2writewakeup = NULL;
st->l3.l3l4 = dchan_l3l4;
}
@ -1315,6 +1317,20 @@ CallcFreeChan(struct IsdnCardState *csta)
}
}
static void
ll_writewakeup(struct Channel *chanp, int len)
{
isdn_ctrl ic;
if (chanp->debug & 1)
link_debug(chanp, 0, "STAT_BSENT");
ic.driver = chanp->cs->myid;
ic.command = ISDN_STAT_BSENT;
ic.arg = chanp->chan;
ic.parm.length = len;
chanp->cs->iif.statcallb(&ic);
}
static void
lldata_handler(struct PStack *st, int pr, void *arg)
{
@ -1329,6 +1345,11 @@ lldata_handler(struct PStack *st, int pr, void *arg)
idev_kfree_skb(skb, FREE_READ);
}
break;
case (DL_DATA | CONFIRM):
/* the original length of the skb is saved in priority */
if (skb->pkt_type != PACKET_NOACK)
ll_writewakeup(chanp, skb->priority);
break;
case (DL_ESTABLISH | INDICATION):
case (DL_ESTABLISH | CONFIRM):
FsmEvent(&chanp->fi, EV_BC_EST, NULL);
@ -1359,6 +1380,11 @@ lltrans_handler(struct PStack *st, int pr, void *arg)
idev_kfree_skb(skb, FREE_READ);
}
break;
case (PH_DATA | CONFIRM):
/* the original length of the skb is saved in priority */
if (skb->pkt_type != PACKET_NOACK)
ll_writewakeup(chanp, skb->priority);
break;
case (PH_ACTIVATE | INDICATION):
case (PH_ACTIVATE | CONFIRM):
FsmEvent(&chanp->fi, EV_BC_EST, NULL);
@ -1374,19 +1400,6 @@ lltrans_handler(struct PStack *st, int pr, void *arg)
}
}
static void
ll_writewakeup(struct PStack *st, int len)
{
struct Channel *chanp = st->lli.userdata;
isdn_ctrl ic;
ic.driver = chanp->cs->myid;
ic.command = ISDN_STAT_BSENT;
ic.arg = chanp->chan;
ic.parm.length = len;
chanp->cs->iif.statcallb(&ic);
}
static int
init_b_st(struct Channel *chanp, int incoming)
{
@ -1434,8 +1447,6 @@ init_b_st(struct Channel *chanp, int incoming)
setstack_l3bc(st, chanp);
st->l2.l2l3 = lldata_handler;
st->lli.userdata = chanp;
st->lli.l1writewakeup = NULL;
st->lli.l2writewakeup = ll_writewakeup;
st->l2.l2m.debug = chanp->debug & 16;
st->l2.debug = chanp->debug & 64;
break;
@ -1445,7 +1456,6 @@ init_b_st(struct Channel *chanp, int incoming)
case (ISDN_PROTO_L2_FAX):
st->l1.l1l2 = lltrans_handler;
st->lli.userdata = chanp;
st->lli.l1writewakeup = ll_writewakeup;
setstack_transl2(st);
setstack_l3bc(st, chanp);
break;
@ -1489,6 +1499,10 @@ leased_l1l2(struct PStack *st, int pr, void *arg)
link_debug(chanp, 0, "leased line d-channel DATA");
idev_kfree_skb(skb, FREE_READ);
break;
case (PH_DATA | CONFIRM):
if (skb->pkt_type != PACKET_NOACK)
ll_writewakeup(chanp, skb->len);
break;
case (PH_ACTIVATE | INDICATION):
case (PH_ACTIVATE | CONFIRM):
event = EV_LEASED;
@ -1931,6 +1945,12 @@ HiSax_writebuf_skb(int id, int chan, int ack, struct sk_buff *skb)
if (nskb) {
if (!ack)
nskb->pkt_type = PACKET_NOACK;
/* I'm misusing the priority field here to save the length of the
original skb.
Since the skb is cloned, this should be okay.
--KG
*/
nskb->priority = nskb->len;
if (chanp->l2_active_protocol == ISDN_PROTO_L2_X75I)
st->l3.l3l2(st, DL_DATA | REQUEST, nskb);
else {

View File

@ -12,6 +12,9 @@
*
*
* $Log$
* Revision 1.19.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.19 2000/02/26 00:35:12 keil
* Fix skb freeing in interrupt context
*
@ -590,9 +593,7 @@ Memhscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
Memhscx_fill_fifo(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.hscx.count);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_irq(bcs->tx_skb, FREE_WRITE);
bcs->hw.hscx.count = 0;
bcs->tx_skb = NULL;

View File

@ -294,10 +294,7 @@ modem_fill(struct BCState *bcs) {
write_modem(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st,
bcs->hw.hscx.count);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_any(bcs->tx_skb, FREE_WRITE);
bcs->tx_skb = NULL;
}

View File

@ -6,6 +6,9 @@
*
*
* $Log$
* Revision 1.12.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.12 2000/02/26 00:35:12 keil
* Fix skb freeing in interrupt context
*
@ -402,9 +405,7 @@ hfc_fill_fifo(struct BCState *bcs)
printk(KERN_WARNING "HFC S FIFO channel %d BUSY Error\n", bcs->channel);
} else {
bcs->tx_cnt -= bcs->tx_skb->len;
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_any(bcs->tx_skb, FREE_WRITE);
bcs->tx_skb = NULL;
}

View File

@ -6,6 +6,9 @@
*
*
* $Log$
* Revision 1.13.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.13 2000/02/26 00:35:12 keil
* Fix skb freeing in interrupt context
*
@ -359,19 +362,19 @@ hfc_fill_fifo(struct BCState *bcs)
debugl1(cs, "FIFO Send BUSY error");
printk(KERN_WARNING "HFC S FIFO channel %d BUSY Error\n", bcs->channel);
} else {
struct sk_buff *sav_skb;
count = bcs->tx_skb->len;
bcs->tx_cnt -= count;
if (PACKET_NOACK == bcs->tx_skb->pkt_type)
count = -1;
idev_kfree_skb_any(bcs->tx_skb, FREE_WRITE);
sav_skb = bcs->tx_skb;
bcs->tx_skb = NULL;
if (bcs->mode != B1_MODE_TRANS) {
WaitForBusy(cs);
WaitNoBusy(cs);
cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F1_INC | HFC_SEND | HFC_CHANNEL(bcs->channel));
WaitForBusy(cs);
WaitNoBusy(cs);
cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F1_INC | HFC_SEND | HFC_CHANNEL(bcs->channel));
}
if (bcs->st->lli.l1writewakeup && (count >= 0))
bcs->st->lli.l1writewakeup(bcs->st, count);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, sav_skb);
idev_kfree_skb_any(sav_skb, FREE_WRITE);
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
restore_flags(flags);

View File

@ -23,6 +23,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.27.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.27 2000/02/26 00:35:12 keil
* Fix skb freeing in interrupt context
*
@ -777,11 +780,7 @@ hfcpci_fill_fifo(struct BCState *bcs)
src += maxlen; /* new position */
memcpy(dst, src, count);
}
bcs->tx_cnt -= bcs->tx_skb->len;
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
cli();
bz->za[new_f1].z1 = new_z1; /* for next buffer */
bz->f1 = new_f1; /* next frame */

View File

@ -22,6 +22,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log$
* Revision 1.4.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.4 2000/02/26 00:35:12 keil
* Fix skb freeing in interrupt context
*
@ -635,13 +638,11 @@ hfcsx_fill_fifo(struct BCState *bcs)
(bcs->mode == B1_MODE_TRANS) ?
HFCSX_BTRANS_THRESHOLD : 0)) {
bcs->tx_cnt -= bcs->tx_skb->len;
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
idev_kfree_skb_any(bcs->tx_skb, FREE_WRITE);
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
bcs->tx_cnt -= bcs->tx_skb->len;
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_any(bcs->tx_skb, FREE_WRITE);
bcs->tx_skb = NULL;
test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
}
cli();

View File

@ -3,6 +3,9 @@
* Basic declarations, defines and prototypes
*
* $Log$
* Revision 2.41.2.2 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 2.41.2.1 2000/03/03 13:03:33 kai
* now we use schedule_timeout() instead of the huge
* udelay() when we have to wait a long time.
@ -405,8 +408,6 @@ struct LLInterface {
void (*l4l3) (struct PStack *, int, void *);
int (*l4l3_proto) (struct PStack *, isdn_ctrl *);
void *userdata;
void (*l1writewakeup) (struct PStack *, int);
void (*l2writewakeup) (struct PStack *, int);
};

View File

@ -7,6 +7,9 @@
* This is an include file for fast inline IRQ stuff
*
* $Log$
* Revision 1.14.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.14 2000/02/26 00:35:13 keil
* Fix skb freeing in interrupt context
*
@ -252,9 +255,7 @@ hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx)
hscx_fill_fifo(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.hscx.count);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_irq(bcs->tx_skb, FREE_WRITE);
bcs->hw.hscx.count = 0;
bcs->tx_skb = NULL;

View File

@ -6,6 +6,9 @@
*
*
* $Log$
* Revision 1.10.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.10 2000/02/26 00:35:13 keil
* Fix skb freeing in interrupt context
*
@ -767,9 +770,7 @@ send_frames(struct BCState *bcs)
isar_fill_fifo(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.isar.txcnt);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
if (bcs->mode == B1_MODE_FAX) {
if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) {
if (test_bit(BC_FLG_LASTDATA, &bcs->Flag)) {

View File

@ -11,6 +11,9 @@
* Fritz Elfert
*
* $Log$
* Revision 2.20 1999/08/25 16:52:04 keil
* Make gcc on AXP happy
*
* Revision 2.19 1999/08/05 20:40:26 keil
* Fix interlayer communication
*
@ -475,13 +478,10 @@ setva(struct PStack *st, unsigned int nr)
else
l2->va %= 8;
len = l2->windowar[l2->sow]->len;
if (PACKET_NOACK == l2->windowar[l2->sow]->pkt_type)
len = -1;
st->l2.l2l3(st, DL_DATA | CONFIRM, l2->windowar[l2->sow]);
idev_kfree_skb(l2->windowar[l2->sow], FREE_WRITE);
l2->windowar[l2->sow] = NULL;
l2->sow = (l2->sow + 1) % l2->window;
if (st->lli.l2writewakeup && (len >=0))
st->lli.l2writewakeup(st, len);
}
}
@ -1753,6 +1753,8 @@ isdnl2_l1l2(struct PStack *st, int pr, void *arg)
if (ret)
FreeSkb(skb);
break;
case (PH_DATA | CONFIRM):
break;
case (PH_PULL | CONFIRM):
FsmEvent(&st->l2.l2m, EV_L2_ACK_PULL, arg);
break;

View File

@ -5,6 +5,9 @@
* Author Roland Klabunde (R.Klabunde@Berkom.de)
*
* $Log$
* Revision 1.3.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.3 2000/02/26 00:35:13 keil
* Fix skb freeing in interrupt context
*
@ -194,9 +197,7 @@ jade_interrupt(struct IsdnCardState *cs, u_char val, u_char jade)
jade_fill_fifo(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.hscx.count);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_irq(bcs->tx_skb, FREE_WRITE);
bcs->hw.hscx.count = 0;
bcs->tx_skb = NULL;

View File

@ -7,6 +7,9 @@
* Thanks to Traverse Technologie Australia for documents and informations
*
* $Log$
* Revision 1.18.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.18 2000/02/26 00:35:13 keil
* Fix skb freeing in interrupt context
*
@ -734,9 +737,7 @@ static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
if (!bcs->tx_skb) {
debugl1(bcs->cs,"tiger write_raw: NULL skb s_cnt %d", s_cnt);
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_any(bcs->tx_skb, FREE_WRITE);
bcs->tx_skb = NULL;
}

View File

@ -8,6 +8,9 @@
* This file is (c) under GNU PUBLIC LICENSE
*
* $Log$
* Revision 1.2.2.1 2000/03/03 13:11:32 kai
* changed L1_MODE_... to B1_MODE_... using constants defined in CAPI
*
* Revision 1.2 2000/02/26 00:35:13 keil
* Fix skb freeing in interrupt context
*
@ -383,9 +386,7 @@ W6692B_interrupt(struct IsdnCardState *cs, u_char bchan)
W6692B_fill_fifo(bcs);
return;
} else {
if (bcs->st->lli.l1writewakeup &&
(PACKET_NOACK != bcs->tx_skb->pkt_type))
bcs->st->lli.l1writewakeup(bcs->st, bcs->hw.w6692.count);
bcs->st->l1.l1l2(bcs->st, PH_DATA | CONFIRM, bcs->tx_skb);
idev_kfree_skb_irq(bcs->tx_skb, FREE_WRITE);
bcs->hw.w6692.count = 0;
bcs->tx_skb = NULL;