cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stack.c (16518B)


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