remove the layer-breaking writewakeup callbacks and use PH_DATA / DL_DATA
| CONFIRM instead
This commit is contained in:
parent
b407598343
commit
f9ad4cbc72
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue