linux/drivers/isdn/mISDN/stack.c
<<
>>
Prefs
   1/*
   2 *
   3 * Author       Karsten Keil <kkeil@novell.com>
   4 *
   5 * Copyright 2008  by Karsten Keil <kkeil@novell.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 */
  17
  18#include <linux/slab.h>
  19#include <linux/mISDNif.h>
  20#include <linux/kthread.h>
  21#include <linux/sched.h>
  22#include "core.h"
  23
  24static u_int    *debug;
  25
  26static inline void
  27_queue_message(struct mISDNstack *st, struct sk_buff *skb)
  28{
  29        struct mISDNhead        *hh = mISDN_HEAD_P(skb);
  30
  31        if (*debug & DEBUG_QUEUE_FUNC)
  32                printk(KERN_DEBUG "%s prim(%x) id(%x) %p\n",
  33                       __func__, hh->prim, hh->id, skb);
  34        skb_queue_tail(&st->msgq, skb);
  35        if (likely(!test_bit(mISDN_STACK_STOPPED, &st->status))) {
  36                test_and_set_bit(mISDN_STACK_WORK, &st->status);
  37                wake_up_interruptible(&st->workq);
  38        }
  39}
  40
  41static int
  42mISDN_queue_message(struct mISDNchannel *ch, struct sk_buff *skb)
  43{
  44        _queue_message(ch->st, skb);
  45        return 0;
  46}
  47
  48static struct mISDNchannel *
  49get_channel4id(struct mISDNstack *st, u_int id)
  50{
  51        struct mISDNchannel     *ch;
  52
  53        mutex_lock(&st->lmutex);
  54        list_for_each_entry(ch, &st->layer2, list) {
  55                if (id == ch->nr)
  56                        goto unlock;
  57        }
  58        ch = NULL;
  59unlock:
  60        mutex_unlock(&st->lmutex);
  61        return ch;
  62}
  63
  64static void
  65send_socklist(struct mISDN_sock_list *sl, struct sk_buff *skb)
  66{
  67        struct sock             *sk;
  68        struct sk_buff          *cskb = NULL;
  69
  70        read_lock(&sl->lock);
  71        sk_for_each(sk, &sl->head) {
  72                if (sk->sk_state != MISDN_BOUND)
  73                        continue;
  74                if (!cskb)
  75                        cskb = skb_copy(skb, GFP_KERNEL);
  76                if (!cskb) {
  77                        printk(KERN_WARNING "%s no skb\n", __func__);
  78                        break;
  79                }
  80                if (!sock_queue_rcv_skb(sk, cskb))
  81                        cskb = NULL;
  82        }
  83        read_unlock(&sl->lock);
  84        if (cskb)
  85                dev_kfree_skb(cskb);
  86}
  87
  88static void
  89send_layer2(struct mISDNstack *st, struct sk_buff *skb)
  90{
  91        struct sk_buff          *cskb;
  92        struct mISDNhead        *hh = mISDN_HEAD_P(skb);
  93        struct mISDNchannel     *ch;
  94        int                     ret;
  95
  96        if (!st)
  97                return;
  98        mutex_lock(&st->lmutex);
  99        if ((hh->id & MISDN_ID_ADDR_MASK) == MISDN_ID_ANY) { /* L2 for all */
 100                list_for_each_entry(ch, &st->layer2, list) {
 101                        if (list_is_last(&ch->list, &st->layer2)) {
 102                                cskb = skb;
 103                                skb = NULL;
 104                        } else {
 105                                cskb = skb_copy(skb, GFP_KERNEL);
 106                        }
 107                        if (cskb) {
 108                                ret = ch->send(ch, cskb);
 109                                if (ret) {
 110                                        if (*debug & DEBUG_SEND_ERR)
 111                                                printk(KERN_DEBUG
 112                                                       "%s ch%d prim(%x) addr(%x)"
 113                                                       " err %d\n",
 114                                                       __func__, ch->nr,
 115                                                       hh->prim, ch->addr, ret);
 116                                        dev_kfree_skb(cskb);
 117                                }
 118                        } else {
 119                                printk(KERN_WARNING "%s ch%d addr %x no mem\n",
 120                                       __func__, ch->nr, ch->addr);
 121                                goto out;
 122                        }
 123                }
 124        } else {
 125                list_for_each_entry(ch, &st->layer2, list) {
 126                        if ((hh->id & MISDN_ID_ADDR_MASK) == ch->addr) {
 127                                ret = ch->send(ch, skb);
 128                                if (!ret)
 129                                        skb = NULL;
 130                                goto out;
 131                        }
 132                }
 133                ret = st->dev->teimgr->ctrl(st->dev->teimgr, CHECK_DATA, skb);
 134                if (!ret)
 135                        skb = NULL;
 136                else if (*debug & DEBUG_SEND_ERR)
 137                        printk(KERN_DEBUG
 138                               "%s mgr prim(%x) err %d\n",
 139                               __func__, hh->prim, ret);
 140        }
 141out:
 142        mutex_unlock(&st->lmutex);
 143        if (skb)
 144                dev_kfree_skb(skb);
 145}
 146
 147static inline int
 148send_msg_to_layer(struct mISDNstack *st, struct sk_buff *skb)
 149{
 150        struct mISDNhead        *hh = mISDN_HEAD_P(skb);
 151        struct mISDNchannel     *ch;
 152        int     lm;
 153
 154        lm = hh->prim & MISDN_LAYERMASK;
 155        if (*debug & DEBUG_QUEUE_FUNC)
 156                printk(KERN_DEBUG "%s prim(%x) id(%x) %p\n",
 157                       __func__, hh->prim, hh->id, skb);
 158        if (lm == 0x1) {
 159                if (!hlist_empty(&st->l1sock.head)) {
 160                        __net_timestamp(skb);
 161                        send_socklist(&st->l1sock, skb);
 162                }
 163                return st->layer1->send(st->layer1, skb);
 164        } else if (lm == 0x2) {
 165                if (!hlist_empty(&st->l1sock.head))
 166                        send_socklist(&st->l1sock, skb);
 167                send_layer2(st, skb);
 168                return 0;
 169        } else if (lm == 0x4) {
 170                ch = get_channel4id(st, hh->id);
 171                if (ch)
 172                        return ch->send(ch, skb);
 173                else
 174                        printk(KERN_WARNING
 175                               "%s: dev(%s) prim(%x) id(%x) no channel\n",
 176                               __func__, dev_name(&st->dev->dev), hh->prim,
 177                               hh->id);
 178        } else if (lm == 0x8) {
 179                WARN_ON(lm == 0x8);
 180                ch = get_channel4id(st, hh->id);
 181                if (ch)
 182                        return ch->send(ch, skb);
 183                else
 184                        printk(KERN_WARNING
 185                               "%s: dev(%s) prim(%x) id(%x) no channel\n",
 186                               __func__, dev_name(&st->dev->dev), hh->prim,
 187                               hh->id);
 188        } else {
 189                /* broadcast not handled yet */
 190                printk(KERN_WARNING "%s: dev(%s) prim %x not delivered\n",
 191                       __func__, dev_name(&st->dev->dev), hh->prim);
 192        }
 193        return -ESRCH;
 194}
 195
 196static void
 197do_clear_stack(struct mISDNstack *st)
 198{
 199}
 200
 201static int
 202mISDNStackd(void *data)
 203{
 204        struct mISDNstack *st = data;
 205#ifdef MISDN_MSG_STATS
 206        cputime_t utime, stime;
 207#endif
 208        int err = 0;
 209
 210        sigfillset(&current->blocked);
 211        if (*debug & DEBUG_MSG_THREAD)
 212                printk(KERN_DEBUG "mISDNStackd %s started\n",
 213                       dev_name(&st->dev->dev));
 214
 215        if (st->notify != NULL) {
 216                complete(st->notify);
 217                st->notify = NULL;
 218        }
 219
 220        for (;;) {
 221                struct sk_buff  *skb;
 222
 223                if (unlikely(test_bit(mISDN_STACK_STOPPED, &st->status))) {
 224                        test_and_clear_bit(mISDN_STACK_WORK, &st->status);
 225                        test_and_clear_bit(mISDN_STACK_RUNNING, &st->status);
 226                } else
 227                        test_and_set_bit(mISDN_STACK_RUNNING, &st->status);
 228                while (test_bit(mISDN_STACK_WORK, &st->status)) {
 229                        skb = skb_dequeue(&st->msgq);
 230                        if (!skb) {
 231                                test_and_clear_bit(mISDN_STACK_WORK,
 232                                                   &st->status);
 233                                /* test if a race happens */
 234                                skb = skb_dequeue(&st->msgq);
 235                                if (!skb)
 236                                        continue;
 237                                test_and_set_bit(mISDN_STACK_WORK,
 238                                                 &st->status);
 239                        }
 240#ifdef MISDN_MSG_STATS
 241                        st->msg_cnt++;
 242#endif
 243                        err = send_msg_to_layer(st, skb);
 244                        if (unlikely(err)) {
 245                                if (*debug & DEBUG_SEND_ERR)
 246                                        printk(KERN_DEBUG
 247                                               "%s: %s prim(%x) id(%x) "
 248                                               "send call(%d)\n",
 249                                               __func__, dev_name(&st->dev->dev),
 250                                               mISDN_HEAD_PRIM(skb),
 251                                               mISDN_HEAD_ID(skb), err);
 252                                dev_kfree_skb(skb);
 253                                continue;
 254                        }
 255                        if (unlikely(test_bit(mISDN_STACK_STOPPED,
 256                                              &st->status))) {
 257                                test_and_clear_bit(mISDN_STACK_WORK,
 258                                                   &st->status);
 259                                test_and_clear_bit(mISDN_STACK_RUNNING,
 260                                                   &st->status);
 261                                break;
 262                        }
 263                }
 264                if (test_bit(mISDN_STACK_CLEARING, &st->status)) {
 265                        test_and_set_bit(mISDN_STACK_STOPPED, &st->status);
 266                        test_and_clear_bit(mISDN_STACK_RUNNING, &st->status);
 267                        do_clear_stack(st);
 268                        test_and_clear_bit(mISDN_STACK_CLEARING, &st->status);
 269                        test_and_set_bit(mISDN_STACK_RESTART, &st->status);
 270                }
 271                if (test_and_clear_bit(mISDN_STACK_RESTART, &st->status)) {
 272                        test_and_clear_bit(mISDN_STACK_STOPPED, &st->status);
 273                        test_and_set_bit(mISDN_STACK_RUNNING, &st->status);
 274                        if (!skb_queue_empty(&st->msgq))
 275                                test_and_set_bit(mISDN_STACK_WORK,
 276                                                 &st->status);
 277                }
 278                if (test_bit(mISDN_STACK_ABORT, &st->status))
 279                        break;
 280                if (st->notify != NULL) {
 281                        complete(st->notify);
 282                        st->notify = NULL;
 283                }
 284#ifdef MISDN_MSG_STATS
 285                st->sleep_cnt++;
 286#endif
 287                test_and_clear_bit(mISDN_STACK_ACTIVE, &st->status);
 288                wait_event_interruptible(st->workq, (st->status &
 289                                                     mISDN_STACK_ACTION_MASK));
 290                if (*debug & DEBUG_MSG_THREAD)
 291                        printk(KERN_DEBUG "%s: %s wake status %08lx\n",
 292                               __func__, dev_name(&st->dev->dev), st->status);
 293                test_and_set_bit(mISDN_STACK_ACTIVE, &st->status);
 294
 295                test_and_clear_bit(mISDN_STACK_WAKEUP, &st->status);
 296
 297                if (test_bit(mISDN_STACK_STOPPED, &st->status)) {
 298                        test_and_clear_bit(mISDN_STACK_RUNNING, &st->status);
 299#ifdef MISDN_MSG_STATS
 300                        st->stopped_cnt++;
 301#endif
 302                }
 303        }
 304#ifdef MISDN_MSG_STATS
 305        printk(KERN_DEBUG "mISDNStackd daemon for %s proceed %d "
 306               "msg %d sleep %d stopped\n",
 307               dev_name(&st->dev->dev), st->msg_cnt, st->sleep_cnt,
 308               st->stopped_cnt);
 309        task_cputime(st->thread, &utime, &stime);
 310        printk(KERN_DEBUG
 311               "mISDNStackd daemon for %s utime(%ld) stime(%ld)\n",
 312               dev_name(&st->dev->dev), utime, stime);
 313        printk(KERN_DEBUG
 314               "mISDNStackd daemon for %s nvcsw(%ld) nivcsw(%ld)\n",
 315               dev_name(&st->dev->dev), st->thread->nvcsw, st->thread->nivcsw);
 316        printk(KERN_DEBUG "mISDNStackd daemon for %s killed now\n",
 317               dev_name(&st->dev->dev));
 318#endif
 319        test_and_set_bit(mISDN_STACK_KILLED, &st->status);
 320        test_and_clear_bit(mISDN_STACK_RUNNING, &st->status);
 321        test_and_clear_bit(mISDN_STACK_ACTIVE, &st->status);
 322        test_and_clear_bit(mISDN_STACK_ABORT, &st->status);
 323        skb_queue_purge(&st->msgq);
 324        st->thread = NULL;
 325        if (st->notify != NULL) {
 326                complete(st->notify);
 327                st->notify = NULL;
 328        }
 329        return 0;
 330}
 331
 332static int
 333l1_receive(struct mISDNchannel *ch, struct sk_buff *skb)
 334{
 335        if (!ch->st)
 336                return -ENODEV;
 337        __net_timestamp(skb);
 338        _queue_message(ch->st, skb);
 339        return 0;
 340}
 341
 342void
 343set_channel_address(struct mISDNchannel *ch, u_int sapi, u_int tei)
 344{
 345        ch->addr = sapi | (tei << 8);
 346}
 347
 348void
 349__add_layer2(struct mISDNchannel *ch, struct mISDNstack *st)
 350{
 351        list_add_tail(&ch->list, &st->layer2);
 352}
 353
 354void
 355add_layer2(struct mISDNchannel *ch, struct mISDNstack *st)
 356{
 357        mutex_lock(&st->lmutex);
 358        __add_layer2(ch, st);
 359        mutex_unlock(&st->lmutex);
 360}
 361
 362static int
 363st_own_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 364{
 365        if (!ch->st || !ch->st->layer1)
 366                return -EINVAL;
 367        return ch->st->layer1->ctrl(ch->st->layer1, cmd, arg);
 368}
 369
 370int
 371create_stack(struct mISDNdevice *dev)
 372{
 373        struct mISDNstack       *newst;
 374        int                     err;
 375        DECLARE_COMPLETION_ONSTACK(done);
 376
 377        newst = kzalloc(sizeof(struct mISDNstack), GFP_KERNEL);
 378        if (!newst) {
 379                printk(KERN_ERR "kmalloc mISDN_stack failed\n");
 380                return -ENOMEM;
 381        }
 382        newst->dev = dev;
 383        INIT_LIST_HEAD(&newst->layer2);
 384        INIT_HLIST_HEAD(&newst->l1sock.head);
 385        rwlock_init(&newst->l1sock.lock);
 386        init_waitqueue_head(&newst->workq);
 387        skb_queue_head_init(&newst->msgq);
 388        mutex_init(&newst->lmutex);
 389        dev->D.st = newst;
 390        err = create_teimanager(dev);
 391        if (err) {
 392                printk(KERN_ERR "kmalloc teimanager failed\n");
 393                kfree(newst);
 394                return err;
 395        }
 396        dev->teimgr->peer = &newst->own;
 397        dev->teimgr->recv = mISDN_queue_message;
 398        dev->teimgr->st = newst;
 399        newst->layer1 = &dev->D;
 400        dev->D.recv = l1_receive;
 401        dev->D.peer = &newst->own;
 402        newst->own.st = newst;
 403        newst->own.ctrl = st_own_ctrl;
 404        newst->own.send = mISDN_queue_message;
 405        newst->own.recv = mISDN_queue_message;
 406        if (*debug & DEBUG_CORE_FUNC)
 407                printk(KERN_DEBUG "%s: st(%s)\n", __func__,
 408                       dev_name(&newst->dev->dev));
 409        newst->notify = &done;
 410        newst->thread = kthread_run(mISDNStackd, (void *)newst, "mISDN_%s",
 411                                    dev_name(&newst->dev->dev));
 412        if (IS_ERR(newst->thread)) {
 413                err = PTR_ERR(newst->thread);
 414                printk(KERN_ERR
 415                       "mISDN:cannot create kernel thread for %s (%d)\n",
 416                       dev_name(&newst->dev->dev), err);
 417                delete_teimanager(dev->teimgr);
 418                kfree(newst);
 419        } else
 420                wait_for_completion(&done);
 421        return err;
 422}
 423
 424int
 425connect_layer1(struct mISDNdevice *dev, struct mISDNchannel *ch,
 426               u_int protocol, struct sockaddr_mISDN *adr)
 427{
 428        struct mISDN_sock       *msk = container_of(ch, struct mISDN_sock, ch);
 429        struct channel_req      rq;
 430        int                     err;
 431
 432
 433        if (*debug &  DEBUG_CORE_FUNC)
 434                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
 435                       __func__, dev_name(&dev->dev), protocol, adr->dev,
 436                       adr->channel, adr->sapi, adr->tei);
 437        switch (protocol) {
 438        case ISDN_P_NT_S0:
 439        case ISDN_P_NT_E1:
 440        case ISDN_P_TE_S0:
 441        case ISDN_P_TE_E1:
 442                ch->recv = mISDN_queue_message;
 443                ch->peer = &dev->D.st->own;
 444                ch->st = dev->D.st;
 445                rq.protocol = protocol;
 446                rq.adr.channel = adr->channel;
 447                err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq);
 448                printk(KERN_DEBUG "%s: ret %d (dev %d)\n", __func__, err,
 449                       dev->id);
 450                if (err)
 451                        return err;
 452                write_lock_bh(&dev->D.st->l1sock.lock);
 453                sk_add_node(&msk->sk, &dev->D.st->l1sock.head);
 454                write_unlock_bh(&dev->D.st->l1sock.lock);
 455                break;
 456        default:
 457                return -ENOPROTOOPT;
 458        }
 459        return 0;
 460}
 461
 462int
 463connect_Bstack(struct mISDNdevice *dev, struct mISDNchannel *ch,
 464               u_int protocol, struct sockaddr_mISDN *adr)
 465{
 466        struct channel_req      rq, rq2;
 467        int                     pmask, err;
 468        struct Bprotocol        *bp;
 469
 470        if (*debug &  DEBUG_CORE_FUNC)
 471                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
 472                       __func__, dev_name(&dev->dev), protocol,
 473                       adr->dev, adr->channel, adr->sapi,
 474                       adr->tei);
 475        ch->st = dev->D.st;
 476        pmask = 1 << (protocol & ISDN_P_B_MASK);
 477        if (pmask & dev->Bprotocols) {
 478                rq.protocol = protocol;
 479                rq.adr = *adr;
 480                err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq);
 481                if (err)
 482                        return err;
 483                ch->recv = rq.ch->send;
 484                ch->peer = rq.ch;
 485                rq.ch->recv = ch->send;
 486                rq.ch->peer = ch;
 487                rq.ch->st = dev->D.st;
 488        } else {
 489                bp = get_Bprotocol4mask(pmask);
 490                if (!bp)
 491                        return -ENOPROTOOPT;
 492                rq2.protocol = protocol;
 493                rq2.adr = *adr;
 494                rq2.ch = ch;
 495                err = bp->create(&rq2);
 496                if (err)
 497                        return err;
 498                ch->recv = rq2.ch->send;
 499                ch->peer = rq2.ch;
 500                rq2.ch->st = dev->D.st;
 501                rq.protocol = rq2.protocol;
 502                rq.adr = *adr;
 503                err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq);
 504                if (err) {
 505                        rq2.ch->ctrl(rq2.ch, CLOSE_CHANNEL, NULL);
 506                        return err;
 507                }
 508                rq2.ch->recv = rq.ch->send;
 509                rq2.ch->peer = rq.ch;
 510                rq.ch->recv = rq2.ch->send;
 511                rq.ch->peer = rq2.ch;
 512                rq.ch->st = dev->D.st;
 513        }
 514        ch->protocol = protocol;
 515        ch->nr = rq.ch->nr;
 516        return 0;
 517}
 518
 519int
 520create_l2entity(struct mISDNdevice *dev, struct mISDNchannel *ch,
 521                u_int protocol, struct sockaddr_mISDN *adr)
 522{
 523        struct channel_req      rq;
 524        int                     err;
 525
 526        if (*debug &  DEBUG_CORE_FUNC)
 527                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
 528                       __func__, dev_name(&dev->dev), protocol,
 529                       adr->dev, adr->channel, adr->sapi,
 530                       adr->tei);
 531        rq.protocol = ISDN_P_TE_S0;
 532        if (dev->Dprotocols & (1 << ISDN_P_TE_E1))
 533                rq.protocol = ISDN_P_TE_E1;
 534        switch (protocol) {
 535        case ISDN_P_LAPD_NT:
 536                rq.protocol = ISDN_P_NT_S0;
 537                if (dev->Dprotocols & (1 << ISDN_P_NT_E1))
 538                        rq.protocol = ISDN_P_NT_E1;
 539        case ISDN_P_LAPD_TE:
 540                ch->recv = mISDN_queue_message;
 541                ch->peer = &dev->D.st->own;
 542                ch->st = dev->D.st;
 543                rq.adr.channel = 0;
 544                err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq);
 545                printk(KERN_DEBUG "%s: ret 1 %d\n", __func__, err);
 546                if (err)
 547                        break;
 548                rq.protocol = protocol;
 549                rq.adr = *adr;
 550                rq.ch = ch;
 551                err = dev->teimgr->ctrl(dev->teimgr, OPEN_CHANNEL, &rq);
 552                printk(KERN_DEBUG "%s: ret 2 %d\n", __func__, err);
 553                if (!err) {
 554                        if ((protocol == ISDN_P_LAPD_NT) && !rq.ch)
 555                                break;
 556                        add_layer2(rq.ch, dev->D.st);
 557                        rq.ch->recv = mISDN_queue_message;
 558                        rq.ch->peer = &dev->D.st->own;
 559                        rq.ch->ctrl(rq.ch, OPEN_CHANNEL, NULL); /* can't fail */
 560                }
 561                break;
 562        default:
 563                err = -EPROTONOSUPPORT;
 564        }
 565        return err;
 566}
 567
 568void
 569delete_channel(struct mISDNchannel *ch)
 570{
 571        struct mISDN_sock       *msk = container_of(ch, struct mISDN_sock, ch);
 572        struct mISDNchannel     *pch;
 573
 574        if (!ch->st) {
 575                printk(KERN_WARNING "%s: no stack\n", __func__);
 576                return;
 577        }
 578        if (*debug & DEBUG_CORE_FUNC)
 579                printk(KERN_DEBUG "%s: st(%s) protocol(%x)\n", __func__,
 580                       dev_name(&ch->st->dev->dev), ch->protocol);
 581        if (ch->protocol >= ISDN_P_B_START) {
 582                if (ch->peer) {
 583                        ch->peer->ctrl(ch->peer, CLOSE_CHANNEL, NULL);
 584                        ch->peer = NULL;
 585                }
 586                return;
 587        }
 588        switch (ch->protocol) {
 589        case ISDN_P_NT_S0:
 590        case ISDN_P_TE_S0:
 591        case ISDN_P_NT_E1:
 592        case ISDN_P_TE_E1:
 593                write_lock_bh(&ch->st->l1sock.lock);
 594                sk_del_node_init(&msk->sk);
 595                write_unlock_bh(&ch->st->l1sock.lock);
 596                ch->st->dev->D.ctrl(&ch->st->dev->D, CLOSE_CHANNEL, NULL);
 597                break;
 598        case ISDN_P_LAPD_TE:
 599                pch = get_channel4id(ch->st, ch->nr);
 600                if (pch) {
 601                        mutex_lock(&ch->st->lmutex);
 602                        list_del(&pch->list);
 603                        mutex_unlock(&ch->st->lmutex);
 604                        pch->ctrl(pch, CLOSE_CHANNEL, NULL);
 605                        pch = ch->st->dev->teimgr;
 606                        pch->ctrl(pch, CLOSE_CHANNEL, NULL);
 607                } else
 608                        printk(KERN_WARNING "%s: no l2 channel\n",
 609                               __func__);
 610                break;
 611        case ISDN_P_LAPD_NT:
 612                pch = ch->st->dev->teimgr;
 613                if (pch) {
 614                        pch->ctrl(pch, CLOSE_CHANNEL, NULL);
 615                } else
 616                        printk(KERN_WARNING "%s: no l2 channel\n",
 617                               __func__);
 618                break;
 619        default:
 620                break;
 621        }
 622        return;
 623}
 624
 625void
 626delete_stack(struct mISDNdevice *dev)
 627{
 628        struct mISDNstack       *st = dev->D.st;
 629        DECLARE_COMPLETION_ONSTACK(done);
 630
 631        if (*debug & DEBUG_CORE_FUNC)
 632                printk(KERN_DEBUG "%s: st(%s)\n", __func__,
 633                       dev_name(&st->dev->dev));
 634        if (dev->teimgr)
 635                delete_teimanager(dev->teimgr);
 636        if (st->thread) {
 637                if (st->notify) {
 638                        printk(KERN_WARNING "%s: notifier in use\n",
 639                               __func__);
 640                        complete(st->notify);
 641                }
 642                st->notify = &done;
 643                test_and_set_bit(mISDN_STACK_ABORT, &st->status);
 644                test_and_set_bit(mISDN_STACK_WAKEUP, &st->status);
 645                wake_up_interruptible(&st->workq);
 646                wait_for_completion(&done);
 647        }
 648        if (!list_empty(&st->layer2))
 649                printk(KERN_WARNING "%s: layer2 list not empty\n",
 650                       __func__);
 651        if (!hlist_empty(&st->l1sock.head))
 652                printk(KERN_WARNING "%s: layer1 list not empty\n",
 653                       __func__);
 654        kfree(st);
 655}
 656
 657void
 658mISDN_initstack(u_int *dp)
 659{
 660        debug = dp;
 661}
 662