OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [before_ORP/] [uclinux/] [uClinux-2.0.x/] [drivers/] [isdn/] [hisax/] [callc.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 199 simons
/* $Id: callc.c,v 1.1.1.1 2001-09-10 07:44:18 simons Exp $
2
 
3
 * Author       Karsten Keil (keil@isdn4linux.de)
4
 *              based on the teles driver from Jan den Ouden
5
 *
6
 *              This file is (c) under GNU PUBLIC LICENSE
7
 *              For changes and modifications please read
8
 *              ../../../Documentation/isdn/HiSax.cert
9
 *
10
 * Thanks to    Jan den Ouden
11
 *              Fritz Elfert
12
 *
13
 * $Log: not supported by cvs2svn $
14
 * Revision 1.1.1.1  2001/07/02 17:58:32  simons
15
 * Initial revision
16
 *
17
 * Revision 1.30.2.13  1998/11/05 21:13:32  keil
18
 * minor fixes
19
 *
20
 * Revision 1.30.2.12  1998/11/03 00:05:51  keil
21
 * certification related changes
22
 * fixed logging for smaller stack use
23
 *
24
 * Revision 1.30.2.11  1998/09/30 22:20:05  keil
25
 * Cosmetics
26
 *
27
 * Revision 1.30.2.10  1998/09/27 13:05:35  keil
28
 * Apply most changes from 2.1.X (HiSax 3.1)
29
 *
30
 * Revision 1.30.2.9  1998/05/27 18:04:53  keil
31
 * HiSax 3.0
32
 *
33
 * Revision 1.30.2.8  1998/04/11 18:48:26  keil
34
 * remove debug
35
 *
36
 * Revision 1.30.2.7  1998/04/08 21:51:50  keil
37
 * new debug
38
 *
39
 * Revision 1.30.2.6  1998/03/07 23:15:02  tsbogend
40
 * made HiSax working on Linux/Alpha
41
 *
42
 * Revision 1.30.2.5  1998/02/09 11:24:17  keil
43
 * New leased line support (Read README.HiSax!)
44
 *
45
 * Revision 1.30.2.4  1998/01/27 22:46:00  keil
46
 * B-channel send delay now configurable
47
 *
48
 * Revision 1.30.2.3  1998/01/11 23:21:03  keil
49
 * Missing callc state
50
 *
51
 * Revision 1.30.2.2  1997/11/15 18:54:31  keil
52
 * cosmetics
53
 *
54
 * Revision 1.30.2.1  1997/10/17 22:13:32  keil
55
 * update to last hisax version
56
 *
57
 * Revision 2.6  1997/09/11 17:26:58  keil
58
 * Open B-channel if here are incomming packets
59
 *
60
 * Revision 2.5  1997/08/07 17:46:05  keil
61
 * Fix Incomming Call without broadcast
62
 *
63
 * Revision 2.4  1997/08/03 14:37:58  keil
64
 * Activate Layer2 in PtP mode
65
 *
66
 * Revision 2.3  1997/07/31 19:23:40  keil
67
 * LAYER2_WATCHING for PtP
68
 *
69
 * Revision 2.2  1997/07/31 11:48:18  keil
70
 * experimental REJECT after ALERTING
71
 *
72
 * Revision 2.1  1997/07/30 17:12:59  keil
73
 * more changes for 'One TEI per card'
74
 *
75
 * Revision 2.0  1997/07/27 21:12:21  keil
76
 * CRef based L3; new channel handling; many other stuff
77
 *
78
 * Revision 1.31  1997/06/26 11:09:23  keil
79
 * New managment and minor changes
80
 *
81
 * old logs removed /KKe
82
 *
83
 */
84
 
85
#define __NO_VERSION__
86
#include "hisax.h"
87
#include "../avmb1/capicmd.h"  /* this should be moved in a common place */
88
 
89
#ifdef MODULE
90
extern long mod_use_count_;
91
#define MOD_USE_COUNT mod_use_count_
92
#endif                          /* MODULE */
93
 
94
const char *lli_revision = "$Revision: 1.1.1.1 $";
95
 
96
extern struct IsdnCard cards[];
97
extern int nrcards;
98
extern void HiSax_mod_dec_use_count(void);
99
extern void HiSax_mod_inc_use_count(void);
100
 
101
static int init_b_st(struct Channel *chanp, int incoming);
102
static void release_b_st(struct Channel *chanp);
103
 
104
static struct Fsm callcfsm =
105
{NULL, 0, 0, NULL, NULL};
106
 
107
static int chancount = 0;
108
 
109
/* experimental REJECT after ALERTING for CALLBACK to beat the 4s delay */
110
#define ALERT_REJECT 0
111
 
112
/* Value to delay the sending of the first B-channel paket after CONNECT
113
 * here is no value given by ITU, but experience shows that 300 ms will
114
 * work on many networks, if you or your other side is behind local exchanges
115
 * a greater value may be recommented. If the delay is to short the first paket
116
 * will be lost and autodetect on many comercial routers goes wrong !
117
 * You can adjust this value on runtime with
118
 * hisaxctrl <id> 2 <value>
119
 * value is in milliseconds
120
 */
121
#define DEFAULT_B_DELAY 300
122
 
123
/* Flags for remembering action done in lli */
124
 
125
#define  FLG_START_D    0
126
#define  FLG_ESTAB_D    1
127
#define  FLG_CALL_SEND  2
128
#define  FLG_CALL_REC   3
129
#define  FLG_CALL_ALERT 4
130
#define  FLG_START_B    5
131
#define  FLG_CONNECT_B  6
132
#define  FLG_LL_DCONN   7
133
#define  FLG_LL_BCONN   8
134
#define  FLG_DISC_SEND  9
135
#define  FLG_DISC_REC   10
136
#define  FLG_REL_REC    11
137
#define  FLG_DO_ALERT   12
138
#define  FLG_DO_HANGUP  13
139
#define  FLG_DO_CONNECT 14
140
#define  FLG_DO_ESTAB   15
141
#define  FLG_RESUME     16
142
 
143
/*
144
 * Because of callback it's a good idea to delay the shutdown of the d-channel
145
 */
146
#define DREL_TIMER_VALUE 40000
147
 
148
/*
149
 * Find card with given driverId
150
 */
151
static inline struct IsdnCardState
152
*
153
hisax_findcard(int driverid)
154
{
155
        int i;
156
 
157
        for (i = 0; i < nrcards; i++)
158
                if (cards[i].cs)
159
                        if (cards[i].cs->myid == driverid)
160
                                return (cards[i].cs);
161
        return (struct IsdnCardState *) 0;
162
}
163
 
164
int
165
discard_queue(struct sk_buff_head *q)
166
{
167
        struct sk_buff *skb;
168
        int ret=0;
169
 
170
        while ((skb = skb_dequeue(q))) {
171
                dev_kfree_skb(skb, FREE_READ);
172
                ret++;
173
        }
174
        return(ret);
175
}
176
 
177
static void
178
link_debug(struct Channel *chanp, int direction, char *fmt, ...)
179
{
180
        va_list args;
181
        char tmp[16];
182
 
183
        va_start(args, fmt);
184
        sprintf(tmp, "Ch%d %s ", chanp->chan,
185
                direction ? "LL->HL" : "HL->LL");
186
        VHiSax_putstatus(chanp->cs, tmp, fmt, args);
187
        va_end(args);
188
}
189
 
190
 
191
enum {
192
        ST_NULL,                /*  0 inactive */
193
        ST_OUT_WAIT_D,          /*  1 outgoing, awaiting d-channel establishment */
194
        ST_IN_WAIT_D,           /*  2 incoming, awaiting d-channel establishment */
195
        ST_OUT_DIAL,            /*  3 outgoing, SETUP send; awaiting confirm */
196
        ST_IN_WAIT_LL,          /*  4 incoming call received; wait for LL confirm */
197
        ST_IN_ALERT_SEND,       /*  5 incoming call received; ALERT send */
198
        ST_IN_WAIT_CONN_ACK,    /*  6 incoming CONNECT send; awaiting CONN_ACK */
199
        ST_WAIT_BCONN,          /*  7 CONNECT/CONN_ACK received, awaiting b-channel prot. estbl. */
200
        ST_ACTIVE,              /*  8 active, b channel prot. established */
201
        ST_WAIT_BRELEASE,       /*  9 call clear. (initiator), awaiting b channel prot. rel. */
202
        ST_WAIT_BREL_DISC,      /* 10 call clear. (receiver), DISCONNECT req. received */
203
        ST_WAIT_DCOMMAND,       /* 11 call clear. (receiver), awaiting DCHANNEL message */
204
        ST_WAIT_DRELEASE,       /* 12 DISCONNECT sent, awaiting RELEASE */
205
        ST_WAIT_D_REL_CNF,      /* 13 RELEASE sent, awaiting RELEASE confirm */
206
        ST_WAIT_DSHUTDOWN,      /*  14 awaiting d-channel shutdown */
207
};
208
 
209
#define STATE_COUNT (ST_WAIT_DSHUTDOWN +1)
210
 
211
static char *strState[] =
212
{
213
        "ST_NULL",
214
        "ST_OUT_WAIT_D",
215
        "ST_IN_WAIT_D",
216
        "ST_OUT_DIAL",
217
        "ST_IN_WAIT_LL",
218
        "ST_IN_ALERT_SEND",
219
        "ST_IN_WAIT_CONN_ACK",
220
        "ST_WAIT_BCONN",
221
        "ST_ACTIVE",
222
        "ST_WAIT_BRELEASE",
223
        "ST_WAIT_BREL_DISC",
224
        "ST_WAIT_DCOMMAND",
225
        "ST_WAIT_DRELEASE",
226
        "ST_WAIT_D_REL_CNF",
227
        "ST_WAIT_DSHUTDOWN",
228
};
229
 
230
enum {
231
        EV_DIAL,                /*  0 */
232
        EV_SETUP_CNF,           /*  1 */
233
        EV_ACCEPTB,             /*  2 */
234
        EV_DISCONNECT_IND,      /*  3 */
235
        EV_RELEASE_CNF,         /*  4 */
236
        EV_DLEST,               /*  5 */
237
        EV_DLRL,                /*  6 */
238
        EV_SETUP_IND,           /*  7 */
239
        EV_RELEASE_IND,         /*  8 */
240
        EV_ACCEPTD,             /*  9 */
241
        EV_SETUP_CMPL_IND,      /* 10 */
242
        EV_BC_EST,              /* 11 */
243
        EV_WRITEBUF,            /* 12 */
244
        EV_ESTABLISH,           /* 13 */
245
        EV_HANGUP,              /* 14 */
246
        EV_BC_REL,              /* 15 */
247
        EV_CINF,                /* 16 */
248
        EV_SUSPEND,             /* 17 */
249
        EV_RESUME,              /* 18 */
250
        EV_SHUTDOWN_D,          /* 19 */
251
        EV_NOSETUP_RSP,         /* 20 */
252
        EV_SETUP_ERR,           /* 21 */
253
        EV_CONNECT_ERR,         /* 22 */
254
        EV_RELEASE_ERR,         /* 23 */
255
};
256
 
257
#define EVENT_COUNT (EV_RELEASE_ERR +1)
258
 
259
static char *strEvent[] =
260
{
261
        "EV_DIAL",
262
        "EV_SETUP_CNF",
263
        "EV_ACCEPTB",
264
        "EV_DISCONNECT_IND",
265
        "EV_RELEASE_CNF",
266
        "EV_DLEST",
267
        "EV_DLRL",
268
        "EV_SETUP_IND",
269
        "EV_RELEASE_IND",
270
        "EV_ACCEPTD",
271
        "EV_SETUP_CMPL_IND",
272
        "EV_BC_EST",
273
        "EV_WRITEBUF",
274
        "EV_ESTABLISH",
275
        "EV_HANGUP",
276
        "EV_BC_REL",
277
        "EV_CINF",
278
        "EV_SUSPEND",
279
        "EV_RESUME",
280
        "EV_SHUTDOWN_D",
281
        "EV_NOSETUP_RSP",
282
        "EV_SETUP_ERR",
283
        "EV_CONNECT_ERR",
284
        "EV_RELEASE_ERR",
285
};
286
 
287
static inline void
288
lli_deliver_cause(struct Channel *chanp, isdn_ctrl *ic)
289
{
290
        if (chanp->proc->para.cause < 0)
291
                return;
292
        ic->driver = chanp->cs->myid;
293
        ic->command = ISDN_STAT_CAUSE;
294
        ic->arg = chanp->chan;
295
        if (chanp->cs->protocol == ISDN_PTYPE_EURO)
296
                sprintf(ic->parm.num, "E%02X%02X", chanp->proc->para.loc & 0x7f,
297
                        chanp->proc->para.cause & 0x7f);
298
        else
299
                sprintf(ic->parm.num, "%02X%02X", chanp->proc->para.loc & 0x7f,
300
                        chanp->proc->para.cause & 0x7f);
301
        chanp->cs->iif.statcallb(ic);
302
}
303
 
304
static void
305
lli_d_established(struct FsmInst *fi, int event, void *arg)
306
{
307
        struct Channel *chanp = fi->userdata;
308
 
309
        test_and_set_bit(FLG_ESTAB_D, &chanp->Flags);
310
        if (chanp->leased) {
311
                isdn_ctrl ic;
312
                int ret;
313
 
314
                chanp->cs->cardmsg(chanp->cs, MDL_INFO_SETUP, (void *) (long)chanp->chan);
315
                FsmChangeState(fi, ST_IN_WAIT_LL);
316
                test_and_set_bit(FLG_CALL_REC, &chanp->Flags);
317
                if (chanp->debug & 1)
318
                        link_debug(chanp, 0, "STAT_ICALL_LEASED");
319
                ic.driver = chanp->cs->myid;
320
                ic.command = ISDN_STAT_ICALL;
321
                ic.arg = chanp->chan;
322
                ic.parm.setup.si1 = 7;
323
                ic.parm.setup.si2 = 0;
324
                ic.parm.setup.plan = 0;
325
                ic.parm.setup.screen = 0;
326
                sprintf(ic.parm.setup.eazmsn,"%d", chanp->chan + 1);
327
                sprintf(ic.parm.setup.phone,"LEASED%d", chanp->cs->myid);
328
                ret = chanp->cs->iif.statcallb(&ic);
329
                if (chanp->debug & 1)
330
                        link_debug(chanp, 1, "statcallb ret=%d", ret);
331
                if (!ret) {
332
                        chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
333
                        FsmChangeState(fi, ST_NULL);
334
                }
335
        } else if (fi->state == ST_WAIT_DSHUTDOWN)
336
                FsmChangeState(fi, ST_NULL);
337
}
338
 
339
static void
340
lli_d_released(struct FsmInst *fi, int event, void *arg)
341
{
342
        struct Channel *chanp = fi->userdata;
343
 
344
        test_and_clear_bit(FLG_START_D, &chanp->Flags);
345
}
346
 
347
/*
348
 * Dial out
349
 */
350
static void
351
lli_prep_dialout(struct FsmInst *fi, int event, void *arg)
352
{
353
        struct Channel *chanp = fi->userdata;
354
 
355
        FsmChangeState(fi, ST_OUT_WAIT_D);
356
        FsmDelTimer(&chanp->drel_timer, 60);
357
        FsmDelTimer(&chanp->dial_timer, 73);
358
        chanp->l2_active_protocol = chanp->l2_protocol;
359
        chanp->incoming = 0;
360
        if (test_bit(FLG_ESTAB_D, &chanp->Flags)) {
361
                FsmEvent(fi, EV_DLEST, NULL);
362
        } else {
363
                chanp->Flags = 0;
364
                if (EV_RESUME == event)
365
                        test_and_set_bit(FLG_RESUME, &chanp->Flags);
366
                test_and_set_bit(FLG_START_D, &chanp->Flags);
367
                chanp->d_st->lli.l4l3(chanp->d_st, DL_ESTABLISH | REQUEST, NULL);
368
        }
369
}
370
 
371
static void
372
lli_do_dialout(struct FsmInst *fi, int event, void *arg)
373
{
374
        struct Channel *chanp = fi->userdata;
375
        int ev;
376
 
377
        FsmChangeState(fi, ST_OUT_DIAL);
378
        chanp->cs->cardmsg(chanp->cs, MDL_INFO_SETUP, (void *) (long)chanp->chan);
379
        if (test_and_clear_bit(FLG_RESUME, &chanp->Flags))
380
                ev = CC_RESUME | REQUEST;
381
        else
382
                ev = CC_SETUP | REQUEST;
383
        if (chanp->leased) {
384
                FsmEvent(&chanp->fi, EV_SETUP_CNF, NULL);
385
        } else {
386
                test_and_set_bit(FLG_ESTAB_D, &chanp->Flags);
387
                chanp->d_st->lli.l4l3(chanp->d_st, ev, chanp);
388
                test_and_set_bit(FLG_CALL_SEND, &chanp->Flags);
389
        }
390
}
391
 
392
static void
393
lli_init_bchan_out(struct FsmInst *fi, int event, void *arg)
394
{
395
        struct Channel *chanp = fi->userdata;
396
        isdn_ctrl ic;
397
 
398
        FsmChangeState(fi, ST_WAIT_BCONN);
399
        test_and_set_bit(FLG_LL_DCONN, &chanp->Flags);
400
        if (chanp->debug & 1)
401
                link_debug(chanp, 0, "STAT_DCONN");
402
        ic.driver = chanp->cs->myid;
403
        ic.command = ISDN_STAT_DCONN;
404
        ic.arg = chanp->chan;
405
        chanp->cs->iif.statcallb(&ic);
406
        init_b_st(chanp, 0);
407
        test_and_set_bit(FLG_START_B, &chanp->Flags);
408
        chanp->b_st->lli.l4l3(chanp->b_st, DL_ESTABLISH | REQUEST, NULL);
409
}
410
 
411
static void
412
lli_go_active(struct FsmInst *fi, int event, void *arg)
413
{
414
        struct Channel *chanp = fi->userdata;
415
        isdn_ctrl ic;
416
 
417
        FsmChangeState(fi, ST_ACTIVE);
418
        chanp->data_open = !0;
419
        test_and_set_bit(FLG_CONNECT_B, &chanp->Flags);
420
        if (chanp->debug & 1)
421
                link_debug(chanp, 0, "STAT_BCONN");
422
        test_and_set_bit(FLG_LL_BCONN, &chanp->Flags);
423
        ic.driver = chanp->cs->myid;
424
        ic.command = ISDN_STAT_BCONN;
425
        ic.arg = chanp->chan;
426
        chanp->cs->iif.statcallb(&ic);
427
        chanp->cs->cardmsg(chanp->cs, MDL_INFO_CONN, (void *) (long)chanp->chan);
428
}
429
 
430
/*
431
 * RESUME
432
 */
433
 
434
/* incomming call */
435
 
436
static void
437
lli_start_dchan(struct FsmInst *fi, int event, void *arg)
438
{
439
        struct Channel *chanp = fi->userdata;
440
 
441
        FsmChangeState(fi, ST_IN_WAIT_D);
442
        FsmDelTimer(&chanp->drel_timer, 61);
443
        if (event == EV_ACCEPTD)
444
                test_and_set_bit(FLG_DO_CONNECT, &chanp->Flags);
445
        else if (event == EV_HANGUP) {
446
                test_and_set_bit(FLG_DO_HANGUP, &chanp->Flags);
447
#ifdef ALERT_REJECT
448
                test_and_set_bit(FLG_DO_ALERT, &chanp->Flags);
449
#endif
450
        }
451
        if (test_bit(FLG_ESTAB_D, &chanp->Flags)) {
452
                FsmEvent(fi, EV_DLEST, NULL);
453
        } else if (!test_and_set_bit(FLG_START_D, &chanp->Flags))
454
                chanp->d_st->lli.l4l3(chanp->d_st, DL_ESTABLISH | REQUEST, NULL);
455
}
456
 
457
static void
458
lli_deliver_call(struct FsmInst *fi, int event, void *arg)
459
{
460
        struct Channel *chanp = fi->userdata;
461
        isdn_ctrl ic;
462
        int ret;
463
 
464
        chanp->cs->cardmsg(chanp->cs, MDL_INFO_SETUP, (void *) (long)chanp->chan);
465
        /*
466
         * Report incoming calls only once to linklevel, use CallFlags
467
         * which is set to 3 with each broadcast message in isdnl1.c
468
         * and resetted if a interface  answered the STAT_ICALL.
469
         */
470
        if (1) { /* for only one TEI */
471
                FsmChangeState(fi, ST_IN_WAIT_LL);
472
                test_and_set_bit(FLG_CALL_REC, &chanp->Flags);
473
                if (chanp->debug & 1)
474
                        link_debug(chanp, 0, "STAT_ICALL");
475
                ic.driver = chanp->cs->myid;
476
                ic.command = ISDN_STAT_ICALL;
477
                ic.arg = chanp->chan;
478
                /*
479
                 * No need to return "unknown" for calls without OAD,
480
                 * cause that's handled in linklevel now (replaced by '0')
481
                 */
482
                ic.parm.setup = chanp->proc->para.setup;
483
                ret = chanp->cs->iif.statcallb(&ic);
484
                if (chanp->debug & 1)
485
                        link_debug(chanp, 1, "statcallb ret=%d", ret);
486
                switch (ret) {
487
                        case 1: /* OK, anybody likes this call */
488
                                FsmDelTimer(&chanp->drel_timer, 61);
489
                                if (test_bit(FLG_ESTAB_D, &chanp->Flags)) {
490
                                        FsmChangeState(fi, ST_IN_ALERT_SEND);
491
                                        test_and_set_bit(FLG_CALL_ALERT, &chanp->Flags);
492
                                        chanp->d_st->lli.l4l3(chanp->d_st, CC_ALERTING | REQUEST, chanp->proc);
493
                                } else {
494
                                        test_and_set_bit(FLG_DO_ALERT, &chanp->Flags);
495
                                        FsmChangeState(fi, ST_IN_WAIT_D);
496
                                        test_and_set_bit(FLG_START_D, &chanp->Flags);
497
                                        chanp->d_st->lli.l4l3(chanp->d_st,
498
                                                DL_ESTABLISH | REQUEST, NULL);
499
                                }
500
                                break;
501
                        case 2: /* Rejecting Call */
502
                                test_and_clear_bit(FLG_CALL_REC, &chanp->Flags);
503
                                break;
504
                        case 0:  /* OK, nobody likes this call */
505
                        default:        /* statcallb problems */
506
                                chanp->d_st->lli.l4l3(chanp->d_st, CC_IGNORE | REQUEST, chanp->proc);
507
                                chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
508
                                FsmChangeState(fi, ST_NULL);
509
                                if (test_bit(FLG_ESTAB_D, &chanp->Flags) &&
510
                                        !test_bit(FLG_PTP, &chanp->d_st->l2.flag))
511
                                        FsmRestartTimer(&chanp->drel_timer, DREL_TIMER_VALUE, EV_SHUTDOWN_D, NULL, 61);
512
                                break;
513
                }
514
        } else {
515
                chanp->d_st->lli.l4l3(chanp->d_st, CC_IGNORE | REQUEST, chanp->proc);
516
                chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
517
                FsmChangeState(fi, ST_NULL);
518
                if (test_bit(FLG_ESTAB_D, &chanp->Flags) &&
519
                        !test_bit(FLG_PTP, &chanp->d_st->l2.flag))
520
                        FsmRestartTimer(&chanp->drel_timer, DREL_TIMER_VALUE, EV_SHUTDOWN_D, NULL, 62);
521
        }
522
}
523
 
524
static void
525
lli_establish_d(struct FsmInst *fi, int event, void *arg)
526
{
527
        /* This establish the D-channel for pending L3 messages
528
         * without blocking the channel
529
         */
530
        struct Channel *chanp = fi->userdata;
531
 
532
        test_and_set_bit(FLG_DO_ESTAB, &chanp->Flags);
533
        FsmChangeState(fi, ST_IN_WAIT_D);
534
        test_and_set_bit(FLG_START_D, &chanp->Flags);
535
        chanp->d_st->lli.l4l3(chanp->d_st, DL_ESTABLISH | REQUEST, NULL);
536
}
537
 
538
static void
539
lli_do_action(struct FsmInst *fi, int event, void *arg)
540
{
541
        struct Channel *chanp = fi->userdata;
542
 
543
        test_and_set_bit(FLG_ESTAB_D, &chanp->Flags);
544
        if (chanp->leased) {
545
                FsmChangeState(fi, ST_IN_WAIT_CONN_ACK);
546
                test_and_clear_bit(FLG_DO_ALERT, &chanp->Flags);
547
                test_and_clear_bit(FLG_DO_CONNECT, &chanp->Flags);
548
                FsmEvent(&chanp->fi, EV_SETUP_CMPL_IND, NULL);
549
        } else if (test_and_clear_bit(FLG_DO_CONNECT, &chanp->Flags) &&
550
                !test_bit(FLG_DO_HANGUP, &chanp->Flags)) {
551
                FsmChangeState(fi, ST_IN_WAIT_CONN_ACK);
552
                test_and_clear_bit(FLG_DO_ALERT, &chanp->Flags);
553
                chanp->d_st->lli.l4l3(chanp->d_st, CC_SETUP | RESPONSE, chanp->proc);
554
        } else if (test_and_clear_bit(FLG_DO_ALERT, &chanp->Flags)) {
555
                if (test_bit(FLG_DO_HANGUP, &chanp->Flags))
556
                        FsmRestartTimer(&chanp->drel_timer, 40, EV_HANGUP, NULL, 63);
557
                FsmChangeState(fi, ST_IN_ALERT_SEND);
558
                test_and_set_bit(FLG_CALL_ALERT, &chanp->Flags);
559
                chanp->d_st->lli.l4l3(chanp->d_st, CC_ALERTING | REQUEST, chanp->proc);
560
        } else if (test_and_clear_bit(FLG_DO_HANGUP, &chanp->Flags)) {
561
                FsmChangeState(fi, ST_WAIT_DRELEASE);
562
                chanp->proc->para.cause = 0x15;         /* Call Rejected */
563
                chanp->d_st->lli.l4l3(chanp->d_st, CC_REJECT | REQUEST, chanp->proc);
564
                test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);
565
        }
566
}
567
 
568
static void
569
lli_send_dconnect(struct FsmInst *fi, int event, void *arg)
570
{
571
        struct Channel *chanp = fi->userdata;
572
 
573
        FsmChangeState(fi, ST_IN_WAIT_CONN_ACK);
574
        chanp->d_st->lli.l4l3(chanp->d_st, CC_SETUP | RESPONSE, chanp->proc);
575
}
576
 
577
static void
578
lli_init_bchan_in(struct FsmInst *fi, int event, void *arg)
579
{
580
        struct Channel *chanp = fi->userdata;
581
        isdn_ctrl ic;
582
 
583
        FsmChangeState(fi, ST_WAIT_BCONN);
584
        test_and_set_bit(FLG_LL_DCONN, &chanp->Flags);
585
        if (chanp->debug & 1)
586
                link_debug(chanp, 0, "STAT_DCONN");
587
        ic.driver = chanp->cs->myid;
588
        ic.command = ISDN_STAT_DCONN;
589
        ic.arg = chanp->chan;
590
        chanp->cs->iif.statcallb(&ic);
591
        chanp->l2_active_protocol = chanp->l2_protocol;
592
        chanp->incoming = !0;
593
        init_b_st(chanp, !0);
594
        test_and_set_bit(FLG_START_B, &chanp->Flags);
595
        chanp->b_st->lli.l4l3(chanp->b_st, DL_ESTABLISH | REQUEST, NULL);
596
}
597
 
598
/* Call suspend */
599
 
600
static void
601
lli_suspend(struct FsmInst *fi, int event, void *arg)
602
{
603
        struct Channel *chanp = fi->userdata;
604
 
605
        chanp->d_st->lli.l4l3(chanp->d_st, CC_SUSPEND | REQUEST, chanp->proc);
606
}
607
 
608
/* Call clearing */
609
 
610
static void
611
lli_cancel_call(struct FsmInst *fi, int event, void *arg)
612
{
613
        struct Channel *chanp = fi->userdata;
614
        isdn_ctrl ic;
615
 
616
        FsmChangeState(fi, ST_WAIT_DRELEASE);
617
        if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {
618
                if (chanp->debug & 1)
619
                        link_debug(chanp, 0, "STAT_BHUP");
620
                ic.driver = chanp->cs->myid;
621
                ic.command = ISDN_STAT_BHUP;
622
                ic.arg = chanp->chan;
623
                chanp->cs->iif.statcallb(&ic);
624
        }
625
        if (test_and_clear_bit(FLG_START_B, &chanp->Flags))
626
                release_b_st(chanp);
627
        chanp->proc->para.cause = 0x10;         /* Normal Call Clearing */
628
        chanp->d_st->lli.l4l3(chanp->d_st, CC_DISCONNECT | REQUEST, chanp->proc);
629
        test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);
630
}
631
 
632
static void
633
lli_shutdown_d(struct FsmInst *fi, int event, void *arg)
634
{
635
        struct Channel *chanp = fi->userdata;
636
 
637
        FsmDelTimer(&chanp->drel_timer, 62);
638
        if (test_bit(FLG_PTP, &chanp->d_st->l2.flag)) {
639
                FsmChangeState(fi, ST_NULL);
640
        } else {
641
                if (!test_bit(FLG_TWO_DCHAN, &chanp->cs->HW_Flags)) {
642
                        if (chanp->chan) {
643
                                if (chanp->cs->channel[0].fi.state != ST_NULL)
644
                                        return;
645
                        } else {
646
                                if (chanp->cs->channel[1].fi.state != ST_NULL)
647
                                        return;
648
                        }
649
                }
650
                FsmChangeState(fi, ST_WAIT_DSHUTDOWN);
651
                test_and_clear_bit(FLG_ESTAB_D, &chanp->Flags);
652
                chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);
653
        }
654
}
655
 
656
static void
657
lli_timeout_d(struct FsmInst *fi, int event, void *arg)
658
{
659
        struct Channel *chanp = fi->userdata;
660
        isdn_ctrl ic;
661
 
662
        test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);
663
        if (chanp->debug & 1)
664
                link_debug(chanp, 0, "STAT_DHUP");
665
        lli_deliver_cause(chanp, &ic);
666
        ic.driver = chanp->cs->myid;
667
        ic.command = ISDN_STAT_DHUP;
668
        ic.arg = chanp->chan;
669
        chanp->cs->iif.statcallb(&ic);
670
        FsmChangeState(fi, ST_NULL);
671
        chanp->Flags = 0;
672
        test_and_set_bit(FLG_ESTAB_D, &chanp->Flags);
673
        if (!test_bit(FLG_PTP, &chanp->d_st->l2.flag))
674
                FsmAddTimer(&chanp->drel_timer, DREL_TIMER_VALUE, EV_SHUTDOWN_D, NULL, 60);
675
        chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
676
}
677
 
678
static void
679
lli_go_null(struct FsmInst *fi, int event, void *arg)
680
{
681
        struct Channel *chanp = fi->userdata;
682
 
683
        FsmChangeState(fi, ST_NULL);
684
        chanp->Flags = 0;
685
        FsmDelTimer(&chanp->drel_timer, 63);
686
        chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
687
}
688
 
689
static void
690
lli_disconn_bchan(struct FsmInst *fi, int event, void *arg)
691
{
692
        struct Channel *chanp = fi->userdata;
693
 
694
        chanp->data_open = 0;
695
        FsmChangeState(fi, ST_WAIT_BRELEASE);
696
        test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags);
697
        chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);
698
}
699
 
700
static void
701
lli_send_d_disc(struct FsmInst *fi, int event, void *arg)
702
{
703
        struct Channel *chanp = fi->userdata;
704
        isdn_ctrl ic;
705
 
706
        if (test_bit(FLG_DISC_REC, &chanp->Flags) ||
707
                test_bit(FLG_REL_REC, &chanp->Flags))
708
                return;
709
        FsmChangeState(fi, ST_WAIT_DRELEASE);
710
        if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {
711
                if (chanp->debug & 1)
712
                        link_debug(chanp, 0, "STAT_BHUP");
713
                ic.driver = chanp->cs->myid;
714
                ic.command = ISDN_STAT_BHUP;
715
                ic.arg = chanp->chan;
716
                chanp->cs->iif.statcallb(&ic);
717
        }
718
        if (test_and_clear_bit(FLG_START_B, &chanp->Flags))
719
                release_b_st(chanp);
720
        if (chanp->leased) {
721
                ic.command = ISDN_STAT_CAUSE;
722
                ic.arg = chanp->chan;
723
                sprintf(ic.parm.num, "L0010");
724
                chanp->cs->iif.statcallb(&ic);
725
                if (chanp->debug & 1)
726
                        link_debug(chanp, 0, "STAT_DHUP");
727
                ic.driver = chanp->cs->myid;
728
                ic.command = ISDN_STAT_DHUP;
729
                ic.arg = chanp->chan;
730
                chanp->cs->iif.statcallb(&ic);
731
                FsmChangeState(fi, ST_WAIT_DSHUTDOWN);
732
                test_and_clear_bit(FLG_ESTAB_D, &chanp->Flags);
733
                chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);
734
        } else {
735
                if (test_and_clear_bit(FLG_DO_HANGUP, &chanp->Flags))
736
                        chanp->proc->para.cause = 0x15;         /* Call Reject */
737
                else
738
                        chanp->proc->para.cause = 0x10;         /* Normal Call Clearing */
739
                chanp->d_st->lli.l4l3(chanp->d_st, CC_DISCONNECT | REQUEST, chanp->proc);
740
                test_and_set_bit(FLG_DISC_SEND, &chanp->Flags);
741
        }
742
}
743
 
744
static void
745
lli_released_bchan(struct FsmInst *fi, int event, void *arg)
746
{
747
        struct Channel *chanp = fi->userdata;
748
        isdn_ctrl ic;
749
 
750
        FsmChangeState(fi, ST_WAIT_DCOMMAND);
751
        chanp->data_open = 0;
752
        if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {
753
                if (chanp->debug & 1)
754
                        link_debug(chanp, 0, "STAT_BHUP");
755
                ic.driver = chanp->cs->myid;
756
                ic.command = ISDN_STAT_BHUP;
757
                ic.arg = chanp->chan;
758
                chanp->cs->iif.statcallb(&ic);
759
        }
760
        release_b_st(chanp);
761
        test_and_clear_bit(FLG_START_B, &chanp->Flags);
762
}
763
 
764
 
765
static void
766
lli_release_bchan(struct FsmInst *fi, int event, void *arg)
767
{
768
        struct Channel *chanp = fi->userdata;
769
 
770
        chanp->data_open = 0;
771
        test_and_set_bit(FLG_DISC_REC, &chanp->Flags);
772
        FsmChangeState(fi, ST_WAIT_BREL_DISC);
773
        test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags);
774
        chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);
775
}
776
 
777
static void
778
lli_received_d_rel(struct FsmInst *fi, int event, void *arg)
779
{
780
        struct Channel *chanp = fi->userdata;
781
        isdn_ctrl ic;
782
 
783
        chanp->data_open = 0;
784
        FsmChangeState(fi, ST_NULL);
785
        test_and_set_bit(FLG_REL_REC, &chanp->Flags);
786
        if (test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags)) {
787
                chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);
788
        }
789
        if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {
790
                if (chanp->debug & 1)
791
                        link_debug(chanp, 0, "STAT_BHUP");
792
                ic.driver = chanp->cs->myid;
793
                ic.command = ISDN_STAT_BHUP;
794
                ic.arg = chanp->chan;
795
                chanp->cs->iif.statcallb(&ic);
796
        }
797
        if (test_and_clear_bit(FLG_START_B, &chanp->Flags))
798
                release_b_st(chanp);
799
        if (chanp->debug & 1)
800
                link_debug(chanp, 0, "STAT_DHUP");
801
        lli_deliver_cause(chanp, &ic);
802
        ic.driver = chanp->cs->myid;
803
        ic.command = ISDN_STAT_DHUP;
804
        ic.arg = chanp->chan;
805
        chanp->cs->iif.statcallb(&ic);
806
        test_and_clear_bit(FLG_DISC_SEND, &chanp->Flags);
807
        test_and_clear_bit(FLG_CALL_REC, &chanp->Flags);
808
        test_and_clear_bit(FLG_CALL_ALERT, &chanp->Flags);
809
        test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);
810
        test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);
811
        lli_timeout_d(fi, event, arg);
812
}
813
 
814
static void
815
lli_received_d_relcnf(struct FsmInst *fi, int event, void *arg)
816
{
817
        struct Channel *chanp = fi->userdata;
818
        isdn_ctrl ic;
819
 
820
        chanp->data_open = 0;
821
        FsmChangeState(fi, ST_NULL);
822
        if (test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags)) {
823
                chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);
824
        }
825
        if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {
826
                if (chanp->debug & 1)
827
                        link_debug(chanp, 0, "STAT_BHUP");
828
                ic.driver = chanp->cs->myid;
829
                ic.command = ISDN_STAT_BHUP;
830
                ic.arg = chanp->chan;
831
                chanp->cs->iif.statcallb(&ic);
832
        }
833
        if (test_and_clear_bit(FLG_START_B, &chanp->Flags))
834
                release_b_st(chanp);
835
        if (chanp->debug & 1)
836
                link_debug(chanp, 0, "STAT_DHUP");
837
        lli_deliver_cause(chanp, &ic);
838
        ic.driver = chanp->cs->myid;
839
        ic.command = ISDN_STAT_DHUP;
840
        ic.arg = chanp->chan;
841
        chanp->cs->iif.statcallb(&ic);
842
        test_and_clear_bit(FLG_DISC_SEND, &chanp->Flags);
843
        test_and_clear_bit(FLG_CALL_REC, &chanp->Flags);
844
        test_and_clear_bit(FLG_CALL_ALERT, &chanp->Flags);
845
        test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);
846
        test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);
847
        lli_timeout_d(fi, event, arg);
848
}
849
 
850
static void
851
lli_received_d_disc(struct FsmInst *fi, int event, void *arg)
852
{
853
        struct Channel *chanp = fi->userdata;
854
        isdn_ctrl ic;
855
 
856
        chanp->data_open = 0;
857
        FsmChangeState(fi, ST_WAIT_D_REL_CNF);
858
        test_and_set_bit(FLG_DISC_REC, &chanp->Flags);
859
        if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {
860
                if (chanp->debug & 1)
861
                        link_debug(chanp, 0, "STAT_BHUP");
862
                ic.driver = chanp->cs->myid;
863
                ic.command = ISDN_STAT_BHUP;
864
                ic.arg = chanp->chan;
865
                chanp->cs->iif.statcallb(&ic);
866
        }
867
        if (test_and_clear_bit(FLG_START_B, &chanp->Flags))
868
                release_b_st(chanp);
869
        if (chanp->debug & 1)
870
                link_debug(chanp, 0, "STAT_DHUP");
871
        lli_deliver_cause(chanp, &ic);
872
        ic.driver = chanp->cs->myid;
873
        ic.command = ISDN_STAT_DHUP;
874
        ic.arg = chanp->chan;
875
        chanp->cs->iif.statcallb(&ic);
876
        test_and_clear_bit(FLG_CALL_ALERT, &chanp->Flags);
877
        test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);
878
        test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);
879
        chanp->d_st->lli.l4l3(chanp->d_st, CC_RELEASE | REQUEST, chanp->proc);
880
}
881
 
882
/* processing charge info */
883
static void
884
lli_charge_info(struct FsmInst *fi, int event, void *arg)
885
{
886
        struct Channel *chanp = fi->userdata;
887
        isdn_ctrl ic;
888
 
889
        ic.driver = chanp->cs->myid;
890
        ic.command = ISDN_STAT_CINF;
891
        ic.arg = chanp->chan;
892
        sprintf(ic.parm.num, "%d", chanp->proc->para.chargeinfo);
893
        chanp->cs->iif.statcallb(&ic);
894
}
895
 
896
/* error procedures */
897
 
898
static void
899
lli_no_dchan(struct FsmInst *fi, int event, void *arg)
900
{
901
        struct Channel *chanp = fi->userdata;
902
        isdn_ctrl ic;
903
 
904
        if (chanp->debug & 1)
905
                link_debug(chanp, 0, "STAT_NODCH");
906
        ic.driver = chanp->cs->myid;
907
        ic.command = ISDN_STAT_NODCH;
908
        ic.arg = chanp->chan;
909
        chanp->cs->iif.statcallb(&ic);
910
        chanp->Flags = 0;
911
        FsmChangeState(fi, ST_NULL);
912
        chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);
913
}
914
 
915
static void
916
lli_no_dchan_ready(struct FsmInst *fi, int event, void *arg)
917
{
918
        struct Channel *chanp = fi->userdata;
919
        isdn_ctrl ic;
920
 
921
        if (chanp->debug & 1)
922
                link_debug(chanp, 0, "STAT_DHUP");
923
        ic.driver = chanp->cs->myid;
924
        ic.command = ISDN_STAT_DHUP;
925
        ic.arg = chanp->chan;
926
        chanp->cs->iif.statcallb(&ic);
927
}
928
 
929
static void
930
lli_no_dchan_in(struct FsmInst *fi, int event, void *arg)
931
{
932
        struct Channel *chanp = fi->userdata;
933
        isdn_ctrl ic;
934
 
935
        if (chanp->debug & 1)
936
                link_debug(chanp, 0, "STAT_DHUP");
937
        ic.driver = chanp->cs->myid;
938
        ic.command = ISDN_STAT_DHUP;
939
        ic.arg = chanp->chan;
940
        chanp->cs->iif.statcallb(&ic);
941
        chanp->d_st->lli.l4l3(chanp->d_st, CC_DLRL | REQUEST, chanp->proc);
942
        chanp->Flags = 0;
943
        FsmChangeState(fi, ST_NULL);
944
        chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);
945
}
946
 
947
static void
948
lli_no_setup_rsp(struct FsmInst *fi, int event, void *arg)
949
{
950
        struct Channel *chanp = fi->userdata;
951
        isdn_ctrl ic;
952
 
953
        FsmChangeState(fi, ST_NULL);
954
        test_and_clear_bit(FLG_CALL_SEND, &chanp->Flags);
955
        if (chanp->debug & 1)
956
                link_debug(chanp, 0, "STAT_DHUP");
957
        ic.driver = chanp->cs->myid;
958
        ic.command = ISDN_STAT_DHUP;
959
        ic.arg = chanp->chan;
960
        chanp->cs->iif.statcallb(&ic);
961
        lli_shutdown_d(fi, event, arg);
962
}
963
 
964
static void
965
lli_setup_err(struct FsmInst *fi, int event, void *arg)
966
{
967
        struct Channel *chanp = fi->userdata;
968
        isdn_ctrl ic;
969
 
970
        FsmChangeState(fi, ST_WAIT_DRELEASE);
971
        test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);
972
        if (chanp->debug & 1)
973
                link_debug(chanp, 0, "STAT_DHUP");
974
        lli_deliver_cause(chanp, &ic);
975
        ic.driver = chanp->cs->myid;
976
        ic.command = ISDN_STAT_DHUP;
977
        ic.arg = chanp->chan;
978
        chanp->cs->iif.statcallb(&ic);
979
        test_and_set_bit(FLG_DISC_SEND, &chanp->Flags); /* DISCONN was sent from L3 */
980
}
981
 
982
static void
983
lli_connect_err(struct FsmInst *fi, int event, void *arg)
984
{
985
        struct Channel *chanp = fi->userdata;
986
        isdn_ctrl ic;
987
 
988
        FsmChangeState(fi, ST_WAIT_DRELEASE);
989
        test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);
990
        if (chanp->debug & 1)
991
                link_debug(chanp, 0, "STAT_DHUP");
992
        lli_deliver_cause(chanp, &ic);
993
        ic.driver = chanp->cs->myid;
994
        ic.command = ISDN_STAT_DHUP;
995
        ic.arg = chanp->chan;
996
        chanp->cs->iif.statcallb(&ic);
997
        test_and_set_bit(FLG_DISC_SEND, &chanp->Flags); /* DISCONN was sent from L3 */
998
}
999
 
1000
static void
1001
lli_got_dlrl(struct FsmInst *fi, int event, void *arg)
1002
{
1003
        struct Channel *chanp = fi->userdata;
1004
        isdn_ctrl ic;
1005
 
1006
        chanp->data_open = 0;
1007
        FsmChangeState(fi, ST_NULL);
1008
        if (test_and_clear_bit(FLG_CONNECT_B, &chanp->Flags)) {
1009
                chanp->b_st->lli.l4l3(chanp->b_st, DL_RELEASE | REQUEST, NULL);
1010
        }
1011
        if (test_and_clear_bit(FLG_LL_BCONN, &chanp->Flags)) {
1012
                if (chanp->debug & 1)
1013
                        link_debug(chanp, 0, "STAT_BHUP");
1014
                ic.driver = chanp->cs->myid;
1015
                ic.command = ISDN_STAT_BHUP;
1016
                ic.arg = chanp->chan;
1017
                chanp->cs->iif.statcallb(&ic);
1018
        }
1019
        if (test_and_clear_bit(FLG_START_B, &chanp->Flags))
1020
                release_b_st(chanp);
1021
        if (chanp->leased) {
1022
                ic.driver = chanp->cs->myid;
1023
                ic.command = ISDN_STAT_CAUSE;
1024
                ic.arg = chanp->chan;
1025
                sprintf(ic.parm.num, "L%02X%02X", 0, 0x2f);
1026
                chanp->cs->iif.statcallb(&ic);
1027
                ic.driver = chanp->cs->myid;
1028
                ic.command = ISDN_STAT_DHUP;
1029
                ic.arg = chanp->chan;
1030
                chanp->cs->iif.statcallb(&ic);
1031
                chanp->Flags = 0;
1032
        } else {
1033
                test_and_clear_bit(FLG_LL_DCONN, &chanp->Flags);
1034
                if (chanp->debug & 1)
1035
                        link_debug(chanp, 0, "STAT_DHUP");
1036
                if (chanp->cs->protocol == ISDN_PTYPE_EURO) {
1037
                        chanp->proc->para.cause = 0x2f;
1038
                        chanp->proc->para.loc = 0;
1039
                } else {
1040
                        chanp->proc->para.cause = 0x70;
1041
                        chanp->proc->para.loc = 0;
1042
                }
1043
                lli_deliver_cause(chanp, &ic);
1044
                ic.driver = chanp->cs->myid;
1045
                ic.command = ISDN_STAT_DHUP;
1046
                ic.arg = chanp->chan;
1047
                chanp->cs->iif.statcallb(&ic);
1048
                chanp->d_st->lli.l4l3(chanp->d_st, CC_DLRL | REQUEST, chanp->proc);
1049
                chanp->Flags = 0;
1050
                chanp->d_st->lli.l4l3(chanp->d_st, DL_RELEASE | REQUEST, NULL);
1051
        }
1052
        chanp->cs->cardmsg(chanp->cs, MDL_INFO_REL, (void *) (long)chanp->chan);
1053
}
1054
 
1055
/* *INDENT-OFF* */
1056
static struct FsmNode fnlist[] HISAX_INITDATA =
1057
{
1058
        {ST_NULL,               EV_DIAL,                lli_prep_dialout},
1059
        {ST_NULL,               EV_RESUME,              lli_prep_dialout},
1060
        {ST_NULL,               EV_SETUP_IND,           lli_deliver_call},
1061
        {ST_NULL,               EV_SHUTDOWN_D,          lli_shutdown_d},
1062
        {ST_NULL,               EV_DLRL,                lli_go_null},
1063
        {ST_NULL,               EV_DLEST,               lli_d_established},
1064
        {ST_NULL,               EV_ESTABLISH,           lli_establish_d},
1065
        {ST_OUT_WAIT_D,         EV_DLEST,               lli_do_dialout},
1066
        {ST_OUT_WAIT_D,         EV_DLRL,                lli_no_dchan},
1067
        {ST_OUT_WAIT_D,         EV_HANGUP,              lli_no_dchan},
1068
        {ST_IN_WAIT_D,          EV_DLEST,               lli_do_action},
1069
        {ST_IN_WAIT_D,          EV_DLRL,                lli_no_dchan_in},
1070
        {ST_IN_WAIT_D,          EV_ACCEPTD,             lli_start_dchan},
1071
        {ST_IN_WAIT_D,          EV_HANGUP,              lli_start_dchan},
1072
        {ST_OUT_DIAL,           EV_SETUP_CNF,           lli_init_bchan_out},
1073
        {ST_OUT_DIAL,           EV_HANGUP,              lli_cancel_call},
1074
        {ST_OUT_DIAL,           EV_DISCONNECT_IND,      lli_received_d_disc},
1075
        {ST_OUT_DIAL,           EV_RELEASE_IND,         lli_received_d_rel},
1076
        {ST_OUT_DIAL,           EV_RELEASE_CNF,         lli_received_d_relcnf},
1077
        {ST_OUT_DIAL,           EV_NOSETUP_RSP,         lli_no_setup_rsp},
1078
        {ST_OUT_DIAL,           EV_SETUP_ERR,           lli_setup_err},
1079
        {ST_OUT_DIAL,           EV_DLRL,                lli_got_dlrl},
1080
        {ST_IN_WAIT_LL,         EV_DLEST,               lli_d_established},
1081
        {ST_IN_WAIT_LL,         EV_DLRL,                lli_d_released},
1082
        {ST_IN_WAIT_LL,         EV_ACCEPTD,             lli_start_dchan},
1083
        {ST_IN_WAIT_LL,         EV_HANGUP,              lli_start_dchan},
1084
        {ST_IN_WAIT_LL,         EV_DISCONNECT_IND,      lli_received_d_disc},
1085
        {ST_IN_WAIT_LL,         EV_RELEASE_IND,         lli_received_d_rel},
1086
        {ST_IN_WAIT_LL,         EV_RELEASE_CNF,         lli_received_d_relcnf},
1087
        {ST_IN_ALERT_SEND,      EV_SETUP_CMPL_IND,      lli_init_bchan_in},
1088
        {ST_IN_ALERT_SEND,      EV_ACCEPTD,             lli_send_dconnect},
1089
        {ST_IN_ALERT_SEND,      EV_HANGUP,              lli_send_d_disc},
1090
        {ST_IN_ALERT_SEND,      EV_DISCONNECT_IND,      lli_received_d_disc},
1091
        {ST_IN_ALERT_SEND,      EV_RELEASE_IND,         lli_received_d_rel},
1092
        {ST_IN_ALERT_SEND,      EV_RELEASE_CNF,         lli_received_d_relcnf},
1093
        {ST_IN_ALERT_SEND,      EV_DLRL,                lli_got_dlrl},
1094
        {ST_IN_WAIT_CONN_ACK,   EV_SETUP_CMPL_IND,      lli_init_bchan_in},
1095
        {ST_IN_WAIT_CONN_ACK,   EV_HANGUP,              lli_send_d_disc},
1096
        {ST_IN_WAIT_CONN_ACK,   EV_DISCONNECT_IND,      lli_received_d_disc},
1097
        {ST_IN_WAIT_CONN_ACK,   EV_RELEASE_IND,         lli_received_d_rel},
1098
        {ST_IN_WAIT_CONN_ACK,   EV_RELEASE_CNF,         lli_received_d_relcnf},
1099
        {ST_IN_WAIT_CONN_ACK,   EV_CONNECT_ERR,         lli_connect_err},
1100
        {ST_IN_WAIT_CONN_ACK,   EV_DLRL,                lli_got_dlrl},
1101
        {ST_WAIT_BCONN,         EV_BC_EST,              lli_go_active},
1102
        {ST_WAIT_BCONN,         EV_BC_REL,              lli_send_d_disc},
1103
        {ST_WAIT_BCONN,         EV_HANGUP,              lli_send_d_disc},
1104
        {ST_WAIT_BCONN,         EV_DISCONNECT_IND,      lli_received_d_disc},
1105
        {ST_WAIT_BCONN,         EV_RELEASE_IND,         lli_received_d_rel},
1106
        {ST_WAIT_BCONN,         EV_RELEASE_CNF,         lli_received_d_relcnf},
1107
        {ST_WAIT_BCONN,         EV_DLRL,                lli_got_dlrl},
1108
        {ST_WAIT_BCONN,         EV_CINF,                lli_charge_info},
1109
        {ST_ACTIVE,             EV_CINF,                lli_charge_info},
1110
        {ST_ACTIVE,             EV_BC_REL,              lli_released_bchan},
1111
        {ST_ACTIVE,             EV_SUSPEND,             lli_suspend},
1112
        {ST_ACTIVE,             EV_HANGUP,              lli_disconn_bchan},
1113
        {ST_ACTIVE,             EV_DISCONNECT_IND,      lli_release_bchan},
1114
        {ST_ACTIVE,             EV_RELEASE_CNF,         lli_received_d_relcnf},
1115
        {ST_ACTIVE,             EV_RELEASE_IND,         lli_received_d_rel},
1116
        {ST_ACTIVE,             EV_DLRL,                lli_got_dlrl},
1117
        {ST_WAIT_BRELEASE,      EV_BC_REL,              lli_send_d_disc},
1118
        {ST_WAIT_BRELEASE,      EV_DISCONNECT_IND,      lli_received_d_disc},
1119
        {ST_WAIT_BRELEASE,      EV_RELEASE_CNF,         lli_received_d_relcnf},
1120
        {ST_WAIT_BRELEASE,      EV_RELEASE_IND,         lli_received_d_rel},
1121
        {ST_WAIT_BRELEASE,      EV_DLRL,                lli_got_dlrl},
1122
        {ST_WAIT_BREL_DISC,     EV_BC_REL,              lli_received_d_disc},
1123
        {ST_WAIT_BREL_DISC,     EV_RELEASE_CNF,         lli_received_d_relcnf},
1124
        {ST_WAIT_BREL_DISC,     EV_RELEASE_IND,         lli_received_d_rel},
1125
        {ST_WAIT_BREL_DISC,     EV_DLRL,                lli_got_dlrl},
1126
        {ST_WAIT_DCOMMAND,      EV_HANGUP,              lli_send_d_disc},
1127
        {ST_WAIT_DCOMMAND,      EV_DISCONNECT_IND,      lli_received_d_disc},
1128
        {ST_WAIT_DCOMMAND,      EV_RELEASE_CNF,         lli_received_d_relcnf},
1129
        {ST_WAIT_DCOMMAND,      EV_RELEASE_IND,         lli_received_d_rel},
1130
        {ST_WAIT_DCOMMAND,      EV_DLRL,                lli_got_dlrl},
1131
        {ST_WAIT_DRELEASE,      EV_RELEASE_IND,         lli_timeout_d},
1132
        {ST_WAIT_DRELEASE,      EV_RELEASE_CNF,         lli_timeout_d},
1133
        {ST_WAIT_DRELEASE,      EV_RELEASE_ERR,         lli_timeout_d},
1134
        {ST_WAIT_DRELEASE,      EV_DIAL,                lli_no_dchan_ready},
1135
        {ST_WAIT_DRELEASE,      EV_DLRL,                lli_got_dlrl},
1136
        {ST_WAIT_D_REL_CNF,     EV_RELEASE_CNF,         lli_timeout_d},
1137
        {ST_WAIT_D_REL_CNF,     EV_RELEASE_ERR,         lli_timeout_d},
1138
/* ETS 300-104 16.1 */
1139
        {ST_WAIT_D_REL_CNF,     EV_RELEASE_IND,         lli_timeout_d},
1140
        {ST_WAIT_D_REL_CNF,     EV_DIAL,                lli_no_dchan_ready},
1141
        {ST_WAIT_D_REL_CNF,     EV_DLRL,                lli_got_dlrl},
1142
        {ST_WAIT_DSHUTDOWN,     EV_DLRL,                lli_go_null},
1143
        {ST_WAIT_DSHUTDOWN,     EV_DLEST,               lli_d_established},
1144
        {ST_WAIT_DSHUTDOWN,     EV_DIAL,                lli_prep_dialout},
1145
        {ST_WAIT_DSHUTDOWN,     EV_RESUME,              lli_prep_dialout},
1146
        {ST_WAIT_DSHUTDOWN,     EV_SETUP_IND,           lli_deliver_call},
1147
};
1148
/* *INDENT-ON* */
1149
 
1150
 
1151
#define FNCOUNT (sizeof(fnlist)/sizeof(struct FsmNode))
1152
 
1153
HISAX_INITFUNC(void
1154
CallcNew(void))
1155
{
1156
        callcfsm.state_count = STATE_COUNT;
1157
        callcfsm.event_count = EVENT_COUNT;
1158
        callcfsm.strEvent = strEvent;
1159
        callcfsm.strState = strState;
1160
        FsmNew(&callcfsm, fnlist, FNCOUNT);
1161
}
1162
 
1163
void
1164
CallcFree(void)
1165
{
1166
        FsmFree(&callcfsm);
1167
}
1168
 
1169
static void
1170
release_b_st(struct Channel *chanp)
1171
{
1172
        struct PStack *st = chanp->b_st;
1173
 
1174
        chanp->bcs->BC_Close(chanp->bcs);
1175
        switch (chanp->l2_active_protocol) {
1176
                case (ISDN_PROTO_L2_X75I):
1177
                        releasestack_isdnl2(st);
1178
                        break;
1179
                case (ISDN_PROTO_L2_HDLC):
1180
                case (ISDN_PROTO_L2_TRANS):
1181
//              case (ISDN_PROTO_L2_MODEM):
1182
                        releasestack_transl2(st);
1183
                        break;
1184
        }
1185
}
1186
 
1187
struct Channel
1188
*selectfreechannel(struct PStack *st)
1189
{
1190
        struct IsdnCardState *cs = st->l1.hardware;
1191
        struct Channel *chanp = st->lli.userdata;
1192
        int i;
1193
 
1194
        if (test_bit(FLG_TWO_DCHAN, &cs->HW_Flags))
1195
                i=1;
1196
        else
1197
                i=0;
1198
        while (i<2) {
1199
                if (chanp->fi.state == ST_NULL)
1200
                        return (chanp);
1201
                chanp++;
1202
                i++;
1203
        }
1204
        return (NULL);
1205
}
1206
 
1207
int
1208
is_activ(struct PStack *st)
1209
{
1210
        struct IsdnCardState *cs = st->l1.hardware;
1211
        struct Channel *chanp = st->lli.userdata;
1212
        int i;
1213
 
1214
        if (test_bit(FLG_TWO_DCHAN, &cs->HW_Flags))
1215
                i=1;
1216
        else
1217
                i=0;
1218
        while (i<2) {
1219
                if (test_bit(FLG_ESTAB_D, &chanp->Flags))
1220
                        return (1);
1221
                chanp++;
1222
                i++;
1223
        }
1224
        return (0);
1225
}
1226
 
1227
static void
1228
dchan_l3l4(struct PStack *st, int pr, void *arg)
1229
{
1230
        struct l3_process *pc = arg;
1231
        struct IsdnCardState *cs = st->l1.hardware;
1232
        struct Channel *chanp;
1233
        int event;
1234
 
1235
        switch (pr) {
1236
                case (DL_ESTABLISH | INDICATION):
1237
                        event = EV_DLEST;
1238
                        break;
1239
                case (DL_RELEASE | INDICATION):
1240
                        event = EV_DLRL;
1241
                        break;
1242
                default:
1243
                        event = -1;
1244
                        break;
1245
        }
1246
        if (event >= 0) {
1247
                int i;
1248
 
1249
                chanp = st->lli.userdata;
1250
                if (test_bit(FLG_TWO_DCHAN, &cs->HW_Flags))
1251
                        i = 1;
1252
                else
1253
                        i = 0;
1254
                while (i < 2) {
1255
                        FsmEvent(&chanp->fi, event, NULL);
1256
                        chanp++;
1257
                        i++;
1258
                }
1259
                return;
1260
        } else if (pr == (CC_SETUP | INDICATION)) {
1261
                if (!(chanp = selectfreechannel(pc->st))) {
1262
                        pc->st->lli.l4l3(pc->st, CC_DLRL | REQUEST, pc);
1263
                } else {
1264
                        chanp->proc = pc;
1265
                        pc->chan = chanp;
1266
                        FsmEvent(&chanp->fi, EV_SETUP_IND, NULL);
1267
                }
1268
                return;
1269
        }
1270
        if (!(chanp = pc->chan))
1271
                return;
1272
 
1273
        switch (pr) {
1274
                case (CC_DISCONNECT | INDICATION):
1275
                        FsmEvent(&chanp->fi, EV_DISCONNECT_IND, NULL);
1276
                        break;
1277
                case (CC_RELEASE | CONFIRM):
1278
                        FsmEvent(&chanp->fi, EV_RELEASE_CNF, NULL);
1279
                        break;
1280
                case (CC_SUSPEND | CONFIRM):
1281
                        FsmEvent(&chanp->fi, EV_RELEASE_CNF, NULL);
1282
                        break;
1283
                case (CC_RESUME | CONFIRM):
1284
                        FsmEvent(&chanp->fi, EV_SETUP_CNF, NULL);
1285
                        break;
1286
                case (CC_RESUME_ERR):
1287
                        FsmEvent(&chanp->fi, EV_RELEASE_CNF, NULL);
1288
                        break;
1289
                case (CC_RELEASE | INDICATION):
1290
                        FsmEvent(&chanp->fi, EV_RELEASE_IND, NULL);
1291
                        break;
1292
                case (CC_SETUP_COMPL | INDICATION):
1293
                        FsmEvent(&chanp->fi, EV_SETUP_CMPL_IND, NULL);
1294
                        break;
1295
                case (CC_SETUP | CONFIRM):
1296
                        FsmEvent(&chanp->fi, EV_SETUP_CNF, NULL);
1297
                        break;
1298
                case (CC_CHARGE | INDICATION):
1299
                        FsmEvent(&chanp->fi, EV_CINF, NULL);
1300
                        break;
1301
                case (CC_NOSETUP_RSP):
1302
                        FsmEvent(&chanp->fi, EV_NOSETUP_RSP, NULL);
1303
                        break;
1304
                case (CC_SETUP_ERR):
1305
                        FsmEvent(&chanp->fi, EV_SETUP_ERR, NULL);
1306
                        break;
1307
                case (CC_CONNECT_ERR):
1308
                        FsmEvent(&chanp->fi, EV_CONNECT_ERR, NULL);
1309
                        break;
1310
                case (CC_RELEASE_ERR):
1311
                        FsmEvent(&chanp->fi, EV_RELEASE_ERR, NULL);
1312
                        break;
1313
                case (CC_PROCEEDING | INDICATION):
1314
                case (CC_ALERTING | INDICATION):
1315
                        break;
1316
                default:
1317
                        if (chanp->debug & 0x800) {
1318
                                HiSax_putstatus(chanp->cs, "Ch",
1319
                                        "%d L3->L4 unknown primitiv %x",
1320
                                        chanp->chan, pr);
1321
                        }
1322
        }
1323
}
1324
 
1325
static void
1326
init_d_st(struct Channel *chanp)
1327
{
1328
        struct PStack *st = chanp->d_st;
1329
        struct IsdnCardState *cs = chanp->cs;
1330
        char tmp[16];
1331
 
1332
        HiSax_addlist(cs, st);
1333
        setstack_HiSax(st, cs);
1334
        st->l2.sap = 0;
1335
        st->l2.tei = -1;
1336
        st->l2.flag = 0;
1337
        test_and_set_bit(FLG_MOD128, &st->l2.flag);
1338
        test_and_set_bit(FLG_LAPD, &st->l2.flag);
1339
        test_and_set_bit(FLG_ORIG, &st->l2.flag);
1340
        st->l2.maxlen = MAX_DFRAME_LEN;
1341
        st->l2.window = 1;
1342
        st->l2.T200 = 1000;     /* 1000 milliseconds  */
1343
        st->l2.N200 = 3;        /* try 3 times        */
1344
        st->l2.T203 = 10000;    /* 10000 milliseconds */
1345
        if (test_bit(FLG_TWO_DCHAN, &cs->HW_Flags))
1346
                sprintf(tmp, "DCh%d Q.921 ", chanp->chan);
1347
        else
1348
                sprintf(tmp, "DCh Q.921 ");
1349
        setstack_isdnl2(st, tmp);
1350
        setstack_l3dc(st, chanp);
1351
        st->lli.userdata = chanp;
1352
        st->lli.l2writewakeup = NULL;
1353
        st->l3.l3l4 = dchan_l3l4;
1354
}
1355
 
1356
static void
1357
callc_debug(struct FsmInst *fi, char *fmt, ...)
1358
{
1359
        va_list args;
1360
        struct Channel *chanp = fi->userdata;
1361
        char tmp[16];
1362
 
1363
        va_start(args, fmt);
1364
        sprintf(tmp, "Ch%d callc ", chanp->chan);
1365
        VHiSax_putstatus(chanp->cs, tmp, fmt, args);
1366
        va_end(args);
1367
}
1368
 
1369
static void
1370
dummy_pstack(struct PStack *st, int pr, void *arg) {
1371
        printk(KERN_WARNING"call to dummy_pstack pr=%04x arg %lx\n", pr, (long)arg);
1372
}
1373
 
1374
static void
1375
init_PStack(struct PStack **stp) {
1376
        *stp = kmalloc(sizeof(struct PStack), GFP_ATOMIC);
1377
        (*stp)->next = NULL;
1378
        (*stp)->l1.l1l2 = dummy_pstack;
1379
        (*stp)->l1.l1hw = dummy_pstack;
1380
        (*stp)->l1.l1tei = dummy_pstack;
1381
        (*stp)->l2.l2tei = dummy_pstack;
1382
        (*stp)->l2.l2l1 = dummy_pstack;
1383
        (*stp)->l2.l2l3 = dummy_pstack;
1384
        (*stp)->l3.l3l2 = dummy_pstack;
1385
        (*stp)->l3.l3l4 = dummy_pstack;
1386
        (*stp)->lli.l4l3 = dummy_pstack;
1387
        (*stp)->ma.layer = dummy_pstack;
1388
}
1389
 
1390
static void
1391
init_chan(int chan, struct IsdnCardState *csta)
1392
{
1393
        struct Channel *chanp = csta->channel + chan;
1394
 
1395
        chanp->cs = csta;
1396
        chanp->bcs = csta->bcs + chan;
1397
        chanp->chan = chan;
1398
        chanp->incoming = 0;
1399
        chanp->debug = 0;
1400
        chanp->Flags = 0;
1401
        chanp->leased = 0;
1402
        init_PStack(&chanp->b_st);
1403
        chanp->b_st->l1.delay = DEFAULT_B_DELAY;
1404
        chanp->fi.fsm = &callcfsm;
1405
        chanp->fi.state = ST_NULL;
1406
        chanp->fi.debug = 0;
1407
        chanp->fi.userdata = chanp;
1408
        chanp->fi.printdebug = callc_debug;
1409
        FsmInitTimer(&chanp->fi, &chanp->dial_timer);
1410
        FsmInitTimer(&chanp->fi, &chanp->drel_timer);
1411
        if (!chan || test_bit(FLG_TWO_DCHAN, &csta->HW_Flags)) {
1412
                init_PStack(&chanp->d_st);
1413
                if (chan)
1414
                        csta->channel->d_st->next = chanp->d_st;
1415
                chanp->d_st->next = NULL;
1416
                init_d_st(chanp);
1417
        } else {
1418
                chanp->d_st = csta->channel->d_st;
1419
        }
1420
        chanp->data_open = 0;
1421
}
1422
 
1423
int
1424
CallcNewChan(struct IsdnCardState *csta)
1425
{
1426
        chancount += 2;
1427
        init_chan(0, csta);
1428
        init_chan(1, csta);
1429
        printk(KERN_INFO "HiSax: 2 channels added\n");
1430
        if (test_bit(FLG_PTP, &csta->channel->d_st->l2.flag)) {
1431
                printk(KERN_INFO "LAYER2 WATCHING ESTABLISH\n");
1432
                test_and_set_bit(FLG_START_D, &csta->channel->Flags);
1433
                csta->channel->d_st->lli.l4l3(csta->channel->d_st,
1434
                        DL_ESTABLISH | REQUEST, NULL);
1435
        }
1436
        return (2);
1437
}
1438
 
1439
static void
1440
release_d_st(struct Channel *chanp)
1441
{
1442
        struct PStack *st = chanp->d_st;
1443
 
1444
        if (!st)
1445
                return;
1446
        releasestack_isdnl2(st);
1447
        releasestack_isdnl3(st);
1448
        HiSax_rmlist(st->l1.hardware, st);
1449
        kfree(st);
1450
        chanp->d_st = NULL;
1451
}
1452
 
1453
void
1454
CallcFreeChan(struct IsdnCardState *csta)
1455
{
1456
        int i;
1457
 
1458
        for (i = 0; i < 2; i++) {
1459
                FsmDelTimer(&csta->channel[i].drel_timer, 74);
1460
                FsmDelTimer(&csta->channel[i].dial_timer, 75);
1461
                if (i || test_bit(FLG_TWO_DCHAN, &csta->HW_Flags))
1462
                        release_d_st(csta->channel + i);
1463
                if (csta->channel[i].b_st) {
1464
                        if (test_and_clear_bit(FLG_START_B, &csta->channel[i].Flags))
1465
                                release_b_st(csta->channel + i);
1466
                        kfree(csta->channel[i].b_st);
1467
                        csta->channel[i].b_st = NULL;
1468
                } else
1469
                        printk(KERN_WARNING "CallcFreeChan b_st ch%d allready freed\n", i);
1470
                if (i || test_bit(FLG_TWO_DCHAN, &csta->HW_Flags)) {
1471
                        release_d_st(csta->channel + i);
1472
                } else
1473
                        csta->channel[i].d_st = NULL;
1474
        }
1475
}
1476
 
1477
static void
1478
lldata_handler(struct PStack *st, int pr, void *arg)
1479
{
1480
        struct Channel *chanp = (struct Channel *) st->lli.userdata;
1481
        struct sk_buff *skb = arg;
1482
 
1483
        switch (pr) {
1484
                case (DL_DATA  | INDICATION):
1485
                        if (chanp->data_open)
1486
                                chanp->cs->iif.rcvcallb_skb(chanp->cs->myid, chanp->chan, skb);
1487
                        else {
1488
                                dev_kfree_skb(skb, FREE_READ);
1489
                        }
1490
                        break;
1491
                case (DL_ESTABLISH | INDICATION):
1492
                case (DL_ESTABLISH | CONFIRM):
1493
                        FsmEvent(&chanp->fi, EV_BC_EST, NULL);
1494
                        break;
1495
                case (DL_RELEASE | INDICATION):
1496
                case (DL_RELEASE | CONFIRM):
1497
                        FsmEvent(&chanp->fi, EV_BC_REL, NULL);
1498
                        break;
1499
                default:
1500
                        printk(KERN_WARNING "lldata_handler unknown primitive %x\n",
1501
                               pr);
1502
                        break;
1503
        }
1504
}
1505
 
1506
static void
1507
lltrans_handler(struct PStack *st, int pr, void *arg)
1508
{
1509
        struct Channel *chanp = (struct Channel *) st->lli.userdata;
1510
        struct sk_buff *skb = arg;
1511
 
1512
        switch (pr) {
1513
                case (PH_DATA | INDICATION):
1514
                        if (chanp->data_open)
1515
                                chanp->cs->iif.rcvcallb_skb(chanp->cs->myid, chanp->chan, skb);
1516
                        else {
1517
                                link_debug(chanp, 0, "channel not open");
1518
                                dev_kfree_skb(skb, FREE_READ);
1519
                        }
1520
                        break;
1521
                case (PH_ACTIVATE | INDICATION):
1522
                case (PH_ACTIVATE | CONFIRM):
1523
                        FsmEvent(&chanp->fi, EV_BC_EST, NULL);
1524
                        break;
1525
                case (PH_DEACTIVATE | INDICATION):
1526
                case (PH_DEACTIVATE | CONFIRM):
1527
                        FsmEvent(&chanp->fi, EV_BC_REL, NULL);
1528
                        break;
1529
                default:
1530
                        printk(KERN_WARNING "lltrans_handler unknown primitive %x\n",
1531
                               pr);
1532
                        break;
1533
        }
1534
}
1535
 
1536
static void
1537
ll_writewakeup(struct PStack *st, int len)
1538
{
1539
        struct Channel *chanp = st->lli.userdata;
1540
        isdn_ctrl ic;
1541
 
1542
        ic.driver = chanp->cs->myid;
1543
        ic.command = ISDN_STAT_BSENT;
1544
        ic.arg = chanp->chan;
1545
//      ic.parm.length = len;
1546
        chanp->cs->iif.statcallb(&ic);
1547
}
1548
 
1549
static int
1550
init_b_st(struct Channel *chanp, int incoming)
1551
{
1552
        struct PStack *st = chanp->b_st;
1553
        struct IsdnCardState *cs = chanp->cs;
1554
        char tmp[16];
1555
 
1556
        st->l1.hardware = cs;
1557
        if (chanp->leased)
1558
                st->l1.bc = chanp->chan & 1;
1559
        else
1560
                st->l1.bc = chanp->proc->para.bchannel - 1;
1561
        switch (chanp->l2_active_protocol) {
1562
                case (ISDN_PROTO_L2_X75I):
1563
                case (ISDN_PROTO_L2_HDLC):
1564
                        st->l1.mode = L1_MODE_HDLC;
1565
                        break;
1566
                case (ISDN_PROTO_L2_TRANS):
1567
                        st->l1.mode = L1_MODE_TRANS;
1568
                        break;
1569
#if 0
1570
                case (ISDN_PROTO_L2_MODEM):
1571
                        st->l1.mode = L1_MODE_MODEM;
1572
                        break;
1573
#endif
1574
        }
1575
        if (chanp->bcs->BC_SetStack(st, chanp->bcs))
1576
                return (-1);
1577
        st->l2.flag = 0;
1578
        test_and_set_bit(FLG_LAPB, &st->l2.flag);
1579
        st->l2.maxlen = MAX_DATA_SIZE;
1580
        if (!incoming)
1581
                test_and_set_bit(FLG_ORIG, &st->l2.flag);
1582
        st->l2.T200 = 1000;     /* 1000 milliseconds */
1583
        st->l2.window = 7;
1584
        st->l2.N200 = 4;        /* try 4 times       */
1585
        st->l2.T203 = 5000;     /* 5000 milliseconds */
1586
        st->l3.debug = 0;
1587
        switch (chanp->l2_active_protocol) {
1588
                case (ISDN_PROTO_L2_X75I):
1589
                        sprintf(tmp, "Ch%d X.75", chanp->chan);
1590
                        setstack_isdnl2(st, tmp);
1591
                        setstack_l3bc(st, chanp);
1592
                        st->l2.l2l3 = lldata_handler;
1593
                        st->lli.userdata = chanp;
1594
                        st->lli.l1writewakeup = NULL;
1595
                        st->lli.l2writewakeup = ll_writewakeup;
1596
                        st->l2.l2m.debug = chanp->debug & 16;
1597
                        st->l2.debug = chanp->debug & 64;
1598
                        break;
1599
                case (ISDN_PROTO_L2_HDLC):
1600
                case (ISDN_PROTO_L2_TRANS):
1601
//              case (ISDN_PROTO_L2_MODEM):
1602
                        st->l1.l1l2 = lltrans_handler;
1603
                        st->lli.userdata = chanp;
1604
                        st->lli.l1writewakeup = ll_writewakeup;
1605
                        setstack_transl2(st);
1606
                        setstack_l3bc(st, chanp);
1607
                        break;
1608
        }
1609
        return (0);
1610
}
1611
 
1612
static void
1613
leased_l4l3(struct PStack *st, int pr, void *arg)
1614
{
1615
        struct Channel *chanp = (struct Channel *) st->lli.userdata;
1616
        struct sk_buff *skb = arg;
1617
 
1618
        switch (pr) {
1619
                case (DL_DATA | REQUEST):
1620
                        link_debug(chanp, 0, "leased line d-channel DATA");
1621
                        dev_kfree_skb(skb, FREE_READ);
1622
                        break;
1623
                case (DL_ESTABLISH | REQUEST):
1624
                        st->l2.l2l1(st, PH_ACTIVATE | REQUEST, NULL);
1625
                        break;
1626
                case (DL_RELEASE | REQUEST):
1627
                        break;
1628
                default:
1629
                        printk(KERN_WARNING "transd_l4l3 unknown primitive %x\n",
1630
                               pr);
1631
                        break;
1632
        }
1633
}
1634
 
1635
static void
1636
leased_l1l2(struct PStack *st, int pr, void *arg)
1637
{
1638
        struct Channel *chanp = (struct Channel *) st->lli.userdata;
1639
        struct sk_buff *skb = arg;
1640
        int i,event = EV_DLRL;
1641
 
1642
        switch (pr) {
1643
                case (PH_DATA | INDICATION):
1644
                        link_debug(chanp, 0, "leased line d-channel DATA");
1645
                        dev_kfree_skb(skb, FREE_READ);
1646
                        break;
1647
                case (PH_ACTIVATE | INDICATION):
1648
                case (PH_ACTIVATE | CONFIRM):
1649
                        event = EV_DLEST;
1650
                case (PH_DEACTIVATE | INDICATION):
1651
                case (PH_DEACTIVATE | CONFIRM):
1652
                        if (test_bit(FLG_TWO_DCHAN, &chanp->cs->HW_Flags))
1653
                                i = 1;
1654
                        else
1655
                                i = 0;
1656
                        while (i < 2) {
1657
                                FsmEvent(&chanp->fi, event, NULL);
1658
                                chanp++;
1659
                                i++;
1660
                        }
1661
                        break;
1662
                default:
1663
                        printk(KERN_WARNING
1664
                                "transd_l1l2 unknown primitive %x\n", pr);
1665
                        break;
1666
        }
1667
}
1668
 
1669
static void
1670
channel_report(struct Channel *chanp)
1671
{
1672
}
1673
 
1674
static void
1675
distr_debug(struct IsdnCardState *csta, int debugflags)
1676
{
1677
        int i;
1678
        struct Channel *chanp = csta->channel;
1679
 
1680
        for (i = 0; i < 2; i++) {
1681
                chanp[i].debug = debugflags;
1682
                chanp[i].fi.debug = debugflags & 2;
1683
                chanp[i].d_st->l2.l2m.debug = debugflags & 8;
1684
                chanp[i].b_st->l2.l2m.debug = debugflags & 0x10;
1685
                chanp[i].d_st->l2.debug = debugflags & 0x20;
1686
                chanp[i].b_st->l2.debug = debugflags & 0x40;
1687
                chanp[i].d_st->l3.l3m.debug = debugflags & 0x80;
1688
                chanp[i].b_st->l3.l3m.debug = debugflags & 0x100;
1689
                chanp[i].b_st->ma.tei_m.debug = debugflags & 0x200;
1690
                chanp[i].b_st->ma.debug = debugflags & 0x200;
1691
                chanp[i].d_st->l1.l1m.debug = debugflags & 0x1000;
1692
                chanp[i].b_st->l1.l1m.debug = debugflags & 0x2000;
1693
        }
1694
        if (debugflags & 4)
1695
                csta->debug |= DEB_DLOG_HEX;
1696
        else
1697
                csta->debug &= ~DEB_DLOG_HEX;
1698
}
1699
 
1700
#if 0
1701
static char tmpbuf[256];
1702
 
1703
static void
1704
capi_debug(struct Channel *chanp, capi_msg *cm)
1705
{
1706
        char *t = tmpbuf;
1707
 
1708
        t += sprintf(tmpbuf, "%d CAPIMSG", chanp->chan);
1709
        t += QuickHex(t, (u_char *)cm, (cm->Length>50)? 50: cm->Length);
1710
        t--;
1711
        *t= 0;
1712
        HiSax_putstatus(chanp->cs, "Ch", "%d CAPIMSG %s", chanp->chan, tmpbuf);
1713
}
1714
 
1715
void
1716
lli_got_fac_req(struct Channel *chanp, capi_msg *cm) {
1717
        if ((cm->para[0] != 3) || (cm->para[1] != 0))
1718
                return;
1719
        if (cm->para[2]<3)
1720
                return;
1721
        if (cm->para[4] != 0)
1722
                return;
1723
        switch(cm->para[3]) {
1724
                case 4: /* Suspend */
1725
                        if (cm->para[5]) {
1726
                                strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
1727
                                FsmEvent(&chanp->fi, EV_SUSPEND, cm);
1728
                        }
1729
                        break;
1730
                case 5: /* Resume */
1731
                        if (cm->para[5]) {
1732
                                strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
1733
                                if (chanp->fi.state == ST_NULL) {
1734
                                        FsmEvent(&chanp->fi, EV_RESUME, cm);
1735
                                } else {
1736
                                        FsmDelTimer(&chanp->dial_timer, 72);
1737
                                        FsmAddTimer(&chanp->dial_timer, 80, EV_RESUME, cm, 73);
1738
                                }
1739
                        }
1740
                        break;
1741
        }
1742
}
1743
 
1744
void
1745
lli_got_manufacturer(struct Channel *chanp, struct IsdnCardState *cs, capi_msg *cm) {
1746
        if ((cs->typ == ISDN_CTYPE_ELSA) || (cs->typ == ISDN_CTYPE_ELSA_PNP) ||
1747
                (cs->typ == ISDN_CTYPE_ELSA_PCI)) {
1748
                if (cs->hw.elsa.MFlag) {
1749
                        cs->cardmsg(cs, CARD_AUX_IND, cm->para);
1750
                }
1751
        }
1752
}
1753
#endif
1754
 
1755
int
1756
HiSax_command(isdn_ctrl * ic)
1757
{
1758
        struct IsdnCardState *csta = hisax_findcard(ic->driver);
1759
        struct Channel *chanp;
1760
        int i;
1761
        u_int num;
1762
        u_long adr;
1763
 
1764
        if (!csta) {
1765
                printk(KERN_ERR
1766
                "HiSax: if_command %d called with invalid driverId %d!\n",
1767
                       ic->command, ic->driver);
1768
                return -ENODEV;
1769
        }
1770
 
1771
        switch (ic->command) {
1772
                case (ISDN_CMD_SETEAZ):
1773
                        chanp = csta->channel + ic->arg;
1774
                        break;
1775
 
1776
                case (ISDN_CMD_SETL2):
1777
                        chanp = csta->channel + (ic->arg & 0xff);
1778
                        if (chanp->debug & 1)
1779
                                link_debug(chanp, 1, "SETL2 card %d %ld",
1780
                                        csta->cardnr + 1, ic->arg >> 8);
1781
                        chanp->l2_protocol = ic->arg >> 8;
1782
                        break;
1783
                case (ISDN_CMD_SETL3):
1784
                        chanp = csta->channel + (ic->arg & 0xff);
1785
                        if (chanp->debug & 1)
1786
                                link_debug(chanp, 1, "SETL3 card %d %ld",
1787
                                        csta->cardnr + 1, ic->arg >> 8);
1788
                        chanp->l3_protocol = ic->arg >> 8;
1789
                        break;
1790
                case (ISDN_CMD_DIAL):
1791
                        chanp = csta->channel + (ic->arg & 0xff);
1792
                        if (chanp->debug & 1)
1793
                                link_debug(chanp, 1, "DIAL %s -> %s (%d,%d)",
1794
                                        ic->parm.setup.eazmsn, ic->parm.setup.phone,
1795
                                        ic->parm.setup.si1, ic->parm.setup.si2);
1796
                        chanp->setup = ic->parm.setup;
1797
                        if (!strcmp(chanp->setup.eazmsn, "0"))
1798
                                chanp->setup.eazmsn[0] = '\0';
1799
                        /* this solution is dirty and may be change, if
1800
                         * we make a callreference based callmanager */
1801
                        if (chanp->fi.state == ST_NULL) {
1802
                                FsmEvent(&chanp->fi, EV_DIAL, NULL);
1803
                        } else {
1804
                                FsmDelTimer(&chanp->dial_timer, 70);
1805
                                FsmAddTimer(&chanp->dial_timer, 50, EV_DIAL, NULL, 71);
1806
                        }
1807
                        break;
1808
                case (ISDN_CMD_ACCEPTB):
1809
                        chanp = csta->channel + ic->arg;
1810
                        if (chanp->debug & 1)
1811
                                link_debug(chanp, 1, "ACCEPTB");
1812
                        FsmEvent(&chanp->fi, EV_ACCEPTB, NULL);
1813
                        break;
1814
                case (ISDN_CMD_ACCEPTD):
1815
                        chanp = csta->channel + ic->arg;
1816
                        if (chanp->debug & 1)
1817
                                link_debug(chanp, 1, "ACCEPTD");
1818
                        FsmEvent(&chanp->fi, EV_ACCEPTD, NULL);
1819
                        break;
1820
                case (ISDN_CMD_HANGUP):
1821
                        chanp = csta->channel + ic->arg;
1822
                        if (chanp->debug & 1)
1823
                                link_debug(chanp, 1, "HANGUP");
1824
                        FsmEvent(&chanp->fi, EV_HANGUP, NULL);
1825
                        break;
1826
#if 0
1827
                case (CAPI_PUT_MESSAGE):
1828
                        chanp = csta->channel + ic->arg;
1829
                        if (chanp->debug & 1)
1830
                                capi_debug(chanp, &ic->parm.cmsg);
1831
                        if (ic->parm.cmsg.Length < 8)
1832
                                break;
1833
                        switch(ic->parm.cmsg.Command) {
1834
                                case CAPI_FACILITY:
1835
                                        if (ic->parm.cmsg.Subcommand == CAPI_REQ)
1836
                                                lli_got_fac_req(chanp, &ic->parm.cmsg);
1837
                                        break;
1838
                                case CAPI_MANUFACTURER:
1839
                                        if (ic->parm.cmsg.Subcommand == CAPI_REQ)
1840
                                                lli_got_manufacturer(chanp, csta, &ic->parm.cmsg);
1841
                                        break;
1842
                                default:
1843
                                        break;
1844
                        }
1845
                        break;
1846
#endif
1847
                case (ISDN_CMD_LOCK):
1848
                        HiSax_mod_inc_use_count();
1849
#ifdef MODULE
1850
                        if (csta->channel[0].debug & 0x400)
1851
                                HiSax_putstatus(csta, "   LOCK ", "modcnt %lx",
1852
                                        MOD_USE_COUNT);
1853
#endif                          /* MODULE */
1854
                        break;
1855
                case (ISDN_CMD_UNLOCK):
1856
                        HiSax_mod_dec_use_count();
1857
#ifdef MODULE
1858
                        if (csta->channel[0].debug & 0x400)
1859
                                HiSax_putstatus(csta, " UNLOCK ", "modcnt %lx",
1860
                                        MOD_USE_COUNT);
1861
#endif                          /* MODULE */
1862
                        break;
1863
                case (ISDN_CMD_IOCTL):
1864
                        switch (ic->arg) {
1865
                                case (0):
1866
                                        HiSax_reportcard(csta->cardnr);
1867
                                        for (i = 0; i < 2; i++)
1868
                                                channel_report(&csta->channel[i]);
1869
                                        break;
1870
                                case (1):
1871
                                        num = *(unsigned int *) ic->parm.num;
1872
                                        distr_debug(csta, num);
1873
                                        printk(KERN_DEBUG "HiSax: debugging flags card %d set to %x\n",
1874
                                                csta->cardnr + 1, num);
1875
                                        HiSax_putstatus(csta, "debugging flags ",
1876
                                                "card %d set to %x", csta->cardnr + 1, num);
1877
                                        break;
1878
                                case (2):
1879
                                        num = *(unsigned int *) ic->parm.num;
1880
                                        csta->channel[0].b_st->l1.delay = num;
1881
                                        csta->channel[1].b_st->l1.delay = num;
1882
                                        HiSax_putstatus(csta, "delay ", "card %d set to %d ms",
1883
                                                csta->cardnr + 1, num);
1884
                                        printk(KERN_DEBUG "HiSax: delay card %d set to %d ms\n",
1885
                                                csta->cardnr + 1, num);
1886
                                        break;
1887
                                case (3):
1888
                                        for (i = 0; i < *(unsigned int *) ic->parm.num; i++)
1889
                                                HiSax_mod_dec_use_count();
1890
                                        break;
1891
                                case (4):
1892
                                        for (i = 0; i < *(unsigned int *) ic->parm.num; i++)
1893
                                                HiSax_mod_inc_use_count();
1894
                                        break;
1895
                                case (5):       /* set card in leased mode */
1896
                                        num = *(unsigned int *) ic->parm.num;
1897
                                        if ((num <1) || (num > 2)) {
1898
                                                HiSax_putstatus(csta, "Set LEASED ",
1899
                                                        "wrong channel %d", num);
1900
                                                printk(KERN_WARNING "HiSax: Set LEASED wrong channel %d\n",
1901
                                                        num);
1902
                                        } else {
1903
                                                num--;
1904
                                                chanp = csta->channel +num;
1905
                                                chanp->leased = 1;
1906
                                                HiSax_putstatus(csta, "Card",
1907
                                                        "%d channel %d set leased mode\n",
1908
                                                        csta->cardnr + 1, num + 1);
1909
                                                chanp->d_st->l1.l1l2 = leased_l1l2;
1910
                                                chanp->d_st->lli.l4l3 = leased_l4l3;
1911
                                                chanp->d_st->lli.l4l3(chanp->d_st,
1912
                                                        DL_ESTABLISH | REQUEST, NULL);
1913
                                        }
1914
                                        break;
1915
                                case (6):       /* set B-channel test loop */
1916
                                        num = *(unsigned int *) ic->parm.num;
1917
                                        if (csta->stlist)
1918
                                                csta->stlist->l2.l2l1(csta->stlist,
1919
                                                        PH_TESTLOOP | REQUEST, (void *) (long)num);
1920
                                        break;
1921
                                case (7):       /* set card in PTP mode */
1922
                                        num = *(unsigned int *) ic->parm.num;
1923
                                        if (test_bit(FLG_TWO_DCHAN, &csta->HW_Flags)) {
1924
                                                printk(KERN_ERR "HiSax PTP mode only with one TEI possible\n");
1925
                                        } else if (num) {
1926
                                                test_and_set_bit(FLG_PTP, &csta->channel[0].d_st->l2.flag);
1927
                                                test_and_set_bit(FLG_FIXED_TEI, &csta->channel[0].d_st->l2.flag);
1928
                                                csta->channel[0].d_st->l2.tei = 0;
1929
                                                HiSax_putstatus(csta, "set card ", "in PTP mode");
1930
                                                printk(KERN_DEBUG "HiSax: set card in PTP mode\n");
1931
                                                printk(KERN_INFO "LAYER2 WATCHING ESTABLISH\n");
1932
                                                test_and_set_bit(FLG_START_D, &csta->channel[0].Flags);
1933
                                                test_and_set_bit(FLG_START_D, &csta->channel[1].Flags);
1934
                                                csta->channel[0].d_st->lli.l4l3(csta->channel[0].d_st,
1935
                                                        DL_ESTABLISH | REQUEST, NULL);
1936
                                        } else {
1937
                                                test_and_clear_bit(FLG_PTP, &csta->channel[0].d_st->l2.flag);
1938
                                                test_and_clear_bit(FLG_FIXED_TEI, &csta->channel[0].d_st->l2.flag);
1939
                                                HiSax_putstatus(csta, "set card ", "in PTMP mode");
1940
                                                printk(KERN_DEBUG "HiSax: set card in PTMP mode\n");
1941
                                        }
1942
                                        break;
1943
                                case (8):       /* set card in FIXED TEI mode */
1944
                                        num = *(unsigned int *) ic->parm.num;
1945
                                        chanp = csta->channel + (num & 1);
1946
                                        num = num >>1;
1947
                                        test_and_set_bit(FLG_FIXED_TEI, &chanp->d_st->l2.flag);
1948
                                        chanp->d_st->l2.tei = num;
1949
                                        HiSax_putstatus(csta, "set card ", "in FIXED TEI (%d) mode", num);
1950
                                        printk(KERN_DEBUG "HiSax: set card in FIXED TEI (%d) mode\n",
1951
                                                num);
1952
                                        break;
1953
                                case (9): /* load firmware */
1954
                                        memcpy(&adr, ic->parm.num, sizeof(ulong));
1955
                                        csta->cardmsg(csta, CARD_LOAD_FIRM,
1956
                                                (void *) adr);
1957
                                        break;
1958
#ifdef MODULE
1959
                                case (55):
1960
                                        MOD_USE_COUNT = 0;
1961
                                        HiSax_mod_inc_use_count();
1962
                                        break;
1963
#endif                          /* MODULE */
1964
                                case (11):
1965
                                        num = csta->debug & DEB_DLOG_HEX;
1966
                                        csta->debug = *(unsigned int *) ic->parm.num;
1967
                                        csta->debug |= num;
1968
                                        HiSax_putstatus(cards[0].cs, "l1 debugging ",
1969
                                                "flags card %d set to %x",
1970
                                                csta->cardnr + 1, csta->debug);
1971
                                        printk(KERN_DEBUG "HiSax: l1 debugging flags card %d set to %x\n",
1972
                                                csta->cardnr + 1, csta->debug);
1973
                                        break;
1974
                                case (13):
1975
                                        csta->channel[0].d_st->l3.debug = *(unsigned int *) ic->parm.num;
1976
                                        csta->channel[1].d_st->l3.debug = *(unsigned int *) ic->parm.num;
1977
                                        HiSax_putstatus(cards[0].cs, "l3 debugging ",
1978
                                                "flags card %d set to %x\n", csta->cardnr + 1,
1979
                                                *(unsigned int *) ic->parm.num);
1980
                                        printk(KERN_DEBUG "HiSax: l3 debugging flags card %d set to %x\n",
1981
                                                csta->cardnr + 1, *(unsigned int *) ic->parm.num);
1982
                                        break;
1983
                                default:
1984
                                        printk(KERN_DEBUG "HiSax: invalid ioclt %d\n",
1985
                                               (int) ic->arg);
1986
                                        return (-EINVAL);
1987
                        }
1988
                        break;
1989
                default:
1990
                        break;
1991
        }
1992
 
1993
        return (0);
1994
}
1995
 
1996
int
1997
HiSax_writebuf_skb(int id, int chan, struct sk_buff *skb)
1998
{
1999
        struct IsdnCardState *csta = hisax_findcard(id);
2000
        struct Channel *chanp;
2001
        struct PStack *st;
2002
        int len = skb->len;
2003
        unsigned long flags;
2004
        struct sk_buff *nskb;
2005
 
2006
        if (!csta) {
2007
                printk(KERN_ERR
2008
                    "HiSax: if_sendbuf called with invalid driverId!\n");
2009
                return -ENODEV;
2010
        }
2011
        chanp = csta->channel + chan;
2012
        st = chanp->b_st;
2013
        if (!chanp->data_open) {
2014
                link_debug(chanp, 1, "writebuf: channel not open");
2015
                return -EIO;
2016
        }
2017
        if (len > MAX_DATA_SIZE) {
2018
                link_debug(chanp, 1, "writebuf: packet too large (%d bytes)", len);
2019
                printk(KERN_WARNING "HiSax_writebuf: packet too large (%d bytes) !\n",
2020
                        len);
2021
                return -EINVAL;
2022
        }
2023
        if (len) {
2024
                if ((len + chanp->bcs->tx_cnt) > MAX_DATA_MEM) {
2025
                        /* Must return 0 here, since this is not an error
2026
                         * but a temporary lack of resources.
2027
                         */
2028
                        if (chanp->debug & 0x800)
2029
                                link_debug(chanp, 1, "writebuf: no buffers for %d bytes", len);
2030
                        return 0;
2031
                }
2032
                save_flags(flags);
2033
                cli();
2034
                nskb = skb_clone(skb, GFP_ATOMIC);
2035
                if (nskb) {
2036
//                      if (!ack)
2037
//                              nskb->pkt_type = PACKET_NOACK;
2038
                        if (chanp->l2_active_protocol == ISDN_PROTO_L2_X75I)
2039
                                st->l3.l3l2(st, DL_DATA | REQUEST, nskb);
2040
                        else {
2041
                                chanp->bcs->tx_cnt += len;
2042
                                st->l2.l2l1(st, PH_DATA | REQUEST, nskb);
2043
                        }
2044
                        dev_kfree_skb(skb, FREE_WRITE);
2045
                } else
2046
                        len = 0;
2047
                restore_flags(flags);
2048
        }
2049
        return (len);
2050
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.