/* $Id: capi.c,v 1.9.6.2 2001/09/23 22:24:32 kai Exp $
 *
 * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000.
 * CAPI encoder/decoder
 *
 * Author       Fritz Elfert
 * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 *
 * Thanks to Friedemann Baitinger and IBM Germany
 *
 */

#include "act2000.h"
#include "capi.h"

static actcapi_msgdsc valid_msg[] = {
	{{ 0x86, 0x02}, "DATA_B3_IND"},       /* DATA_B3_IND/CONF must be first because of speed!!! */
	{{ 0x86, 0x01}, "DATA_B3_CONF"},
	{{ 0x02, 0x01}, "CONNECT_CONF"},
	{{ 0x02, 0x02}, "CONNECT_IND"},
	{{ 0x09, 0x01}, "CONNECT_INFO_CONF"},
	{{ 0x03, 0x02}, "CONNECT_ACTIVE_IND"},
	{{ 0x04, 0x01}, "DISCONNECT_CONF"},
	{{ 0x04, 0x02}, "DISCONNECT_IND"},
	{{ 0x05, 0x01}, "LISTEN_CONF"},
	{{ 0x06, 0x01}, "GET_PARAMS_CONF"},
	{{ 0x07, 0x01}, "INFO_CONF"},
	{{ 0x07, 0x02}, "INFO_IND"},
	{{ 0x08, 0x01}, "DATA_CONF"},
	{{ 0x08, 0x02}, "DATA_IND"},
	{{ 0x40, 0x01}, "SELECT_B2_PROTOCOL_CONF"},
	{{ 0x80, 0x01}, "SELECT_B3_PROTOCOL_CONF"},
	{{ 0x81, 0x01}, "LISTEN_B3_CONF"},
	{{ 0x82, 0x01}, "CONNECT_B3_CONF"},
	{{ 0x82, 0x02}, "CONNECT_B3_IND"},
	{{ 0x83, 0x02}, "CONNECT_B3_ACTIVE_IND"},
	{{ 0x84, 0x01}, "DISCONNECT_B3_CONF"},
	{{ 0x84, 0x02}, "DISCONNECT_B3_IND"},
	{{ 0x85, 0x01}, "GET_B3_PARAMS_CONF"},
	{{ 0x01, 0x01}, "RESET_B3_CONF"},
	{{ 0x01, 0x02}, "RESET_B3_IND"},
	/* {{ 0x87, 0x02, "HANDSET_IND"}, not implemented */
	{{ 0xff, 0x01}, "MANUFACTURER_CONF"},
	{{ 0xff, 0x02}, "MANUFACTURER_IND"},
#ifdef DEBUG_MSG
	/* Requests */
	{{ 0x01, 0x00}, "RESET_B3_REQ"},
	{{ 0x02, 0x00}, "CONNECT_REQ"},
	{{ 0x04, 0x00}, "DISCONNECT_REQ"},
	{{ 0x05, 0x00}, "LISTEN_REQ"},
	{{ 0x06, 0x00}, "GET_PARAMS_REQ"},
	{{ 0x07, 0x00}, "INFO_REQ"},
	{{ 0x08, 0x00}, "DATA_REQ"},
	{{ 0x09, 0x00}, "CONNECT_INFO_REQ"},
	{{ 0x40, 0x00}, "SELECT_B2_PROTOCOL_REQ"},
	{{ 0x80, 0x00}, "SELECT_B3_PROTOCOL_REQ"},
	{{ 0x81, 0x00}, "LISTEN_B3_REQ"},
	{{ 0x82, 0x00}, "CONNECT_B3_REQ"},
	{{ 0x84, 0x00}, "DISCONNECT_B3_REQ"},
	{{ 0x85, 0x00}, "GET_B3_PARAMS_REQ"},
	{{ 0x86, 0x00}, "DATA_B3_REQ"},
	{{ 0xff, 0x00}, "MANUFACTURER_REQ"},
	/* Responses */
	{{ 0x01, 0x03}, "RESET_B3_RESP"},
	{{ 0x02, 0x03}, "CONNECT_RESP"},
	{{ 0x03, 0x03}, "CONNECT_ACTIVE_RESP"},
	{{ 0x04, 0x03}, "DISCONNECT_RESP"},
	{{ 0x07, 0x03}, "INFO_RESP"},
	{{ 0x08, 0x03}, "DATA_RESP"},
	{{ 0x82, 0x03}, "CONNECT_B3_RESP"},
	{{ 0x83, 0x03}, "CONNECT_B3_ACTIVE_RESP"},
	{{ 0x84, 0x03}, "DISCONNECT_B3_RESP"},
	{{ 0x86, 0x03}, "DATA_B3_RESP"},
	{{ 0xff, 0x03}, "MANUFACTURER_RESP"},
#endif
	{{ 0x00, 0x00}, NULL},
};
#define num_valid_imsg 27 /* MANUFACTURER_IND */

/*
 * Check for a valid incoming CAPI message.
 * Return:
 *   0 = Invalid message
 *   1 = Valid message, no B-Channel-data
 *   2 = Valid message, B-Channel-data
 */
int
actcapi_chkhdr(act2000_card *card, actcapi_msghdr *hdr)
{
	int i;

	if (hdr->applicationID != 1)
		return 0;
	if (hdr->len < 9)
		return 0;
	for (i = 0; i < num_valid_imsg; i++)
		if ((hdr->cmd.cmd == valid_msg[i].cmd.cmd) &&
		    (hdr->cmd.subcmd == valid_msg[i].cmd.subcmd)) {
			return (i ? 1 : 2);
		}
	return 0;
}

#define ACTCAPI_MKHDR(l, c, s) {				\
		skb = alloc_skb(l + 8, GFP_ATOMIC);		\
		if (skb) {					\
			m = (actcapi_msg *)skb_put(skb, l + 8); \
			m->hdr.len = l + 8;			\
			m->hdr.applicationID = 1;		\
			m->hdr.cmd.cmd = c;			\
			m->hdr.cmd.subcmd = s;			\
			m->hdr.msgnum = actcapi_nextsmsg(card); \
		} else m = NULL;				\
	}

#define ACTCAPI_CHKSKB if (!skb) {					\
		printk(KERN_WARNING "actcapi: alloc_skb failed\n");	\
		return;							\
	}

#define ACTCAPI_QUEUE_TX {				\
		actcapi_debug_msg(skb, 1);		\
		skb_queue_tail(&card->sndq, skb);	\
		act2000_schedule_tx(card);		\
	}

int
actcapi_listen_req(act2000_card *card)
{
	__u16 eazmask = 0;
	int i;
	actcapi_msg *m;
	struct sk_buff *skb;

	for (i = 0; i < ACT2000_BCH; i++)
		eazmask |= card->bch[i].eazmask;
	ACTCAPI_MKHDR(9, 0x05, 0x00);
	if (!skb) {
		printk(KERN_WARNING "actcapi: alloc_skb failed\n");
		return -ENOMEM;
	}
	m->msg.listen_req.controller = 0;
	m->msg.listen_req.infomask = 0x3f; /* All information */
	m->msg.listen_req.eazmask = eazmask;
	m->msg.listen_req.simask = (eazmask) ? 0x86 : 0; /* All SI's  */
	ACTCAPI_QUEUE_TX;
	return 0;
}

int
actcapi_connect_req(act2000_card *card, act2000_chan *chan, char *phone,
		    char eaz, int si1, int si2)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR((11 + strlen(phone)), 0x02, 0x00);
	if (!skb) {
		printk(KERN_WARNING "actcapi: alloc_skb failed\n");
		chan->fsm_state = ACT2000_STATE_NULL;
		return -ENOMEM;
	}
	m->msg.connect_req.controller = 0;
	m->msg.connect_req.bchan = 0x83;
	m->msg.connect_req.infomask = 0x3f;
	m->msg.connect_req.si1 = si1;
	m->msg.connect_req.si2 = si2;
	m->msg.connect_req.eaz = eaz ? eaz : '0';
	m->msg.connect_req.addr.len = strlen(phone) + 1;
	m->msg.connect_req.addr.tnp = 0x81;
	memcpy(m->msg.connect_req.addr.num, phone, strlen(phone));
	chan->callref = m->hdr.msgnum;
	ACTCAPI_QUEUE_TX;
	return 0;
}

static void
actcapi_connect_b3_req(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(17, 0x82, 0x00);
	ACTCAPI_CHKSKB;
	m->msg.connect_b3_req.plci = chan->plci;
	memset(&m->msg.connect_b3_req.ncpi, 0,
	       sizeof(m->msg.connect_b3_req.ncpi));
	m->msg.connect_b3_req.ncpi.len = 13;
	m->msg.connect_b3_req.ncpi.modulo = 8;
	ACTCAPI_QUEUE_TX;
}

/*
 * Set net type (1TR6) or (EDSS1)
 */
int
actcapi_manufacturer_req_net(act2000_card *card)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(5, 0xff, 0x00);
	if (!skb) {
		printk(KERN_WARNING "actcapi: alloc_skb failed\n");
		return -ENOMEM;
	}
	m->msg.manufacturer_req_net.manuf_msg = 0x11;
	m->msg.manufacturer_req_net.controller = 1;
	m->msg.manufacturer_req_net.nettype = (card->ptype == ISDN_PTYPE_EURO) ? 1 : 0;
	ACTCAPI_QUEUE_TX;
	printk(KERN_INFO "act2000 %s: D-channel protocol now %s\n",
	       card->interface.id, (card->ptype == ISDN_PTYPE_EURO) ? "euro" : "1tr6");
	card->interface.features &=
		~(ISDN_FEATURE_P_UNKNOWN | ISDN_FEATURE_P_EURO | ISDN_FEATURE_P_1TR6);
	card->interface.features |=
		((card->ptype == ISDN_PTYPE_EURO) ? ISDN_FEATURE_P_EURO : ISDN_FEATURE_P_1TR6);
	return 0;
}

/*
 * Switch V.42 on or off
 */
#if 0
int
actcapi_manufacturer_req_v42(act2000_card *card, ulong arg)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(8, 0xff, 0x00);
	if (!skb) {

		printk(KERN_WARNING "actcapi: alloc_skb failed\n");
		return -ENOMEM;
	}
	m->msg.manufacturer_req_v42.manuf_msg = 0x10;
	m->msg.manufacturer_req_v42.controller = 0;
	m->msg.manufacturer_req_v42.v42control = (arg ? 1 : 0);
	ACTCAPI_QUEUE_TX;
	return 0;
}
#endif  /*  0  */

/*
 * Set error-handler
 */
int
actcapi_manufacturer_req_errh(act2000_card *card)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(4, 0xff, 0x00);
	if (!skb) {

		printk(KERN_WARNING "actcapi: alloc_skb failed\n");
		return -ENOMEM;
	}
	m->msg.manufacturer_req_err.manuf_msg = 0x03;
	m->msg.manufacturer_req_err.controller = 0;
	ACTCAPI_QUEUE_TX;
	return 0;
}

/*
 * Set MSN-Mapping.
 */
int
actcapi_manufacturer_req_msn(act2000_card *card)
{
	msn_entry *p = card->msn_list;
	actcapi_msg *m;
	struct sk_buff *skb;
	int len;

	while (p) {
		int i;

		len = strlen(p->msn);
		for (i = 0; i < 2; i++) {
			ACTCAPI_MKHDR(6 + len, 0xff, 0x00);
			if (!skb) {
				printk(KERN_WARNING "actcapi: alloc_skb failed\n");
				return -ENOMEM;
			}
			m->msg.manufacturer_req_msn.manuf_msg = 0x13 + i;
			m->msg.manufacturer_req_msn.controller = 0;
			m->msg.manufacturer_req_msn.msnmap.eaz = p->eaz;
			m->msg.manufacturer_req_msn.msnmap.len = len;
			memcpy(m->msg.manufacturer_req_msn.msnmap.msn, p->msn, len);
			ACTCAPI_QUEUE_TX;
		}
		p = p->next;
	}
	return 0;
}

void
actcapi_select_b2_protocol_req(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(10, 0x40, 0x00);
	ACTCAPI_CHKSKB;
	m->msg.select_b2_protocol_req.plci = chan->plci;
	memset(&m->msg.select_b2_protocol_req.dlpd, 0,
	       sizeof(m->msg.select_b2_protocol_req.dlpd));
	m->msg.select_b2_protocol_req.dlpd.len = 6;
	switch (chan->l2prot) {
	case ISDN_PROTO_L2_TRANS:
		m->msg.select_b2_protocol_req.protocol = 0x03;
		m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
		break;
	case ISDN_PROTO_L2_HDLC:
		m->msg.select_b2_protocol_req.protocol = 0x02;
		m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
		break;
	case ISDN_PROTO_L2_X75I:
	case ISDN_PROTO_L2_X75UI:
	case ISDN_PROTO_L2_X75BUI:
		m->msg.select_b2_protocol_req.protocol = 0x01;
		m->msg.select_b2_protocol_req.dlpd.dlen = 4000;
		m->msg.select_b2_protocol_req.dlpd.laa = 3;
		m->msg.select_b2_protocol_req.dlpd.lab = 1;
		m->msg.select_b2_protocol_req.dlpd.win = 7;
		m->msg.select_b2_protocol_req.dlpd.modulo = 8;
		break;
	}
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_select_b3_protocol_req(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(17, 0x80, 0x00);
	ACTCAPI_CHKSKB;
	m->msg.select_b3_protocol_req.plci = chan->plci;
	memset(&m->msg.select_b3_protocol_req.ncpd, 0,
	       sizeof(m->msg.select_b3_protocol_req.ncpd));
	switch (chan->l3prot) {
	case ISDN_PROTO_L3_TRANS:
		m->msg.select_b3_protocol_req.protocol = 0x04;
		m->msg.select_b3_protocol_req.ncpd.len = 13;
		m->msg.select_b3_protocol_req.ncpd.modulo = 8;
		break;
	}
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_listen_b3_req(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(2, 0x81, 0x00);
	ACTCAPI_CHKSKB;
	m->msg.listen_b3_req.plci = chan->plci;
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_disconnect_req(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(3, 0x04, 0x00);
	ACTCAPI_CHKSKB;
	m->msg.disconnect_req.plci = chan->plci;
	m->msg.disconnect_req.cause = 0;
	ACTCAPI_QUEUE_TX;
}

void
actcapi_disconnect_b3_req(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(17, 0x84, 0x00);
	ACTCAPI_CHKSKB;
	m->msg.disconnect_b3_req.ncci = chan->ncci;
	memset(&m->msg.disconnect_b3_req.ncpi, 0,
	       sizeof(m->msg.disconnect_b3_req.ncpi));
	m->msg.disconnect_b3_req.ncpi.len = 13;
	m->msg.disconnect_b3_req.ncpi.modulo = 8;
	chan->fsm_state = ACT2000_STATE_BHWAIT;
	ACTCAPI_QUEUE_TX;
}

void
actcapi_connect_resp(act2000_card *card, act2000_chan *chan, __u8 cause)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(3, 0x02, 0x03);
	ACTCAPI_CHKSKB;
	m->msg.connect_resp.plci = chan->plci;
	m->msg.connect_resp.rejectcause = cause;
	if (cause) {
		chan->fsm_state = ACT2000_STATE_NULL;
		chan->plci = 0x8000;
	} else
		chan->fsm_state = ACT2000_STATE_IWAIT;
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_connect_active_resp(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(2, 0x03, 0x03);
	ACTCAPI_CHKSKB;
	m->msg.connect_resp.plci = chan->plci;
	if (chan->fsm_state == ACT2000_STATE_IWAIT)
		chan->fsm_state = ACT2000_STATE_IBWAIT;
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_connect_b3_resp(act2000_card *card, act2000_chan *chan, __u8 rejectcause)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR((rejectcause ? 3 : 17), 0x82, 0x03);
	ACTCAPI_CHKSKB;
	m->msg.connect_b3_resp.ncci = chan->ncci;
	m->msg.connect_b3_resp.rejectcause = rejectcause;
	if (!rejectcause) {
		memset(&m->msg.connect_b3_resp.ncpi, 0,
		       sizeof(m->msg.connect_b3_resp.ncpi));
		m->msg.connect_b3_resp.ncpi.len = 13;
		m->msg.connect_b3_resp.ncpi.modulo = 8;
		chan->fsm_state = ACT2000_STATE_BWAIT;
	}
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_connect_b3_active_resp(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(2, 0x83, 0x03);
	ACTCAPI_CHKSKB;
	m->msg.connect_b3_active_resp.ncci = chan->ncci;
	chan->fsm_state = ACT2000_STATE_ACTIVE;
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_info_resp(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(2, 0x07, 0x03);
	ACTCAPI_CHKSKB;
	m->msg.info_resp.plci = chan->plci;
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_disconnect_b3_resp(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(2, 0x84, 0x03);
	ACTCAPI_CHKSKB;
	m->msg.disconnect_b3_resp.ncci = chan->ncci;
	chan->ncci = 0x8000;
	chan->queued = 0;
	ACTCAPI_QUEUE_TX;
}

static void
actcapi_disconnect_resp(act2000_card *card, act2000_chan *chan)
{
	actcapi_msg *m;
	struct sk_buff *skb;

	ACTCAPI_MKHDR(2, 0x04, 0x03);
	ACTCAPI_CHKSKB;
	m->msg.disconnect_resp.plci = chan->plci;
	chan->plci = 0x8000;
	ACTCAPI_QUEUE_TX;
}

static int
new_plci(act2000_card *card, __u16 plci)
{
	int i;
	for (i = 0; i < ACT2000_BCH; i++)
		if (card->bch[i].plci == 0x8000) {
			card->bch[i].plci = plci;
			return i;
		}
	return -1;
}

static int
find_plci(act2000_card *card, __u16 plci)
{
	int i;
	for (i = 0; i < ACT2000_BCH; i++)
		if (card->bch[i].plci == plci)
			return i;
	return -1;
}

static int
find_ncci(act2000_card *card, __u16 ncci)
{
	int i;
	for (i = 0; i < ACT2000_BCH; i++)
		if (card->bch[i].ncci == ncci)
			return i;
	return -1;
}

static int
find_dialing(act2000_card *card, __u16 callref)
{
	int i;
	for (i = 0; i < ACT2000_BCH; i++)
		if ((card->bch[i].callref == callref) &&
		    (card->bch[i].fsm_state == ACT2000_STATE_OCALL))
			return i;
	return -1;
}

static int
actcapi_data_b3_ind(act2000_card *card, struct sk_buff *skb) {
	__u16 plci;
	__u16 ncci;
	__u16 controller;
	__u8  blocknr;
	int chan;
	actcapi_msg *msg = (actcapi_msg *)skb->data;

	EVAL_NCCI(msg->msg.data_b3_ind.fakencci, plci, controller, ncci);
	chan = find_ncci(card, ncci);
	if (chan < 0)
		return 0;
	if (card->bch[chan].fsm_state != ACT2000_STATE_ACTIVE)
		return 0;
	if (card->bch[chan].plci != plci)
		return 0;
	blocknr = msg->msg.data_b3_ind.blocknr;
	skb_pull(skb, 19);
	card->interface.rcvcallb_skb(card->myid, chan, skb);
	if (!(skb = alloc_skb(11, GFP_ATOMIC))) {
		printk(KERN_WARNING "actcapi: alloc_skb failed\n");
		return 1;
	}
	msg = (actcapi_msg *)skb_put(skb, 11);
	msg->hdr.len = 11;
	msg->hdr.applicationID = 1;
	msg->hdr.cmd.cmd = 0x86;
	msg->hdr.cmd.subcmd = 0x03;
	msg->hdr.msgnum = actcapi_nextsmsg(card);
	msg->msg.data_b3_resp.ncci = ncci;
	msg->msg.data_b3_resp.blocknr = blocknr;
	ACTCAPI_QUEUE_TX;
	return 1;
}

/*
 * Walk over ackq, unlink DATA_B3_REQ from it, if
 * ncci and blocknr are matching.
 * Decrement queued-bytes counter.
 */
static int
handle_ack(act2000_card *card, act2000_chan *chan, __u8 blocknr) {
	unsigned long flags;
	struct sk_buff *skb;
	struct sk_buff *tmp;
	struct actcapi_msg *m;
	int ret = 0;

	spin_lock_irqsave(&card->lock, flags);
	skb = skb_peek(&card->ackq);
	spin_unlock_irqrestore(&card->lock, flags);
	if (!skb) {
		printk(KERN_WARNING "act2000: handle_ack nothing found!\n");
		return 0;
	}
	tmp = skb;
	while (1) {
		m = (actcapi_msg *)tmp->data;
		if ((((m->msg.data_b3_req.fakencci >> 8) & 0xff) == chan->ncci) &&
		    (m->msg.data_b3_req.blocknr == blocknr)) {
			/* found corresponding DATA_B3_REQ */
			skb_unlink(tmp, &card->ackq);
			chan->queued -= m->msg.data_b3_req.datalen;
			if (m->msg.data_b3_req.flags)
				ret = m->msg.data_b3_req.datalen;
			dev_kfree_skb(tmp);
			if (chan->queued < 0)
				chan->queued = 0;
			return ret;
		}
		spin_lock_irqsave(&card->lock, flags);
		tmp = skb_peek((struct sk_buff_head *)tmp);
		spin_unlock_irqrestore(&card->lock, flags);
		if ((tmp == skb) || (tmp == NULL)) {
			/* reached end of queue */
			printk(KERN_WARNING "act2000: handle_ack nothing found!\n");
			return 0;
		}
	}
}

void
actcapi_dispatch(struct work_struct *work)
{
	struct act2000_card *card =
		container_of(work, struct act2000_card, rcv_tq);
	struct sk_buff *skb;
	actcapi_msg *msg;
	__u16 ccmd;
	int chan;
	int len;
	act2000_chan *ctmp;
	isdn_ctrl cmd;
	char tmp[170];

	while ((skb = skb_dequeue(&card->rcvq))) {
		actcapi_debug_msg(skb, 0);
		msg = (actcapi_msg *)skb->data;
		ccmd = ((msg->hdr.cmd.cmd << 8) | msg->hdr.cmd.subcmd);
		switch (ccmd) {
		case 0x8602:
			/* DATA_B3_IND */
			if (actcapi_data_b3_ind(card, skb))
				return;
			break;
		case 0x8601:
			/* DATA_B3_CONF */
			chan = find_ncci(card, msg->msg.data_b3_conf.ncci);
			if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_ACTIVE)) {
				if (msg->msg.data_b3_conf.info != 0)
					printk(KERN_WARNING "act2000: DATA_B3_CONF: %04x\n",
					       msg->msg.data_b3_conf.info);
				len = handle_ack(card, &card->bch[chan],
						 msg->msg.data_b3_conf.blocknr);
				if (len) {
					cmd.driver = card->myid;
					cmd.command = ISDN_STAT_BSENT;
					cmd.arg = chan;
					cmd.parm.length = len;
					card->interface.statcallb(&cmd);
				}
			}
			break;
		case 0x0201:
			/* CONNECT_CONF */
			chan = find_dialing(card, msg->hdr.msgnum);
			if (chan >= 0) {
				if (msg->msg.connect_conf.info) {
					card->bch[chan].fsm_state = ACT2000_STATE_NULL;
					cmd.driver = card->myid;
					cmd.command = ISDN_STAT_DHUP;
					cmd.arg = chan;
					card->interface.statcallb(&cmd);
				} else {
					card->bch[chan].fsm_state = ACT2000_STATE_OWAIT;
					card->bch[chan].plci = msg->msg.connect_conf.plci;
				}
			}
			break;
		case 0x0202:
			/* CONNECT_IND */
			chan = new_plci(card, msg->msg.connect_ind.plci);
			if (chan < 0) {
				ctmp = (act2000_chan *)tmp;
				ctmp->plci = msg->msg.connect_ind.plci;
				actcapi_connect_resp(card, ctmp, 0x11); /* All Card-Cannels busy */
			} else {
				card->bch[chan].fsm_state = ACT2000_STATE_ICALL;
				cmd.driver = card->myid;
				cmd.command = ISDN_STAT_ICALL;
				cmd.arg = chan;
				cmd.parm.setup.si1 = msg->msg.connect_ind.si1;
				cmd.parm.setup.si2 = msg->msg.connect_ind.si2;
				if (card->ptype == ISDN_PTYPE_EURO)
					strcpy(cmd.parm.setup.eazmsn,
					       act2000_find_eaz(card, msg->msg.connect_ind.eaz));
				else {
					cmd.parm.setup.eazmsn[0] = msg->msg.connect_ind.eaz;
					cmd.parm.setup.eazmsn[1] = 0;
				}
				memset(cmd.parm.setup.phone, 0, sizeof(cmd.parm.setup.phone));
				memcpy(cmd.parm.setup.phone, msg->msg.connect_ind.addr.num,
				       msg->msg.connect_ind.addr.len - 1);
				cmd.parm.setup.plan = msg->msg.connect_ind.addr.tnp;
				cmd.parm.setup.screen = 0;
				if (card->interface.statcallb(&cmd) == 2)
					actcapi_connect_resp(card, &card->bch[chan], 0x15); /* Reject Call */
			}
			break;
		case 0x0302:
			/* CONNECT_ACTIVE_IND */
			chan = find_plci(card, msg->msg.connect_active_ind.plci);
			if (chan >= 0)
				switch (card->bch[chan].fsm_state) {
				case ACT2000_STATE_IWAIT:
					actcapi_connect_active_resp(card, &card->bch[chan]);
					break;
				case ACT2000_STATE_OWAIT:
					actcapi_connect_active_resp(card, &card->bch[chan]);
					actcapi_select_b2_protocol_req(card, &card->bch[chan]);
					break;
				}
			break;
		case 0x8202:
			/* CONNECT_B3_IND */
			chan = find_plci(card, msg->msg.connect_b3_ind.plci);
			if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_IBWAIT)) {
				card->bch[chan].ncci = msg->msg.connect_b3_ind.ncci;
				actcapi_connect_b3_resp(card, &card->bch[chan], 0);
			} else {
				ctmp = (act2000_chan *)tmp;
				ctmp->ncci = msg->msg.connect_b3_ind.ncci;
				actcapi_connect_b3_resp(card, ctmp, 0x11); /* All Card-Cannels busy */
			}
			break;
		case 0x8302:
			/* CONNECT_B3_ACTIVE_IND */
			chan = find_ncci(card, msg->msg.connect_b3_active_ind.ncci);
			if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_BWAIT)) {
				actcapi_connect_b3_active_resp(card, &card->bch[chan]);
				cmd.driver = card->myid;
				cmd.command = ISDN_STAT_BCONN;
				cmd.arg = chan;
				card->interface.statcallb(&cmd);
			}
			break;
		case 0x8402:
			/* DISCONNECT_B3_IND */
			chan = find_ncci(card, msg->msg.disconnect_b3_ind.ncci);
			if (chan >= 0) {
				ctmp = &card->bch[chan];
				actcapi_disconnect_b3_resp(card, ctmp);
				switch (ctmp->fsm_state) {
				case ACT2000_STATE_ACTIVE:
					ctmp->fsm_state = ACT2000_STATE_DHWAIT2;
					cmd.driver = card->myid;
					cmd.command = ISDN_STAT_BHUP;
					cmd.arg = chan;
					card->interface.statcallb(&cmd);
					break;
				case ACT2000_STATE_BHWAIT2:
					actcapi_disconnect_req(card, ctmp);
					ctmp->fsm_state = ACT2000_STATE_DHWAIT;
					cmd.driver = card->myid;
					cmd.command = ISDN_STAT_BHUP;
					cmd.arg = chan;
					card->interface.statcallb(&cmd);
					break;
				}
			}
			break;
		case 0x0402:
			/* DISCONNECT_IND */
			chan = find_plci(card, msg->msg.disconnect_ind.plci);
			if (chan >= 0) {
				ctmp = &card->bch[chan];
				actcapi_disconnect_resp(card, ctmp);
				ctmp->fsm_state = ACT2000_STATE_NULL;
				cmd.driver = card->myid;
				cmd.command = ISDN_STAT_DHUP;
				cmd.arg = chan;
				card->interface.statcallb(&cmd);
			} else {
				ctmp = (act2000_chan *)tmp;
				ctmp->plci = msg->msg.disconnect_ind.plci;
				actcapi_disconnect_resp(card, ctmp);
			}
			break;
		case 0x4001:
			/* SELECT_B2_PROTOCOL_CONF */
			chan = find_plci(card, msg->msg.select_b2_protocol_conf.plci);
			if (chan >= 0)
				switch (card->bch[chan].fsm_state) {
				case ACT2000_STATE_ICALL:
				case ACT2000_STATE_OWAIT:
					ctmp = &card->bch[chan];
					if (msg->msg.select_b2_protocol_conf.info == 0)
						actcapi_select_b3_protocol_req(card, ctmp);
					else {
						ctmp->fsm_state = ACT2000_STATE_NULL;
						cmd.driver = card->myid;
						cmd.command = ISDN_STAT_DHUP;
						cmd.arg = chan;
						card->interface.statcallb(&cmd);
					}
					break;
				}
			break;
		case 0x8001:
			/* SELECT_B3_PROTOCOL_CONF */
			chan = find_plci(card, msg->msg.select_b3_protocol_conf.plci);
			if (chan >= 0)
				switch (card->bch[chan].fsm_state) {
				case ACT2000_STATE_ICALL:
				case ACT2000_STATE_OWAIT:
					ctmp = &card->bch[chan];
					if (msg->msg.select_b3_protocol_conf.info == 0)
						actcapi_listen_b3_req(card, ctmp);
					else {
						ctmp->fsm_state = ACT2000_STATE_NULL;
						cmd.driver = card->myid;
						cmd.command = ISDN_STAT_DHUP;
						cmd.arg = chan;
						card->interface.statcallb(&cmd);
					}
				}
			break;
		case 0x8101:
			/* LISTEN_B3_CONF */
			chan = find_plci(card, msg->msg.listen_b3_conf.plci);
			if (chan >= 0)
				switch (card->bch[chan].fsm_state) {
				case ACT2000_STATE_ICALL:
					ctmp = &card->bch[chan];
					if (msg->msg.listen_b3_conf.info == 0)
						actcapi_connect_resp(card, ctmp, 0);
					else {
						ctmp->fsm_state = ACT2000_STATE_NULL;
						cmd.driver = card->myid;
						cmd.command = ISDN_STAT_DHUP;
						cmd.arg = chan;
						card->interface.statcallb(&cmd);
					}
					break;
				case ACT2000_STATE_OWAIT:
					ctmp = &card->bch[chan];
					if (msg->msg.listen_b3_conf.info == 0) {
						actcapi_connect_b3_req(card, ctmp);
						ctmp->fsm_state = ACT2000_STATE_OBWAIT;
						cmd.driver = card->myid;
						cmd.command = ISDN_STAT_DCONN;
						cmd.arg = chan;
						card->interface.statcallb(&cmd);
					} else {
						ctmp->fsm_state = ACT2000_STATE_NULL;
						cmd.driver = card->myid;
						cmd.command = ISDN_STAT_DHUP;
						cmd.arg = chan;
						card->interface.statcallb(&cmd);
					}
					break;
				}
			break;
		case 0x8201:
			/* CONNECT_B3_CONF */
			chan = find_plci(card, msg->msg.connect_b3_conf.plci);
			if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_OBWAIT)) {
				ctmp = &card->bch[chan];
				if (msg->msg.connect_b3_conf.info) {
					ctmp->fsm_state = ACT2000_STATE_NULL;
					cmd.driver = card->myid;
					cmd.command = ISDN_STAT_DHUP;
					cmd.arg = chan;
					card->interface.statcallb(&cmd);
				} else {
					ctmp->ncci = msg->msg.connect_b3_conf.ncci;
					ctmp->fsm_state = ACT2000_STATE_BWAIT;
				}
			}
			break;
		case 0x8401:
			/* DISCONNECT_B3_CONF */
			chan = find_ncci(card, msg->msg.disconnect_b3_conf.ncci);
			if ((chan >= 0) && (card->bch[chan].fsm_state == ACT2000_STATE_BHWAIT))
				card->bch[chan].fsm_state = ACT2000_STATE_BHWAIT2;
			break;
		case 0x0702:
			/* INFO_IND */
			chan = find_plci(card, msg->msg.info_ind.plci);
			if (chan >= 0)
				/* TODO: Eval Charging info / cause */
				actcapi_info_resp(card, &card->bch[chan]);
			break;
		case 0x0401:
			/* LISTEN_CONF */
		case 0x0501:
			/* LISTEN_CONF */
		case 0xff01:
			/* MANUFACTURER_CONF */
			break;
		case 0xff02:
			/* MANUFACTURER_IND */
			if (msg->msg.manuf_msg == 3) {
				memset(tmp, 0, sizeof(tmp));
				strncpy(tmp,
					&msg->msg.manufacturer_ind_err.errstring,
					msg->hdr.len - 16);
				if (msg->msg.manufacturer_ind_err.errcode)
					printk(KERN_WARNING "act2000: %s\n", tmp);
				else {
					printk(KERN_DEBUG "act2000: %s\n", tmp);
					if ((!strncmp(tmp, "INFO: Trace buffer con", 22)) ||
					    (!strncmp(tmp, "INFO: Compile Date/Tim", 22))) {
						card->flags |= ACT2000_FLAGS_RUNNING;
						cmd.command = ISDN_STAT_RUN;
						cmd.driver = card->myid;
						cmd.arg = 0;
						actcapi_manufacturer_req_net(card);
						actcapi_manufacturer_req_msn(card);
						actcapi_listen_req(card);
						card->interface.statcallb(&cmd);
					}
				}
			}
			break;
		default:
			printk(KERN_WARNING "act2000: UNHANDLED Message %04x\n", ccmd);
			break;
		}
		dev_kfree_skb(skb);
	}
}

#ifdef DEBUG_MSG
static void
actcapi_debug_caddr(actcapi_addr *addr)
{
	char tmp[30];

	printk(KERN_DEBUG " Alen  = %d\n", addr->len);
	if (addr->len > 0)
		printk(KERN_DEBUG " Atnp  = 0x%02x\n", addr->tnp);
	if (addr->len > 1) {
		memset(tmp, 0, 30);
		memcpy(tmp, addr->num, addr->len - 1);
		printk(KERN_DEBUG " Anum  = '%s'\n", tmp);
	}
}

static void
actcapi_debug_ncpi(actcapi_ncpi *ncpi)
{
	printk(KERN_DEBUG " ncpi.len = %d\n", ncpi->len);
	if (ncpi->len >= 2)
		printk(KERN_DEBUG " ncpi.lic = 0x%04x\n", ncpi->lic);
	if (ncpi->len >= 4)
		printk(KERN_DEBUG " ncpi.hic = 0x%04x\n", ncpi->hic);
	if (ncpi->len >= 6)
		printk(KERN_DEBUG " ncpi.ltc = 0x%04x\n", ncpi->ltc);
	if (ncpi->len >= 8)
		printk(KERN_DEBUG " ncpi.htc = 0x%04x\n", ncpi->htc);
	if (ncpi->len >= 10)
		printk(KERN_DEBUG " ncpi.loc = 0x%04x\n", ncpi->loc);
	if (ncpi->len >= 12)
		printk(KERN_DEBUG " ncpi.hoc = 0x%04x\n", ncpi->hoc);
	if (ncpi->len >= 13)
		printk(KERN_DEBUG " ncpi.mod = %d\n", ncpi->modulo);
}

static void
actcapi_debug_dlpd(actcapi_dlpd *dlpd)
{
	printk(KERN_DEBUG " dlpd.len = %d\n", dlpd->len);
	if (dlpd->len >= 2)
		printk(KERN_DEBUG " dlpd.dlen   = 0x%04x\n", dlpd->dlen);
	if (dlpd->len >= 3)
		printk(KERN_DEBUG " dlpd.laa    = 0x%02x\n", dlpd->laa);
	if (dlpd->len >= 4)
		printk(KERN_DEBUG " dlpd.lab    = 0x%02x\n", dlpd->lab);
	if (dlpd->len >= 5)
		printk(KERN_DEBUG " dlpd.modulo = %d\n", dlpd->modulo);
	if (dlpd->len >= 6)
		printk(KERN_DEBUG " dlpd.win    = %d\n", dlpd->win);
}

#ifdef DEBUG_DUMP_SKB
static void dump_skb(struct sk_buff *skb) {
	char tmp[80];
	char *p = skb->data;
	char *t = tmp;
	int i;

	for (i = 0; i < skb->len; i++) {
		t += sprintf(t, "%02x ", *p++ & 0xff);
		if ((i & 0x0f) == 8) {
			printk(KERN_DEBUG "dump: %s\n", tmp);
			t = tmp;
		}
	}
	if (i & 0x07)
		printk(KERN_DEBUG "dump: %s\n", tmp);
}
#endif

void
actcapi_debug_msg(struct sk_buff *skb, int direction)
{
	actcapi_msg *msg = (actcapi_msg *)skb->data;
	char *descr;
	int i;
	char tmp[170];

#ifndef DEBUG_DATA_MSG
	if (msg->hdr.cmd.cmd == 0x86)
		return;
#endif
	descr = "INVALID";
#ifdef DEBUG_DUMP_SKB
	dump_skb(skb);
#endif
	for (i = 0; i < ARRAY_SIZE(valid_msg); i++)
		if ((msg->hdr.cmd.cmd == valid_msg[i].cmd.cmd) &&
		    (msg->hdr.cmd.subcmd == valid_msg[i].cmd.subcmd)) {
			descr = valid_msg[i].description;
			break;
		}
	printk(KERN_DEBUG "%s %s msg\n", direction ? "Outgoing" : "Incoming", descr);
	printk(KERN_DEBUG " ApplID = %d\n", msg->hdr.applicationID);
	printk(KERN_DEBUG " Len    = %d\n", msg->hdr.len);
	printk(KERN_DEBUG " MsgNum = 0x%04x\n", msg->hdr.msgnum);
	printk(KERN_DEBUG " Cmd    = 0x%02x\n", msg->hdr.cmd.cmd);
	printk(KERN_DEBUG " SubCmd = 0x%02x\n", msg->hdr.cmd.subcmd);
	switch (i) {
	case 0:
		/* DATA B3 IND */
		printk(KERN_DEBUG " BLOCK = 0x%02x\n",
		       msg->msg.data_b3_ind.blocknr);
		break;
	case 2:
		/* CONNECT CONF */
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.connect_conf.plci);
		printk(KERN_DEBUG " Info = 0x%04x\n",
		       msg->msg.connect_conf.info);
		break;
	case 3:
		/* CONNECT IND */
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.connect_ind.plci);
		printk(KERN_DEBUG " Contr = %d\n",
		       msg->msg.connect_ind.controller);
		printk(KERN_DEBUG " SI1   = %d\n",
		       msg->msg.connect_ind.si1);
		printk(KERN_DEBUG " SI2   = %d\n",
		       msg->msg.connect_ind.si2);
		printk(KERN_DEBUG " EAZ   = '%c'\n",
		       msg->msg.connect_ind.eaz);
		actcapi_debug_caddr(&msg->msg.connect_ind.addr);
		break;
	case 5:
		/* CONNECT ACTIVE IND */
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.connect_active_ind.plci);
		actcapi_debug_caddr(&msg->msg.connect_active_ind.addr);
		break;
	case 8:
		/* LISTEN CONF */
		printk(KERN_DEBUG " Contr = %d\n",
		       msg->msg.listen_conf.controller);
		printk(KERN_DEBUG " Info = 0x%04x\n",
		       msg->msg.listen_conf.info);
		break;
	case 11:
		/* INFO IND */
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.info_ind.plci);
		printk(KERN_DEBUG " Imsk = 0x%04x\n",
		       msg->msg.info_ind.nr.mask);
		if (msg->hdr.len > 12) {
			int l = msg->hdr.len - 12;
			int j;
			char *p = tmp;
			for (j = 0; j < l; j++)
				p += sprintf(p, "%02x ", msg->msg.info_ind.el.display[j]);
			printk(KERN_DEBUG " D = '%s'\n", tmp);
		}
		break;
	case 14:
		/* SELECT B2 PROTOCOL CONF */
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.select_b2_protocol_conf.plci);
		printk(KERN_DEBUG " Info = 0x%04x\n",
		       msg->msg.select_b2_protocol_conf.info);
		break;
	case 15:
		/* SELECT B3 PROTOCOL CONF */
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.select_b3_protocol_conf.plci);
		printk(KERN_DEBUG " Info = 0x%04x\n",
		       msg->msg.select_b3_protocol_conf.info);
		break;
	case 16:
		/* LISTEN B3 CONF */
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.listen_b3_conf.plci);
		printk(KERN_DEBUG " Info = 0x%04x\n",
		       msg->msg.listen_b3_conf.info);
		break;
	case 18:
		/* CONNECT B3 IND */
		printk(KERN_DEBUG " NCCI = 0x%04x\n",
		       msg->msg.connect_b3_ind.ncci);
		printk(KERN_DEBUG " PLCI = 0x%04x\n",
		       msg->msg.connect_b3_ind.plci);
		actcapi_debug_ncpi(&msg->msg.connect_b3_ind.ncpi);
		break;
	case 19:
		/* CONNECT B3 ACTIVE IND */
		printk(KERN_DEBUG " NCCI = 0x%04x\n",
		       msg->msg.connect_b3_active_ind.ncci);
		actcapi_debug_ncpi(&msg->msg.connect_b3_active_ind.ncpi);
		break;
	case 26:
		/* MANUFACTURER IND */
		printk(KERN_DEBUG " Mmsg = 0x%02x\n",
		       msg->msg.manufacturer_ind_err.manuf_msg);
		switch (msg->msg.manufacturer_ind_err.manuf_msg) {
		case 3:
			printk(KERN_DEBUG " Contr = %d\n",
			       msg->msg.manufacturer_ind_err.controller);
			printk(KERN_DEBUG " Code = 0x%08x\n",
			       msg->msg.manufacturer_ind_err.errcode);
			memset(tmp, 0, sizeof(tmp));
			strncpy(tmp, &msg->msg.manufacturer_ind_err.errstring,
				msg->hdr.len - 16);
			printk(KERN_DEBUG " Emsg = '%s'\n", tmp);
			break;
		}
		break;
	case 30:
		/* LISTEN REQ */
		printk(KERN_DEBUG " Imsk = 0x%08x\n",
		       msg->msg.listen_req.infomask);
		printk(KERN_DEBUG " Emsk = 0x%04x\n",
		       msg->msg.listen_req.eazmask);
		printk(KERN_DEBUG " Smsk = 0x%04x\n",
		       msg->msg.listen_req.simask);
		break;
	case 35:
		/* SELECT_B2_PROTOCOL_REQ */
		printk(KERN_DEBUG " PLCI  = 0x%04x\n",
		       msg->msg.select_b2_protocol_req.plci);
		printk(KERN_DEBUG " prot  = 0x%02x\n",
		       msg->msg.select_b2_protocol_req.protocol);
		if (msg->hdr.len >= 11)
			printk(KERN_DEBUG "No dlpd\n");
		else
			actcapi_debug_dlpd(&msg->msg.select_b2_protocol_req.dlpd);
		break;
	case 44:
		/* CONNECT RESP */
		printk(KERN_DEBUG " PLCI  = 0x%04x\n",
		       msg->msg.connect_resp.plci);
		printk(KERN_DEBUG " CAUSE = 0x%02x\n",
		       msg->msg.connect_resp.rejectcause);
		break;
	case 45:
		/* CONNECT ACTIVE RESP */
		printk(KERN_DEBUG " PLCI  = 0x%04x\n",
		       msg->msg.connect_active_resp.plci);
		break;
	}
}
#endif
