/*
 *
 Copyright (c) Eicon Networks, 2002.
 *
 This source file is supplied for the use with
 Eicon Networks range of DIVA Server Adapters.
 *
 Eicon File Revision :    2.1
 *
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 *
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 *
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#include <linux/bitmap.h>

#include "platform.h"
#include "di_defs.h"
#include "pc.h"
#include "capi20.h"
#include "divacapi.h"
#include "mdm_msg.h"
#include "divasync.h"

#define FILE_ "MESSAGE.C"
#define dprintf

/*------------------------------------------------------------------*/
/* This is options supported for all adapters that are server by    */
/* XDI driver. Allo it is not necessary to ask it from every adapter*/
/* and it is not necessary to save it separate for every adapter    */
/* Macrose defined here have only local meaning                     */
/*------------------------------------------------------------------*/
static dword diva_xdi_extended_features = 0;

#define DIVA_CAPI_USE_CMA                 0x00000001
#define DIVA_CAPI_XDI_PROVIDES_SDRAM_BAR  0x00000002
#define DIVA_CAPI_XDI_PROVIDES_NO_CANCEL  0x00000004
#define DIVA_CAPI_XDI_PROVIDES_RX_DMA     0x00000008

/*
  CAPI can request to process all return codes self only if:
  protocol code supports this && xdi supports this
*/
#define DIVA_CAPI_SUPPORTS_NO_CANCEL(__a__)   (((__a__)->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL) && ((__a__)->manufacturer_features & MANUFACTURER_FEATURE_OK_FC_LABEL) && (diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_NO_CANCEL))

/*------------------------------------------------------------------*/
/* local function prototypes                                        */
/*------------------------------------------------------------------*/

static void group_optimization(DIVA_CAPI_ADAPTER *a, PLCI *plci);
void AutomaticLaw(DIVA_CAPI_ADAPTER *);
word CapiRelease(word);
word CapiRegister(word);
word api_put(APPL *, CAPI_MSG *);
static word api_parse(byte *, word, byte *, API_PARSE *);
static void api_save_msg(API_PARSE *in, byte *format, API_SAVE *out);
static void api_load_msg(API_SAVE *in, API_PARSE *out);

word api_remove_start(void);
void api_remove_complete(void);

static void plci_remove(PLCI *);
static void diva_get_extended_adapter_features(DIVA_CAPI_ADAPTER *a);
static void diva_ask_for_xdi_sdram_bar(DIVA_CAPI_ADAPTER *, IDI_SYNC_REQ *);

void callback(ENTITY *);

static void control_rc(PLCI *, byte, byte, byte, byte, byte);
static void data_rc(PLCI *, byte);
static void data_ack(PLCI *, byte);
static void sig_ind(PLCI *);
static void SendInfo(PLCI *, dword, byte **, byte);
static void SendSetupInfo(APPL *, PLCI *, dword, byte **, byte);
static void SendSSExtInd(APPL *, PLCI *plci, dword Id, byte **parms);

static void VSwitchReqInd(PLCI *plci, dword Id, byte **parms);

static void nl_ind(PLCI *);

static byte connect_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte connect_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte connect_a_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte disconnect_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte disconnect_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte listen_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte info_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte info_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte alert_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte facility_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte facility_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte connect_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte connect_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte connect_b3_a_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte disconnect_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte disconnect_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte data_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte data_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte reset_b3_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte reset_b3_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte connect_b3_t90_a_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte select_b_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte manufacturer_req(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
static byte manufacturer_res(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);

static word get_plci(DIVA_CAPI_ADAPTER *);
static void add_p(PLCI *, byte, byte *);
static void add_s(PLCI *plci, byte code, API_PARSE *p);
static void add_ss(PLCI *plci, byte code, API_PARSE *p);
static void add_ie(PLCI *plci, byte code, byte *p, word p_length);
static void add_d(PLCI *, word, byte *);
static void add_ai(PLCI *, API_PARSE *);
static word add_b1(PLCI *, API_PARSE *, word, word);
static word add_b23(PLCI *, API_PARSE *);
static word add_modem_b23(PLCI *plci, API_PARSE *bp_parms);
static void sig_req(PLCI *, byte, byte);
static void nl_req_ncci(PLCI *, byte, byte);
static void send_req(PLCI *);
static void send_data(PLCI *);
static word plci_remove_check(PLCI *);
static void listen_check(DIVA_CAPI_ADAPTER *);
static byte AddInfo(byte **, byte **, byte *, byte *);
static byte getChannel(API_PARSE *);
static void IndParse(PLCI *, const word *, byte **, byte);
static byte ie_compare(byte *, byte *);
static word find_cip(DIVA_CAPI_ADAPTER *, byte *, byte *);
static word CPN_filter_ok(byte *cpn, DIVA_CAPI_ADAPTER *, word);

/*
  XON protocol helpers
*/
static void channel_flow_control_remove(PLCI *plci);
static void channel_x_off(PLCI *plci, byte ch, byte flag);
static void channel_x_on(PLCI *plci, byte ch);
static void channel_request_xon(PLCI *plci, byte ch);
static void channel_xmit_xon(PLCI *plci);
static int channel_can_xon(PLCI *plci, byte ch);
static void channel_xmit_extended_xon(PLCI *plci);

static byte SendMultiIE(PLCI *plci, dword Id, byte **parms, byte ie_type, dword info_mask, byte setupParse);
static word AdvCodecSupport(DIVA_CAPI_ADAPTER *, PLCI *, APPL *, byte);
static void CodecIdCheck(DIVA_CAPI_ADAPTER *, PLCI *);
static void SetVoiceChannel(PLCI *, byte *, DIVA_CAPI_ADAPTER *);
static void VoiceChannelOff(PLCI *plci);
static void adv_voice_write_coefs(PLCI *plci, word write_command);
static void adv_voice_clear_config(PLCI *plci);

static word get_b1_facilities(PLCI *plci, byte b1_resource);
static byte add_b1_facilities(PLCI *plci, byte b1_resource, word b1_facilities);
static void adjust_b1_facilities(PLCI *plci, byte new_b1_resource, word new_b1_facilities);
static word adjust_b_process(dword Id, PLCI *plci, byte Rc);
static void adjust_b1_resource(dword Id, PLCI *plci, API_SAVE *bp_msg, word b1_facilities, word internal_command);
static void adjust_b_restore(dword Id, PLCI *plci, byte Rc);
static void reset_b3_command(dword Id, PLCI *plci, byte Rc);
static void select_b_command(dword Id, PLCI *plci, byte Rc);
static void fax_connect_ack_command(dword Id, PLCI *plci, byte Rc);
static void fax_edata_ack_command(dword Id, PLCI *plci, byte Rc);
static void fax_connect_info_command(dword Id, PLCI *plci, byte Rc);
static void fax_adjust_b23_command(dword Id, PLCI *plci, byte Rc);
static void fax_disconnect_command(dword Id, PLCI *plci, byte Rc);
static void hold_save_command(dword Id, PLCI *plci, byte Rc);
static void retrieve_restore_command(dword Id, PLCI *plci, byte Rc);
static void init_b1_config(PLCI *plci);
static void clear_b1_config(PLCI *plci);

static void dtmf_command(dword Id, PLCI *plci, byte Rc);
static byte dtmf_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
static void dtmf_confirmation(dword Id, PLCI *plci);
static void dtmf_indication(dword Id, PLCI *plci, byte *msg, word length);
static void dtmf_parameter_write(PLCI *plci);


static void mixer_set_bchannel_id_esc(PLCI *plci, byte bchannel_id);
static void mixer_set_bchannel_id(PLCI *plci, byte *chi);
static void mixer_clear_config(PLCI *plci);
static void mixer_notify_update(PLCI *plci, byte others);
static void mixer_command(dword Id, PLCI *plci, byte Rc);
static byte mixer_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
static void mixer_indication_coefs_set(dword Id, PLCI *plci);
static void mixer_indication_xconnect_from(dword Id, PLCI *plci, byte *msg, word length);
static void mixer_indication_xconnect_to(dword Id, PLCI *plci, byte *msg, word length);
static void mixer_remove(PLCI *plci);


static void ec_command(dword Id, PLCI *plci, byte Rc);
static byte ec_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
static void ec_indication(dword Id, PLCI *plci, byte *msg, word length);


static void rtp_connect_b3_req_command(dword Id, PLCI *plci, byte Rc);
static void rtp_connect_b3_res_command(dword Id, PLCI *plci, byte Rc);


static int diva_get_dma_descriptor(PLCI *plci, dword *dma_magic);
static void diva_free_dma_descriptor(PLCI *plci, int nr);

/*------------------------------------------------------------------*/
/* external function prototypes                                     */
/*------------------------------------------------------------------*/

extern byte MapController(byte);
extern byte UnMapController(byte);
#define MapId(Id)(((Id) & 0xffffff00L) | MapController((byte)(Id)))
#define UnMapId(Id)(((Id) & 0xffffff00L) | UnMapController((byte)(Id)))

void sendf(APPL *, word, dword, word, byte *, ...);
void *TransmitBufferSet(APPL *appl, dword ref);
void *TransmitBufferGet(APPL *appl, void *p);
void TransmitBufferFree(APPL *appl, void *p);
void *ReceiveBufferGet(APPL *appl, int Num);

int fax_head_line_time(char *buffer);


/*------------------------------------------------------------------*/
/* Global data definitions                                          */
/*------------------------------------------------------------------*/
extern byte max_adapter;
extern byte max_appl;
extern DIVA_CAPI_ADAPTER *adapter;
extern APPL *application;







static byte remove_started = false;
static PLCI dummy_plci;


static struct _ftable {
	word command;
	byte *format;
	byte (*function)(dword, word, DIVA_CAPI_ADAPTER *, PLCI *, APPL *, API_PARSE *);
} ftable[] = {
	{_DATA_B3_R,                          "dwww",         data_b3_req},
	{_DATA_B3_I | RESPONSE,               "w",            data_b3_res},
	{_INFO_R,                             "ss",           info_req},
	{_INFO_I | RESPONSE,                  "",             info_res},
	{_CONNECT_R,                          "wsssssssss",   connect_req},
	{_CONNECT_I | RESPONSE,               "wsssss",       connect_res},
	{_CONNECT_ACTIVE_I | RESPONSE,        "",             connect_a_res},
	{_DISCONNECT_R,                       "s",            disconnect_req},
	{_DISCONNECT_I | RESPONSE,            "",             disconnect_res},
	{_LISTEN_R,                           "dddss",        listen_req},
	{_ALERT_R,                            "s",            alert_req},
	{_FACILITY_R,                         "ws",           facility_req},
	{_FACILITY_I | RESPONSE,              "ws",           facility_res},
	{_CONNECT_B3_R,                       "s",            connect_b3_req},
	{_CONNECT_B3_I | RESPONSE,            "ws",           connect_b3_res},
	{_CONNECT_B3_ACTIVE_I | RESPONSE,     "",             connect_b3_a_res},
	{_DISCONNECT_B3_R,                    "s",            disconnect_b3_req},
	{_DISCONNECT_B3_I | RESPONSE,         "",             disconnect_b3_res},
	{_RESET_B3_R,                         "s",            reset_b3_req},
	{_RESET_B3_I | RESPONSE,              "",             reset_b3_res},
	{_CONNECT_B3_T90_ACTIVE_I | RESPONSE, "ws",           connect_b3_t90_a_res},
	{_CONNECT_B3_T90_ACTIVE_I | RESPONSE, "",             connect_b3_t90_a_res},
	{_SELECT_B_REQ,                       "s",            select_b_req},
	{_MANUFACTURER_R,                     "dws",          manufacturer_req},
	{_MANUFACTURER_I | RESPONSE,          "dws",          manufacturer_res},
	{_MANUFACTURER_I | RESPONSE,          "",             manufacturer_res}
};

static byte *cip_bc[29][2] = {
	{ "",                     ""                     }, /* 0 */
	{ "\x03\x80\x90\xa3",     "\x03\x80\x90\xa2"     }, /* 1 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 2 */
	{ "\x02\x89\x90",         "\x02\x89\x90"         }, /* 3 */
	{ "\x03\x90\x90\xa3",     "\x03\x90\x90\xa2"     }, /* 4 */
	{ "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 5 */
	{ "\x02\x98\x90",         "\x02\x98\x90"         }, /* 6 */
	{ "\x04\x88\xc0\xc6\xe6", "\x04\x88\xc0\xc6\xe6" }, /* 7 */
	{ "\x04\x88\x90\x21\x8f", "\x04\x88\x90\x21\x8f" }, /* 8 */
	{ "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 9 */
	{ "",                     ""                     }, /* 10 */
	{ "",                     ""                     }, /* 11 */
	{ "",                     ""                     }, /* 12 */
	{ "",                     ""                     }, /* 13 */
	{ "",                     ""                     }, /* 14 */
	{ "",                     ""                     }, /* 15 */

	{ "\x03\x80\x90\xa3",     "\x03\x80\x90\xa2"     }, /* 16 */
	{ "\x03\x90\x90\xa3",     "\x03\x90\x90\xa2"     }, /* 17 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 18 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 19 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 20 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 21 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 22 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 23 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 24 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }, /* 25 */
	{ "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 26 */
	{ "\x03\x91\x90\xa5",     "\x03\x91\x90\xa5"     }, /* 27 */
	{ "\x02\x88\x90",         "\x02\x88\x90"         }  /* 28 */
};

static byte *cip_hlc[29] = {
	"",                           /* 0 */
	"",                           /* 1 */
	"",                           /* 2 */
	"",                           /* 3 */
	"",                           /* 4 */
	"",                           /* 5 */
	"",                           /* 6 */
	"",                           /* 7 */
	"",                           /* 8 */
	"",                           /* 9 */
	"",                           /* 10 */
	"",                           /* 11 */
	"",                           /* 12 */
	"",                           /* 13 */
	"",                           /* 14 */
	"",                           /* 15 */

	"\x02\x91\x81",               /* 16 */
	"\x02\x91\x84",               /* 17 */
	"\x02\x91\xa1",               /* 18 */
	"\x02\x91\xa4",               /* 19 */
	"\x02\x91\xa8",               /* 20 */
	"\x02\x91\xb1",               /* 21 */
	"\x02\x91\xb2",               /* 22 */
	"\x02\x91\xb5",               /* 23 */
	"\x02\x91\xb8",               /* 24 */
	"\x02\x91\xc1",               /* 25 */
	"\x02\x91\x81",               /* 26 */
	"\x03\x91\xe0\x01",           /* 27 */
	"\x03\x91\xe0\x02"            /* 28 */
};

/*------------------------------------------------------------------*/

#define V120_HEADER_LENGTH 1
#define V120_HEADER_EXTEND_BIT  0x80
#define V120_HEADER_BREAK_BIT   0x40
#define V120_HEADER_C1_BIT      0x04
#define V120_HEADER_C2_BIT      0x08
#define V120_HEADER_FLUSH_COND  (V120_HEADER_BREAK_BIT | V120_HEADER_C1_BIT | V120_HEADER_C2_BIT)

static byte v120_default_header[] =
{

	0x83                          /*  Ext, BR , res, res, C2 , C1 , B  , F   */

};

static byte v120_break_header[] =
{

	0xc3 | V120_HEADER_BREAK_BIT  /*  Ext, BR , res, res, C2 , C1 , B  , F   */

};


/*------------------------------------------------------------------*/
/* API_PUT function                                                 */
/*------------------------------------------------------------------*/

word api_put(APPL *appl, CAPI_MSG *msg)
{
	word i, j, k, l, n;
	word ret;
	byte c;
	byte controller;
	DIVA_CAPI_ADAPTER *a;
	PLCI *plci;
	NCCI *ncci_ptr;
	word ncci;
	CAPI_MSG *m;
	API_PARSE msg_parms[MAX_MSG_PARMS + 1];

	if (msg->header.length < sizeof(msg->header) ||
	    msg->header.length > MAX_MSG_SIZE) {
		dbug(1, dprintf("bad len"));
		return _BAD_MSG;
	}

	controller = (byte)((msg->header.controller & 0x7f) - 1);

	/* controller starts with 0 up to (max_adapter - 1) */
	if (controller >= max_adapter)
	{
		dbug(1, dprintf("invalid ctrl"));
		return _BAD_MSG;
	}

	a = &adapter[controller];
	plci = NULL;
	if ((msg->header.plci != 0) && (msg->header.plci <= a->max_plci) && !a->adapter_disabled)
	{
		dbug(1, dprintf("plci=%x", msg->header.plci));
		plci = &a->plci[msg->header.plci - 1];
		ncci = GET_WORD(&msg->header.ncci);
		if (plci->Id
		    && (plci->appl
			|| (plci->State == INC_CON_PENDING)
			|| (plci->State == INC_CON_ALERT)
			|| (msg->header.command == (_DISCONNECT_I | RESPONSE)))
		    && ((ncci == 0)
			|| (msg->header.command == (_DISCONNECT_B3_I | RESPONSE))
			|| ((ncci < MAX_NCCI + 1) && (a->ncci_plci[ncci] == plci->Id))))
		{
			i = plci->msg_in_read_pos;
			j = plci->msg_in_write_pos;
			if (j >= i)
			{
				if (j + msg->header.length + MSG_IN_OVERHEAD <= MSG_IN_QUEUE_SIZE)
					i += MSG_IN_QUEUE_SIZE - j;
				else
					j = 0;
			}
			else
			{

				n = (((CAPI_MSG *)(plci->msg_in_queue))->header.length + MSG_IN_OVERHEAD + 3) & 0xfffc;

				if (i > MSG_IN_QUEUE_SIZE - n)
					i = MSG_IN_QUEUE_SIZE - n + 1;
				i -= j;
			}

			if (i <= ((msg->header.length + MSG_IN_OVERHEAD + 3) & 0xfffc))

			{
				dbug(0, dprintf("Q-FULL1(msg) - len=%d write=%d read=%d wrap=%d free=%d",
						msg->header.length, plci->msg_in_write_pos,
						plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));

				return _QUEUE_FULL;
			}
			c = false;
			if ((((byte *) msg) < ((byte *)(plci->msg_in_queue)))
			    || (((byte *) msg) >= ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
			{
				if (plci->msg_in_write_pos != plci->msg_in_read_pos)
					c = true;
			}
			if (msg->header.command == _DATA_B3_R)
			{
				if (msg->header.length < 20)
				{
					dbug(1, dprintf("DATA_B3 REQ wrong length %d", msg->header.length));
					return _BAD_MSG;
				}
				ncci_ptr = &(a->ncci[ncci]);
				n = ncci_ptr->data_pending;
				l = ncci_ptr->data_ack_pending;
				k = plci->msg_in_read_pos;
				while (k != plci->msg_in_write_pos)
				{
					if (k == plci->msg_in_wrap_pos)
						k = 0;
					if ((((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.command == _DATA_B3_R)
					    && (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.ncci == ncci))
					{
						n++;
						if (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->info.data_b3_req.Flags & 0x0004)
							l++;
					}

					k += (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.length +
					      MSG_IN_OVERHEAD + 3) & 0xfffc;

				}
				if ((n >= MAX_DATA_B3) || (l >= MAX_DATA_ACK))
				{
					dbug(0, dprintf("Q-FULL2(data) - pending=%d/%d ack_pending=%d/%d",
							ncci_ptr->data_pending, n, ncci_ptr->data_ack_pending, l));

					return _QUEUE_FULL;
				}
				if (plci->req_in || plci->internal_command)
				{
					if ((((byte *) msg) >= ((byte *)(plci->msg_in_queue)))
					    && (((byte *) msg) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
					{
						dbug(0, dprintf("Q-FULL3(requeue)"));

						return _QUEUE_FULL;
					}
					c = true;
				}
			}
			else
			{
				if (plci->req_in || plci->internal_command)
					c = true;
				else
				{
					plci->command = msg->header.command;
					plci->number = msg->header.number;
				}
			}
			if (c)
			{
				dbug(1, dprintf("enqueue msg(0x%04x,0x%x,0x%x) - len=%d write=%d read=%d wrap=%d free=%d",
						msg->header.command, plci->req_in, plci->internal_command,
						msg->header.length, plci->msg_in_write_pos,
						plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));
				if (j == 0)
					plci->msg_in_wrap_pos = plci->msg_in_write_pos;
				m = (CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]);
				for (i = 0; i < msg->header.length; i++)
					((byte *)(plci->msg_in_queue))[j++] = ((byte *) msg)[i];
				if (m->header.command == _DATA_B3_R)
				{

					m->info.data_b3_req.Data = (dword)(long)(TransmitBufferSet(appl, m->info.data_b3_req.Data));

				}

				j = (j + 3) & 0xfffc;

				*((APPL **)(&((byte *)(plci->msg_in_queue))[j])) = appl;
				plci->msg_in_write_pos = j + MSG_IN_OVERHEAD;
				return 0;
			}
		}
		else
		{
			plci = NULL;
		}
	}
	dbug(1, dprintf("com=%x", msg->header.command));

	for (j = 0; j < MAX_MSG_PARMS + 1; j++) msg_parms[j].length = 0;
	for (i = 0, ret = _BAD_MSG; i < ARRAY_SIZE(ftable); i++) {

		if (ftable[i].command == msg->header.command) {
			/* break loop if the message is correct, otherwise continue scan  */
			/* (for example: CONNECT_B3_T90_ACT_RES has two specifications)   */
			if (!api_parse(msg->info.b, (word)(msg->header.length - 12), ftable[i].format, msg_parms)) {
				ret = 0;
				break;
			}
			for (j = 0; j < MAX_MSG_PARMS + 1; j++) msg_parms[j].length = 0;
		}
	}
	if (ret) {
		dbug(1, dprintf("BAD_MSG"));
		if (plci) plci->command = 0;
		return ret;
	}


	c = ftable[i].function(GET_DWORD(&msg->header.controller),
			       msg->header.number,
			       a,
			       plci,
			       appl,
			       msg_parms);

	channel_xmit_extended_xon(plci);

	if (c == 1) send_req(plci);
	if (c == 2 && plci) plci->req_in = plci->req_in_start = plci->req_out = 0;
	if (plci && !plci->req_in) plci->command = 0;
	return 0;
}


/*------------------------------------------------------------------*/
/* api_parse function, check the format of api messages             */
/*------------------------------------------------------------------*/

static word api_parse(byte *msg, word length, byte *format, API_PARSE *parms)
{
	word i;
	word p;

	for (i = 0, p = 0; format[i]; i++) {
		if (parms)
		{
			parms[i].info = &msg[p];
		}
		switch (format[i]) {
		case 'b':
			p += 1;
			break;
		case 'w':
			p += 2;
			break;
		case 'd':
			p += 4;
			break;
		case 's':
			if (msg[p] == 0xff) {
				parms[i].info += 2;
				parms[i].length = msg[p + 1] + (msg[p + 2] << 8);
				p += (parms[i].length + 3);
			}
			else {
				parms[i].length = msg[p];
				p += (parms[i].length + 1);
			}
			break;
		}

		if (p > length) return true;
	}
	if (parms) parms[i].info = NULL;
	return false;
}

static void api_save_msg(API_PARSE *in, byte *format, API_SAVE *out)
{
	word i, j, n = 0;
	byte *p;

	p = out->info;
	for (i = 0; format[i] != '\0'; i++)
	{
		out->parms[i].info = p;
		out->parms[i].length = in[i].length;
		switch (format[i])
		{
		case 'b':
			n = 1;
			break;
		case 'w':
			n = 2;
			break;
		case 'd':
			n = 4;
			break;
		case 's':
			n = in[i].length + 1;
			break;
		}
		for (j = 0; j < n; j++)
			*(p++) = in[i].info[j];
	}
	out->parms[i].info = NULL;
	out->parms[i].length = 0;
}

static void api_load_msg(API_SAVE *in, API_PARSE *out)
{
	word i;

	i = 0;
	do
	{
		out[i].info = in->parms[i].info;
		out[i].length = in->parms[i].length;
	} while (in->parms[i++].info);
}


/*------------------------------------------------------------------*/
/* CAPI remove function                                             */
/*------------------------------------------------------------------*/

word api_remove_start(void)
{
	word i;
	word j;

	if (!remove_started) {
		remove_started = true;
		for (i = 0; i < max_adapter; i++) {
			if (adapter[i].request) {
				for (j = 0; j < adapter[i].max_plci; j++) {
					if (adapter[i].plci[j].Sig.Id) plci_remove(&adapter[i].plci[j]);
				}
			}
		}
		return 1;
	}
	else {
		for (i = 0; i < max_adapter; i++) {
			if (adapter[i].request) {
				for (j = 0; j < adapter[i].max_plci; j++) {
					if (adapter[i].plci[j].Sig.Id) return 1;
				}
			}
		}
	}
	api_remove_complete();
	return 0;
}


/*------------------------------------------------------------------*/
/* internal command queue                                           */
/*------------------------------------------------------------------*/

static void init_internal_command_queue(PLCI *plci)
{
	word i;

	dbug(1, dprintf("%s,%d: init_internal_command_queue",
			(char *)(FILE_), __LINE__));

	plci->internal_command = 0;
	for (i = 0; i < MAX_INTERNAL_COMMAND_LEVELS; i++)
		plci->internal_command_queue[i] = NULL;
}


static void start_internal_command(dword Id, PLCI *plci, t_std_internal_command command_function)
{
	word i;

	dbug(1, dprintf("[%06lx] %s,%d: start_internal_command",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	if (plci->internal_command == 0)
	{
		plci->internal_command_queue[0] = command_function;
		(*command_function)(Id, plci, OK);
	}
	else
	{
		i = 1;
		while (plci->internal_command_queue[i] != NULL)
			i++;
		plci->internal_command_queue[i] = command_function;
	}
}


static void next_internal_command(dword Id, PLCI *plci)
{
	word i;

	dbug(1, dprintf("[%06lx] %s,%d: next_internal_command",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	plci->internal_command = 0;
	plci->internal_command_queue[0] = NULL;
	while (plci->internal_command_queue[1] != NULL)
	{
		for (i = 0; i < MAX_INTERNAL_COMMAND_LEVELS - 1; i++)
			plci->internal_command_queue[i] = plci->internal_command_queue[i + 1];
		plci->internal_command_queue[MAX_INTERNAL_COMMAND_LEVELS - 1] = NULL;
		(*(plci->internal_command_queue[0]))(Id, plci, OK);
		if (plci->internal_command != 0)
			return;
		plci->internal_command_queue[0] = NULL;
	}
}


/*------------------------------------------------------------------*/
/* NCCI allocate/remove function                                    */
/*------------------------------------------------------------------*/

static dword ncci_mapping_bug = 0;

static word get_ncci(PLCI *plci, byte ch, word force_ncci)
{
	DIVA_CAPI_ADAPTER *a;
	word ncci, i, j, k;

	a = plci->adapter;
	if (!ch || a->ch_ncci[ch])
	{
		ncci_mapping_bug++;
		dbug(1, dprintf("NCCI mapping exists %ld %02x %02x %02x-%02x",
				ncci_mapping_bug, ch, force_ncci, a->ncci_ch[a->ch_ncci[ch]], a->ch_ncci[ch]));
		ncci = ch;
	}
	else
	{
		if (force_ncci)
			ncci = force_ncci;
		else
		{
			if ((ch < MAX_NCCI + 1) && !a->ncci_ch[ch])
				ncci = ch;
			else
			{
				ncci = 1;
				while ((ncci < MAX_NCCI + 1) && a->ncci_ch[ncci])
					ncci++;
				if (ncci == MAX_NCCI + 1)
				{
					ncci_mapping_bug++;
					i = 1;
					do
					{
						j = 1;
						while ((j < MAX_NCCI + 1) && (a->ncci_ch[j] != i))
							j++;
						k = j;
						if (j < MAX_NCCI + 1)
						{
							do
							{
								j++;
							} while ((j < MAX_NCCI + 1) && (a->ncci_ch[j] != i));
						}
					} while ((i < MAX_NL_CHANNEL + 1) && (j < MAX_NCCI + 1));
					if (i < MAX_NL_CHANNEL + 1)
					{
						dbug(1, dprintf("NCCI mapping overflow %ld %02x %02x %02x-%02x-%02x",
								ncci_mapping_bug, ch, force_ncci, i, k, j));
					}
					else
					{
						dbug(1, dprintf("NCCI mapping overflow %ld %02x %02x",
								ncci_mapping_bug, ch, force_ncci));
					}
					ncci = ch;
				}
			}
			a->ncci_plci[ncci] = plci->Id;
			a->ncci_state[ncci] = IDLE;
			if (!plci->ncci_ring_list)
				plci->ncci_ring_list = ncci;
			else
				a->ncci_next[ncci] = a->ncci_next[plci->ncci_ring_list];
			a->ncci_next[plci->ncci_ring_list] = (byte) ncci;
		}
		a->ncci_ch[ncci] = ch;
		a->ch_ncci[ch] = (byte) ncci;
		dbug(1, dprintf("NCCI mapping established %ld %02x %02x %02x-%02x",
				ncci_mapping_bug, ch, force_ncci, ch, ncci));
	}
	return (ncci);
}


static void ncci_free_receive_buffers(PLCI *plci, word ncci)
{
	DIVA_CAPI_ADAPTER *a;
	APPL *appl;
	word i, ncci_code;
	dword Id;

	a = plci->adapter;
	Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
	if (ncci)
	{
		if (a->ncci_plci[ncci] == plci->Id)
		{
			if (!plci->appl)
			{
				ncci_mapping_bug++;
				dbug(1, dprintf("NCCI mapping appl expected %ld %08lx",
						ncci_mapping_bug, Id));
			}
			else
			{
				appl = plci->appl;
				ncci_code = ncci | (((word) a->Id) << 8);
				for (i = 0; i < appl->MaxBuffer; i++)
				{
					if ((appl->DataNCCI[i] == ncci_code)
					    && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
					{
						appl->DataNCCI[i] = 0;
					}
				}
			}
		}
	}
	else
	{
		for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
		{
			if (a->ncci_plci[ncci] == plci->Id)
			{
				if (!plci->appl)
				{
					ncci_mapping_bug++;
					dbug(1, dprintf("NCCI mapping no appl %ld %08lx",
							ncci_mapping_bug, Id));
				}
				else
				{
					appl = plci->appl;
					ncci_code = ncci | (((word) a->Id) << 8);
					for (i = 0; i < appl->MaxBuffer; i++)
					{
						if ((appl->DataNCCI[i] == ncci_code)
						    && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
						{
							appl->DataNCCI[i] = 0;
						}
					}
				}
			}
		}
	}
}


static void cleanup_ncci_data(PLCI *plci, word ncci)
{
	NCCI *ncci_ptr;

	if (ncci && (plci->adapter->ncci_plci[ncci] == plci->Id))
	{
		ncci_ptr = &(plci->adapter->ncci[ncci]);
		if (plci->appl)
		{
			while (ncci_ptr->data_pending != 0)
			{
				if (!plci->data_sent || (ncci_ptr->DBuffer[ncci_ptr->data_out].P != plci->data_sent_ptr))
					TransmitBufferFree(plci->appl, ncci_ptr->DBuffer[ncci_ptr->data_out].P);
				(ncci_ptr->data_out)++;
				if (ncci_ptr->data_out == MAX_DATA_B3)
					ncci_ptr->data_out = 0;
				(ncci_ptr->data_pending)--;
			}
		}
		ncci_ptr->data_out = 0;
		ncci_ptr->data_pending = 0;
		ncci_ptr->data_ack_out = 0;
		ncci_ptr->data_ack_pending = 0;
	}
}


static void ncci_remove(PLCI *plci, word ncci, byte preserve_ncci)
{
	DIVA_CAPI_ADAPTER *a;
	dword Id;
	word i;

	a = plci->adapter;
	Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
	if (!preserve_ncci)
		ncci_free_receive_buffers(plci, ncci);
	if (ncci)
	{
		if (a->ncci_plci[ncci] != plci->Id)
		{
			ncci_mapping_bug++;
			dbug(1, dprintf("NCCI mapping doesn't exist %ld %08lx %02x",
					ncci_mapping_bug, Id, preserve_ncci));
		}
		else
		{
			cleanup_ncci_data(plci, ncci);
			dbug(1, dprintf("NCCI mapping released %ld %08lx %02x %02x-%02x",
					ncci_mapping_bug, Id, preserve_ncci, a->ncci_ch[ncci], ncci));
			a->ch_ncci[a->ncci_ch[ncci]] = 0;
			if (!preserve_ncci)
			{
				a->ncci_ch[ncci] = 0;
				a->ncci_plci[ncci] = 0;
				a->ncci_state[ncci] = IDLE;
				i = plci->ncci_ring_list;
				while ((i != 0) && (a->ncci_next[i] != plci->ncci_ring_list) && (a->ncci_next[i] != ncci))
					i = a->ncci_next[i];
				if ((i != 0) && (a->ncci_next[i] == ncci))
				{
					if (i == ncci)
						plci->ncci_ring_list = 0;
					else if (plci->ncci_ring_list == ncci)
						plci->ncci_ring_list = i;
					a->ncci_next[i] = a->ncci_next[ncci];
				}
				a->ncci_next[ncci] = 0;
			}
		}
	}
	else
	{
		for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
		{
			if (a->ncci_plci[ncci] == plci->Id)
			{
				cleanup_ncci_data(plci, ncci);
				dbug(1, dprintf("NCCI mapping released %ld %08lx %02x %02x-%02x",
						ncci_mapping_bug, Id, preserve_ncci, a->ncci_ch[ncci], ncci));
				a->ch_ncci[a->ncci_ch[ncci]] = 0;
				if (!preserve_ncci)
				{
					a->ncci_ch[ncci] = 0;
					a->ncci_plci[ncci] = 0;
					a->ncci_state[ncci] = IDLE;
					a->ncci_next[ncci] = 0;
				}
			}
		}
		if (!preserve_ncci)
			plci->ncci_ring_list = 0;
	}
}


/*------------------------------------------------------------------*/
/* PLCI remove function                                             */
/*------------------------------------------------------------------*/

static void plci_free_msg_in_queue(PLCI *plci)
{
	word i;

	if (plci->appl)
	{
		i = plci->msg_in_read_pos;
		while (i != plci->msg_in_write_pos)
		{
			if (i == plci->msg_in_wrap_pos)
				i = 0;
			if (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.command == _DATA_B3_R)
			{

				TransmitBufferFree(plci->appl,
						   (byte *)(long)(((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->info.data_b3_req.Data));

			}

			i += (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.length +
			      MSG_IN_OVERHEAD + 3) & 0xfffc;

		}
	}
	plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
	plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
	plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
}


static void plci_remove(PLCI *plci)
{

	if (!plci) {
		dbug(1, dprintf("plci_remove(no plci)"));
		return;
	}
	init_internal_command_queue(plci);
	dbug(1, dprintf("plci_remove(%x,tel=%x)", plci->Id, plci->tel));
	if (plci_remove_check(plci))
	{
		return;
	}
	if (plci->Sig.Id == 0xff)
	{
		dbug(1, dprintf("D-channel X.25 plci->NL.Id:%0x", plci->NL.Id));
		if (plci->NL.Id && !plci->nl_remove_id)
		{
			nl_req_ncci(plci, REMOVE, 0);
			send_req(plci);
		}
	}
	else
	{
		if (!plci->sig_remove_id
		    && (plci->Sig.Id
			|| (plci->req_in != plci->req_out)
			|| (plci->nl_req || plci->sig_req)))
		{
			sig_req(plci, HANGUP, 0);
			send_req(plci);
		}
	}
	ncci_remove(plci, 0, false);
	plci_free_msg_in_queue(plci);

	plci->channels = 0;
	plci->appl = NULL;
	if ((plci->State == INC_CON_PENDING) || (plci->State == INC_CON_ALERT))
		plci->State = OUTG_DIS_PENDING;
}

/*------------------------------------------------------------------*/
/* translation function for each message                            */
/*------------------------------------------------------------------*/

static byte connect_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word ch;
	word i;
	word Info;
	byte LinkLayer;
	API_PARSE *ai;
	API_PARSE *bp;
	API_PARSE ai_parms[5];
	word channel = 0;
	dword ch_mask;
	byte m;
	static byte esc_chi[35] = {0x02, 0x18, 0x01};
	static byte lli[2] = {0x01, 0x00};
	byte noCh = 0;
	word dir = 0;
	byte *p_chi = "";

	for (i = 0; i < 5; i++) ai_parms[i].length = 0;

	dbug(1, dprintf("connect_req(%d)", parms->length));
	Info = _WRONG_IDENTIFIER;
	if (a)
	{
		if (a->adapter_disabled)
		{
			dbug(1, dprintf("adapter disabled"));
			Id = ((word)1 << 8) | a->Id;
			sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", 0);
			sendf(appl, _DISCONNECT_I, Id, 0, "w", _L1_ERROR);
			return false;
		}
		Info = _OUT_OF_PLCI;
		if ((i = get_plci(a)))
		{
			Info = 0;
			plci = &a->plci[i - 1];
			plci->appl = appl;
			plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
			/* check 'external controller' bit for codec support */
			if (Id & EXT_CONTROLLER)
			{
				if (AdvCodecSupport(a, plci, appl, 0))
				{
					plci->Id = 0;
					sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", _WRONG_IDENTIFIER);
					return 2;
				}
			}
			ai = &parms[9];
			bp = &parms[5];
			ch = 0;
			if (bp->length)LinkLayer = bp->info[3];
			else LinkLayer = 0;
			if (ai->length)
			{
				ch = 0xffff;
				if (!api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
				{
					ch = 0;
					if (ai_parms[0].length)
					{
						ch = GET_WORD(ai_parms[0].info + 1);
						if (ch > 4) ch = 0; /* safety -> ignore ChannelID */
						if (ch == 4) /* explizit CHI in message */
						{
							/* check length of B-CH struct */
							if ((ai_parms[0].info)[3] >= 1)
							{
								if ((ai_parms[0].info)[4] == CHI)
								{
									p_chi = &((ai_parms[0].info)[5]);
								}
								else
								{
									p_chi = &((ai_parms[0].info)[3]);
								}
								if (p_chi[0] > 35) /* check length of channel ID */
								{
									Info = _WRONG_MESSAGE_FORMAT;
								}
							}
							else Info = _WRONG_MESSAGE_FORMAT;
						}

						if (ch == 3 && ai_parms[0].length >= 7 && ai_parms[0].length <= 36)
						{
							dir = GET_WORD(ai_parms[0].info + 3);
							ch_mask = 0;
							m = 0x3f;
							for (i = 0; i + 5 <= ai_parms[0].length; i++)
							{
								if (ai_parms[0].info[i + 5] != 0)
								{
									if ((ai_parms[0].info[i + 5] | m) != 0xff)
										Info = _WRONG_MESSAGE_FORMAT;
									else
									{
										if (ch_mask == 0)
											channel = i;
										ch_mask |= 1L << i;
									}
								}
								m = 0;
							}
							if (ch_mask == 0)
								Info = _WRONG_MESSAGE_FORMAT;
							if (!Info)
							{
								if ((ai_parms[0].length == 36) || (ch_mask != ((dword)(1L << channel))))
								{
									esc_chi[0] = (byte)(ai_parms[0].length - 2);
									for (i = 0; i + 5 <= ai_parms[0].length; i++)
										esc_chi[i + 3] = ai_parms[0].info[i + 5];
								}
								else
									esc_chi[0] = 2;
								esc_chi[2] = (byte)channel;
								plci->b_channel = (byte)channel; /* not correct for ETSI ch 17..31 */
								add_p(plci, LLI, lli);
								add_p(plci, ESC, esc_chi);
								plci->State = LOCAL_CONNECT;
								if (!dir) plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;     /* dir 0=DTE, 1=DCE */
							}
						}
					}
				}
				else  Info = _WRONG_MESSAGE_FORMAT;
			}

			dbug(1, dprintf("ch=%x,dir=%x,p_ch=%d", ch, dir, channel));
			plci->command = _CONNECT_R;
			plci->number = Number;
			/* x.31 or D-ch free SAPI in LinkLayer? */
			if (ch == 1 && LinkLayer != 3 && LinkLayer != 12) noCh = true;
			if ((ch == 0 || ch == 2 || noCh || ch == 3 || ch == 4) && !Info)
			{
				/* B-channel used for B3 connections (ch==0), or no B channel    */
				/* is used (ch==2) or perm. connection (3) is used  do a CALL    */
				if (noCh) Info = add_b1(plci, &parms[5], 2, 0);    /* no resource    */
				else     Info = add_b1(plci, &parms[5], ch, 0);
				add_s(plci, OAD, &parms[2]);
				add_s(plci, OSA, &parms[4]);
				add_s(plci, BC, &parms[6]);
				add_s(plci, LLC, &parms[7]);
				add_s(plci, HLC, &parms[8]);
				if (a->Info_Mask[appl->Id - 1] & 0x200)
				{
					/* early B3 connect (CIP mask bit 9) no release after a disc */
					add_p(plci, LLI, "\x01\x01");
				}
				if (GET_WORD(parms[0].info) < 29) {
					add_p(plci, BC, cip_bc[GET_WORD(parms[0].info)][a->u_law]);
					add_p(plci, HLC, cip_hlc[GET_WORD(parms[0].info)]);
				}
				add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
				sig_req(plci, ASSIGN, DSIG_ID);
			}
			else if (ch == 1) {

				/* D-Channel used for B3 connections */
				plci->Sig.Id = 0xff;
				Info = 0;
			}

			if (!Info && ch != 2 && !noCh) {
				Info = add_b23(plci, &parms[5]);
				if (!Info) {
					if (!(plci->tel && !plci->adv_nl))nl_req_ncci(plci, ASSIGN, 0);
				}
			}

			if (!Info)
			{
				if (ch == 0 || ch == 2 || ch == 3 || noCh || ch == 4)
				{
					if (plci->spoofed_msg == SPOOFING_REQUIRED)
					{
						api_save_msg(parms, "wsssssssss", &plci->saved_msg);
						plci->spoofed_msg = CALL_REQ;
						plci->internal_command = BLOCK_PLCI;
						plci->command = 0;
						dbug(1, dprintf("Spoof"));
						send_req(plci);
						return false;
					}
					if (ch == 4)add_p(plci, CHI, p_chi);
					add_s(plci, CPN, &parms[1]);
					add_s(plci, DSA, &parms[3]);
					if (noCh) add_p(plci, ESC, "\x02\x18\xfd");  /* D-channel, no B-L3 */
					add_ai(plci, &parms[9]);
					if (!dir)sig_req(plci, CALL_REQ, 0);
					else
					{
						plci->command = PERM_LIST_REQ;
						plci->appl = appl;
						sig_req(plci, LISTEN_REQ, 0);
						send_req(plci);
						return false;
					}
				}
				send_req(plci);
				return false;
			}
			plci->Id = 0;
		}
	}
	sendf(appl,
	      _CONNECT_R | CONFIRM,
	      Id,
	      Number,
	      "w", Info);
	return 2;
}

static byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word i, Info;
	word Reject;
	static byte cau_t[] = {0, 0, 0x90, 0x91, 0xac, 0x9d, 0x86, 0xd8, 0x9b};
	static byte esc_t[] = {0x03, 0x08, 0x00, 0x00};
	API_PARSE *ai;
	API_PARSE ai_parms[5];
	word ch = 0;

	if (!plci) {
		dbug(1, dprintf("connect_res(no plci)"));
		return 0;  /* no plci, no send */
	}

	dbug(1, dprintf("connect_res(State=0x%x)", plci->State));
	for (i = 0; i < 5; i++) ai_parms[i].length = 0;
	ai = &parms[5];
	dbug(1, dprintf("ai->length=%d", ai->length));

	if (ai->length)
	{
		if (!api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
		{
			dbug(1, dprintf("ai_parms[0].length=%d/0x%x", ai_parms[0].length, GET_WORD(ai_parms[0].info + 1)));
			ch = 0;
			if (ai_parms[0].length)
			{
				ch = GET_WORD(ai_parms[0].info + 1);
				dbug(1, dprintf("BCH-I=0x%x", ch));
			}
		}
	}

	if (plci->State == INC_CON_CONNECTED_ALERT)
	{
		dbug(1, dprintf("Connected Alert Call_Res"));
		if (a->Info_Mask[appl->Id - 1] & 0x200)
		{
			/* early B3 connect (CIP mask bit 9) no release after a disc */
			add_p(plci, LLI, "\x01\x01");
		}
		add_s(plci, CONN_NR, &parms[2]);
		add_s(plci, LLC, &parms[4]);
		add_ai(plci, &parms[5]);
		plci->State = INC_CON_ACCEPT;
		sig_req(plci, CALL_RES, 0);
		return 1;
	}
	else if (plci->State == INC_CON_PENDING || plci->State == INC_CON_ALERT) {
		__clear_bit(appl->Id - 1, plci->c_ind_mask_table);
		dbug(1, dprintf("c_ind_mask =%*pb", MAX_APPL, plci->c_ind_mask_table));
		Reject = GET_WORD(parms[0].info);
		dbug(1, dprintf("Reject=0x%x", Reject));
		if (Reject)
		{
			if (bitmap_empty(plci->c_ind_mask_table, MAX_APPL))
			{
				if ((Reject & 0xff00) == 0x3400)
				{
					esc_t[2] = ((byte)(Reject & 0x00ff)) | 0x80;
					add_p(plci, ESC, esc_t);
					add_ai(plci, &parms[5]);
					sig_req(plci, REJECT, 0);
				}
				else if (Reject == 1 || Reject >= 9)
				{
					add_ai(plci, &parms[5]);
					sig_req(plci, HANGUP, 0);
				}
				else
				{
					esc_t[2] = cau_t[(Reject&0x000f)];
					add_p(plci, ESC, esc_t);
					add_ai(plci, &parms[5]);
					sig_req(plci, REJECT, 0);
				}
				plci->appl = appl;
			}
			else
			{
				sendf(appl, _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
			}
		}
		else {
			plci->appl = appl;
			if (Id & EXT_CONTROLLER) {
				if (AdvCodecSupport(a, plci, appl, 0)) {
					dbug(1, dprintf("connect_res(error from AdvCodecSupport)"));
					sig_req(plci, HANGUP, 0);
					return 1;
				}
				if (plci->tel == ADV_VOICE && a->AdvCodecPLCI)
				{
					Info = add_b23(plci, &parms[1]);
					if (Info)
					{
						dbug(1, dprintf("connect_res(error from add_b23)"));
						sig_req(plci, HANGUP, 0);
						return 1;
					}
					if (plci->adv_nl)
					{
						nl_req_ncci(plci, ASSIGN, 0);
					}
				}
			}
			else
			{
				plci->tel = 0;
				if (ch != 2)
				{
					Info = add_b23(plci, &parms[1]);
					if (Info)
					{
						dbug(1, dprintf("connect_res(error from add_b23 2)"));
						sig_req(plci, HANGUP, 0);
						return 1;
					}
				}
				nl_req_ncci(plci, ASSIGN, 0);
			}

			if (plci->spoofed_msg == SPOOFING_REQUIRED)
			{
				api_save_msg(parms, "wsssss", &plci->saved_msg);
				plci->spoofed_msg = CALL_RES;
				plci->internal_command = BLOCK_PLCI;
				plci->command = 0;
				dbug(1, dprintf("Spoof"));
			}
			else
			{
				add_b1(plci, &parms[1], ch, plci->B1_facilities);
				if (a->Info_Mask[appl->Id - 1] & 0x200)
				{
					/* early B3 connect (CIP mask bit 9) no release after a disc */
					add_p(plci, LLI, "\x01\x01");
				}
				add_s(plci, CONN_NR, &parms[2]);
				add_s(plci, LLC, &parms[4]);
				add_ai(plci, &parms[5]);
				plci->State = INC_CON_ACCEPT;
				sig_req(plci, CALL_RES, 0);
			}

			for_each_set_bit(i, plci->c_ind_mask_table, max_appl)
				sendf(&application[i], _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
		}
	}
	return 1;
}

static byte connect_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			  PLCI *plci, APPL *appl, API_PARSE *msg)
{
	dbug(1, dprintf("connect_a_res"));
	return false;
}

static byte disconnect_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			   PLCI *plci, APPL *appl, API_PARSE *msg)
{
	word Info;
	word i;

	dbug(1, dprintf("disconnect_req"));

	Info = _WRONG_IDENTIFIER;

	if (plci)
	{
		if (plci->State == INC_CON_PENDING || plci->State == INC_CON_ALERT)
		{
			__clear_bit(appl->Id - 1, plci->c_ind_mask_table);
			plci->appl = appl;
			for_each_set_bit(i, plci->c_ind_mask_table, max_appl)
				sendf(&application[i], _DISCONNECT_I, Id, 0, "w", 0);
			plci->State = OUTG_DIS_PENDING;
		}
		if (plci->Sig.Id && plci->appl)
		{
			Info = 0;
			if (plci->Sig.Id != 0xff)
			{
				if (plci->State != INC_DIS_PENDING)
				{
					add_ai(plci, &msg[0]);
					sig_req(plci, HANGUP, 0);
					plci->State = OUTG_DIS_PENDING;
					return 1;
				}
			}
			else
			{
				if (plci->NL.Id && !plci->nl_remove_id)
				{
					mixer_remove(plci);
					nl_req_ncci(plci, REMOVE, 0);
					sendf(appl, _DISCONNECT_R | CONFIRM, Id, Number, "w", 0);
					sendf(appl, _DISCONNECT_I, Id, 0, "w", 0);
					plci->State = INC_DIS_PENDING;
				}
				return 1;
			}
		}
	}

	if (!appl)  return false;
	sendf(appl, _DISCONNECT_R | CONFIRM, Id, Number, "w", Info);
	return false;
}

static byte disconnect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			   PLCI *plci, APPL *appl, API_PARSE *msg)
{
	dbug(1, dprintf("disconnect_res"));
	if (plci)
	{
		/* clear ind mask bit, just in case of collsion of          */
		/* DISCONNECT_IND and CONNECT_RES                           */
		__clear_bit(appl->Id - 1, plci->c_ind_mask_table);
		ncci_free_receive_buffers(plci, 0);
		if (plci_remove_check(plci))
		{
			return 0;
		}
		if (plci->State == INC_DIS_PENDING
		    || plci->State == SUSPENDING) {
			if (bitmap_empty(plci->c_ind_mask_table, MAX_APPL)) {
				if (plci->State != SUSPENDING) plci->State = IDLE;
				dbug(1, dprintf("chs=%d", plci->channels));
				if (!plci->channels) {
					plci_remove(plci);
				}
			}
		}
	}
	return 0;
}

static byte listen_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
		       PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word Info;
	byte i;

	dbug(1, dprintf("listen_req(Appl=0x%x)", appl->Id));

	Info = _WRONG_IDENTIFIER;
	if (a) {
		Info = 0;
		a->Info_Mask[appl->Id - 1] = GET_DWORD(parms[0].info);
		a->CIP_Mask[appl->Id - 1] = GET_DWORD(parms[1].info);
		dbug(1, dprintf("CIP_MASK=0x%lx", GET_DWORD(parms[1].info)));
		if (a->Info_Mask[appl->Id - 1] & 0x200) { /* early B3 connect provides */
			a->Info_Mask[appl->Id - 1] |=  0x10;   /* call progression infos    */
		}

		/* check if external controller listen and switch listen on or off*/
		if (Id&EXT_CONTROLLER && GET_DWORD(parms[1].info)) {
			if (a->profile.Global_Options & ON_BOARD_CODEC) {
				dummy_plci.State = IDLE;
				a->codec_listen[appl->Id - 1] = &dummy_plci;
				a->TelOAD[0] = (byte)(parms[3].length);
				for (i = 1; parms[3].length >= i && i < 22; i++) {
					a->TelOAD[i] = parms[3].info[i];
				}
				a->TelOAD[i] = 0;
				a->TelOSA[0] = (byte)(parms[4].length);
				for (i = 1; parms[4].length >= i && i < 22; i++) {
					a->TelOSA[i] = parms[4].info[i];
				}
				a->TelOSA[i] = 0;
			}
			else Info = 0x2002; /* wrong controller, codec not supported */
		}
		else{               /* clear listen */
			a->codec_listen[appl->Id - 1] = (PLCI *)0;
		}
	}
	sendf(appl,
	      _LISTEN_R | CONFIRM,
	      Id,
	      Number,
	      "w", Info);

	if (a) listen_check(a);
	return false;
}

static byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
		     PLCI *plci, APPL *appl, API_PARSE *msg)
{
	word i;
	API_PARSE *ai;
	PLCI *rc_plci = NULL;
	API_PARSE ai_parms[5];
	word Info = 0;

	dbug(1, dprintf("info_req"));
	for (i = 0; i < 5; i++) ai_parms[i].length = 0;

	ai = &msg[1];

	if (ai->length)
	{
		if (api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
		{
			dbug(1, dprintf("AddInfo wrong"));
			Info = _WRONG_MESSAGE_FORMAT;
		}
	}
	if (!a) Info = _WRONG_STATE;

	if (!Info && plci)
	{                /* no fac, with CPN, or KEY */
		rc_plci = plci;
		if (!ai_parms[3].length && plci->State && (msg[0].length || ai_parms[1].length))
		{
			/* overlap sending option */
			dbug(1, dprintf("OvlSnd"));
			add_s(plci, CPN, &msg[0]);
			add_s(plci, KEY, &ai_parms[1]);
			sig_req(plci, INFO_REQ, 0);
			send_req(plci);
			return false;
		}

		if (plci->State && ai_parms[2].length)
		{
			/* User_Info option */
			dbug(1, dprintf("UUI"));
			add_s(plci, UUI, &ai_parms[2]);
			sig_req(plci, USER_DATA, 0);
		}
		else if (plci->State && ai_parms[3].length)
		{
			/* Facility option */
			dbug(1, dprintf("FAC"));
			add_s(plci, CPN, &msg[0]);
			add_ai(plci, &msg[1]);
			sig_req(plci, FACILITY_REQ, 0);
		}
		else
		{
			Info = _WRONG_STATE;
		}
	}
	else if ((ai_parms[1].length || ai_parms[2].length || ai_parms[3].length) && !Info)
	{
		/* NCR_Facility option -> send UUI and Keypad too */
		dbug(1, dprintf("NCR_FAC"));
		if ((i = get_plci(a)))
		{
			rc_plci = &a->plci[i - 1];
			appl->NullCREnable = true;
			rc_plci->internal_command = C_NCR_FAC_REQ;
			rc_plci->appl = appl;
			add_p(rc_plci, CAI, "\x01\x80");
			add_p(rc_plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
			sig_req(rc_plci, ASSIGN, DSIG_ID);
			send_req(rc_plci);
		}
		else
		{
			Info = _OUT_OF_PLCI;
		}

		if (!Info)
		{
			add_s(rc_plci, CPN, &msg[0]);
			add_ai(rc_plci, &msg[1]);
			sig_req(rc_plci, NCR_FACILITY, 0);
			send_req(rc_plci);
			return false;
			/* for application controlled supplementary services    */
		}
	}

	if (!rc_plci)
	{
		Info = _WRONG_MESSAGE_FORMAT;
	}

	if (!Info)
	{
		send_req(rc_plci);
	}
	else
	{  /* appl is not assigned to a PLCI or error condition */
		dbug(1, dprintf("localInfoCon"));
		sendf(appl,
		      _INFO_R | CONFIRM,
		      Id,
		      Number,
		      "w", Info);
	}
	return false;
}

static byte info_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
		     PLCI *plci, APPL *appl, API_PARSE *msg)
{
	dbug(1, dprintf("info_res"));
	return false;
}

static byte alert_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
		      PLCI *plci, APPL *appl, API_PARSE *msg)
{
	word Info;
	byte ret;

	dbug(1, dprintf("alert_req"));

	Info = _WRONG_IDENTIFIER;
	ret = false;
	if (plci) {
		Info = _ALERT_IGNORED;
		if (plci->State != INC_CON_ALERT) {
			Info = _WRONG_STATE;
			if (plci->State == INC_CON_PENDING) {
				Info = 0;
				plci->State = INC_CON_ALERT;
				add_ai(plci, &msg[0]);
				sig_req(plci, CALL_ALERT, 0);
				ret = 1;
			}
		}
	}
	sendf(appl,
	      _ALERT_R | CONFIRM,
	      Id,
	      Number,
	      "w", Info);
	return ret;
}

static byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			 PLCI *plci, APPL *appl, API_PARSE *msg)
{
	word Info = 0;
	word i    = 0;

	word selector;
	word SSreq;
	long relatedPLCIvalue;
	DIVA_CAPI_ADAPTER *relatedadapter;
	byte *SSparms  = "";
	byte RCparms[]  = "\x05\x00\x00\x02\x00\x00";
	byte SSstruct[] = "\x09\x00\x00\x06\x00\x00\x00\x00\x00\x00";
	API_PARSE *parms;
	API_PARSE ss_parms[11];
	PLCI *rplci;
	byte cai[15];
	dword d;
	API_PARSE dummy;

	dbug(1, dprintf("facility_req"));
	for (i = 0; i < 9; i++) ss_parms[i].length = 0;

	parms = &msg[1];

	if (!a)
	{
		dbug(1, dprintf("wrong Ctrl"));
		Info = _WRONG_IDENTIFIER;
	}

	selector = GET_WORD(msg[0].info);

	if (!Info)
	{
		switch (selector)
		{
		case SELECTOR_HANDSET:
			Info = AdvCodecSupport(a, plci, appl, HOOK_SUPPORT);
			break;

		case SELECTOR_SU_SERV:
			if (!msg[1].length)
			{
				Info = _WRONG_MESSAGE_FORMAT;
				break;
			}
			SSreq = GET_WORD(&(msg[1].info[1]));
			PUT_WORD(&RCparms[1], SSreq);
			SSparms = RCparms;
			switch (SSreq)
			{
			case S_GET_SUPPORTED_SERVICES:
				if ((i = get_plci(a)))
				{
					rplci = &a->plci[i - 1];
					rplci->appl = appl;
					add_p(rplci, CAI, "\x01\x80");
					add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
					sig_req(rplci, ASSIGN, DSIG_ID);
					send_req(rplci);
				}
				else
				{
					PUT_DWORD(&SSstruct[6], MASK_TERMINAL_PORTABILITY);
					SSparms = (byte *)SSstruct;
					break;
				}
				rplci->internal_command = GETSERV_REQ_PEND;
				rplci->number = Number;
				rplci->appl = appl;
				sig_req(rplci, S_SUPPORTED, 0);
				send_req(rplci);
				return false;
				break;

			case S_LISTEN:
				if (parms->length == 7)
				{
					if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
					{
						dbug(1, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
						break;
					}
				}
				else
				{
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				a->Notification_Mask[appl->Id - 1] = GET_DWORD(ss_parms[2].info);
				if (a->Notification_Mask[appl->Id - 1] & SMASK_MWI) /* MWI active? */
				{
					if ((i = get_plci(a)))
					{
						rplci = &a->plci[i - 1];
						rplci->appl = appl;
						add_p(rplci, CAI, "\x01\x80");
						add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
						sig_req(rplci, ASSIGN, DSIG_ID);
						send_req(rplci);
					}
					else
					{
						break;
					}
					rplci->internal_command = GET_MWI_STATE;
					rplci->number = Number;
					sig_req(rplci, MWI_POLL, 0);
					send_req(rplci);
				}
				break;

			case S_HOLD:
				api_parse(&parms->info[1], (word)parms->length, "ws", ss_parms);
				if (plci && plci->State && plci->SuppState == IDLE)
				{
					plci->SuppState = HOLD_REQUEST;
					plci->command = C_HOLD_REQ;
					add_s(plci, CAI, &ss_parms[1]);
					sig_req(plci, CALL_HOLD, 0);
					send_req(plci);
					return false;
				}
				else Info = 0x3010;                    /* wrong state           */
				break;
			case S_RETRIEVE:
				if (plci && plci->State && plci->SuppState == CALL_HELD)
				{
					if (Id & EXT_CONTROLLER)
					{
						if (AdvCodecSupport(a, plci, appl, 0))
						{
							Info = 0x3010;                    /* wrong state           */
							break;
						}
					}
					else plci->tel = 0;

					plci->SuppState = RETRIEVE_REQUEST;
					plci->command = C_RETRIEVE_REQ;
					if (plci->spoofed_msg == SPOOFING_REQUIRED)
					{
						plci->spoofed_msg = CALL_RETRIEVE;
						plci->internal_command = BLOCK_PLCI;
						plci->command = 0;
						dbug(1, dprintf("Spoof"));
						return false;
					}
					else
					{
						sig_req(plci, CALL_RETRIEVE, 0);
						send_req(plci);
						return false;
					}
				}
				else Info = 0x3010;                    /* wrong state           */
				break;
			case S_SUSPEND:
				if (parms->length)
				{
					if (api_parse(&parms->info[1], (word)parms->length, "wbs", ss_parms))
					{
						dbug(1, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
						break;
					}
				}
				if (plci && plci->State)
				{
					add_s(plci, CAI, &ss_parms[2]);
					plci->command = SUSPEND_REQ;
					sig_req(plci, SUSPEND, 0);
					plci->State = SUSPENDING;
					send_req(plci);
				}
				else Info = 0x3010;                    /* wrong state           */
				break;

			case S_RESUME:
				if (!(i = get_plci(a)))
				{
					Info = _OUT_OF_PLCI;
					break;
				}
				rplci = &a->plci[i - 1];
				rplci->appl = appl;
				rplci->number = Number;
				rplci->tel = 0;
				rplci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
				/* check 'external controller' bit for codec support */
				if (Id & EXT_CONTROLLER)
				{
					if (AdvCodecSupport(a, rplci, appl, 0))
					{
						rplci->Id = 0;
						Info = 0x300A;
						break;
					}
				}
				if (parms->length)
				{
					if (api_parse(&parms->info[1], (word)parms->length, "wbs", ss_parms))
					{
						dbug(1, dprintf("format wrong"));
						rplci->Id = 0;
						Info = _WRONG_MESSAGE_FORMAT;
						break;
					}
				}
				dummy.length = 0;
				dummy.info = "\x00";
				add_b1(rplci, &dummy, 0, 0);
				if (a->Info_Mask[appl->Id - 1] & 0x200)
				{
					/* early B3 connect (CIP mask bit 9) no release after a disc */
					add_p(rplci, LLI, "\x01\x01");
				}
				add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
				sig_req(rplci, ASSIGN, DSIG_ID);
				send_req(rplci);
				add_s(rplci, CAI, &ss_parms[2]);
				rplci->command = RESUME_REQ;
				sig_req(rplci, RESUME, 0);
				rplci->State = RESUMING;
				send_req(rplci);
				break;

			case S_CONF_BEGIN: /* Request */
			case S_CONF_DROP:
			case S_CONF_ISOLATE:
			case S_CONF_REATTACH:
				if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
				{
					dbug(1, dprintf("format wrong"));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				if (plci && plci->State && ((plci->SuppState == IDLE) || (plci->SuppState == CALL_HELD)))
				{
					d = GET_DWORD(ss_parms[2].info);
					if (d >= 0x80)
					{
						dbug(1, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
						break;
					}
					plci->ptyState = (byte)SSreq;
					plci->command = 0;
					cai[0] = 2;
					switch (SSreq)
					{
					case S_CONF_BEGIN:
						cai[1] = CONF_BEGIN;
						plci->internal_command = CONF_BEGIN_REQ_PEND;
						break;
					case S_CONF_DROP:
						cai[1] = CONF_DROP;
						plci->internal_command = CONF_DROP_REQ_PEND;
						break;
					case S_CONF_ISOLATE:
						cai[1] = CONF_ISOLATE;
						plci->internal_command = CONF_ISOLATE_REQ_PEND;
						break;
					case S_CONF_REATTACH:
						cai[1] = CONF_REATTACH;
						plci->internal_command = CONF_REATTACH_REQ_PEND;
						break;
					}
					cai[2] = (byte)d; /* Conference Size resp. PartyId */
					add_p(plci, CAI, cai);
					sig_req(plci, S_SERVICE, 0);
					send_req(plci);
					return false;
				}
				else Info = 0x3010;                    /* wrong state           */
				break;

			case S_ECT:
			case S_3PTY_BEGIN:
			case S_3PTY_END:
			case S_CONF_ADD:
				if (parms->length == 7)
				{
					if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
					{
						dbug(1, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
						break;
					}
				}
				else if (parms->length == 8) /* workaround for the T-View-S */
				{
					if (api_parse(&parms->info[1], (word)parms->length, "wbdb", ss_parms))
					{
						dbug(1, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
						break;
					}
				}
				else
				{
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				if (!msg[1].length)
				{
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				if (!plci)
				{
					Info = _WRONG_IDENTIFIER;
					break;
				}
				relatedPLCIvalue = GET_DWORD(ss_parms[2].info);
				relatedPLCIvalue &= 0x0000FFFF;
				dbug(1, dprintf("PTY/ECT/addCONF,relPLCI=%lx", relatedPLCIvalue));
				/* controller starts with 0 up to (max_adapter - 1) */
				if (((relatedPLCIvalue & 0x7f) == 0)
				    || (MapController((byte)(relatedPLCIvalue & 0x7f)) == 0)
				    || (MapController((byte)(relatedPLCIvalue & 0x7f)) > max_adapter))
				{
					if (SSreq == S_3PTY_END)
					{
						dbug(1, dprintf("wrong Controller use 2nd PLCI=PLCI"));
						rplci = plci;
					}
					else
					{
						Info = 0x3010;                    /* wrong state           */
						break;
					}
				}
				else
				{
					relatedadapter = &adapter[MapController((byte)(relatedPLCIvalue & 0x7f)) - 1];
					relatedPLCIvalue >>= 8;
					/* find PLCI PTR*/
					for (i = 0, rplci = NULL; i < relatedadapter->max_plci; i++)
					{
						if (relatedadapter->plci[i].Id == (byte)relatedPLCIvalue)
						{
							rplci = &relatedadapter->plci[i];
						}
					}
					if (!rplci || !relatedPLCIvalue)
					{
						if (SSreq == S_3PTY_END)
						{
							dbug(1, dprintf("use 2nd PLCI=PLCI"));
							rplci = plci;
						}
						else
						{
							Info = 0x3010;                    /* wrong state           */
							break;
						}
					}
				}
/*
  dbug(1, dprintf("rplci:%x", rplci));
  dbug(1, dprintf("plci:%x", plci));
  dbug(1, dprintf("rplci->ptyState:%x", rplci->ptyState));
  dbug(1, dprintf("plci->ptyState:%x", plci->ptyState));
  dbug(1, dprintf("SSreq:%x", SSreq));
  dbug(1, dprintf("rplci->internal_command:%x", rplci->internal_command));
  dbug(1, dprintf("rplci->appl:%x", rplci->appl));
  dbug(1, dprintf("rplci->Id:%x", rplci->Id));
*/
				/* send PTY/ECT req, cannot check all states because of US stuff */
				if (!rplci->internal_command && rplci->appl)
				{
					plci->command = 0;
					rplci->relatedPTYPLCI = plci;
					plci->relatedPTYPLCI = rplci;
					rplci->ptyState = (byte)SSreq;
					if (SSreq == S_ECT)
					{
						rplci->internal_command = ECT_REQ_PEND;
						cai[1] = ECT_EXECUTE;

						rplci->vswitchstate = 0;
						rplci->vsprot = 0;
						rplci->vsprotdialect = 0;
						plci->vswitchstate = 0;
						plci->vsprot = 0;
						plci->vsprotdialect = 0;

					}
					else if (SSreq == S_CONF_ADD)
					{
						rplci->internal_command = CONF_ADD_REQ_PEND;
						cai[1] = CONF_ADD;
					}
					else
					{
						rplci->internal_command = PTY_REQ_PEND;
						cai[1] = (byte)(SSreq - 3);
					}
					rplci->number = Number;
					if (plci != rplci) /* explicit invocation */
					{
						cai[0] = 2;
						cai[2] = plci->Sig.Id;
						dbug(1, dprintf("explicit invocation"));
					}
					else
					{
						dbug(1, dprintf("implicit invocation"));
						cai[0] = 1;
					}
					add_p(rplci, CAI, cai);
					sig_req(rplci, S_SERVICE, 0);
					send_req(rplci);
					return false;
				}
				else
				{
					dbug(0, dprintf("Wrong line"));
					Info = 0x3010;                    /* wrong state           */
					break;
				}
				break;

			case S_CALL_DEFLECTION:
				if (api_parse(&parms->info[1], (word)parms->length, "wbwss", ss_parms))
				{
					dbug(1, dprintf("format wrong"));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				if (!plci)
				{
					Info = _WRONG_IDENTIFIER;
					break;
				}
				/* reuse unused screening indicator */
				ss_parms[3].info[3] = (byte)GET_WORD(&(ss_parms[2].info[0]));
				plci->command = 0;
				plci->internal_command = CD_REQ_PEND;
				appl->CDEnable = true;
				cai[0] = 1;
				cai[1] = CALL_DEFLECTION;
				add_p(plci, CAI, cai);
				add_p(plci, CPN, ss_parms[3].info);
				sig_req(plci, S_SERVICE, 0);
				send_req(plci);
				return false;
				break;

			case S_CALL_FORWARDING_START:
				if (api_parse(&parms->info[1], (word)parms->length, "wbdwwsss", ss_parms))
				{
					dbug(1, dprintf("format wrong"));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}

				if ((i = get_plci(a)))
				{
					rplci = &a->plci[i - 1];
					rplci->appl = appl;
					add_p(rplci, CAI, "\x01\x80");
					add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
					sig_req(rplci, ASSIGN, DSIG_ID);
					send_req(rplci);
				}
				else
				{
					Info = _OUT_OF_PLCI;
					break;
				}

				/* reuse unused screening indicator */
				rplci->internal_command = CF_START_PEND;
				rplci->appl = appl;
				rplci->number = Number;
				appl->S_Handle = GET_DWORD(&(ss_parms[2].info[0]));
				cai[0] = 2;
				cai[1] = 0x70 | (byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
				cai[2] = (byte)GET_WORD(&(ss_parms[4].info[0])); /* Basic Service */
				add_p(rplci, CAI, cai);
				add_p(rplci, OAD, ss_parms[5].info);
				add_p(rplci, CPN, ss_parms[6].info);
				sig_req(rplci, S_SERVICE, 0);
				send_req(rplci);
				return false;
				break;

			case S_INTERROGATE_DIVERSION:
			case S_INTERROGATE_NUMBERS:
			case S_CALL_FORWARDING_STOP:
			case S_CCBS_REQUEST:
			case S_CCBS_DEACTIVATE:
			case S_CCBS_INTERROGATE:
				switch (SSreq)
				{
				case S_INTERROGATE_NUMBERS:
					if (api_parse(&parms->info[1], (word)parms->length, "wbd", ss_parms))
					{
						dbug(0, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
					}
					break;
				case S_CCBS_REQUEST:
				case S_CCBS_DEACTIVATE:
					if (api_parse(&parms->info[1], (word)parms->length, "wbdw", ss_parms))
					{
						dbug(0, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
					}
					break;
				case S_CCBS_INTERROGATE:
					if (api_parse(&parms->info[1], (word)parms->length, "wbdws", ss_parms))
					{
						dbug(0, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
					}
					break;
				default:
					if (api_parse(&parms->info[1], (word)parms->length, "wbdwws", ss_parms))
					{
						dbug(0, dprintf("format wrong"));
						Info = _WRONG_MESSAGE_FORMAT;
						break;
					}
					break;
				}

				if (Info) break;
				if ((i = get_plci(a)))
				{
					rplci = &a->plci[i - 1];
					switch (SSreq)
					{
					case S_INTERROGATE_DIVERSION: /* use cai with S_SERVICE below */
						cai[1] = 0x60 | (byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
						rplci->internal_command = INTERR_DIVERSION_REQ_PEND; /* move to rplci if assigned */
						break;
					case S_INTERROGATE_NUMBERS: /* use cai with S_SERVICE below */
						cai[1] = DIVERSION_INTERROGATE_NUM; /* Function */
						rplci->internal_command = INTERR_NUMBERS_REQ_PEND; /* move to rplci if assigned */
						break;
					case S_CALL_FORWARDING_STOP:
						rplci->internal_command = CF_STOP_PEND;
						cai[1] = 0x80 | (byte)GET_WORD(&(ss_parms[3].info[0])); /* Function */
						break;
					case S_CCBS_REQUEST:
						cai[1] = CCBS_REQUEST;
						rplci->internal_command = CCBS_REQUEST_REQ_PEND;
						break;
					case S_CCBS_DEACTIVATE:
						cai[1] = CCBS_DEACTIVATE;
						rplci->internal_command = CCBS_DEACTIVATE_REQ_PEND;
						break;
					case S_CCBS_INTERROGATE:
						cai[1] = CCBS_INTERROGATE;
						rplci->internal_command = CCBS_INTERROGATE_REQ_PEND;
						break;
					default:
						cai[1] = 0;
						break;
					}
					rplci->appl = appl;
					rplci->number = Number;
					add_p(rplci, CAI, "\x01\x80");
					add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
					sig_req(rplci, ASSIGN, DSIG_ID);
					send_req(rplci);
				}
				else
				{
					Info = _OUT_OF_PLCI;
					break;
				}

				appl->S_Handle = GET_DWORD(&(ss_parms[2].info[0]));
				switch (SSreq)
				{
				case S_INTERROGATE_NUMBERS:
					cai[0] = 1;
					add_p(rplci, CAI, cai);
					break;
				case S_CCBS_REQUEST:
				case S_CCBS_DEACTIVATE:
					cai[0] = 3;
					PUT_WORD(&cai[2], GET_WORD(&(ss_parms[3].info[0])));
					add_p(rplci, CAI, cai);
					break;
				case S_CCBS_INTERROGATE:
					cai[0] = 3;
					PUT_WORD(&cai[2], GET_WORD(&(ss_parms[3].info[0])));
					add_p(rplci, CAI, cai);
					add_p(rplci, OAD, ss_parms[4].info);
					break;
				default:
					cai[0] = 2;
					cai[2] = (byte)GET_WORD(&(ss_parms[4].info[0])); /* Basic Service */
					add_p(rplci, CAI, cai);
					add_p(rplci, OAD, ss_parms[5].info);
					break;
				}

				sig_req(rplci, S_SERVICE, 0);
				send_req(rplci);
				return false;
				break;

			case S_MWI_ACTIVATE:
				if (api_parse(&parms->info[1], (word)parms->length, "wbwdwwwssss", ss_parms))
				{
					dbug(1, dprintf("format wrong"));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				if (!plci)
				{
					if ((i = get_plci(a)))
					{
						rplci = &a->plci[i - 1];
						rplci->appl = appl;
						rplci->cr_enquiry = true;
						add_p(rplci, CAI, "\x01\x80");
						add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
						sig_req(rplci, ASSIGN, DSIG_ID);
						send_req(rplci);
					}
					else
					{
						Info = _OUT_OF_PLCI;
						break;
					}
				}
				else
				{
					rplci = plci;
					rplci->cr_enquiry = false;
				}

				rplci->command = 0;
				rplci->internal_command = MWI_ACTIVATE_REQ_PEND;
				rplci->appl = appl;
				rplci->number = Number;

				cai[0] = 13;
				cai[1] = ACTIVATION_MWI; /* Function */
				PUT_WORD(&cai[2], GET_WORD(&(ss_parms[2].info[0]))); /* Basic Service */
				PUT_DWORD(&cai[4], GET_DWORD(&(ss_parms[3].info[0]))); /* Number of Messages */
				PUT_WORD(&cai[8], GET_WORD(&(ss_parms[4].info[0]))); /* Message Status */
				PUT_WORD(&cai[10], GET_WORD(&(ss_parms[5].info[0]))); /* Message Reference */
				PUT_WORD(&cai[12], GET_WORD(&(ss_parms[6].info[0]))); /* Invocation Mode */
				add_p(rplci, CAI, cai);
				add_p(rplci, CPN, ss_parms[7].info); /* Receiving User Number */
				add_p(rplci, OAD, ss_parms[8].info); /* Controlling User Number */
				add_p(rplci, OSA, ss_parms[9].info); /* Controlling User Provided Number */
				add_p(rplci, UID, ss_parms[10].info); /* Time */
				sig_req(rplci, S_SERVICE, 0);
				send_req(rplci);
				return false;

			case S_MWI_DEACTIVATE:
				if (api_parse(&parms->info[1], (word)parms->length, "wbwwss", ss_parms))
				{
					dbug(1, dprintf("format wrong"));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				if (!plci)
				{
					if ((i = get_plci(a)))
					{
						rplci = &a->plci[i - 1];
						rplci->appl = appl;
						rplci->cr_enquiry = true;
						add_p(rplci, CAI, "\x01\x80");
						add_p(rplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
						sig_req(rplci, ASSIGN, DSIG_ID);
						send_req(rplci);
					}
					else
					{
						Info = _OUT_OF_PLCI;
						break;
					}
				}
				else
				{
					rplci = plci;
					rplci->cr_enquiry = false;
				}

				rplci->command = 0;
				rplci->internal_command = MWI_DEACTIVATE_REQ_PEND;
				rplci->appl = appl;
				rplci->number = Number;

				cai[0] = 5;
				cai[1] = DEACTIVATION_MWI; /* Function */
				PUT_WORD(&cai[2], GET_WORD(&(ss_parms[2].info[0]))); /* Basic Service */
				PUT_WORD(&cai[4], GET_WORD(&(ss_parms[3].info[0]))); /* Invocation Mode */
				add_p(rplci, CAI, cai);
				add_p(rplci, CPN, ss_parms[4].info); /* Receiving User Number */
				add_p(rplci, OAD, ss_parms[5].info); /* Controlling User Number */
				sig_req(rplci, S_SERVICE, 0);
				send_req(rplci);
				return false;

			default:
				Info = 0x300E;  /* not supported */
				break;
			}
			break; /* case SELECTOR_SU_SERV: end */


		case SELECTOR_DTMF:
			return (dtmf_request(Id, Number, a, plci, appl, msg));



		case SELECTOR_LINE_INTERCONNECT:
			return (mixer_request(Id, Number, a, plci, appl, msg));



		case PRIV_SELECTOR_ECHO_CANCELLER:
			appl->appl_flags |= APPL_FLAG_PRIV_EC_SPEC;
			return (ec_request(Id, Number, a, plci, appl, msg));

		case SELECTOR_ECHO_CANCELLER:
			appl->appl_flags &= ~APPL_FLAG_PRIV_EC_SPEC;
			return (ec_request(Id, Number, a, plci, appl, msg));


		case SELECTOR_V42BIS:
		default:
			Info = _FACILITY_NOT_SUPPORTED;
			break;
		} /* end of switch (selector) */
	}

	dbug(1, dprintf("SendFacRc"));
	sendf(appl,
	      _FACILITY_R | CONFIRM,
	      Id,
	      Number,
	      "wws", Info, selector, SSparms);
	return false;
}

static byte facility_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			 PLCI *plci, APPL *appl, API_PARSE *msg)
{
	dbug(1, dprintf("facility_res"));
	return false;
}

static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			   PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word Info = 0;
	byte req;
	byte len;
	word w;
	word fax_control_bits, fax_feature_bits, fax_info_change;
	API_PARSE *ncpi;
	byte pvc[2];

	API_PARSE fax_parms[9];
	word i;


	dbug(1, dprintf("connect_b3_req"));
	if (plci)
	{
		if ((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING)
		    || (plci->State == INC_DIS_PENDING) || (plci->SuppState != IDLE))
		{
			Info = _WRONG_STATE;
		}
		else
		{
			/* local reply if assign unsuccessful
			   or B3 protocol allows only one layer 3 connection
			   and already connected
			   or B2 protocol not any LAPD
			   and connect_b3_req contradicts originate/answer direction */
			if (!plci->NL.Id
			    || (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
				&& ((plci->channels != 0)
				    || (((plci->B2_prot != B2_SDLC) && (plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL))
					&& ((plci->call_dir & CALL_DIR_ANSWER) && !(plci->call_dir & CALL_DIR_FORCE_OUTG_NL))))))
			{
				dbug(1, dprintf("B3 already connected=%d or no NL.Id=0x%x, dir=%d sstate=0x%x",
						plci->channels, plci->NL.Id, plci->call_dir, plci->SuppState));
				Info = _WRONG_STATE;
				sendf(appl,
				      _CONNECT_B3_R | CONFIRM,
				      Id,
				      Number,
				      "w", Info);
				return false;
			}
			plci->requested_options_conn = 0;

			req = N_CONNECT;
			ncpi = &parms[0];
			if (plci->B3_prot == 2 || plci->B3_prot == 3)
			{
				if (ncpi->length > 2)
				{
					/* check for PVC */
					if (ncpi->info[2] || ncpi->info[3])
					{
						pvc[0] = ncpi->info[3];
						pvc[1] = ncpi->info[2];
						add_d(plci, 2, pvc);
						req = N_RESET;
					}
					else
					{
						if (ncpi->info[1] & 1) req = N_CONNECT | N_D_BIT;
						add_d(plci, (word)(ncpi->length - 3), &ncpi->info[4]);
					}
				}
			}
			else if (plci->B3_prot == 5)
			{
				if (plci->NL.Id && !plci->nl_remove_id)
				{
					fax_control_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low);
					fax_feature_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low);
					if (!(fax_control_bits & T30_CONTROL_BIT_MORE_DOCUMENTS)
					    || (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS))
					{
						len = offsetof(T30_INFO, universal_6);
						fax_info_change = false;
						if (ncpi->length >= 4)
						{
							w = GET_WORD(&ncpi->info[3]);
							if ((w & 0x0001) != ((word)(((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & 0x0001)))
							{
								((T30_INFO *)(plci->fax_connect_info_buffer))->resolution =
									(byte)((((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & ~T30_RESOLUTION_R8_0770_OR_200) |
									       ((w & 0x0001) ? T30_RESOLUTION_R8_0770_OR_200 : 0));
								fax_info_change = true;
							}
							fax_control_bits &= ~(T30_CONTROL_BIT_REQUEST_POLLING | T30_CONTROL_BIT_MORE_DOCUMENTS);
							if (w & 0x0002)  /* Fax-polling request */
								fax_control_bits |= T30_CONTROL_BIT_REQUEST_POLLING;
							if ((w & 0x0004) /* Request to send / poll another document */
							    && (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_MORE_DOCUMENTS))
							{
								fax_control_bits |= T30_CONTROL_BIT_MORE_DOCUMENTS;
							}
							if (ncpi->length >= 6)
							{
								w = GET_WORD(&ncpi->info[5]);
								if (((byte) w) != ((T30_INFO *)(plci->fax_connect_info_buffer))->data_format)
								{
									((T30_INFO *)(plci->fax_connect_info_buffer))->data_format = (byte) w;
									fax_info_change = true;
								}

								if ((a->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
								    && (GET_WORD(&ncpi->info[5]) & 0x8000)) /* Private SEP/SUB/PWD enable */
								{
									plci->requested_options_conn |= (1L << PRIVATE_FAX_SUB_SEP_PWD);
								}
								if ((a->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
								    && (GET_WORD(&ncpi->info[5]) & 0x4000)) /* Private non-standard facilities enable */
								{
									plci->requested_options_conn |= (1L << PRIVATE_FAX_NONSTANDARD);
								}
								fax_control_bits &= ~(T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_SEL_POLLING |
										      T30_CONTROL_BIT_ACCEPT_PASSWORD);
								if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id - 1])
								    & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
								{
									if (api_parse(&ncpi->info[1], ncpi->length, "wwwwsss", fax_parms))
										Info = _WRONG_MESSAGE_FORMAT;
									else
									{
										if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id - 1])
										    & (1L << PRIVATE_FAX_SUB_SEP_PWD))
										{
											fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_PASSWORD;
											if (fax_control_bits & T30_CONTROL_BIT_ACCEPT_POLLING)
												fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
										}
										w = fax_parms[4].length;
										if (w > 20)
											w = 20;
										((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = (byte) w;
										for (i = 0; i < w; i++)
											((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1 + i];
										((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
										len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
										w = fax_parms[5].length;
										if (w > 20)
											w = 20;
										plci->fax_connect_info_buffer[len++] = (byte) w;
										for (i = 0; i < w; i++)
											plci->fax_connect_info_buffer[len++] = fax_parms[5].info[1 + i];
										w = fax_parms[6].length;
										if (w > 20)
											w = 20;
										plci->fax_connect_info_buffer[len++] = (byte) w;
										for (i = 0; i < w; i++)
											plci->fax_connect_info_buffer[len++] = fax_parms[6].info[1 + i];
										if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id - 1])
										    & (1L << PRIVATE_FAX_NONSTANDARD))
										{
											if (api_parse(&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
											{
												dbug(1, dprintf("non-standard facilities info missing or wrong format"));
												plci->fax_connect_info_buffer[len++] = 0;
											}
											else
											{
												if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
													plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
												plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
												for (i = 0; i < fax_parms[7].length; i++)
													plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1 + i];
											}
										}
									}
								}
								else
								{
									len = offsetof(T30_INFO, universal_6);
								}
								fax_info_change = true;

							}
							if (fax_control_bits != GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low))
							{
								PUT_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low, fax_control_bits);
								fax_info_change = true;
							}
						}
						if (Info == GOOD)
						{
							plci->fax_connect_info_length = len;
							if (fax_info_change)
							{
								if (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)
								{
									start_internal_command(Id, plci, fax_connect_info_command);
									return false;
								}
								else
								{
									start_internal_command(Id, plci, fax_adjust_b23_command);
									return false;
								}
							}
						}
					}
					else  Info = _WRONG_STATE;
				}
				else  Info = _WRONG_STATE;
			}

			else if (plci->B3_prot == B3_RTP)
			{
				plci->internal_req_buffer[0] = ncpi->length + 1;
				plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
				for (w = 0; w < ncpi->length; w++)
					plci->internal_req_buffer[2 + w] = ncpi->info[1 + w];
				start_internal_command(Id, plci, rtp_connect_b3_req_command);
				return false;
			}

			if (!Info)
			{
				nl_req_ncci(plci, req, 0);
				return 1;
			}
		}
	}
	else Info = _WRONG_IDENTIFIER;

	sendf(appl,
	      _CONNECT_B3_R | CONFIRM,
	      Id,
	      Number,
	      "w", Info);
	return false;
}

static byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			   PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word ncci;
	API_PARSE *ncpi;
	byte req;

	word w;


	API_PARSE fax_parms[9];
	word i;
	byte len;


	dbug(1, dprintf("connect_b3_res"));

	ncci = (word)(Id >> 16);
	if (plci && ncci) {
		if (a->ncci_state[ncci] == INC_CON_PENDING) {
			if (GET_WORD(&parms[0].info[0]) != 0)
			{
				a->ncci_state[ncci] = OUTG_REJ_PENDING;
				channel_request_xon(plci, a->ncci_ch[ncci]);
				channel_xmit_xon(plci);
				cleanup_ncci_data(plci, ncci);
				nl_req_ncci(plci, N_DISC, (byte)ncci);
				return 1;
			}
			a->ncci_state[ncci] = INC_ACT_PENDING;

			req = N_CONNECT_ACK;
			ncpi = &parms[1];
			if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
			{

				if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id - 1])
				    & (1L << PRIVATE_FAX_NONSTANDARD))
				{
					if (((plci->B3_prot == 4) || (plci->B3_prot == 5))
					    && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
					    && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
					{
						len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
						if (plci->fax_connect_info_length < len)
						{
							((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
							((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
						}
						if (api_parse(&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
						{
							dbug(1, dprintf("non-standard facilities info missing or wrong format"));
						}
						else
						{
							if (plci->fax_connect_info_length <= len)
								plci->fax_connect_info_buffer[len] = 0;
							len += 1 + plci->fax_connect_info_buffer[len];
							if (plci->fax_connect_info_length <= len)
								plci->fax_connect_info_buffer[len] = 0;
							len += 1 + plci->fax_connect_info_buffer[len];
							if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
								plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
							plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
							for (i = 0; i < fax_parms[7].length; i++)
								plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1 + i];
						}
						plci->fax_connect_info_length = len;
						((T30_INFO *)(plci->fax_connect_info_buffer))->code = 0;
						start_internal_command(Id, plci, fax_connect_ack_command);
						return false;
					}
				}

				nl_req_ncci(plci, req, (byte)ncci);
				if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
				    && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
				{
					if (plci->B3_prot == 4)
						sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
					else
						sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
					plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
				}
			}

			else if (plci->B3_prot == B3_RTP)
			{
				plci->internal_req_buffer[0] = ncpi->length + 1;
				plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
				for (w = 0; w < ncpi->length; w++)
					plci->internal_req_buffer[2 + w] = ncpi->info[1+w];
				start_internal_command(Id, plci, rtp_connect_b3_res_command);
				return false;
			}

			else
			{
				if (ncpi->length > 2) {
					if (ncpi->info[1] & 1) req = N_CONNECT_ACK | N_D_BIT;
					add_d(plci, (word)(ncpi->length - 3), &ncpi->info[4]);
				}
				nl_req_ncci(plci, req, (byte)ncci);
				sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
				if (plci->adjust_b_restore)
				{
					plci->adjust_b_restore = false;
					start_internal_command(Id, plci, adjust_b_restore);
				}
			}
			return 1;
		}
	}
	return false;
}

static byte connect_b3_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			     PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word ncci;

	ncci = (word)(Id >> 16);
	dbug(1, dprintf("connect_b3_a_res(ncci=0x%x)", ncci));

	if (plci && ncci && (plci->State != IDLE) && (plci->State != INC_DIS_PENDING)
	    && (plci->State != OUTG_DIS_PENDING))
	{
		if (a->ncci_state[ncci] == INC_ACT_PENDING) {
			a->ncci_state[ncci] = CONNECTED;
			if (plci->State != INC_CON_CONNECTED_ALERT) plci->State = CONNECTED;
			channel_request_xon(plci, a->ncci_ch[ncci]);
			channel_xmit_xon(plci);
		}
	}
	return false;
}

static byte disconnect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			      PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word Info;
	word ncci;
	API_PARSE *ncpi;

	dbug(1, dprintf("disconnect_b3_req"));

	Info = _WRONG_IDENTIFIER;
	ncci = (word)(Id >> 16);
	if (plci && ncci)
	{
		Info = _WRONG_STATE;
		if ((a->ncci_state[ncci] == CONNECTED)
		    || (a->ncci_state[ncci] == OUTG_CON_PENDING)
		    || (a->ncci_state[ncci] == INC_CON_PENDING)
		    || (a->ncci_state[ncci] == INC_ACT_PENDING))
		{
			a->ncci_state[ncci] = OUTG_DIS_PENDING;
			channel_request_xon(plci, a->ncci_ch[ncci]);
			channel_xmit_xon(plci);

			if (a->ncci[ncci].data_pending
			    && ((plci->B3_prot == B3_TRANSPARENT)
				|| (plci->B3_prot == B3_T30)
				|| (plci->B3_prot == B3_T30_WITH_EXTENSIONS)))
			{
				plci->send_disc = (byte)ncci;
				plci->command = 0;
				return false;
			}
			else
			{
				cleanup_ncci_data(plci, ncci);

				if (plci->B3_prot == 2 || plci->B3_prot == 3)
				{
					ncpi = &parms[0];
					if (ncpi->length > 3)
					{
						add_d(plci, (word)(ncpi->length - 3), (byte *)&(ncpi->info[4]));
					}
				}
				nl_req_ncci(plci, N_DISC, (byte)ncci);
			}
			return 1;
		}
	}
	sendf(appl,
	      _DISCONNECT_B3_R | CONFIRM,
	      Id,
	      Number,
	      "w", Info);
	return false;
}

static byte disconnect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			      PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word ncci;
	word i;

	ncci = (word)(Id >> 16);
	dbug(1, dprintf("disconnect_b3_res(ncci=0x%x", ncci));
	if (plci && ncci) {
		plci->requested_options_conn = 0;
		plci->fax_connect_info_length = 0;
		plci->ncpi_state = 0x00;
		if (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
		    && ((plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL)))
		{
			plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
		}
		for (i = 0; i < MAX_CHANNELS_PER_PLCI && plci->inc_dis_ncci_table[i] != (byte)ncci; i++);
		if (i < MAX_CHANNELS_PER_PLCI) {
			if (plci->channels)plci->channels--;
			for (; i < MAX_CHANNELS_PER_PLCI - 1; i++) plci->inc_dis_ncci_table[i] = plci->inc_dis_ncci_table[i + 1];
			plci->inc_dis_ncci_table[MAX_CHANNELS_PER_PLCI - 1] = 0;

			ncci_free_receive_buffers(plci, ncci);

			if ((plci->State == IDLE || plci->State == SUSPENDING) && !plci->channels) {
				if (plci->State == SUSPENDING) {
					sendf(plci->appl,
					      _FACILITY_I,
					      Id & 0xffffL,
					      0,
					      "ws", (word)3, "\x03\x04\x00\x00");
					sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
				}
				plci_remove(plci);
				plci->State = IDLE;
			}
		}
		else
		{
			if ((a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
			    && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
			    && (a->ncci_state[ncci] == INC_DIS_PENDING))
			{
				ncci_free_receive_buffers(plci, ncci);

				nl_req_ncci(plci, N_EDATA, (byte)ncci);

				plci->adapter->ncci_state[ncci] = IDLE;
				start_internal_command(Id, plci, fax_disconnect_command);
				return 1;
			}
		}
	}
	return false;
}

static byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			PLCI *plci, APPL *appl, API_PARSE *parms)
{
	NCCI *ncci_ptr;
	DATA_B3_DESC *data;
	word Info;
	word ncci;
	word i;

	dbug(1, dprintf("data_b3_req"));

	Info = _WRONG_IDENTIFIER;
	ncci = (word)(Id >> 16);
	dbug(1, dprintf("ncci=0x%x, plci=0x%x", ncci, plci));

	if (plci && ncci)
	{
		Info = _WRONG_STATE;
		if ((a->ncci_state[ncci] == CONNECTED)
		    || (a->ncci_state[ncci] == INC_ACT_PENDING))
		{
			/* queue data */
			ncci_ptr = &(a->ncci[ncci]);
			i = ncci_ptr->data_out + ncci_ptr->data_pending;
			if (i >= MAX_DATA_B3)
				i -= MAX_DATA_B3;
			data = &(ncci_ptr->DBuffer[i]);
			data->Number = Number;
			if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
			    && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
			{

				data->P = (byte *)(long)(*((dword *)(parms[0].info)));

			}
			else
				data->P = TransmitBufferSet(appl, *(dword *)parms[0].info);
			data->Length = GET_WORD(parms[1].info);
			data->Handle = GET_WORD(parms[2].info);
			data->Flags = GET_WORD(parms[3].info);
			(ncci_ptr->data_pending)++;

			/* check for delivery confirmation */
			if (data->Flags & 0x0004)
			{
				i = ncci_ptr->data_ack_out + ncci_ptr->data_ack_pending;
				if (i >= MAX_DATA_ACK)
					i -= MAX_DATA_ACK;
				ncci_ptr->DataAck[i].Number = data->Number;
				ncci_ptr->DataAck[i].Handle = data->Handle;
				(ncci_ptr->data_ack_pending)++;
			}

			send_data(plci);
			return false;
		}
	}
	if (appl)
	{
		if (plci)
		{
			if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
			    && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
			{

				TransmitBufferFree(appl, (byte *)(long)(*((dword *)(parms[0].info))));

			}
		}
		sendf(appl,
		      _DATA_B3_R | CONFIRM,
		      Id,
		      Number,
		      "ww", GET_WORD(parms[2].info), Info);
	}
	return false;
}

static byte data_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word n;
	word ncci;
	word NCCIcode;

	dbug(1, dprintf("data_b3_res"));

	ncci = (word)(Id >> 16);
	if (plci && ncci) {
		n = GET_WORD(parms[0].info);
		dbug(1, dprintf("free(%d)", n));
		NCCIcode = ncci | (((word) a->Id) << 8);
		if (n < appl->MaxBuffer &&
		    appl->DataNCCI[n] == NCCIcode &&
		    (byte)(appl->DataFlags[n] >> 8) == plci->Id) {
			dbug(1, dprintf("found"));
			appl->DataNCCI[n] = 0;

			if (channel_can_xon(plci, a->ncci_ch[ncci])) {
				channel_request_xon(plci, a->ncci_ch[ncci]);
			}
			channel_xmit_xon(plci);

			if (appl->DataFlags[n] & 4) {
				nl_req_ncci(plci, N_DATA_ACK, (byte)ncci);
				return 1;
			}
		}
	}
	return false;
}

static byte reset_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			 PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word Info;
	word ncci;

	dbug(1, dprintf("reset_b3_req"));

	Info = _WRONG_IDENTIFIER;
	ncci = (word)(Id >> 16);
	if (plci && ncci)
	{
		Info = _WRONG_STATE;
		switch (plci->B3_prot)
		{
		case B3_ISO8208:
		case B3_X25_DCE:
			if (a->ncci_state[ncci] == CONNECTED)
			{
				nl_req_ncci(plci, N_RESET, (byte)ncci);
				send_req(plci);
				Info = GOOD;
			}
			break;
		case B3_TRANSPARENT:
			if (a->ncci_state[ncci] == CONNECTED)
			{
				start_internal_command(Id, plci, reset_b3_command);
				Info = GOOD;
			}
			break;
		}
	}
	/* reset_b3 must result in a reset_b3_con & reset_b3_Ind */
	sendf(appl,
	      _RESET_B3_R | CONFIRM,
	      Id,
	      Number,
	      "w", Info);
	return false;
}

static byte reset_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			 PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word ncci;

	dbug(1, dprintf("reset_b3_res"));

	ncci = (word)(Id >> 16);
	if (plci && ncci) {
		switch (plci->B3_prot)
		{
		case B3_ISO8208:
		case B3_X25_DCE:
			if (a->ncci_state[ncci] == INC_RES_PENDING)
			{
				a->ncci_state[ncci] = CONNECTED;
				nl_req_ncci(plci, N_RESET_ACK, (byte)ncci);
				return true;
			}
			break;
		}
	}
	return false;
}

static byte connect_b3_t90_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
				 PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word ncci;
	API_PARSE *ncpi;
	byte req;

	dbug(1, dprintf("connect_b3_t90_a_res"));

	ncci = (word)(Id >> 16);
	if (plci && ncci) {
		if (a->ncci_state[ncci] == INC_ACT_PENDING) {
			a->ncci_state[ncci] = CONNECTED;
		}
		else if (a->ncci_state[ncci] == INC_CON_PENDING) {
			a->ncci_state[ncci] = CONNECTED;

			req = N_CONNECT_ACK;

			/* parms[0]==0 for CAPI original message definition! */
			if (parms[0].info) {
				ncpi = &parms[1];
				if (ncpi->length > 2) {
					if (ncpi->info[1] & 1) req = N_CONNECT_ACK | N_D_BIT;
					add_d(plci, (word)(ncpi->length - 3), &ncpi->info[4]);
				}
			}
			nl_req_ncci(plci, req, (byte)ncci);
			return 1;
		}
	}
	return false;
}


static byte select_b_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			 PLCI *plci, APPL *appl, API_PARSE *msg)
{
	word Info = 0;
	word i;
	byte tel;
	API_PARSE bp_parms[7];

	if (!plci || !msg)
	{
		Info = _WRONG_IDENTIFIER;
	}
	else
	{
		dbug(1, dprintf("select_b_req[%d],PLCI=0x%x,Tel=0x%x,NL=0x%x,appl=0x%x,sstate=0x%x",
				msg->length, plci->Id, plci->tel, plci->NL.Id, plci->appl, plci->SuppState));
		dbug(1, dprintf("PlciState=0x%x", plci->State));
		for (i = 0; i < 7; i++) bp_parms[i].length = 0;

		/* check if no channel is open, no B3 connected only */
		if ((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING) || (plci->State == INC_DIS_PENDING)
		    || (plci->SuppState != IDLE) || plci->channels || plci->nl_remove_id)
		{
			Info = _WRONG_STATE;
		}
		/* check message format and fill bp_parms pointer */
		else if (msg->length && api_parse(&msg->info[1], (word)msg->length, "wwwsss", bp_parms))
		{
			Info = _WRONG_MESSAGE_FORMAT;
		}
		else
		{
			if ((plci->State == INC_CON_PENDING) || (plci->State == INC_CON_ALERT)) /* send alert tone inband to the network, */
			{                                                                  /* e.g. Qsig or RBS or Cornet-N or xess PRI */
				if (Id & EXT_CONTROLLER)
				{
					sendf(appl, _SELECT_B_REQ | CONFIRM, Id, Number, "w", 0x2002); /* wrong controller */
					return 0;
				}
				plci->State = INC_CON_CONNECTED_ALERT;
				plci->appl = appl;
				__clear_bit(appl->Id - 1, plci->c_ind_mask_table);
				dbug(1, dprintf("c_ind_mask =%*pb", MAX_APPL, plci->c_ind_mask_table));
				/* disconnect the other appls its quasi a connect */
				for_each_set_bit(i, plci->c_ind_mask_table, max_appl)
					sendf(&application[i], _DISCONNECT_I, Id, 0, "w", _OTHER_APPL_CONNECTED);
			}

			api_save_msg(msg, "s", &plci->saved_msg);
			tel = plci->tel;
			if (Id & EXT_CONTROLLER)
			{
				if (tel) /* external controller in use by this PLCI */
				{
					if (a->AdvSignalAppl && a->AdvSignalAppl != appl)
					{
						dbug(1, dprintf("Ext_Ctrl in use 1"));
						Info = _WRONG_STATE;
					}
				}
				else  /* external controller NOT in use by this PLCI ? */
				{
					if (a->AdvSignalPLCI)
					{
						dbug(1, dprintf("Ext_Ctrl in use 2"));
						Info = _WRONG_STATE;
					}
					else /* activate the codec */
					{
						dbug(1, dprintf("Ext_Ctrl start"));
						if (AdvCodecSupport(a, plci, appl, 0))
						{
							dbug(1, dprintf("Error in codec procedures"));
							Info = _WRONG_STATE;
						}
						else if (plci->spoofed_msg == SPOOFING_REQUIRED) /* wait until codec is active */
						{
							plci->spoofed_msg = AWAITING_SELECT_B;
							plci->internal_command = BLOCK_PLCI; /* lock other commands */
							plci->command = 0;
							dbug(1, dprintf("continue if codec loaded"));
							return false;
						}
					}
				}
			}
			else /* external controller bit is OFF */
			{
				if (tel) /* external controller in use, need to switch off */
				{
					if (a->AdvSignalAppl == appl)
					{
						CodecIdCheck(a, plci);
						plci->tel = 0;
						plci->adv_nl = 0;
						dbug(1, dprintf("Ext_Ctrl disable"));
					}
					else
					{
						dbug(1, dprintf("Ext_Ctrl not requested"));
					}
				}
			}
			if (!Info)
			{
				if (plci->call_dir & CALL_DIR_OUT)
					plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
				else if (plci->call_dir & CALL_DIR_IN)
					plci->call_dir = CALL_DIR_IN | CALL_DIR_ANSWER;
				start_internal_command(Id, plci, select_b_command);
				return false;
			}
		}
	}
	sendf(appl, _SELECT_B_REQ | CONFIRM, Id, Number, "w", Info);
	return false;
}

static byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			     PLCI *plci, APPL *appl, API_PARSE *parms)
{
	word command;
	word i;
	word ncci;
	API_PARSE *m;
	API_PARSE m_parms[5];
	word codec;
	byte req;
	byte ch;
	byte dir;
	static byte chi[2] = {0x01, 0x00};
	static byte lli[2] = {0x01, 0x00};
	static byte codec_cai[2] = {0x01, 0x01};
	static byte null_msg = {0};
	static API_PARSE null_parms = { 0, &null_msg };
	PLCI *v_plci;
	word Info = 0;

	dbug(1, dprintf("manufacturer_req"));
	for (i = 0; i < 5; i++) m_parms[i].length = 0;

	if (GET_DWORD(parms[0].info) != _DI_MANU_ID) {
		Info = _WRONG_MESSAGE_FORMAT;
	}
	command = GET_WORD(parms[1].info);
	m = &parms[2];
	if (!Info)
	{
		switch (command) {
		case _DI_ASSIGN_PLCI:
			if (api_parse(&m->info[1], (word)m->length, "wbbs", m_parms)) {
				Info = _WRONG_MESSAGE_FORMAT;
				break;
			}
			codec = GET_WORD(m_parms[0].info);
			ch = m_parms[1].info[0];
			dir = m_parms[2].info[0];
			if ((i = get_plci(a))) {
				plci = &a->plci[i - 1];
				plci->appl = appl;
				plci->command = _MANUFACTURER_R;
				plci->m_command = command;
				plci->number = Number;
				plci->State = LOCAL_CONNECT;
				Id = (((word)plci->Id << 8) | plci->adapter->Id | 0x80);
				dbug(1, dprintf("ManCMD,plci=0x%x", Id));

				if ((ch == 1 || ch == 2) && (dir <= 2)) {
					chi[1] = (byte)(0x80 | ch);
					lli[1] = 0;
					plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
					switch (codec)
					{
					case 0:
						Info = add_b1(plci, &m_parms[3], 0, 0);
						break;
					case 1:
						add_p(plci, CAI, codec_cai);
						break;
						/* manual 'swich on' to the codec support without signalling */
						/* first 'assign plci' with this function, then use */
					case 2:
						if (AdvCodecSupport(a, plci, appl, 0)) {
							Info = _RESOURCE_ERROR;
						}
						else {
							Info = add_b1(plci, &null_parms, 0, B1_FACILITY_LOCAL);
							lli[1] = 0x10; /* local call codec stream */
						}
						break;
					}

					plci->State = LOCAL_CONNECT;
					plci->manufacturer = true;
					plci->command = _MANUFACTURER_R;
					plci->m_command = command;
					plci->number = Number;

					if (!Info)
					{
						add_p(plci, LLI, lli);
						add_p(plci, CHI, chi);
						add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
						sig_req(plci, ASSIGN, DSIG_ID);

						if (!codec)
						{
							Info = add_b23(plci, &m_parms[3]);
							if (!Info)
							{
								nl_req_ncci(plci, ASSIGN, 0);
								send_req(plci);
							}
						}
						if (!Info)
						{
							dbug(1, dprintf("dir=0x%x,spoof=0x%x", dir, plci->spoofed_msg));
							if (plci->spoofed_msg == SPOOFING_REQUIRED)
							{
								api_save_msg(m_parms, "wbbs", &plci->saved_msg);
								plci->spoofed_msg = AWAITING_MANUF_CON;
								plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
								plci->command = 0;
								send_req(plci);
								return false;
							}
							if (dir == 1) {
								sig_req(plci, CALL_REQ, 0);
							}
							else if (!dir) {
								sig_req(plci, LISTEN_REQ, 0);
							}
							send_req(plci);
						}
						else
						{
							sendf(appl,
							      _MANUFACTURER_R | CONFIRM,
							      Id,
							      Number,
							      "dww", _DI_MANU_ID, command, Info);
							return 2;
						}
					}
				}
			}
			else  Info = _OUT_OF_PLCI;
			break;

		case _DI_IDI_CTRL:
			if (!plci)
			{
				Info = _WRONG_IDENTIFIER;
				break;
			}
			if (api_parse(&m->info[1], (word)m->length, "bs", m_parms)) {
				Info = _WRONG_MESSAGE_FORMAT;
				break;
			}
			req = m_parms[0].info[0];
			plci->command = _MANUFACTURER_R;
			plci->m_command = command;
			plci->number = Number;
			if (req == CALL_REQ)
			{
				plci->b_channel = getChannel(&m_parms[1]);
				mixer_set_bchannel_id_esc(plci, plci->b_channel);
				if (plci->spoofed_msg == SPOOFING_REQUIRED)
				{
					plci->spoofed_msg = CALL_REQ | AWAITING_MANUF_CON;
					plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
					plci->command = 0;
					break;
				}
			}
			else if (req == LAW_REQ)
			{
				plci->cr_enquiry = true;
			}
			add_ss(plci, FTY, &m_parms[1]);
			sig_req(plci, req, 0);
			send_req(plci);
			if (req == HANGUP)
			{
				if (plci->NL.Id && !plci->nl_remove_id)
				{
					if (plci->channels)
					{
						for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
						{
							if ((a->ncci_plci[ncci] == plci->Id) && (a->ncci_state[ncci] == CONNECTED))
							{
								a->ncci_state[ncci] = OUTG_DIS_PENDING;
								cleanup_ncci_data(plci, ncci);
								nl_req_ncci(plci, N_DISC, (byte)ncci);
							}
						}
					}
					mixer_remove(plci);
					nl_req_ncci(plci, REMOVE, 0);
					send_req(plci);
				}
			}
			break;

		case _DI_SIG_CTRL:
			/* signalling control for loop activation B-channel */
			if (!plci)
			{
				Info = _WRONG_IDENTIFIER;
				break;
			}
			if (m->length) {
				plci->command = _MANUFACTURER_R;
				plci->number = Number;
				add_ss(plci, FTY, m);
				sig_req(plci, SIG_CTRL, 0);
				send_req(plci);
			}
			else Info = _WRONG_MESSAGE_FORMAT;
			break;

		case _DI_RXT_CTRL:
			/* activation control for receiver/transmitter B-channel */
			if (!plci)
			{
				Info = _WRONG_IDENTIFIER;
				break;
			}
			if (m->length) {
				plci->command = _MANUFACTURER_R;
				plci->number = Number;
				add_ss(plci, FTY, m);
				sig_req(plci, DSP_CTRL, 0);
				send_req(plci);
			}
			else Info = _WRONG_MESSAGE_FORMAT;
			break;

		case _DI_ADV_CODEC:
		case _DI_DSP_CTRL:
			/* TEL_CTRL commands to support non standard adjustments: */
			/* Ring on/off, Handset micro volume, external micro vol. */
			/* handset+external speaker volume, receiver+transm. gain,*/
			/* handsfree on (hookinfo off), set mixer command         */

			if (command == _DI_ADV_CODEC)
			{
				if (!a->AdvCodecPLCI) {
					Info = _WRONG_STATE;
					break;
				}
				v_plci = a->AdvCodecPLCI;
			}
			else
			{
				if (plci
				    && (m->length >= 3)
				    && (m->info[1] == 0x1c)
				    && (m->info[2] >= 1))
				{
					if (m->info[3] == DSP_CTRL_OLD_SET_MIXER_COEFFICIENTS)
					{
						if ((plci->tel != ADV_VOICE) || (plci != a->AdvSignalPLCI))
						{
							Info = _WRONG_STATE;
							break;
						}
						a->adv_voice_coef_length = m->info[2] - 1;
						if (a->adv_voice_coef_length > m->length - 3)
							a->adv_voice_coef_length = (byte)(m->length - 3);
						if (a->adv_voice_coef_length > ADV_VOICE_COEF_BUFFER_SIZE)
							a->adv_voice_coef_length = ADV_VOICE_COEF_BUFFER_SIZE;
						for (i = 0; i < a->adv_voice_coef_length; i++)
							a->adv_voice_coef_buffer[i] = m->info[4 + i];
						if (plci->B1_facilities & B1_FACILITY_VOICE)
							adv_voice_write_coefs(plci, ADV_VOICE_WRITE_UPDATE);
						break;
					}
					else if (m->info[3] == DSP_CTRL_SET_DTMF_PARAMETERS)
					{
						if (!(a->manufacturer_features & MANUFACTURER_FEATURE_DTMF_PARAMETERS))
						{
							Info = _FACILITY_NOT_SUPPORTED;
							break;
						}

						plci->dtmf_parameter_length = m->info[2] - 1;
						if (plci->dtmf_parameter_length > m->length - 3)
							plci->dtmf_parameter_length = (byte)(m->length - 3);
						if (plci->dtmf_parameter_length > DTMF_PARAMETER_BUFFER_SIZE)
							plci->dtmf_parameter_length = DTMF_PARAMETER_BUFFER_SIZE;
						for (i = 0; i < plci->dtmf_parameter_length; i++)
							plci->dtmf_parameter_buffer[i] = m->info[4 + i];
						if (plci->B1_facilities & B1_FACILITY_DTMFR)
							dtmf_parameter_write(plci);
						break;

					}
				}
				v_plci = plci;
			}

			if (!v_plci)
			{
				Info = _WRONG_IDENTIFIER;
				break;
			}
			if (m->length) {
				add_ss(v_plci, FTY, m);
				sig_req(v_plci, TEL_CTRL, 0);
				send_req(v_plci);
			}
			else Info = _WRONG_MESSAGE_FORMAT;

			break;

		case _DI_OPTIONS_REQUEST:
			if (api_parse(&m->info[1], (word)m->length, "d", m_parms)) {
				Info = _WRONG_MESSAGE_FORMAT;
				break;
			}
			if (GET_DWORD(m_parms[0].info) & ~a->man_profile.private_options)
			{
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			a->requested_options_table[appl->Id - 1] = GET_DWORD(m_parms[0].info);
			break;



		default:
			Info = _WRONG_MESSAGE_FORMAT;
			break;
		}
	}

	sendf(appl,
	      _MANUFACTURER_R | CONFIRM,
	      Id,
	      Number,
	      "dww", _DI_MANU_ID, command, Info);
	return false;
}


static byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
			     PLCI *plci, APPL *appl, API_PARSE *msg)
{
	word indication;

	API_PARSE m_parms[3];
	API_PARSE *ncpi;
	API_PARSE fax_parms[9];
	word i;
	byte len;


	dbug(1, dprintf("manufacturer_res"));

	if ((msg[0].length == 0)
	    || (msg[1].length == 0)
	    || (GET_DWORD(msg[0].info) != _DI_MANU_ID))
	{
		return false;
	}
	indication = GET_WORD(msg[1].info);
	switch (indication)
	{

	case _DI_NEGOTIATE_B3:
		if (!plci)
			break;
		if (((plci->B3_prot != 4) && (plci->B3_prot != 5))
		    || !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
		{
			dbug(1, dprintf("wrong state for NEGOTIATE_B3 parameters"));
			break;
		}
		if (api_parse(&msg[2].info[1], msg[2].length, "ws", m_parms))
		{
			dbug(1, dprintf("wrong format in NEGOTIATE_B3 parameters"));
			break;
		}
		ncpi = &m_parms[1];
		len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
		if (plci->fax_connect_info_length < len)
		{
			((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
			((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
		}
		if (api_parse(&ncpi->info[1], ncpi->length, "wwwwssss", fax_parms))
		{
			dbug(1, dprintf("non-standard facilities info missing or wrong format"));
		}
		else
		{
			if (plci->fax_connect_info_length <= len)
				plci->fax_connect_info_buffer[len] = 0;
			len += 1 + plci->fax_connect_info_buffer[len];
			if (plci->fax_connect_info_length <= len)
				plci->fax_connect_info_buffer[len] = 0;
			len += 1 + plci->fax_connect_info_buffer[len];
			if ((fax_parms[7].length >= 3) && (fax_parms[7].info[1] >= 2))
				plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
			plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
			for (i = 0; i < fax_parms[7].length; i++)
				plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1 + i];
		}
		plci->fax_connect_info_length = len;
		plci->fax_edata_ack_length = plci->fax_connect_info_length;
		start_internal_command(Id, plci, fax_edata_ack_command);
		break;

	}
	return false;
}

/*------------------------------------------------------------------*/
/* IDI callback function                                            */
/*------------------------------------------------------------------*/

void callback(ENTITY *e)
{
	DIVA_CAPI_ADAPTER *a;
	APPL *appl;
	PLCI *plci;
	CAPI_MSG *m;
	word i, j;
	byte rc;
	byte ch;
	byte req;
	byte global_req;
	int no_cancel_rc;

	dbug(1, dprintf("%x:CB(%x:Req=%x,Rc=%x,Ind=%x)",
			(e->user[0] + 1) & 0x7fff, e->Id, e->Req, e->Rc, e->Ind));

	a = &(adapter[(byte)e->user[0]]);
	plci = &(a->plci[e->user[1]]);
	no_cancel_rc = DIVA_CAPI_SUPPORTS_NO_CANCEL(a);

	/*
	  If new protocol code and new XDI is used then CAPI should work
	  fully in accordance with IDI cpec an look on callback field instead
	  of Rc field for return codes.
	*/
	if (((e->complete == 0xff) && no_cancel_rc) ||
	    (e->Rc && !no_cancel_rc)) {
		rc = e->Rc;
		ch = e->RcCh;
		req = e->Req;
		e->Rc = 0;

		if (e->user[0] & 0x8000)
		{
			/*
			  If REMOVE request was sent then we have to wait until
			  return code with Id set to zero arrives.
			  All other return codes should be ignored.
			*/
			if (req == REMOVE)
			{
				if (e->Id)
				{
					dbug(1, dprintf("cancel RC in REMOVE state"));
					return;
				}
				channel_flow_control_remove(plci);
				for (i = 0; i < 256; i++)
				{
					if (a->FlowControlIdTable[i] == plci->nl_remove_id)
						a->FlowControlIdTable[i] = 0;
				}
				plci->nl_remove_id = 0;
				if (plci->rx_dma_descriptor > 0) {
					diva_free_dma_descriptor(plci, plci->rx_dma_descriptor - 1);
					plci->rx_dma_descriptor = 0;
				}
			}
			if (rc == OK_FC)
			{
				a->FlowControlIdTable[ch] = e->Id;
				a->FlowControlSkipTable[ch] = 0;

				a->ch_flow_control[ch] |= N_OK_FC_PENDING;
				a->ch_flow_plci[ch] = plci->Id;
				plci->nl_req = 0;
			}
			else
			{
				/*
				  Cancel return codes self, if feature was requested
				*/
				if (no_cancel_rc && (a->FlowControlIdTable[ch] == e->Id) && e->Id) {
					a->FlowControlIdTable[ch] = 0;
					if ((rc == OK) && a->FlowControlSkipTable[ch]) {
						dbug(3, dprintf("XDI CAPI: RC cancelled Id:0x02, Ch:%02x", e->Id, ch));
						return;
					}
				}

				if (a->ch_flow_control[ch] & N_OK_FC_PENDING)
				{
					a->ch_flow_control[ch] &= ~N_OK_FC_PENDING;
					if (ch == e->ReqCh)
						plci->nl_req = 0;
				}
				else
					plci->nl_req = 0;
			}
			if (plci->nl_req)
				control_rc(plci, 0, rc, ch, 0, true);
			else
			{
				if (req == N_XON)
				{
					channel_x_on(plci, ch);
					if (plci->internal_command)
						control_rc(plci, req, rc, ch, 0, true);
				}
				else
				{
					if (plci->nl_global_req)
					{
						global_req = plci->nl_global_req;
						plci->nl_global_req = 0;
						if (rc != ASSIGN_OK) {
							e->Id = 0;
							if (plci->rx_dma_descriptor > 0) {
								diva_free_dma_descriptor(plci, plci->rx_dma_descriptor - 1);
								plci->rx_dma_descriptor = 0;
							}
						}
						channel_xmit_xon(plci);
						control_rc(plci, 0, rc, ch, global_req, true);
					}
					else if (plci->data_sent)
					{
						channel_xmit_xon(plci);
						plci->data_sent = false;
						plci->NL.XNum = 1;
						data_rc(plci, ch);
						if (plci->internal_command)
							control_rc(plci, req, rc, ch, 0, true);
					}
					else
					{
						channel_xmit_xon(plci);
						control_rc(plci, req, rc, ch, 0, true);
					}
				}
			}
		}
		else
		{
			/*
			  If REMOVE request was sent then we have to wait until
			  return code with Id set to zero arrives.
			  All other return codes should be ignored.
			*/
			if (req == REMOVE)
			{
				if (e->Id)
				{
					dbug(1, dprintf("cancel RC in REMOVE state"));
					return;
				}
				plci->sig_remove_id = 0;
			}
			plci->sig_req = 0;
			if (plci->sig_global_req)
			{
				global_req = plci->sig_global_req;
				plci->sig_global_req = 0;
				if (rc != ASSIGN_OK)
					e->Id = 0;
				channel_xmit_xon(plci);
				control_rc(plci, 0, rc, ch, global_req, false);
			}
			else
			{
				channel_xmit_xon(plci);
				control_rc(plci, req, rc, ch, 0, false);
			}
		}
		/*
		  Again: in accordance with IDI spec Rc and Ind can't be delivered in the
		  same callback. Also if new XDI and protocol code used then jump
		  direct to finish.
		*/
		if (no_cancel_rc) {
			channel_xmit_xon(plci);
			goto capi_callback_suffix;
		}
	}

	channel_xmit_xon(plci);

	if (e->Ind) {
		if (e->user[0] & 0x8000) {
			byte Ind = e->Ind & 0x0f;
			byte Ch = e->IndCh;
			if (((Ind == N_DISC) || (Ind == N_DISC_ACK)) &&
			    (a->ch_flow_plci[Ch] == plci->Id)) {
				if (a->ch_flow_control[Ch] & N_RX_FLOW_CONTROL_MASK) {
					dbug(3, dprintf("XDI CAPI: I: pending N-XON Ch:%02x", Ch));
				}
				a->ch_flow_control[Ch] &= ~N_RX_FLOW_CONTROL_MASK;
			}
			nl_ind(plci);
			if ((e->RNR != 1) &&
			    (a->ch_flow_plci[Ch] == plci->Id) &&
			    (a->ch_flow_control[Ch] & N_RX_FLOW_CONTROL_MASK)) {
				a->ch_flow_control[Ch] &= ~N_RX_FLOW_CONTROL_MASK;
				dbug(3, dprintf("XDI CAPI: I: remove faked N-XON Ch:%02x", Ch));
			}
		} else {
			sig_ind(plci);
		}
		e->Ind = 0;
	}

capi_callback_suffix:

	while (!plci->req_in
	       && !plci->internal_command
	       && (plci->msg_in_write_pos != plci->msg_in_read_pos))
	{
		j = (plci->msg_in_read_pos == plci->msg_in_wrap_pos) ? 0 : plci->msg_in_read_pos;

		i = (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]))->header.length + 3) & 0xfffc;

		m = (CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]);
		appl = *((APPL **)(&((byte *)(plci->msg_in_queue))[j + i]));
		dbug(1, dprintf("dequeue msg(0x%04x) - write=%d read=%d wrap=%d",
				m->header.command, plci->msg_in_write_pos, plci->msg_in_read_pos, plci->msg_in_wrap_pos));
		if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
		{
			plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
			plci->msg_in_read_pos = i + MSG_IN_OVERHEAD;
		}
		else
		{
			plci->msg_in_read_pos = j + i + MSG_IN_OVERHEAD;
		}
		if (plci->msg_in_read_pos == plci->msg_in_write_pos)
		{
			plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
			plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
		}
		else if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
		{
			plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
			plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
		}
		i = api_put(appl, m);
		if (i != 0)
		{
			if (m->header.command == _DATA_B3_R)

				TransmitBufferFree(appl, (byte *)(long)(m->info.data_b3_req.Data));

			dbug(1, dprintf("Error 0x%04x from msg(0x%04x)", i, m->header.command));
			break;
		}

		if (plci->li_notify_update)
		{
			plci->li_notify_update = false;
			mixer_notify_update(plci, false);
		}

	}
	send_data(plci);
	send_req(plci);
}


static void control_rc(PLCI *plci, byte req, byte rc, byte ch, byte global_req,
		       byte nl_rc)
{
	dword Id;
	dword rId;
	word Number;
	word Info = 0;
	word i;
	word ncci;
	DIVA_CAPI_ADAPTER *a;
	APPL *appl;
	PLCI *rplci;
	byte SSparms[] = "\x05\x00\x00\x02\x00\x00";
	byte SSstruct[] = "\x09\x00\x00\x06\x00\x00\x00\x00\x00\x00";

	if (!plci) {
		dbug(0, dprintf("A: control_rc, no plci %02x:%02x:%02x:%02x:%02x", req, rc, ch, global_req, nl_rc));
		return;
	}
	dbug(1, dprintf("req0_in/out=%d/%d", plci->req_in, plci->req_out));
	if (plci->req_in != plci->req_out)
	{
		if (nl_rc || (global_req != ASSIGN) || (rc == ASSIGN_OK))
		{
			dbug(1, dprintf("req_1return"));
			return;
		}
		/* cancel outstanding request on the PLCI after SIG ASSIGN failure */
	}
	plci->req_in = plci->req_in_start = plci->req_out = 0;
	dbug(1, dprintf("control_rc"));

	appl = plci->appl;
	a = plci->adapter;
	ncci = a->ch_ncci[ch];
	if (appl)
	{
		Id = (((dword)(ncci ? ncci : ch)) << 16) | ((word)plci->Id << 8) | a->Id;
		if (plci->tel && plci->SuppState != CALL_HELD) Id |= EXT_CONTROLLER;
		Number = plci->number;
		dbug(1, dprintf("Contr_RC-Id=%08lx,plci=%x,tel=%x, entity=0x%x, command=0x%x, int_command=0x%x", Id, plci->Id, plci->tel, plci->Sig.Id, plci->command, plci->internal_command));
		dbug(1, dprintf("channels=0x%x", plci->channels));
		if (plci_remove_check(plci))
			return;
		if (req == REMOVE && rc == ASSIGN_OK)
		{
			sig_req(plci, HANGUP, 0);
			sig_req(plci, REMOVE, 0);
			send_req(plci);
		}
		if (plci->command)
		{
			switch (plci->command)
			{
			case C_HOLD_REQ:
				dbug(1, dprintf("HoldRC=0x%x", rc));
				SSparms[1] = (byte)S_HOLD;
				if (rc != OK)
				{
					plci->SuppState = IDLE;
					Info = 0x2001;
				}
				sendf(appl, _FACILITY_R | CONFIRM, Id, Number, "wws", Info, 3, SSparms);
				break;

			case C_RETRIEVE_REQ:
				dbug(1, dprintf("RetrieveRC=0x%x", rc));
				SSparms[1] = (byte)S_RETRIEVE;
				if (rc != OK)
				{
					plci->SuppState = CALL_HELD;
					Info = 0x2001;
				}
				sendf(appl, _FACILITY_R | CONFIRM, Id, Number, "wws", Info, 3, SSparms);
				break;

			case _INFO_R:
				dbug(1, dprintf("InfoRC=0x%x", rc));
				if (rc != OK) Info = _WRONG_STATE;
				sendf(appl, _INFO_R | CONFIRM, Id, Number, "w", Info);
				break;

			case _CONNECT_R:
				dbug(1, dprintf("Connect_R=0x%x/0x%x/0x%x/0x%x", req, rc, global_req, nl_rc));
				if (plci->State == INC_DIS_PENDING)
					break;
				if (plci->Sig.Id != 0xff)
				{
					if (((global_req == ASSIGN) && (rc != ASSIGN_OK))
					    || (!nl_rc && (req == CALL_REQ) && (rc != OK)))
					{
						dbug(1, dprintf("No more IDs/Call_Req failed"));
						sendf(appl, _CONNECT_R | CONFIRM, Id & 0xffL, Number, "w", _OUT_OF_PLCI);
						plci_remove(plci);
						plci->State = IDLE;
						break;
					}
					if (plci->State != LOCAL_CONNECT) plci->State = OUTG_CON_PENDING;
					sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", 0);
				}
				else /* D-ch activation */
				{
					if (rc != ASSIGN_OK)
					{
						dbug(1, dprintf("No more IDs/X.25 Call_Req failed"));
						sendf(appl, _CONNECT_R | CONFIRM, Id & 0xffL, Number, "w", _OUT_OF_PLCI);
						plci_remove(plci);
						plci->State = IDLE;
						break;
					}
					sendf(appl, _CONNECT_R | CONFIRM, Id, Number, "w", 0);
					sendf(plci->appl, _CONNECT_ACTIVE_I, Id, 0, "sss", "", "", "");
					plci->State = INC_ACT_PENDING;
				}
				break;

			case _CONNECT_I | RESPONSE:
				if (plci->State != INC_DIS_PENDING)
					plci->State = INC_CON_ACCEPT;
				break;

			case _DISCONNECT_R:
				if (plci->State == INC_DIS_PENDING)
					break;
				if (plci->Sig.Id != 0xff)
				{
					plci->State = OUTG_DIS_PENDING;
					sendf(appl, _DISCONNECT_R | CONFIRM, Id, Number, "w", 0);
				}
				break;

			case SUSPEND_REQ:
				break;

			case RESUME_REQ:
				break;

			case _CONNECT_B3_R:
				if (rc != OK)
				{
					sendf(appl, _CONNECT_B3_R | CONFIRM, Id, Number, "w", _WRONG_IDENTIFIER);
					break;
				}
				ncci = get_ncci(plci, ch, 0);
				Id = (Id & 0xffff) | (((dword) ncci) << 16);
				plci->channels++;
				if (req == N_RESET)
				{
					a->ncci_state[ncci] = INC_ACT_PENDING;
					sendf(appl, _CONNECT_B3_R | CONFIRM, Id, Number, "w", 0);
					sendf(appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
				}
				else
				{
					a->ncci_state[ncci] = OUTG_CON_PENDING;
					sendf(appl, _CONNECT_B3_R | CONFIRM, Id, Number, "w", 0);
				}
				break;

			case _CONNECT_B3_I | RESPONSE:
				break;

			case _RESET_B3_R:
/*        sendf(appl, _RESET_B3_R | CONFIRM, Id, Number, "w", 0);*/
				break;

			case _DISCONNECT_B3_R:
				sendf(appl, _DISCONNECT_B3_R | CONFIRM, Id, Number, "w", 0);
				break;

			case _MANUFACTURER_R:
				break;

			case PERM_LIST_REQ:
				if (rc != OK)
				{
					Info = _WRONG_IDENTIFIER;
					sendf(plci->appl, _CONNECT_R | CONFIRM, Id, Number, "w", Info);
					plci_remove(plci);
				}
				else
					sendf(plci->appl, _CONNECT_R | CONFIRM, Id, Number, "w", Info);
				break;

			default:
				break;
			}
			plci->command = 0;
		}
		else if (plci->internal_command)
		{
			switch (plci->internal_command)
			{
			case BLOCK_PLCI:
				return;

			case GET_MWI_STATE:
				if (rc == OK) /* command supported, wait for indication */
				{
					return;
				}
				plci_remove(plci);
				break;

				/* Get Supported Services */
			case GETSERV_REQ_PEND:
				if (rc == OK) /* command supported, wait for indication */
				{
					break;
				}
				PUT_DWORD(&SSstruct[6], MASK_TERMINAL_PORTABILITY);
				sendf(appl, _FACILITY_R | CONFIRM, Id, Number, "wws", 0, 3, SSstruct);
				plci_remove(plci);
				break;

			case INTERR_DIVERSION_REQ_PEND:      /* Interrogate Parameters        */
			case INTERR_NUMBERS_REQ_PEND:
			case CF_START_PEND:                  /* Call Forwarding Start pending */
			case CF_STOP_PEND:                   /* Call Forwarding Stop pending  */
			case CCBS_REQUEST_REQ_PEND:
			case CCBS_DEACTIVATE_REQ_PEND:
			case CCBS_INTERROGATE_REQ_PEND:
				switch (plci->internal_command)
				{
				case INTERR_DIVERSION_REQ_PEND:
					SSparms[1] = S_INTERROGATE_DIVERSION;
					break;
				case INTERR_NUMBERS_REQ_PEND:
					SSparms[1] = S_INTERROGATE_NUMBERS;
					break;
				case CF_START_PEND:
					SSparms[1] = S_CALL_FORWARDING_START;
					break;
				case CF_STOP_PEND:
					SSparms[1] = S_CALL_FORWARDING_STOP;
					break;
				case CCBS_REQUEST_REQ_PEND:
					SSparms[1] = S_CCBS_REQUEST;
					break;
				case CCBS_DEACTIVATE_REQ_PEND:
					SSparms[1] = S_CCBS_DEACTIVATE;
					break;
				case CCBS_INTERROGATE_REQ_PEND:
					SSparms[1] = S_CCBS_INTERROGATE;
					break;
				}
				if (global_req == ASSIGN)
				{
					dbug(1, dprintf("AssignDiversion_RC=0x%x/0x%x", req, rc));
					return;
				}
				if (!plci->appl) break;
				if (rc == ISDN_GUARD_REJ)
				{
					Info = _CAPI_GUARD_ERROR;
				}
				else if (rc != OK)
				{
					Info = _SUPPLEMENTARY_SERVICE_NOT_SUPPORTED;
				}
				sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0x7,
				      plci->number, "wws", Info, (word)3, SSparms);
				if (Info) plci_remove(plci);
				break;

				/* 3pty conference pending */
			case PTY_REQ_PEND:
				if (!plci->relatedPTYPLCI) break;
				rplci = plci->relatedPTYPLCI;
				SSparms[1] = plci->ptyState;
				rId = ((word)rplci->Id << 8) | rplci->adapter->Id;
				if (rplci->tel) rId |= EXT_CONTROLLER;
				if (rc != OK)
				{
					Info = 0x300E; /* not supported */
					plci->relatedPTYPLCI = NULL;
					plci->ptyState = 0;
				}
				sendf(rplci->appl,
				      _FACILITY_R | CONFIRM,
				      rId,
				      plci->number,
				      "wws", Info, (word)3, SSparms);
				break;

				/* Explicit Call Transfer pending */
			case ECT_REQ_PEND:
				dbug(1, dprintf("ECT_RC=0x%x/0x%x", req, rc));
				if (!plci->relatedPTYPLCI) break;
				rplci = plci->relatedPTYPLCI;
				SSparms[1] = S_ECT;
				rId = ((word)rplci->Id << 8) | rplci->adapter->Id;
				if (rplci->tel) rId |= EXT_CONTROLLER;
				if (rc != OK)
				{
					Info = 0x300E; /* not supported */
					plci->relatedPTYPLCI = NULL;
					plci->ptyState = 0;
				}
				sendf(rplci->appl,
				      _FACILITY_R | CONFIRM,
				      rId,
				      plci->number,
				      "wws", Info, (word)3, SSparms);
				break;

			case _MANUFACTURER_R:
				dbug(1, dprintf("_Manufacturer_R=0x%x/0x%x", req, rc));
				if ((global_req == ASSIGN) && (rc != ASSIGN_OK))
				{
					dbug(1, dprintf("No more IDs"));
					sendf(appl, _MANUFACTURER_R | CONFIRM, Id, Number, "dww", _DI_MANU_ID, _MANUFACTURER_R, _OUT_OF_PLCI);
					plci_remove(plci);  /* after codec init, internal codec commands pending */
				}
				break;

			case _CONNECT_R:
				dbug(1, dprintf("_Connect_R=0x%x/0x%x", req, rc));
				if ((global_req == ASSIGN) && (rc != ASSIGN_OK))
				{
					dbug(1, dprintf("No more IDs"));
					sendf(appl, _CONNECT_R | CONFIRM, Id & 0xffL, Number, "w", _OUT_OF_PLCI);
					plci_remove(plci);  /* after codec init, internal codec commands pending */
				}
				break;

			case PERM_COD_HOOK:                     /* finished with Hook_Ind */
				return;

			case PERM_COD_CALL:
				dbug(1, dprintf("***Codec Connect_Pending A, Rc = 0x%x", rc));
				plci->internal_command = PERM_COD_CONN_PEND;
				return;

			case PERM_COD_ASSIGN:
				dbug(1, dprintf("***Codec Assign A, Rc = 0x%x", rc));
				if (rc != ASSIGN_OK) break;
				sig_req(plci, CALL_REQ, 0);
				send_req(plci);
				plci->internal_command = PERM_COD_CALL;
				return;

				/* Null Call Reference Request pending */
			case C_NCR_FAC_REQ:
				dbug(1, dprintf("NCR_FAC=0x%x/0x%x", req, rc));
				if (global_req == ASSIGN)
				{
					if (rc == ASSIGN_OK)
					{
						return;
					}
					else
					{
						sendf(appl, _INFO_R | CONFIRM, Id & 0xf, Number, "w", _WRONG_STATE);
						appl->NullCREnable = false;
						plci_remove(plci);
					}
				}
				else if (req == NCR_FACILITY)
				{
					if (rc == OK)
					{
						sendf(appl, _INFO_R | CONFIRM, Id & 0xf, Number, "w", 0);
					}
					else
					{
						sendf(appl, _INFO_R | CONFIRM, Id & 0xf, Number, "w", _WRONG_STATE);
						appl->NullCREnable = false;
					}
					plci_remove(plci);
				}
				break;

			case HOOK_ON_REQ:
				if (plci->channels)
				{
					if (a->ncci_state[ncci] == CONNECTED)
					{
						a->ncci_state[ncci] = OUTG_DIS_PENDING;
						cleanup_ncci_data(plci, ncci);
						nl_req_ncci(plci, N_DISC, (byte)ncci);
					}
					break;
				}
				break;

			case HOOK_OFF_REQ:
				if (plci->State == INC_DIS_PENDING)
					break;
				sig_req(plci, CALL_REQ, 0);
				send_req(plci);
				plci->State = OUTG_CON_PENDING;
				break;


			case MWI_ACTIVATE_REQ_PEND:
			case MWI_DEACTIVATE_REQ_PEND:
				if (global_req == ASSIGN && rc == ASSIGN_OK)
				{
					dbug(1, dprintf("MWI_REQ assigned"));
					return;
				}
				else if (rc != OK)
				{
					if (rc == WRONG_IE)
					{
						Info = 0x2007; /* Illegal message parameter coding */
						dbug(1, dprintf("MWI_REQ invalid parameter"));
					}
					else
					{
						Info = 0x300B; /* not supported */
						dbug(1, dprintf("MWI_REQ not supported"));
					}
					/* 0x3010: Request not allowed in this state */
					PUT_WORD(&SSparms[4], 0x300E); /* SS not supported */

				}
				if (plci->internal_command == MWI_ACTIVATE_REQ_PEND)
				{
					PUT_WORD(&SSparms[1], S_MWI_ACTIVATE);
				}
				else PUT_WORD(&SSparms[1], S_MWI_DEACTIVATE);

				if (plci->cr_enquiry)
				{
					sendf(plci->appl,
					      _FACILITY_R | CONFIRM,
					      Id & 0xf,
					      plci->number,
					      "wws", Info, (word)3, SSparms);
					if (rc != OK) plci_remove(plci);
				}
				else
				{
					sendf(plci->appl,
					      _FACILITY_R | CONFIRM,
					      Id,
					      plci->number,
					      "wws", Info, (word)3, SSparms);
				}
				break;

			case CONF_BEGIN_REQ_PEND:
			case CONF_ADD_REQ_PEND:
			case CONF_SPLIT_REQ_PEND:
			case CONF_DROP_REQ_PEND:
			case CONF_ISOLATE_REQ_PEND:
			case CONF_REATTACH_REQ_PEND:
				dbug(1, dprintf("CONF_RC=0x%x/0x%x", req, rc));
				if ((plci->internal_command == CONF_ADD_REQ_PEND) && (!plci->relatedPTYPLCI)) break;
				rplci = plci;
				rId = Id;
				switch (plci->internal_command)
				{
				case CONF_BEGIN_REQ_PEND:
					SSparms[1] = S_CONF_BEGIN;
					break;
				case CONF_ADD_REQ_PEND:
					SSparms[1] = S_CONF_ADD;
					rplci = plci->relatedPTYPLCI;
					rId = ((word)rplci->Id << 8) | rplci->adapter->Id;
					break;
				case CONF_SPLIT_REQ_PEND:
					SSparms[1] = S_CONF_SPLIT;
					break;
				case CONF_DROP_REQ_PEND:
					SSparms[1] = S_CONF_DROP;
					break;
				case CONF_ISOLATE_REQ_PEND:
					SSparms[1] = S_CONF_ISOLATE;
					break;
				case CONF_REATTACH_REQ_PEND:
					SSparms[1] = S_CONF_REATTACH;
					break;
				}

				if (rc != OK)
				{
					Info = 0x300E; /* not supported */
					plci->relatedPTYPLCI = NULL;
					plci->ptyState = 0;
				}
				sendf(rplci->appl,
				      _FACILITY_R | CONFIRM,
				      rId,
				      plci->number,
				      "wws", Info, (word)3, SSparms);
				break;

			case VSWITCH_REQ_PEND:
				if (rc != OK)
				{
					if (plci->relatedPTYPLCI)
					{
						plci->relatedPTYPLCI->vswitchstate = 0;
						plci->relatedPTYPLCI->vsprot = 0;
						plci->relatedPTYPLCI->vsprotdialect = 0;
					}
					plci->vswitchstate = 0;
					plci->vsprot = 0;
					plci->vsprotdialect = 0;
				}
				else
				{
					if (plci->relatedPTYPLCI &&
					    plci->vswitchstate == 1 &&
					    plci->relatedPTYPLCI->vswitchstate == 3) /* join complete */
						plci->vswitchstate = 3;
				}
				break;

				/* Call Deflection Request pending (SSCT) */
			case CD_REQ_PEND:
				SSparms[1] = S_CALL_DEFLECTION;
				if (rc != OK)
				{
					Info = 0x300E; /* not supported */
					plci->appl->CDEnable = 0;
				}
				sendf(plci->appl, _FACILITY_R | CONFIRM, Id,
				      plci->number, "wws", Info, (word)3, SSparms);
				break;

			case RTP_CONNECT_B3_REQ_COMMAND_2:
				if (rc == OK)
				{
					ncci = get_ncci(plci, ch, 0);
					Id = (Id & 0xffff) | (((dword) ncci) << 16);
					plci->channels++;
					a->ncci_state[ncci] = OUTG_CON_PENDING;
				}
				/* fall through */

			default:
				if (plci->internal_command_queue[0])
				{
					(*(plci->internal_command_queue[0]))(Id, plci, rc);
					if (plci->internal_command)
						return;
				}
				break;
			}
			next_internal_command(Id, plci);
		}
	}
	else /* appl==0 */
	{
		Id = ((word)plci->Id << 8) | plci->adapter->Id;
		if (plci->tel) Id |= EXT_CONTROLLER;

		switch (plci->internal_command)
		{
		case BLOCK_PLCI:
			return;

		case START_L1_SIG_ASSIGN_PEND:
		case REM_L1_SIG_ASSIGN_PEND:
			if (global_req == ASSIGN)
			{
				break;
			}
			else
			{
				dbug(1, dprintf("***L1 Req rem PLCI"));
				plci->internal_command = 0;
				sig_req(plci, REMOVE, 0);
				send_req(plci);
			}
			break;

			/* Call Deflection Request pending, just no appl ptr assigned */
		case CD_REQ_PEND:
			SSparms[1] = S_CALL_DEFLECTION;
			if (rc != OK)
			{
				Info = 0x300E; /* not supported */
			}
			for (i = 0; i < max_appl; i++)
			{
				if (application[i].CDEnable)
				{
					if (!application[i].Id) application[i].CDEnable = 0;
					else
					{
						sendf(&application[i], _FACILITY_R | CONFIRM, Id,
						      plci->number, "wws", Info, (word)3, SSparms);
						if (Info) application[i].CDEnable = 0;
					}
				}
			}
			plci->internal_command = 0;
			break;

		case PERM_COD_HOOK:                   /* finished with Hook_Ind */
			return;

		case PERM_COD_CALL:
			plci->internal_command = PERM_COD_CONN_PEND;
			dbug(1, dprintf("***Codec Connect_Pending, Rc = 0x%x", rc));
			return;

		case PERM_COD_ASSIGN:
			dbug(1, dprintf("***Codec Assign, Rc = 0x%x", rc));
			plci->internal_command = 0;
			if (rc != ASSIGN_OK) break;
			plci->internal_command = PERM_COD_CALL;
			sig_req(plci, CALL_REQ, 0);
			send_req(plci);
			return;

		case LISTEN_SIG_ASSIGN_PEND:
			if (rc == ASSIGN_OK)
			{
				plci->internal_command = 0;
				dbug(1, dprintf("ListenCheck, new SIG_ID = 0x%x", plci->Sig.Id));
				add_p(plci, ESC, "\x02\x18\x00");             /* support call waiting */
				sig_req(plci, INDICATE_REQ, 0);
				send_req(plci);
			}
			else
			{
				dbug(1, dprintf("ListenCheck failed (assignRc=0x%x)", rc));
				a->listen_active--;
				plci_remove(plci);
				plci->State = IDLE;
			}
			break;

		case USELAW_REQ:
			if (global_req == ASSIGN)
			{
				if (rc == ASSIGN_OK)
				{
					sig_req(plci, LAW_REQ, 0);
					send_req(plci);
					dbug(1, dprintf("Auto-Law assigned"));
				}
				else
				{
					dbug(1, dprintf("Auto-Law assign failed"));
					a->automatic_law = 3;
					plci->internal_command = 0;
					a->automatic_lawPLCI = NULL;
				}
				break;
			}
			else if (req == LAW_REQ && rc == OK)
			{
				dbug(1, dprintf("Auto-Law initiated"));
				a->automatic_law = 2;
				plci->internal_command = 0;
			}
			else
			{
				dbug(1, dprintf("Auto-Law not supported"));
				a->automatic_law = 3;
				plci->internal_command = 0;
				sig_req(plci, REMOVE, 0);
				send_req(plci);
				a->automatic_lawPLCI = NULL;
			}
			break;
		}
		plci_remove_check(plci);
	}
}

static void data_rc(PLCI *plci, byte ch)
{
	dword Id;
	DIVA_CAPI_ADAPTER *a;
	NCCI *ncci_ptr;
	DATA_B3_DESC *data;
	word ncci;

	if (plci->appl)
	{
		TransmitBufferFree(plci->appl, plci->data_sent_ptr);
		a = plci->adapter;
		ncci = a->ch_ncci[ch];
		if (ncci && (a->ncci_plci[ncci] == plci->Id))
		{
			ncci_ptr = &(a->ncci[ncci]);
			dbug(1, dprintf("data_out=%d, data_pending=%d", ncci_ptr->data_out, ncci_ptr->data_pending));
			if (ncci_ptr->data_pending)
			{
				data = &(ncci_ptr->DBuffer[ncci_ptr->data_out]);
				if (!(data->Flags & 4) && a->ncci_state[ncci])
				{
					Id = (((dword)ncci) << 16) | ((word)plci->Id << 8) | a->Id;
					if (plci->tel) Id |= EXT_CONTROLLER;
					sendf(plci->appl, _DATA_B3_R | CONFIRM, Id, data->Number,
					      "ww", data->Handle, 0);
				}
				(ncci_ptr->data_out)++;
				if (ncci_ptr->data_out == MAX_DATA_B3)
					ncci_ptr->data_out = 0;
				(ncci_ptr->data_pending)--;
			}
		}
	}
}

static void data_ack(PLCI *plci, byte ch)
{
	dword Id;
	DIVA_CAPI_ADAPTER *a;
	NCCI *ncci_ptr;
	word ncci;

	a = plci->adapter;
	ncci = a->ch_ncci[ch];
	ncci_ptr = &(a->ncci[ncci]);
	if (ncci_ptr->data_ack_pending)
	{
		if (a->ncci_state[ncci] && (a->ncci_plci[ncci] == plci->Id))
		{
			Id = (((dword)ncci) << 16) | ((word)plci->Id << 8) | a->Id;
			if (plci->tel) Id |= EXT_CONTROLLER;
			sendf(plci->appl, _DATA_B3_R | CONFIRM, Id, ncci_ptr->DataAck[ncci_ptr->data_ack_out].Number,
			      "ww", ncci_ptr->DataAck[ncci_ptr->data_ack_out].Handle, 0);
		}
		(ncci_ptr->data_ack_out)++;
		if (ncci_ptr->data_ack_out == MAX_DATA_ACK)
			ncci_ptr->data_ack_out = 0;
		(ncci_ptr->data_ack_pending)--;
	}
}

static void sig_ind(PLCI *plci)
{
	dword x_Id;
	dword Id;
	dword rId;
	word i;
	word cip;
	dword cip_mask;
	byte *ie;
	DIVA_CAPI_ADAPTER *a;
	API_PARSE saved_parms[MAX_MSG_PARMS + 1];
#define MAXPARMSIDS 31
	byte *parms[MAXPARMSIDS];
	byte *add_i[4];
	byte *multi_fac_parms[MAX_MULTI_IE];
	byte *multi_pi_parms[MAX_MULTI_IE];
	byte *multi_ssext_parms[MAX_MULTI_IE];
	byte *multi_CiPN_parms[MAX_MULTI_IE];

	byte *multi_vswitch_parms[MAX_MULTI_IE];

	byte ai_len;
	byte *esc_chi = "";
	byte *esc_law = "";
	byte *pty_cai = "";
	byte *esc_cr  = "";
	byte *esc_profile = "";

	byte facility[256];
	PLCI *tplci = NULL;
	byte chi[] = "\x02\x18\x01";
	byte voice_cai[]  = "\x06\x14\x00\x00\x00\x00\x08";
	byte resume_cau[] = "\x05\x05\x00\x02\x00\x00";
	/* ESC_MSGTYPE must be the last but one message, a new IE has to be */
	/* included before the ESC_MSGTYPE and MAXPARMSIDS has to be incremented */
	/* SMSG is situated at the end because its 0 (for compatibility reasons */
	/* (see Info_Mask Bit 4, first IE. then the message type)           */
	static const word parms_id[] =
		{MAXPARMSIDS, CPN, 0xff, DSA, OSA, BC, LLC, HLC, ESC_CAUSE, DSP, DT, CHA,
		 UUI, CONG_RR, CONG_RNR, ESC_CHI, KEY, CHI, CAU, ESC_LAW,
		 RDN, RDX, CONN_NR, RIN, NI, CAI, ESC_CR,
		 CST, ESC_PROFILE, 0xff, ESC_MSGTYPE, SMSG};
	/* 14 FTY repl by ESC_CHI */
	/* 18 PI  repl by ESC_LAW */
	/* removed OAD changed to 0xff for future use, OAD is multiIE now */
	static const word multi_fac_id[] = {1, FTY};
	static const word multi_pi_id[]  = {1, PI};
	static const word multi_CiPN_id[]  = {1, OAD};
	static const word multi_ssext_id[]  = {1, ESC_SSEXT};

	static const word multi_vswitch_id[]  = {1, ESC_VSWITCH};

	byte *cau;
	word ncci;
	byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/
	byte CF_Ind[] = "\x09\x02\x00\x06\x00\x00\x00\x00\x00\x00";
	byte Interr_Err_Ind[] = "\x0a\x02\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
	byte CONF_Ind[] = "\x09\x16\x00\x06\x00\x00\x00\x00\x00\x00";
	byte force_mt_info = false;
	byte dir;
	dword d;
	word w;

	a = plci->adapter;
	Id = ((word)plci->Id << 8) | a->Id;
	PUT_WORD(&SS_Ind[4], 0x0000);

	if (plci->sig_remove_id)
	{
		plci->Sig.RNR = 2; /* discard */
		dbug(1, dprintf("SIG discard while remove pending"));
		return;
	}
	if (plci->tel && plci->SuppState != CALL_HELD) Id |= EXT_CONTROLLER;
	dbug(1, dprintf("SigInd-Id=%08lx,plci=%x,tel=%x,state=0x%x,channels=%d,Discflowcl=%d",
			Id, plci->Id, plci->tel, plci->State, plci->channels, plci->hangup_flow_ctrl_timer));
	if (plci->Sig.Ind == CALL_HOLD_ACK && plci->channels)
	{
		plci->Sig.RNR = 1;
		return;
	}
	if (plci->Sig.Ind == HANGUP && plci->channels)
	{
		plci->Sig.RNR = 1;
		plci->hangup_flow_ctrl_timer++;
		/* recover the network layer after timeout */
		if (plci->hangup_flow_ctrl_timer == 100)
		{
			dbug(1, dprintf("Exceptional disc"));
			plci->Sig.RNR = 0;
			plci->hangup_flow_ctrl_timer = 0;
			for (ncci = 1; ncci < MAX_NCCI + 1; ncci++)
			{
				if (a->ncci_plci[ncci] == plci->Id)
				{
					cleanup_ncci_data(plci, ncci);
					if (plci->channels)plci->channels--;
					if (plci->appl)
						sendf(plci->appl, _DISCONNECT_B3_I, (((dword) ncci) << 16) | Id, 0, "ws", 0, "");
				}
			}
			if (plci->appl)
				sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
			plci_remove(plci);
			plci->State = IDLE;
		}
		return;
	}

	/* do first parse the info with no OAD in, because OAD will be converted */
	/* first the multiple facility IE, then mult. progress ind.              */
	/* then the parameters for the info_ind + conn_ind                       */
	IndParse(plci, multi_fac_id, multi_fac_parms, MAX_MULTI_IE);
	IndParse(plci, multi_pi_id, multi_pi_parms, MAX_MULTI_IE);
	IndParse(plci, multi_ssext_id, multi_ssext_parms, MAX_MULTI_IE);

	IndParse(plci, multi_vswitch_id, multi_vswitch_parms, MAX_MULTI_IE);

	IndParse(plci, parms_id, parms, 0);
	IndParse(plci, multi_CiPN_id, multi_CiPN_parms, MAX_MULTI_IE);
	esc_chi  = parms[14];
	esc_law  = parms[18];
	pty_cai  = parms[24];
	esc_cr   = parms[25];
	esc_profile = parms[27];
	if (esc_cr[0] && plci)
	{
		if (plci->cr_enquiry && plci->appl)
		{
			plci->cr_enquiry = false;
			/* d = MANU_ID            */
			/* w = m_command          */
			/* b = total length       */
			/* b = indication type    */
			/* b = length of all IEs  */
			/* b = IE1                */
			/* S = IE1 length + cont. */
			/* b = IE2                */
			/* S = IE2 length + cont. */
			sendf(plci->appl,
			      _MANUFACTURER_I,
			      Id,
			      0,
			      "dwbbbbSbS", _DI_MANU_ID, plci->m_command,
			      2 + 1 + 1 + esc_cr[0] + 1 + 1 + esc_law[0], plci->Sig.Ind, 1 + 1 + esc_cr[0] + 1 + 1 + esc_law[0], ESC, esc_cr, ESC, esc_law);
		}
	}
	/* create the additional info structure                                  */
	add_i[1] = parms[15]; /* KEY of additional info */
	add_i[2] = parms[11]; /* UUI of additional info */
	ai_len = AddInfo(add_i, multi_fac_parms, esc_chi, facility);

	/* the ESC_LAW indicates if u-Law or a-Law is actually used by the card  */
	/* indication returns by the card if requested by the function           */
	/* AutomaticLaw() after driver init                                      */
	if (a->automatic_law < 4)
	{
		if (esc_law[0]) {
			if (esc_law[2]) {
				dbug(0, dprintf("u-Law selected"));
				a->u_law = 1;
			}
			else {
				dbug(0, dprintf("a-Law selected"));
				a->u_law = 0;
			}
			a->automatic_law = 4;
			if (plci == a->automatic_lawPLCI) {
				plci->internal_command = 0;
				sig_req(plci, REMOVE, 0);
				send_req(plci);
				a->automatic_lawPLCI = NULL;
			}
		}
		if (esc_profile[0])
		{
			dbug(1, dprintf("[%06x] CardProfile: %lx %lx %lx %lx %lx",
					UnMapController(a->Id), GET_DWORD(&esc_profile[6]),
					GET_DWORD(&esc_profile[10]), GET_DWORD(&esc_profile[14]),
					GET_DWORD(&esc_profile[18]), GET_DWORD(&esc_profile[46])));

			a->profile.Global_Options &= 0x000000ffL;
			a->profile.B1_Protocols &= 0x000003ffL;
			a->profile.B2_Protocols &= 0x00001fdfL;
			a->profile.B3_Protocols &= 0x000000b7L;

			a->profile.Global_Options &= GET_DWORD(&esc_profile[6]) |
				GL_BCHANNEL_OPERATION_SUPPORTED;
			a->profile.B1_Protocols &= GET_DWORD(&esc_profile[10]);
			a->profile.B2_Protocols &= GET_DWORD(&esc_profile[14]);
			a->profile.B3_Protocols &= GET_DWORD(&esc_profile[18]);
			a->manufacturer_features = GET_DWORD(&esc_profile[46]);
			a->man_profile.private_options = 0;

			if (a->manufacturer_features & MANUFACTURER_FEATURE_ECHO_CANCELLER)
			{
				a->man_profile.private_options |= 1L << PRIVATE_ECHO_CANCELLER;
				a->profile.Global_Options |= GL_ECHO_CANCELLER_SUPPORTED;
			}


			if (a->manufacturer_features & MANUFACTURER_FEATURE_RTP)
				a->man_profile.private_options |= 1L << PRIVATE_RTP;
			a->man_profile.rtp_primary_payloads = GET_DWORD(&esc_profile[50]);
			a->man_profile.rtp_additional_payloads = GET_DWORD(&esc_profile[54]);


			if (a->manufacturer_features & MANUFACTURER_FEATURE_T38)
				a->man_profile.private_options |= 1L << PRIVATE_T38;


			if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_SUB_SEP_PWD)
				a->man_profile.private_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;


			if (a->manufacturer_features & MANUFACTURER_FEATURE_V18)
				a->man_profile.private_options |= 1L << PRIVATE_V18;


			if (a->manufacturer_features & MANUFACTURER_FEATURE_DTMF_TONE)
				a->man_profile.private_options |= 1L << PRIVATE_DTMF_TONE;


			if (a->manufacturer_features & MANUFACTURER_FEATURE_PIAFS)
				a->man_profile.private_options |= 1L << PRIVATE_PIAFS;


			if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
				a->man_profile.private_options |= 1L << PRIVATE_FAX_PAPER_FORMATS;


			if (a->manufacturer_features & MANUFACTURER_FEATURE_VOWN)
				a->man_profile.private_options |= 1L << PRIVATE_VOWN;


			if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_NONSTANDARD)
				a->man_profile.private_options |= 1L << PRIVATE_FAX_NONSTANDARD;

		}
		else
		{
			a->profile.Global_Options &= 0x0000007fL;
			a->profile.B1_Protocols &= 0x000003dfL;
			a->profile.B2_Protocols &= 0x00001adfL;
			a->profile.B3_Protocols &= 0x000000b7L;
			a->manufacturer_features &= MANUFACTURER_FEATURE_HARDDTMF;
		}
		if (a->manufacturer_features & (MANUFACTURER_FEATURE_HARDDTMF |
						MANUFACTURER_FEATURE_SOFTDTMF_SEND | MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
		{
			a->profile.Global_Options |= GL_DTMF_SUPPORTED;
		}
		a->manufacturer_features &= ~MANUFACTURER_FEATURE_OOB_CHANNEL;
		dbug(1, dprintf("[%06x] Profile: %lx %lx %lx %lx %lx",
				UnMapController(a->Id), a->profile.Global_Options,
				a->profile.B1_Protocols, a->profile.B2_Protocols,
				a->profile.B3_Protocols, a->manufacturer_features));
	}
	/* codec plci for the handset/hook state support is just an internal id  */
	if (plci != a->AdvCodecPLCI)
	{
		force_mt_info = SendMultiIE(plci, Id, multi_fac_parms, FTY, 0x20, 0);
		force_mt_info |= SendMultiIE(plci, Id, multi_pi_parms, PI, 0x210, 0);
		SendSSExtInd(NULL, plci, Id, multi_ssext_parms);
		SendInfo(plci, Id, parms, force_mt_info);

		VSwitchReqInd(plci, Id, multi_vswitch_parms);

	}

	/* switch the codec to the b-channel                                     */
	if (esc_chi[0] && plci && !plci->SuppState) {
		plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
		mixer_set_bchannel_id_esc(plci, plci->b_channel);
		dbug(1, dprintf("storeChannel=0x%x", plci->b_channel));
		if (plci->tel == ADV_VOICE && plci->appl) {
			SetVoiceChannel(a->AdvCodecPLCI, esc_chi, a);
		}
	}

	if (plci->appl) plci->appl->Number++;

	switch (plci->Sig.Ind) {
		/* Response to Get_Supported_Services request */
	case S_SUPPORTED:
		dbug(1, dprintf("S_Supported"));
		if (!plci->appl) break;
		if (pty_cai[0] == 4)
		{
			PUT_DWORD(&CF_Ind[6], GET_DWORD(&pty_cai[1]));
		}
		else
		{
			PUT_DWORD(&CF_Ind[6], MASK_TERMINAL_PORTABILITY | MASK_HOLD_RETRIEVE);
		}
		PUT_WORD(&CF_Ind[1], 0);
		PUT_WORD(&CF_Ind[4], 0);
		sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0x7, plci->number, "wws", 0, 3, CF_Ind);
		plci_remove(plci);
		break;

		/* Supplementary Service rejected */
	case S_SERVICE_REJ:
		dbug(1, dprintf("S_Reject=0x%x", pty_cai[5]));
		if (!pty_cai[0]) break;
		switch (pty_cai[5])
		{
		case ECT_EXECUTE:
		case THREE_PTY_END:
		case THREE_PTY_BEGIN:
			if (!plci->relatedPTYPLCI) break;
			tplci = plci->relatedPTYPLCI;
			rId = ((word)tplci->Id << 8) | tplci->adapter->Id;
			if (tplci->tel) rId |= EXT_CONTROLLER;
			if (pty_cai[5] == ECT_EXECUTE)
			{
				PUT_WORD(&SS_Ind[1], S_ECT);

				plci->vswitchstate = 0;
				plci->relatedPTYPLCI->vswitchstate = 0;

			}
			else
			{
				PUT_WORD(&SS_Ind[1], pty_cai[5] + 3);
			}
			if (pty_cai[2] != 0xff)
			{
				PUT_WORD(&SS_Ind[4], 0x3600 | (word)pty_cai[2]);
			}
			else
			{
				PUT_WORD(&SS_Ind[4], 0x300E);
			}
			plci->relatedPTYPLCI = NULL;
			plci->ptyState = 0;
			sendf(tplci->appl, _FACILITY_I, rId, 0, "ws", 3, SS_Ind);
			break;

		case CALL_DEFLECTION:
			if (pty_cai[2] != 0xff)
			{
				PUT_WORD(&SS_Ind[4], 0x3600 | (word)pty_cai[2]);
			}
			else
			{
				PUT_WORD(&SS_Ind[4], 0x300E);
			}
			PUT_WORD(&SS_Ind[1], pty_cai[5]);
			for (i = 0; i < max_appl; i++)
			{
				if (application[i].CDEnable)
				{
					if (application[i].Id) sendf(&application[i], _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
					application[i].CDEnable = false;
				}
			}
			break;

		case DEACTIVATION_DIVERSION:
		case ACTIVATION_DIVERSION:
		case DIVERSION_INTERROGATE_CFU:
		case DIVERSION_INTERROGATE_CFB:
		case DIVERSION_INTERROGATE_CFNR:
		case DIVERSION_INTERROGATE_NUM:
		case CCBS_REQUEST:
		case CCBS_DEACTIVATE:
		case CCBS_INTERROGATE:
			if (!plci->appl) break;
			if (pty_cai[2] != 0xff)
			{
				PUT_WORD(&Interr_Err_Ind[4], 0x3600 | (word)pty_cai[2]);
			}
			else
			{
				PUT_WORD(&Interr_Err_Ind[4], 0x300E);
			}
			switch (pty_cai[5])
			{
			case DEACTIVATION_DIVERSION:
				dbug(1, dprintf("Deact_Div"));
				Interr_Err_Ind[0] = 0x9;
				Interr_Err_Ind[3] = 0x6;
				PUT_WORD(&Interr_Err_Ind[1], S_CALL_FORWARDING_STOP);
				break;
			case ACTIVATION_DIVERSION:
				dbug(1, dprintf("Act_Div"));
				Interr_Err_Ind[0] = 0x9;
				Interr_Err_Ind[3] = 0x6;
				PUT_WORD(&Interr_Err_Ind[1], S_CALL_FORWARDING_START);
				break;
			case DIVERSION_INTERROGATE_CFU:
			case DIVERSION_INTERROGATE_CFB:
			case DIVERSION_INTERROGATE_CFNR:
				dbug(1, dprintf("Interr_Div"));
				Interr_Err_Ind[0] = 0xa;
				Interr_Err_Ind[3] = 0x7;
				PUT_WORD(&Interr_Err_Ind[1], S_INTERROGATE_DIVERSION);
				break;
			case DIVERSION_INTERROGATE_NUM:
				dbug(1, dprintf("Interr_Num"));
				Interr_Err_Ind[0] = 0xa;
				Interr_Err_Ind[3] = 0x7;
				PUT_WORD(&Interr_Err_Ind[1], S_INTERROGATE_NUMBERS);
				break;
			case CCBS_REQUEST:
				dbug(1, dprintf("CCBS Request"));
				Interr_Err_Ind[0] = 0xd;
				Interr_Err_Ind[3] = 0xa;
				PUT_WORD(&Interr_Err_Ind[1], S_CCBS_REQUEST);
				break;
			case CCBS_DEACTIVATE:
				dbug(1, dprintf("CCBS Deactivate"));
				Interr_Err_Ind[0] = 0x9;
				Interr_Err_Ind[3] = 0x6;
				PUT_WORD(&Interr_Err_Ind[1], S_CCBS_DEACTIVATE);
				break;
			case CCBS_INTERROGATE:
				dbug(1, dprintf("CCBS Interrogate"));
				Interr_Err_Ind[0] = 0xb;
				Interr_Err_Ind[3] = 0x8;
				PUT_WORD(&Interr_Err_Ind[1], S_CCBS_INTERROGATE);
				break;
			}
			PUT_DWORD(&Interr_Err_Ind[6], plci->appl->S_Handle);
			sendf(plci->appl, _FACILITY_I, Id & 0x7, 0, "ws", 3, Interr_Err_Ind);
			plci_remove(plci);
			break;
		case ACTIVATION_MWI:
		case DEACTIVATION_MWI:
			if (pty_cai[5] == ACTIVATION_MWI)
			{
				PUT_WORD(&SS_Ind[1], S_MWI_ACTIVATE);
			}
			else PUT_WORD(&SS_Ind[1], S_MWI_DEACTIVATE);

			if (pty_cai[2] != 0xff)
			{
				PUT_WORD(&SS_Ind[4], 0x3600 | (word)pty_cai[2]);
			}
			else
			{
				PUT_WORD(&SS_Ind[4], 0x300E);
			}

			if (plci->cr_enquiry)
			{
				sendf(plci->appl, _FACILITY_I, Id & 0xf, 0, "ws", 3, SS_Ind);
				plci_remove(plci);
			}
			else
			{
				sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
			}
			break;
		case CONF_ADD: /* ERROR */
		case CONF_BEGIN:
		case CONF_DROP:
		case CONF_ISOLATE:
		case CONF_REATTACH:
			CONF_Ind[0] = 9;
			CONF_Ind[3] = 6;
			switch (pty_cai[5])
			{
			case CONF_BEGIN:
				PUT_WORD(&CONF_Ind[1], S_CONF_BEGIN);
				plci->ptyState = 0;
				break;
			case CONF_DROP:
				CONF_Ind[0] = 5;
				CONF_Ind[3] = 2;
				PUT_WORD(&CONF_Ind[1], S_CONF_DROP);
				plci->ptyState = CONNECTED;
				break;
			case CONF_ISOLATE:
				CONF_Ind[0] = 5;
				CONF_Ind[3] = 2;
				PUT_WORD(&CONF_Ind[1], S_CONF_ISOLATE);
				plci->ptyState = CONNECTED;
				break;
			case CONF_REATTACH:
				CONF_Ind[0] = 5;
				CONF_Ind[3] = 2;
				PUT_WORD(&CONF_Ind[1], S_CONF_REATTACH);
				plci->ptyState = CONNECTED;
				break;
			case CONF_ADD:
				PUT_WORD(&CONF_Ind[1], S_CONF_ADD);
				plci->relatedPTYPLCI = NULL;
				tplci = plci->relatedPTYPLCI;
				if (tplci) tplci->ptyState = CONNECTED;
				plci->ptyState = CONNECTED;
				break;
			}

			if (pty_cai[2] != 0xff)
			{
				PUT_WORD(&CONF_Ind[4], 0x3600 | (word)pty_cai[2]);
			}
			else
			{
				PUT_WORD(&CONF_Ind[4], 0x3303); /* Time-out: network did not respond
								  within the required time */
			}

			PUT_DWORD(&CONF_Ind[6], 0x0);
			sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, CONF_Ind);
			break;
		}
		break;

		/* Supplementary Service indicates success */
	case S_SERVICE:
		dbug(1, dprintf("Service_Ind"));
		PUT_WORD(&CF_Ind[4], 0);
		switch (pty_cai[5])
		{
		case THREE_PTY_END:
		case THREE_PTY_BEGIN:
		case ECT_EXECUTE:
			if (!plci->relatedPTYPLCI) break;
			tplci = plci->relatedPTYPLCI;
			rId = ((word)tplci->Id << 8) | tplci->adapter->Id;
			if (tplci->tel) rId |= EXT_CONTROLLER;
			if (pty_cai[5] == ECT_EXECUTE)
			{
				PUT_WORD(&SS_Ind[1], S_ECT);

				if (plci->vswitchstate != 3)
				{

					plci->ptyState = IDLE;
					plci->relatedPTYPLCI = NULL;
					plci->ptyState = 0;

				}

				dbug(1, dprintf("ECT OK"));
				sendf(tplci->appl, _FACILITY_I, rId, 0, "ws", 3, SS_Ind);



			}
			else
			{
				switch (plci->ptyState)
				{
				case S_3PTY_BEGIN:
					plci->ptyState = CONNECTED;
					dbug(1, dprintf("3PTY ON"));
					break;

				case S_3PTY_END:
					plci->ptyState = IDLE;
					plci->relatedPTYPLCI = NULL;
					plci->ptyState = 0;
					dbug(1, dprintf("3PTY OFF"));
					break;
				}
				PUT_WORD(&SS_Ind[1], pty_cai[5] + 3);
				sendf(tplci->appl, _FACILITY_I, rId, 0, "ws", 3, SS_Ind);
			}
			break;

		case CALL_DEFLECTION:
			PUT_WORD(&SS_Ind[1], pty_cai[5]);
			for (i = 0; i < max_appl; i++)
			{
				if (application[i].CDEnable)
				{
					if (application[i].Id) sendf(&application[i], _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
					application[i].CDEnable = false;
				}
			}
			break;

		case DEACTIVATION_DIVERSION:
		case ACTIVATION_DIVERSION:
			if (!plci->appl) break;
			PUT_WORD(&CF_Ind[1], pty_cai[5] + 2);
			PUT_DWORD(&CF_Ind[6], plci->appl->S_Handle);
			sendf(plci->appl, _FACILITY_I, Id & 0x7, 0, "ws", 3, CF_Ind);
			plci_remove(plci);
			break;

		case DIVERSION_INTERROGATE_CFU:
		case DIVERSION_INTERROGATE_CFB:
		case DIVERSION_INTERROGATE_CFNR:
		case DIVERSION_INTERROGATE_NUM:
		case CCBS_REQUEST:
		case CCBS_DEACTIVATE:
		case CCBS_INTERROGATE:
			if (!plci->appl) break;
			switch (pty_cai[5])
			{
			case DIVERSION_INTERROGATE_CFU:
			case DIVERSION_INTERROGATE_CFB:
			case DIVERSION_INTERROGATE_CFNR:
				dbug(1, dprintf("Interr_Div"));
				PUT_WORD(&pty_cai[1], S_INTERROGATE_DIVERSION);
				pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
				break;
			case DIVERSION_INTERROGATE_NUM:
				dbug(1, dprintf("Interr_Num"));
				PUT_WORD(&pty_cai[1], S_INTERROGATE_NUMBERS);
				pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
				break;
			case CCBS_REQUEST:
				dbug(1, dprintf("CCBS Request"));
				PUT_WORD(&pty_cai[1], S_CCBS_REQUEST);
				pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
				break;
			case CCBS_DEACTIVATE:
				dbug(1, dprintf("CCBS Deactivate"));
				PUT_WORD(&pty_cai[1], S_CCBS_DEACTIVATE);
				pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
				break;
			case CCBS_INTERROGATE:
				dbug(1, dprintf("CCBS Interrogate"));
				PUT_WORD(&pty_cai[1], S_CCBS_INTERROGATE);
				pty_cai[3] = pty_cai[0] - 3; /* Supplementary Service-specific parameter len */
				break;
			}
			PUT_WORD(&pty_cai[4], 0); /* Supplementary Service Reason */
			PUT_DWORD(&pty_cai[6], plci->appl->S_Handle);
			sendf(plci->appl, _FACILITY_I, Id & 0x7, 0, "wS", 3, pty_cai);
			plci_remove(plci);
			break;

		case ACTIVATION_MWI:
		case DEACTIVATION_MWI:
			if (pty_cai[5] == ACTIVATION_MWI)
			{
				PUT_WORD(&SS_Ind[1], S_MWI_ACTIVATE);
			}
			else PUT_WORD(&SS_Ind[1], S_MWI_DEACTIVATE);
			if (plci->cr_enquiry)
			{
				sendf(plci->appl, _FACILITY_I, Id & 0xf, 0, "ws", 3, SS_Ind);
				plci_remove(plci);
			}
			else
			{
				sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
			}
			break;
		case MWI_INDICATION:
			if (pty_cai[0] >= 0x12)
			{
				PUT_WORD(&pty_cai[3], S_MWI_INDICATE);
				pty_cai[2] = pty_cai[0] - 2; /* len Parameter */
				pty_cai[5] = pty_cai[0] - 5; /* Supplementary Service-specific parameter len */
				if (plci->appl && (a->Notification_Mask[plci->appl->Id - 1] & SMASK_MWI))
				{
					if (plci->internal_command == GET_MWI_STATE) /* result on Message Waiting Listen */
					{
						sendf(plci->appl, _FACILITY_I, Id & 0xf, 0, "wS", 3, &pty_cai[2]);
						plci_remove(plci);
						return;
					}
					else sendf(plci->appl, _FACILITY_I, Id, 0, "wS", 3, &pty_cai[2]);
					pty_cai[0] = 0;
				}
				else
				{
					for (i = 0; i < max_appl; i++)
					{
						if (a->Notification_Mask[i]&SMASK_MWI)
						{
							sendf(&application[i], _FACILITY_I, Id & 0x7, 0, "wS", 3, &pty_cai[2]);
							pty_cai[0] = 0;
						}
					}
				}

				if (!pty_cai[0])
				{ /* acknowledge */
					facility[2] = 0; /* returncode */
				}
				else facility[2] = 0xff;
			}
			else
			{
				/* reject */
				facility[2] = 0xff; /* returncode */
			}
			facility[0] = 2;
			facility[1] = MWI_RESPONSE; /* Function */
			add_p(plci, CAI, facility);
			add_p(plci, ESC, multi_ssext_parms[0]); /* remembered parameter -> only one possible */
			sig_req(plci, S_SERVICE, 0);
			send_req(plci);
			plci->command = 0;
			next_internal_command(Id, plci);
			break;
		case CONF_ADD: /* OK */
		case CONF_BEGIN:
		case CONF_DROP:
		case CONF_ISOLATE:
		case CONF_REATTACH:
		case CONF_PARTYDISC:
			CONF_Ind[0] = 9;
			CONF_Ind[3] = 6;
			switch (pty_cai[5])
			{
			case CONF_BEGIN:
				PUT_WORD(&CONF_Ind[1], S_CONF_BEGIN);
				if (pty_cai[0] == 6)
				{
					d = pty_cai[6];
					PUT_DWORD(&CONF_Ind[6], d); /* PartyID */
				}
				else
				{
					PUT_DWORD(&CONF_Ind[6], 0x0);
				}
				break;
			case CONF_ISOLATE:
				PUT_WORD(&CONF_Ind[1], S_CONF_ISOLATE);
				CONF_Ind[0] = 5;
				CONF_Ind[3] = 2;
				break;
			case CONF_REATTACH:
				PUT_WORD(&CONF_Ind[1], S_CONF_REATTACH);
				CONF_Ind[0] = 5;
				CONF_Ind[3] = 2;
				break;
			case CONF_DROP:
				PUT_WORD(&CONF_Ind[1], S_CONF_DROP);
				CONF_Ind[0] = 5;
				CONF_Ind[3] = 2;
				break;
			case CONF_ADD:
				PUT_WORD(&CONF_Ind[1], S_CONF_ADD);
				d = pty_cai[6];
				PUT_DWORD(&CONF_Ind[6], d); /* PartyID */
				tplci = plci->relatedPTYPLCI;
				if (tplci) tplci->ptyState = CONNECTED;
				break;
			case CONF_PARTYDISC:
				CONF_Ind[0] = 7;
				CONF_Ind[3] = 4;
				PUT_WORD(&CONF_Ind[1], S_CONF_PARTYDISC);
				d = pty_cai[6];
				PUT_DWORD(&CONF_Ind[4], d); /* PartyID */
				break;
			}
			plci->ptyState = CONNECTED;
			sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, CONF_Ind);
			break;
		case CCBS_INFO_RETAIN:
		case CCBS_ERASECALLLINKAGEID:
		case CCBS_STOP_ALERTING:
			CONF_Ind[0] = 5;
			CONF_Ind[3] = 2;
			switch (pty_cai[5])
			{
			case CCBS_INFO_RETAIN:
				PUT_WORD(&CONF_Ind[1], S_CCBS_INFO_RETAIN);
				break;
			case CCBS_STOP_ALERTING:
				PUT_WORD(&CONF_Ind[1], S_CCBS_STOP_ALERTING);
				break;
			case CCBS_ERASECALLLINKAGEID:
				PUT_WORD(&CONF_Ind[1], S_CCBS_ERASECALLLINKAGEID);
				CONF_Ind[0] = 7;
				CONF_Ind[3] = 4;
				CONF_Ind[6] = 0;
				CONF_Ind[7] = 0;
				break;
			}
			w = pty_cai[6];
			PUT_WORD(&CONF_Ind[4], w); /* PartyID */

			if (plci->appl && (a->Notification_Mask[plci->appl->Id - 1] & SMASK_CCBS))
			{
				sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, CONF_Ind);
			}
			else
			{
				for (i = 0; i < max_appl; i++)
					if (a->Notification_Mask[i] & SMASK_CCBS)
						sendf(&application[i], _FACILITY_I, Id & 0x7, 0, "ws", 3, CONF_Ind);
			}
			break;
		}
		break;
	case CALL_HOLD_REJ:
		cau = parms[7];
		if (cau)
		{
			i = _L3_CAUSE | cau[2];
			if (cau[2] == 0) i = 0x3603;
		}
		else
		{
			i = 0x3603;
		}
		PUT_WORD(&SS_Ind[1], S_HOLD);
		PUT_WORD(&SS_Ind[4], i);
		if (plci->SuppState == HOLD_REQUEST)
		{
			plci->SuppState = IDLE;
			sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
		}
		break;

	case CALL_HOLD_ACK:
		if (plci->SuppState == HOLD_REQUEST)
		{
			plci->SuppState = CALL_HELD;
			CodecIdCheck(a, plci);
			start_internal_command(Id, plci, hold_save_command);
		}
		break;

	case CALL_RETRIEVE_REJ:
		cau = parms[7];
		if (cau)
		{
			i = _L3_CAUSE | cau[2];
			if (cau[2] == 0) i = 0x3603;
		}
		else
		{
			i = 0x3603;
		}
		PUT_WORD(&SS_Ind[1], S_RETRIEVE);
		PUT_WORD(&SS_Ind[4], i);
		if (plci->SuppState == RETRIEVE_REQUEST)
		{
			plci->SuppState = CALL_HELD;
			CodecIdCheck(a, plci);
			sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
		}
		break;

	case CALL_RETRIEVE_ACK:
		PUT_WORD(&SS_Ind[1], S_RETRIEVE);
		if (plci->SuppState == RETRIEVE_REQUEST)
		{
			plci->SuppState = IDLE;
			plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
			plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
			if (plci->tel)
			{
				mixer_set_bchannel_id_esc(plci, plci->b_channel);
				dbug(1, dprintf("RetrChannel=0x%x", plci->b_channel));
				SetVoiceChannel(a->AdvCodecPLCI, esc_chi, a);
				if (plci->B2_prot == B2_TRANSPARENT && plci->B3_prot == B3_TRANSPARENT)
				{
					dbug(1, dprintf("Get B-ch"));
					start_internal_command(Id, plci, retrieve_restore_command);
				}
				else
					sendf(plci->appl, _FACILITY_I, Id, 0, "ws", 3, SS_Ind);
			}
			else
				start_internal_command(Id, plci, retrieve_restore_command);
		}
		break;

	case INDICATE_IND:
		if (plci->State != LISTENING) {
			sig_req(plci, HANGUP, 0);
			send_req(plci);
			break;
		}
		cip = find_cip(a, parms[4], parms[6]);
		cip_mask = 1L << cip;
		dbug(1, dprintf("cip=%d,cip_mask=%lx", cip, cip_mask));
		bitmap_zero(plci->c_ind_mask_table, MAX_APPL);
		if (!remove_started && !a->adapter_disabled)
		{
			group_optimization(a, plci);
			for_each_set_bit(i, plci->group_optimization_mask_table, max_appl) {
				if (application[i].Id
				    && (a->CIP_Mask[i] & 1 || a->CIP_Mask[i] & cip_mask)
				    && CPN_filter_ok(parms[0], a, i)) {
					dbug(1, dprintf("storedcip_mask[%d]=0x%lx", i, a->CIP_Mask[i]));
					__set_bit(i, plci->c_ind_mask_table);
					dbug(1, dprintf("c_ind_mask =%*pb", MAX_APPL, plci->c_ind_mask_table));
					plci->State = INC_CON_PENDING;
					plci->call_dir = (plci->call_dir & ~(CALL_DIR_OUT | CALL_DIR_ORIGINATE)) |
						CALL_DIR_IN | CALL_DIR_ANSWER;
					if (esc_chi[0]) {
						plci->b_channel = esc_chi[esc_chi[0]] & 0x1f;
						mixer_set_bchannel_id_esc(plci, plci->b_channel);
					}
					/* if a listen on the ext controller is done, check if hook states */
					/* are supported or if just a on board codec must be activated     */
					if (a->codec_listen[i] && !a->AdvSignalPLCI) {
						if (a->profile.Global_Options & HANDSET)
							plci->tel = ADV_VOICE;
						else if (a->profile.Global_Options & ON_BOARD_CODEC)
							plci->tel = CODEC;
						if (plci->tel) Id |= EXT_CONTROLLER;
						a->codec_listen[i] = plci;
					}

					sendf(&application[i], _CONNECT_I, Id, 0,
					      "wSSSSSSSbSSSSS", cip,    /* CIP                 */
					      parms[0],    /* CalledPartyNumber   */
					      multi_CiPN_parms[0],    /* CallingPartyNumber  */
					      parms[2],    /* CalledPartySubad    */
					      parms[3],    /* CallingPartySubad   */
					      parms[4],    /* BearerCapability    */
					      parms[5],    /* LowLC               */
					      parms[6],    /* HighLC              */
					      ai_len,      /* nested struct add_i */
					      add_i[0],    /* B channel info    */
					      add_i[1],    /* keypad facility   */
					      add_i[2],    /* user user data    */
					      add_i[3],    /* nested facility   */
					      multi_CiPN_parms[1]    /* second CiPN(SCR)   */
						);
					SendSSExtInd(&application[i],
						     plci,
						     Id,
						     multi_ssext_parms);
					SendSetupInfo(&application[i],
						      plci,
						      Id,
						      parms,
						      SendMultiIE(plci, Id, multi_pi_parms, PI, 0x210, true));
				}
			}
			dbug(1, dprintf("c_ind_mask =%*pb", MAX_APPL, plci->c_ind_mask_table));
		}
		if (bitmap_empty(plci->c_ind_mask_table, MAX_APPL)) {
			sig_req(plci, HANGUP, 0);
			send_req(plci);
			plci->State = IDLE;
		}
		plci->notifiedcall = 0;
		a->listen_active--;
		listen_check(a);
		break;

	case CALL_PEND_NOTIFY:
		plci->notifiedcall = 1;
		listen_check(a);
		break;

	case CALL_IND:
	case CALL_CON:
		if (plci->State == ADVANCED_VOICE_SIG || plci->State == ADVANCED_VOICE_NOSIG)
		{
			if (plci->internal_command == PERM_COD_CONN_PEND)
			{
				if (plci->State == ADVANCED_VOICE_NOSIG)
				{
					dbug(1, dprintf("***Codec OK"));
					if (a->AdvSignalPLCI)
					{
						tplci = a->AdvSignalPLCI;
						if (tplci->spoofed_msg)
						{
							dbug(1, dprintf("***Spoofed Msg(0x%x)", tplci->spoofed_msg));
							tplci->command = 0;
							tplci->internal_command = 0;
							x_Id = ((word)tplci->Id << 8) | tplci->adapter->Id | 0x80;
							switch (tplci->spoofed_msg)
							{
							case CALL_RES:
								tplci->command = _CONNECT_I | RESPONSE;
								api_load_msg(&tplci->saved_msg, saved_parms);
								add_b1(tplci, &saved_parms[1], 0, tplci->B1_facilities);
								if (tplci->adapter->Info_Mask[tplci->appl->Id - 1] & 0x200)
								{
									/* early B3 connect (CIP mask bit 9) no release after a disc */
									add_p(tplci, LLI, "\x01\x01");
								}
								add_s(tplci, CONN_NR, &saved_parms[2]);
								add_s(tplci, LLC, &saved_parms[4]);
								add_ai(tplci, &saved_parms[5]);
								tplci->State = INC_CON_ACCEPT;
								sig_req(tplci, CALL_RES, 0);
								send_req(tplci);
								break;

							case AWAITING_SELECT_B:
								dbug(1, dprintf("Select_B continue"));
								start_internal_command(x_Id, tplci, select_b_command);
								break;

							case AWAITING_MANUF_CON: /* Get_Plci per Manufacturer_Req to ext controller */
								if (!tplci->Sig.Id)
								{
									dbug(1, dprintf("No SigID!"));
									sendf(tplci->appl, _MANUFACTURER_R | CONFIRM, x_Id, tplci->number, "dww", _DI_MANU_ID, _MANUFACTURER_R, _OUT_OF_PLCI);
									plci_remove(tplci);
									break;
								}
								tplci->command = _MANUFACTURER_R;
								api_load_msg(&tplci->saved_msg, saved_parms);
								dir = saved_parms[2].info[0];
								if (dir == 1) {
									sig_req(tplci, CALL_REQ, 0);
								}
								else if (!dir) {
									sig_req(tplci, LISTEN_REQ, 0);
								}
								send_req(tplci);
								sendf(tplci->appl, _MANUFACTURER_R | CONFIRM, x_Id, tplci->number, "dww", _DI_MANU_ID, _MANUFACTURER_R, 0);
								break;

							case (CALL_REQ | AWAITING_MANUF_CON):
								sig_req(tplci, CALL_REQ, 0);
								send_req(tplci);
								break;

							case CALL_REQ:
								if (!tplci->Sig.Id)
								{
									dbug(1, dprintf("No SigID!"));
									sendf(tplci->appl, _CONNECT_R | CONFIRM, tplci->adapter->Id, 0, "w", _OUT_OF_PLCI);
									plci_remove(tplci);
									break;
								}
								tplci->command = _CONNECT_R;
								api_load_msg(&tplci->saved_msg, saved_parms);
								add_s(tplci, CPN, &saved_parms[1]);
								add_s(tplci, DSA, &saved_parms[3]);
								add_ai(tplci, &saved_parms[9]);
								sig_req(tplci, CALL_REQ, 0);
								send_req(tplci);
								break;

							case CALL_RETRIEVE:
								tplci->command = C_RETRIEVE_REQ;
								sig_req(tplci, CALL_RETRIEVE, 0);
								send_req(tplci);
								break;
							}
							tplci->spoofed_msg = 0;
							if (tplci->internal_command == 0)
								next_internal_command(x_Id, tplci);
						}
					}
					next_internal_command(Id, plci);
					break;
				}
				dbug(1, dprintf("***Codec Hook Init Req"));
				plci->internal_command = PERM_COD_HOOK;
				add_p(plci, FTY, "\x01\x09");             /* Get Hook State*/
				sig_req(plci, TEL_CTRL, 0);
				send_req(plci);
			}
		}
		else if (plci->command != _MANUFACTURER_R  /* old style permanent connect */
			 && plci->State != INC_ACT_PENDING)
		{
			mixer_set_bchannel_id_esc(plci, plci->b_channel);
			if (plci->tel == ADV_VOICE && plci->SuppState == IDLE) /* with permanent codec switch on immediately */
			{
				chi[2] = plci->b_channel;
				SetVoiceChannel(a->AdvCodecPLCI, chi, a);
			}
			sendf(plci->appl, _CONNECT_ACTIVE_I, Id, 0, "Sss", parms[21], "", "");
			plci->State = INC_ACT_PENDING;
		}
		break;

	case TEL_CTRL:
		ie = multi_fac_parms[0]; /* inspect the facility hook indications */
		if (plci->State == ADVANCED_VOICE_SIG && ie[0]) {
			switch (ie[1] & 0x91) {
			case 0x80:   /* hook off */
			case 0x81:
				if (plci->internal_command == PERM_COD_HOOK)
				{
					dbug(1, dprintf("init:hook_off"));
					plci->hook_state = ie[1];
					next_internal_command(Id, plci);
					break;
				}
				else /* ignore doubled hook indications */
				{
					if (((plci->hook_state) & 0xf0) == 0x80)
					{
						dbug(1, dprintf("ignore hook"));
						break;
					}
					plci->hook_state = ie[1]&0x91;
				}
				/* check for incoming call pending */
				/* and signal '+'.Appl must decide */
				/* with connect_res if call must   */
				/* accepted or not                 */
				for (i = 0, tplci = NULL; i < max_appl; i++) {
					if (a->codec_listen[i]
					    && (a->codec_listen[i]->State == INC_CON_PENDING
						|| a->codec_listen[i]->State == INC_CON_ALERT)) {
						tplci = a->codec_listen[i];
						tplci->appl = &application[i];
					}
				}
				/* no incoming call, do outgoing call */
				/* and signal '+' if outg. setup   */
				if (!a->AdvSignalPLCI && !tplci) {
					if ((i = get_plci(a))) {
						a->AdvSignalPLCI = &a->plci[i - 1];
						tplci = a->AdvSignalPLCI;
						tplci->tel  = ADV_VOICE;
						PUT_WORD(&voice_cai[5], a->AdvSignalAppl->MaxDataLength);
						if (a->Info_Mask[a->AdvSignalAppl->Id - 1] & 0x200) {
							/* early B3 connect (CIP mask bit 9) no release after a disc */
							add_p(tplci, LLI, "\x01\x01");
						}
						add_p(tplci, CAI, voice_cai);
						add_p(tplci, OAD, a->TelOAD);
						add_p(tplci, OSA, a->TelOSA);
						add_p(tplci, SHIFT | 6, NULL);
						add_p(tplci, SIN, "\x02\x01\x00");
						add_p(tplci, UID, "\x06\x43\x61\x70\x69\x32\x30");
						sig_req(tplci, ASSIGN, DSIG_ID);
						a->AdvSignalPLCI->internal_command = HOOK_OFF_REQ;
						a->AdvSignalPLCI->command = 0;
						tplci->appl = a->AdvSignalAppl;
						tplci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
						send_req(tplci);
					}

				}

				if (!tplci) break;
				Id = ((word)tplci->Id << 8) | a->Id;
				Id |= EXT_CONTROLLER;
				sendf(tplci->appl,
				      _FACILITY_I,
				      Id,
				      0,
				      "ws", (word)0, "\x01+");
				break;

			case 0x90:   /* hook on  */
			case 0x91:
				if (plci->internal_command == PERM_COD_HOOK)
				{
					dbug(1, dprintf("init:hook_on"));
					plci->hook_state = ie[1] & 0x91;
					next_internal_command(Id, plci);
					break;
				}
				else /* ignore doubled hook indications */
				{
					if (((plci->hook_state) & 0xf0) == 0x90) break;
					plci->hook_state = ie[1] & 0x91;
				}
				/* hangup the adv. voice call and signal '-' to the appl */
				if (a->AdvSignalPLCI) {
					Id = ((word)a->AdvSignalPLCI->Id << 8) | a->Id;
					if (plci->tel) Id |= EXT_CONTROLLER;
					sendf(a->AdvSignalAppl,
					      _FACILITY_I,
					      Id,
					      0,
					      "ws", (word)0, "\x01-");
					a->AdvSignalPLCI->internal_command = HOOK_ON_REQ;
					a->AdvSignalPLCI->command = 0;
					sig_req(a->AdvSignalPLCI, HANGUP, 0);
					send_req(a->AdvSignalPLCI);
				}
				break;
			}
		}
		break;

	case RESUME:
		__clear_bit(plci->appl->Id - 1, plci->c_ind_mask_table);
		PUT_WORD(&resume_cau[4], GOOD);
		sendf(plci->appl, _FACILITY_I, Id, 0, "ws", (word)3, resume_cau);
		break;

	case SUSPEND:
		bitmap_zero(plci->c_ind_mask_table, MAX_APPL);

		if (plci->NL.Id && !plci->nl_remove_id) {
			mixer_remove(plci);
			nl_req_ncci(plci, REMOVE, 0);
		}
		if (!plci->sig_remove_id) {
			plci->internal_command = 0;
			sig_req(plci, REMOVE, 0);
		}
		send_req(plci);
		if (!plci->channels) {
			sendf(plci->appl, _FACILITY_I, Id, 0, "ws", (word)3, "\x05\x04\x00\x02\x00\x00");
			sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
		}
		break;

	case SUSPEND_REJ:
		break;

	case HANGUP:
		plci->hangup_flow_ctrl_timer = 0;
		if (plci->manufacturer && plci->State == LOCAL_CONNECT) break;
		cau = parms[7];
		if (cau) {
			i = _L3_CAUSE | cau[2];
			if (cau[2] == 0) i = 0;
			else if (cau[2] == 8) i = _L1_ERROR;
			else if (cau[2] == 9 || cau[2] == 10) i = _L2_ERROR;
			else if (cau[2] == 5) i = _CAPI_GUARD_ERROR;
		}
		else {
			i = _L3_ERROR;
		}

		if (plci->State == INC_CON_PENDING || plci->State == INC_CON_ALERT)
		{
			for_each_set_bit(i, plci->c_ind_mask_table, max_appl)
				sendf(&application[i], _DISCONNECT_I, Id, 0, "w", 0);
		}
		else
		{
			bitmap_zero(plci->c_ind_mask_table, MAX_APPL);
		}
		if (!plci->appl)
		{
			if (plci->State == LISTENING)
			{
				plci->notifiedcall = 0;
				a->listen_active--;
			}
			plci->State = INC_DIS_PENDING;
			if (bitmap_empty(plci->c_ind_mask_table, MAX_APPL))
			{
				plci->State = IDLE;
				if (plci->NL.Id && !plci->nl_remove_id)
				{
					mixer_remove(plci);
					nl_req_ncci(plci, REMOVE, 0);
				}
				if (!plci->sig_remove_id)
				{
					plci->internal_command = 0;
					sig_req(plci, REMOVE, 0);
				}
				send_req(plci);
			}
		}
		else
		{
			/* collision of DISCONNECT or CONNECT_RES with HANGUP can   */
			/* result in a second HANGUP! Don't generate another        */
			/* DISCONNECT                                               */
			if (plci->State != IDLE && plci->State != INC_DIS_PENDING)
			{
				if (plci->State == RESUMING)
				{
					PUT_WORD(&resume_cau[4], i);
					sendf(plci->appl, _FACILITY_I, Id, 0, "ws", (word)3, resume_cau);
				}
				plci->State = INC_DIS_PENDING;
				sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", i);
			}
		}
		break;

	case SSEXT_IND:
		SendSSExtInd(NULL, plci, Id, multi_ssext_parms);
		break;

	case VSWITCH_REQ:
		VSwitchReqInd(plci, Id, multi_vswitch_parms);
		break;
	case VSWITCH_IND:
		if (plci->relatedPTYPLCI &&
		    plci->vswitchstate == 3 &&
		    plci->relatedPTYPLCI->vswitchstate == 3 &&
		    parms[MAXPARMSIDS - 1][0])
		{
			add_p(plci->relatedPTYPLCI, SMSG, parms[MAXPARMSIDS - 1]);
			sig_req(plci->relatedPTYPLCI, VSWITCH_REQ, 0);
			send_req(plci->relatedPTYPLCI);
		}
		else VSwitchReqInd(plci, Id, multi_vswitch_parms);
		break;

	}
}


static void SendSetupInfo(APPL *appl, PLCI *plci, dword Id, byte **parms, byte Info_Sent_Flag)
{
	word i;
	byte *ie;
	word Info_Number;
	byte *Info_Element;
	word Info_Mask = 0;

	dbug(1, dprintf("SetupInfo"));

	for (i = 0; i < MAXPARMSIDS; i++) {
		ie = parms[i];
		Info_Number = 0;
		Info_Element = ie;
		if (ie[0]) {
			switch (i) {
			case 0:
				dbug(1, dprintf("CPN "));
				Info_Number = 0x0070;
				Info_Mask = 0x80;
				Info_Sent_Flag = true;
				break;
			case 8:  /* display      */
				dbug(1, dprintf("display(%d)", i));
				Info_Number = 0x0028;
				Info_Mask = 0x04;
				Info_Sent_Flag = true;
				break;
			case 16: /* Channel Id */
				dbug(1, dprintf("CHI"));
				Info_Number = 0x0018;
				Info_Mask = 0x100;
				Info_Sent_Flag = true;
				mixer_set_bchannel_id(plci, Info_Element);
				break;
			case 19: /* Redirected Number */
				dbug(1, dprintf("RDN"));
				Info_Number = 0x0074;
				Info_Mask = 0x400;
				Info_Sent_Flag = true;
				break;
			case 20: /* Redirected Number extended */
				dbug(1, dprintf("RDX"));
				Info_Number = 0x0073;
				Info_Mask = 0x400;
				Info_Sent_Flag = true;
				break;
			case 22: /* Redirecing Number  */
				dbug(1, dprintf("RIN"));
				Info_Number = 0x0076;
				Info_Mask = 0x400;
				Info_Sent_Flag = true;
				break;
			default:
				Info_Number = 0;
				break;
			}
		}

		if (i == MAXPARMSIDS - 2) { /* to indicate the message type "Setup" */
			Info_Number = 0x8000 | 5;
			Info_Mask = 0x10;
			Info_Element = "";
		}

		if (Info_Sent_Flag && Info_Number) {
			if (plci->adapter->Info_Mask[appl->Id - 1] & Info_Mask) {
				sendf(appl, _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
			}
		}
	}
}


static void SendInfo(PLCI *plci, dword Id, byte **parms, byte iesent)
{
	word i;
	word j;
	word k;
	byte *ie;
	word Info_Number;
	byte *Info_Element;
	word Info_Mask = 0;
	static byte charges[5] = {4, 0, 0, 0, 0};
	static byte cause[] = {0x02, 0x80, 0x00};
	APPL *appl;

	dbug(1, dprintf("InfoParse "));

	if (
		!plci->appl
		&& !plci->State
		&& plci->Sig.Ind != NCR_FACILITY
		)
	{
		dbug(1, dprintf("NoParse "));
		return;
	}
	cause[2] = 0;
	for (i = 0; i < MAXPARMSIDS; i++) {
		ie = parms[i];
		Info_Number = 0;
		Info_Element = ie;
		if (ie[0]) {
			switch (i) {
			case 0:
				dbug(1, dprintf("CPN "));
				Info_Number = 0x0070;
				Info_Mask   = 0x80;
				break;
			case 7: /* ESC_CAU */
				dbug(1, dprintf("cau(0x%x)", ie[2]));
				Info_Number = 0x0008;
				Info_Mask = 0x00;
				cause[2] = ie[2];
				Info_Element = NULL;
				break;
			case 8:  /* display      */
				dbug(1, dprintf("display(%d)", i));
				Info_Number = 0x0028;
				Info_Mask = 0x04;
				break;
			case 9:  /* Date display */
				dbug(1, dprintf("date(%d)", i));
				Info_Number = 0x0029;
				Info_Mask = 0x02;
				break;
			case 10: /* charges */
				for (j = 0; j < 4; j++) charges[1 + j] = 0;
				for (j = 0; j < ie[0] && !(ie[1 + j] & 0x80); j++);
				for (k = 1, j++; j < ie[0] && k <= 4; j++, k++) charges[k] = ie[1 + j];
				Info_Number = 0x4000;
				Info_Mask = 0x40;
				Info_Element = charges;
				break;
			case 11: /* user user info */
				dbug(1, dprintf("uui"));
				Info_Number = 0x007E;
				Info_Mask = 0x08;
				break;
			case 12: /* congestion receiver ready */
				dbug(1, dprintf("clRDY"));
				Info_Number = 0x00B0;
				Info_Mask = 0x08;
				Info_Element = "";
				break;
			case 13: /* congestion receiver not ready */
				dbug(1, dprintf("clNRDY"));
				Info_Number = 0x00BF;
				Info_Mask = 0x08;
				Info_Element = "";
				break;
			case 15: /* Keypad Facility */
				dbug(1, dprintf("KEY"));
				Info_Number = 0x002C;
				Info_Mask = 0x20;
				break;
			case 16: /* Channel Id */
				dbug(1, dprintf("CHI"));
				Info_Number = 0x0018;
				Info_Mask = 0x100;
				mixer_set_bchannel_id(plci, Info_Element);
				break;
			case 17: /* if no 1tr6 cause, send full cause, else esc_cause */
				dbug(1, dprintf("q9cau(0x%x)", ie[2]));
				if (!cause[2] || cause[2] < 0x80) break;  /* eg. layer 1 error */
				Info_Number = 0x0008;
				Info_Mask = 0x01;
				if (cause[2] != ie[2]) Info_Element = cause;
				break;
			case 19: /* Redirected Number */
				dbug(1, dprintf("RDN"));
				Info_Number = 0x0074;
				Info_Mask = 0x400;
				break;
			case 22: /* Redirecing Number  */
				dbug(1, dprintf("RIN"));
				Info_Number = 0x0076;
				Info_Mask = 0x400;
				break;
			case 23: /* Notification Indicator  */
				dbug(1, dprintf("NI"));
				Info_Number = (word)NI;
				Info_Mask = 0x210;
				break;
			case 26: /* Call State  */
				dbug(1, dprintf("CST"));
				Info_Number = (word)CST;
				Info_Mask = 0x01; /* do with cause i.e. for now */
				break;
			case MAXPARMSIDS - 2:  /* Escape Message Type, must be the last indication */
				dbug(1, dprintf("ESC/MT[0x%x]", ie[3]));
				Info_Number = 0x8000 | ie[3];
				if (iesent) Info_Mask = 0xffff;
				else  Info_Mask = 0x10;
				Info_Element = "";
				break;
			default:
				Info_Number  = 0;
				Info_Mask    = 0;
				Info_Element = "";
				break;
			}
		}

		if (plci->Sig.Ind == NCR_FACILITY)           /* check controller broadcast */
		{
			for (j = 0; j < max_appl; j++)
			{
				appl = &application[j];
				if (Info_Number
				    && appl->Id
				    && plci->adapter->Info_Mask[appl->Id - 1] & Info_Mask)
				{
					dbug(1, dprintf("NCR_Ind"));
					iesent = true;
					sendf(&application[j], _INFO_I, Id & 0x0f, 0, "wS", Info_Number, Info_Element);
				}
			}
		}
		else if (!plci->appl)
		{ /* overlap receiving broadcast */
			if (Info_Number == CPN
			    || Info_Number == KEY
			    || Info_Number == NI
			    || Info_Number == DSP
			    || Info_Number == UUI)
			{
				for_each_set_bit(j, plci->c_ind_mask_table, max_appl) {
					dbug(1, dprintf("Ovl_Ind"));
					iesent = true;
					sendf(&application[j], _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
				}
			}
		}               /* all other signalling states */
		else if (Info_Number
			 && plci->adapter->Info_Mask[plci->appl->Id - 1] & Info_Mask)
		{
			dbug(1, dprintf("Std_Ind"));
			iesent = true;
			sendf(plci->appl, _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
		}
	}
}


static byte SendMultiIE(PLCI *plci, dword Id, byte **parms, byte ie_type,
			dword info_mask, byte setupParse)
{
	word i;
	word j;
	byte *ie;
	word Info_Number;
	byte *Info_Element;
	APPL *appl;
	word Info_Mask = 0;
	byte iesent = 0;

	if (
		!plci->appl
		&& !plci->State
		&& plci->Sig.Ind != NCR_FACILITY
		&& !setupParse
		)
	{
		dbug(1, dprintf("NoM-IEParse "));
		return 0;
	}
	dbug(1, dprintf("M-IEParse "));

	for (i = 0; i < MAX_MULTI_IE; i++)
	{
		ie = parms[i];
		Info_Number = 0;
		Info_Element = ie;
		if (ie[0])
		{
			dbug(1, dprintf("[Ind0x%x]:IE=0x%x", plci->Sig.Ind, ie_type));
			Info_Number = (word)ie_type;
			Info_Mask = (word)info_mask;
		}

		if (plci->Sig.Ind == NCR_FACILITY)           /* check controller broadcast */
		{
			for (j = 0; j < max_appl; j++)
			{
				appl = &application[j];
				if (Info_Number
				    && appl->Id
				    && plci->adapter->Info_Mask[appl->Id - 1] & Info_Mask)
				{
					iesent = true;
					dbug(1, dprintf("Mlt_NCR_Ind"));
					sendf(&application[j], _INFO_I, Id & 0x0f, 0, "wS", Info_Number, Info_Element);
				}
			}
		}
		else if (!plci->appl && Info_Number)
		{                                        /* overlap receiving broadcast */
			for_each_set_bit(j, plci->c_ind_mask_table, max_appl) {
				iesent = true;
				dbug(1, dprintf("Mlt_Ovl_Ind"));
				sendf(&application[j] , _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
			}
		}                                        /* all other signalling states */
		else if (Info_Number
			 && plci->adapter->Info_Mask[plci->appl->Id - 1] & Info_Mask)
		{
			iesent = true;
			dbug(1, dprintf("Mlt_Std_Ind"));
			sendf(plci->appl, _INFO_I, Id, 0, "wS", Info_Number, Info_Element);
		}
	}
	return iesent;
}

static void SendSSExtInd(APPL *appl, PLCI *plci, dword Id, byte **parms)
{
	word i;
	/* Format of multi_ssext_parms[i][]:
	   0 byte length
	   1 byte SSEXTIE
	   2 byte SSEXT_REQ/SSEXT_IND
	   3 byte length
	   4 word SSExtCommand
	   6... Params
	*/
	if (
		plci
		&& plci->State
		&& plci->Sig.Ind != NCR_FACILITY
		)
		for (i = 0; i < MAX_MULTI_IE; i++)
		{
			if (parms[i][0] < 6) continue;
			if (parms[i][2] == SSEXT_REQ) continue;

			if (appl)
			{
				parms[i][0] = 0; /* kill it */
				sendf(appl, _MANUFACTURER_I,
				      Id,
				      0,
				      "dwS",
				      _DI_MANU_ID,
				      _DI_SSEXT_CTRL,
				      &parms[i][3]);
			}
			else if (plci->appl)
			{
				parms[i][0] = 0; /* kill it */
				sendf(plci->appl, _MANUFACTURER_I,
				      Id,
				      0,
				      "dwS",
				      _DI_MANU_ID,
				      _DI_SSEXT_CTRL,
				      &parms[i][3]);
			}
		}
};

static void nl_ind(PLCI *plci)
{
	byte ch;
	word ncci;
	dword Id;
	DIVA_CAPI_ADAPTER *a;
	word NCCIcode;
	APPL *APPLptr;
	word count;
	word Num;
	word i, ncpi_state;
	byte len, ncci_state;
	word msg;
	word info = 0;
	word fax_feature_bits;
	byte fax_send_edata_ack;
	static byte v120_header_buffer[2 + 3];
	static word fax_info[] = {
		0,                     /* T30_SUCCESS                        */
		_FAX_NO_CONNECTION,    /* T30_ERR_NO_DIS_RECEIVED            */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_NO_RESPONSE        */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_RESPONSE          */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_TOO_MANY_REPEATS           */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_UNEXPECTED_MESSAGE         */
		_FAX_REMOTE_ABORT,     /* T30_ERR_UNEXPECTED_DCN             */
		_FAX_LOCAL_ABORT,      /* T30_ERR_DTC_UNSUPPORTED            */
		_FAX_TRAINING_ERROR,   /* T30_ERR_ALL_RATES_FAILED           */
		_FAX_TRAINING_ERROR,   /* T30_ERR_TOO_MANY_TRAINS            */
		_FAX_PARAMETER_ERROR,  /* T30_ERR_RECEIVE_CORRUPTED          */
		_FAX_REMOTE_ABORT,     /* T30_ERR_UNEXPECTED_DISC            */
		_FAX_LOCAL_ABORT,      /* T30_ERR_APPLICATION_DISC           */
		_FAX_REMOTE_REJECT,    /* T30_ERR_INCOMPATIBLE_DIS           */
		_FAX_LOCAL_ABORT,      /* T30_ERR_INCOMPATIBLE_DCS           */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_NO_COMMAND         */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_COMMAND           */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_COMMAND_TOO_LONG   */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_TIMEOUT_RESPONSE_TOO_LONG  */
		_FAX_NO_CONNECTION,    /* T30_ERR_NOT_IDENTIFIED             */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_SUPERVISORY_TIMEOUT        */
		_FAX_PARAMETER_ERROR,  /* T30_ERR_TOO_LONG_SCAN_LINE         */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_PAGE_AFTER_MPS    */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_PAGE_AFTER_CFR    */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_FTT     */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_EOM     */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCS_AFTER_MPS     */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCN_AFTER_MCF     */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_DCN_AFTER_RTN     */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_CFR               */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_EOP     */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_EOM     */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_RETRY_NO_MCF_AFTER_MPS     */
		0x331d,                /* T30_ERR_SUB_SEP_UNSUPPORTED        */
		0x331e,                /* T30_ERR_PWD_UNSUPPORTED            */
		0x331f,                /* T30_ERR_SUB_SEP_PWD_UNSUPPORTED    */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_INVALID_COMMAND_FRAME      */
		_FAX_PARAMETER_ERROR,  /* T30_ERR_UNSUPPORTED_PAGE_CODING    */
		_FAX_PARAMETER_ERROR,  /* T30_ERR_INVALID_PAGE_CODING        */
		_FAX_REMOTE_REJECT,    /* T30_ERR_INCOMPATIBLE_PAGE_CONFIG   */
		_FAX_LOCAL_ABORT,      /* T30_ERR_TIMEOUT_FROM_APPLICATION   */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_NO_REACTION_ON_MARK */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_TRAINING_TIMEOUT    */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_UNEXPECTED_V21      */
		_FAX_PROTOCOL_ERROR,   /* T30_ERR_V34FAX_PRIMARY_CTS_ON      */
		_FAX_LOCAL_ABORT,      /* T30_ERR_V34FAX_TURNAROUND_POLLING  */
		_FAX_LOCAL_ABORT       /* T30_ERR_V34FAX_V8_INCOMPATIBILITY  */
	};

	byte dtmf_code_buffer[CAPIDTMF_RECV_DIGIT_BUFFER_SIZE + 1];


	static word rtp_info[] = {
		GOOD,                  /* RTP_SUCCESS                       */
		0x3600                 /* RTP_ERR_SSRC_OR_PAYLOAD_CHANGE    */
	};

	static dword udata_forwarding_table[0x100 / sizeof(dword)] =
		{
			0x0020301e, 0x00000000, 0x00000000, 0x00000000,
			0x00000000, 0x00000000, 0x00000000, 0x00000000
		};

	ch = plci->NL.IndCh;
	a = plci->adapter;
	ncci = a->ch_ncci[ch];
	Id = (((dword)(ncci ? ncci : ch)) << 16) | (((word) plci->Id) << 8) | a->Id;
	if (plci->tel) Id |= EXT_CONTROLLER;
	APPLptr = plci->appl;
	dbug(1, dprintf("NL_IND-Id(NL:0x%x)=0x%08lx,plci=%x,tel=%x,state=0x%x,ch=0x%x,chs=%d,Ind=%x",
			plci->NL.Id, Id, plci->Id, plci->tel, plci->State, ch, plci->channels, plci->NL.Ind & 0x0f));

	/* in the case if no connect_active_Ind was sent to the appl we wait for */

	if (plci->nl_remove_id)
	{
		plci->NL.RNR = 2; /* discard */
		dbug(1, dprintf("NL discard while remove pending"));
		return;
	}
	if ((plci->NL.Ind & 0x0f) == N_CONNECT)
	{
		if (plci->State == INC_DIS_PENDING
		    || plci->State == OUTG_DIS_PENDING
		    || plci->State == IDLE)
		{
			plci->NL.RNR = 2; /* discard */
			dbug(1, dprintf("discard n_connect"));
			return;
		}
		if (plci->State < INC_ACT_PENDING)
		{
			plci->NL.RNR = 1; /* flow control */
			channel_x_off(plci, ch, N_XON_CONNECT_IND);
			return;
		}
	}

	if (!APPLptr)                         /* no application or invalid data */
	{                                    /* while reloading the DSP        */
		dbug(1, dprintf("discard1"));
		plci->NL.RNR = 2;
		return;
	}

	if (((plci->NL.Ind & 0x0f) == N_UDATA)
	    && (((plci->B2_prot != B2_SDLC) && ((plci->B1_resource == 17) || (plci->B1_resource == 18)))
		|| (plci->B2_prot == 7)
		|| (plci->B3_prot == 7)))
	{
		plci->ncpi_buffer[0] = 0;

		ncpi_state = plci->ncpi_state;
		if (plci->NL.complete == 1)
		{
			byte *data = &plci->NL.RBuffer->P[0];

			if ((plci->NL.RBuffer->length >= 12)
			    && ((*data == DSP_UDATA_INDICATION_DCD_ON)
				|| (*data == DSP_UDATA_INDICATION_CTS_ON)))
			{
				word conn_opt, ncpi_opt = 0x00;
/*      HexDump ("MDM N_UDATA:", plci->NL.RBuffer->length, data); */

				if (*data == DSP_UDATA_INDICATION_DCD_ON)
					plci->ncpi_state |= NCPI_MDM_DCD_ON_RECEIVED;
				if (*data == DSP_UDATA_INDICATION_CTS_ON)
					plci->ncpi_state |= NCPI_MDM_CTS_ON_RECEIVED;

				data++;    /* indication code */
				data += 2; /* timestamp */
				if ((*data == DSP_CONNECTED_NORM_V18) || (*data == DSP_CONNECTED_NORM_VOWN))
					ncpi_state &= ~(NCPI_MDM_DCD_ON_RECEIVED | NCPI_MDM_CTS_ON_RECEIVED);
				data++;    /* connected norm */
				conn_opt = GET_WORD(data);
				data += 2; /* connected options */

				PUT_WORD(&(plci->ncpi_buffer[1]), (word)(GET_DWORD(data) & 0x0000FFFF));

				if (conn_opt & DSP_CONNECTED_OPTION_MASK_V42)
				{
					ncpi_opt |= MDM_NCPI_ECM_V42;
				}
				else if (conn_opt & DSP_CONNECTED_OPTION_MASK_MNP)
				{
					ncpi_opt |= MDM_NCPI_ECM_MNP;
				}
				else
				{
					ncpi_opt |= MDM_NCPI_TRANSPARENT;
				}
				if (conn_opt & DSP_CONNECTED_OPTION_MASK_COMPRESSION)
				{
					ncpi_opt |= MDM_NCPI_COMPRESSED;
				}
				PUT_WORD(&(plci->ncpi_buffer[3]), ncpi_opt);
				plci->ncpi_buffer[0] = 4;

				plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND | NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
			}
		}
		if (plci->B3_prot == 7)
		{
			if (((a->ncci_state[ncci] == INC_ACT_PENDING) || (a->ncci_state[ncci] == OUTG_CON_PENDING))
			    && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
			    && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
			{
				a->ncci_state[ncci] = INC_ACT_PENDING;
				sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
				plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
			}
		}

		if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
		      & ((1L << PRIVATE_V18) | (1L << PRIVATE_VOWN)))
		    || !(ncpi_state & NCPI_MDM_DCD_ON_RECEIVED)
		    || !(ncpi_state & NCPI_MDM_CTS_ON_RECEIVED))

		{
			plci->NL.RNR = 2;
			return;
		}
	}

	if (plci->NL.complete == 2)
	{
		if (((plci->NL.Ind & 0x0f) == N_UDATA)
		    && !(udata_forwarding_table[plci->RData[0].P[0] >> 5] & (1L << (plci->RData[0].P[0] & 0x1f))))
		{
			switch (plci->RData[0].P[0])
			{

			case DTMF_UDATA_INDICATION_FAX_CALLING_TONE:
				if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
					sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", SELECTOR_DTMF, "\x01X");
				break;
			case DTMF_UDATA_INDICATION_ANSWER_TONE:
				if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
					sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", SELECTOR_DTMF, "\x01Y");
				break;
			case DTMF_UDATA_INDICATION_DIGITS_RECEIVED:
				dtmf_indication(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
				break;
			case DTMF_UDATA_INDICATION_DIGITS_SENT:
				dtmf_confirmation(Id, plci);
				break;


			case UDATA_INDICATION_MIXER_TAP_DATA:
				capidtmf_recv_process_block(&(plci->capidtmf_state), plci->RData[0].P + 1, (word)(plci->RData[0].PLength - 1));
				i = capidtmf_indication(&(plci->capidtmf_state), dtmf_code_buffer + 1);
				if (i != 0)
				{
					dtmf_code_buffer[0] = DTMF_UDATA_INDICATION_DIGITS_RECEIVED;
					dtmf_indication(Id, plci, dtmf_code_buffer, (word)(i + 1));
				}
				break;


			case UDATA_INDICATION_MIXER_COEFS_SET:
				mixer_indication_coefs_set(Id, plci);
				break;
			case UDATA_INDICATION_XCONNECT_FROM:
				mixer_indication_xconnect_from(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
				break;
			case UDATA_INDICATION_XCONNECT_TO:
				mixer_indication_xconnect_to(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
				break;


			case LEC_UDATA_INDICATION_DISABLE_DETECT:
				ec_indication(Id, plci, plci->RData[0].P, plci->RData[0].PLength);
				break;



			default:
				break;
			}
		}
		else
		{
			if ((plci->RData[0].PLength != 0)
			    && ((plci->B2_prot == B2_V120_ASYNC)
				|| (plci->B2_prot == B2_V120_ASYNC_V42BIS)
				|| (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
			{

				sendf(plci->appl, _DATA_B3_I, Id, 0,
				      "dwww",
				      plci->RData[1].P,
				      (plci->NL.RNum < 2) ? 0 : plci->RData[1].PLength,
				      plci->RNum,
				      plci->RFlags);

			}
			else
			{

				sendf(plci->appl, _DATA_B3_I, Id, 0,
				      "dwww",
				      plci->RData[0].P,
				      plci->RData[0].PLength,
				      plci->RNum,
				      plci->RFlags);

			}
		}
		return;
	}

	fax_feature_bits = 0;
	if ((plci->NL.Ind & 0x0f) == N_CONNECT ||
	    (plci->NL.Ind & 0x0f) == N_CONNECT_ACK ||
	    (plci->NL.Ind & 0x0f) == N_DISC ||
	    (plci->NL.Ind & 0x0f) == N_EDATA ||
	    (plci->NL.Ind & 0x0f) == N_DISC_ACK)
	{
		info = 0;
		plci->ncpi_buffer[0] = 0;
		switch (plci->B3_prot) {
		case  0: /*XPARENT*/
		case  1: /*T.90 NL*/
			break;    /* no network control protocol info - jfr */
		case  2: /*ISO8202*/
		case  3: /*X25 DCE*/
			for (i = 0; i < plci->NL.RLength; i++) plci->ncpi_buffer[4 + i] = plci->NL.RBuffer->P[i];
			plci->ncpi_buffer[0] = (byte)(i + 3);
			plci->ncpi_buffer[1] = (byte)(plci->NL.Ind & N_D_BIT ? 1 : 0);
			plci->ncpi_buffer[2] = 0;
			plci->ncpi_buffer[3] = 0;
			break;
		case  4: /*T.30 - FAX*/
		case  5: /*T.30 - FAX*/
			if (plci->NL.RLength >= sizeof(T30_INFO))
			{
				dbug(1, dprintf("FaxStatus %04x", ((T30_INFO *)plci->NL.RBuffer->P)->code));
				len = 9;
				PUT_WORD(&(plci->ncpi_buffer[1]), ((T30_INFO *)plci->NL.RBuffer->P)->rate_div_2400 * 2400);
				fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
				i = (((T30_INFO *)plci->NL.RBuffer->P)->resolution & T30_RESOLUTION_R8_0770_OR_200) ? 0x0001 : 0x0000;
				if (plci->B3_prot == 5)
				{
					if (!(fax_feature_bits & T30_FEATURE_BIT_ECM))
						i |= 0x8000; /* This is not an ECM connection */
					if (fax_feature_bits & T30_FEATURE_BIT_T6_CODING)
						i |= 0x4000; /* This is a connection with MMR compression */
					if (fax_feature_bits & T30_FEATURE_BIT_2D_CODING)
						i |= 0x2000; /* This is a connection with MR compression */
					if (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)
						i |= 0x0004; /* More documents */
					if (fax_feature_bits & T30_FEATURE_BIT_POLLING)
						i |= 0x0002; /* Fax-polling indication */
				}
				dbug(1, dprintf("FAX Options %04x %04x", fax_feature_bits, i));
				PUT_WORD(&(plci->ncpi_buffer[3]), i);
				PUT_WORD(&(plci->ncpi_buffer[5]), ((T30_INFO *)plci->NL.RBuffer->P)->data_format);
				plci->ncpi_buffer[7] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_low;
				plci->ncpi_buffer[8] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_high;
				plci->ncpi_buffer[len] = 0;
				if (((T30_INFO *)plci->NL.RBuffer->P)->station_id_len)
				{
					plci->ncpi_buffer[len] = 20;
					for (i = 0; i < T30_MAX_STATION_ID_LENGTH; i++)
						plci->ncpi_buffer[++len] = ((T30_INFO *)plci->NL.RBuffer->P)->station_id[i];
				}
				if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
				{
					if (((T30_INFO *)plci->NL.RBuffer->P)->code < ARRAY_SIZE(fax_info))
						info = fax_info[((T30_INFO *)plci->NL.RBuffer->P)->code];
					else
						info = _FAX_PROTOCOL_ERROR;
				}

				if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id - 1])
				    & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
				{
					i = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
					while (i < plci->NL.RBuffer->length)
						plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
				}

				plci->ncpi_buffer[0] = len;
				fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
				PUT_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low, fax_feature_bits);

				plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND;
				if (((plci->NL.Ind & 0x0f) == N_CONNECT_ACK)
				    || (((plci->NL.Ind & 0x0f) == N_CONNECT)
					&& (fax_feature_bits & T30_FEATURE_BIT_POLLING))
				    || (((plci->NL.Ind & 0x0f) == N_EDATA)
					&& ((((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_TRAIN_OK)
					    || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
					    || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DTC))))
				{
					plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT;
				}
				if (((plci->NL.Ind & 0x0f) == N_DISC)
				    || ((plci->NL.Ind & 0x0f) == N_DISC_ACK)
				    || (((plci->NL.Ind & 0x0f) == N_EDATA)
					&& (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_EOP_CAPI)))
				{
					plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
				}
			}
			break;

		case B3_RTP:
			if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
			{
				if (plci->NL.RLength != 0)
				{
					info = rtp_info[plci->NL.RBuffer->P[0]];
					plci->ncpi_buffer[0] = plci->NL.RLength - 1;
					for (i = 1; i < plci->NL.RLength; i++)
						plci->ncpi_buffer[i] = plci->NL.RBuffer->P[i];
				}
			}
			break;

		}
		plci->NL.RNR = 2;
	}
	switch (plci->NL.Ind & 0x0f) {
	case N_EDATA:
		if ((plci->B3_prot == 4) || (plci->B3_prot == 5))
		{
			dbug(1, dprintf("EDATA ncci=0x%x state=%d code=%02x", ncci, a->ncci_state[ncci],
					((T30_INFO *)plci->NL.RBuffer->P)->code));
			fax_send_edata_ack = (((T30_INFO *)(plci->fax_connect_info_buffer))->operating_mode == T30_OPERATING_MODE_CAPI_NEG);

			if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
			    && (plci->nsf_control_bits & (T30_NSF_CONTROL_BIT_NEGOTIATE_IND | T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
			    && (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
			    && (a->ncci_state[ncci] == OUTG_CON_PENDING)
			    && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
			    && !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
			{
				((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
				sendf(plci->appl, _MANUFACTURER_I, Id, 0, "dwbS", _DI_MANU_ID, _DI_NEGOTIATE_B3,
				      (byte)(plci->ncpi_buffer[0] + 1), plci->ncpi_buffer);
				plci->ncpi_state |= NCPI_NEGOTIATE_B3_SENT;
				if (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)
					fax_send_edata_ack = false;
			}

			if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
			{
				switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
				{
				case EDATA_T30_DIS:
					if ((a->ncci_state[ncci] == OUTG_CON_PENDING)
					    && !(GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) & T30_CONTROL_BIT_REQUEST_POLLING)
					    && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
					    && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
					{
						a->ncci_state[ncci] = INC_ACT_PENDING;
						if (plci->B3_prot == 4)
							sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
						else
							sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
						plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
					}
					break;

				case EDATA_T30_TRAIN_OK:
					if ((a->ncci_state[ncci] == INC_ACT_PENDING)
					    && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
					    && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
					{
						if (plci->B3_prot == 4)
							sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
						else
							sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
						plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
					}
					break;

				case EDATA_T30_EOP_CAPI:
					if (a->ncci_state[ncci] == CONNECTED)
					{
						sendf(plci->appl, _DISCONNECT_B3_I, Id, 0, "wS", GOOD, plci->ncpi_buffer);
						a->ncci_state[ncci] = INC_DIS_PENDING;
						plci->ncpi_state = 0;
						fax_send_edata_ack = false;
					}
					break;
				}
			}
			else
			{
				switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
				{
				case EDATA_T30_TRAIN_OK:
					if ((a->ncci_state[ncci] == INC_ACT_PENDING)
					    && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
					    && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
					{
						if (plci->B3_prot == 4)
							sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
						else
							sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
						plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
					}
					break;
				}
			}
			if (fax_send_edata_ack)
			{
				((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
				plci->fax_edata_ack_length = 1;
				start_internal_command(Id, plci, fax_edata_ack_command);
			}
		}
		else
		{
			dbug(1, dprintf("EDATA ncci=0x%x state=%d", ncci, a->ncci_state[ncci]));
		}
		break;
	case N_CONNECT:
		if (!a->ch_ncci[ch])
		{
			ncci = get_ncci(plci, ch, 0);
			Id = (Id & 0xffff) | (((dword) ncci) << 16);
		}
		dbug(1, dprintf("N_CONNECT: ch=%d state=%d plci=%lx plci_Id=%lx plci_State=%d",
				ch, a->ncci_state[ncci], a->ncci_plci[ncci], plci->Id, plci->State));

		msg = _CONNECT_B3_I;
		if (a->ncci_state[ncci] == IDLE)
			plci->channels++;
		else if (plci->B3_prot == 1)
			msg = _CONNECT_B3_T90_ACTIVE_I;

		a->ncci_state[ncci] = INC_CON_PENDING;
		if (plci->B3_prot == 4)
			sendf(plci->appl, msg, Id, 0, "s", "");
		else
			sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
		break;
	case N_CONNECT_ACK:
		dbug(1, dprintf("N_connect_Ack"));
		if (plci->internal_command_queue[0]
		    && ((plci->adjust_b_state == ADJUST_B_CONNECT_2)
			|| (plci->adjust_b_state == ADJUST_B_CONNECT_3)
			|| (plci->adjust_b_state == ADJUST_B_CONNECT_4)))
		{
			(*(plci->internal_command_queue[0]))(Id, plci, 0);
			if (!plci->internal_command)
				next_internal_command(Id, plci);
			break;
		}
		msg = _CONNECT_B3_ACTIVE_I;
		if (plci->B3_prot == 1)
		{
			if (a->ncci_state[ncci] != OUTG_CON_PENDING)
				msg = _CONNECT_B3_T90_ACTIVE_I;
			a->ncci_state[ncci] = INC_ACT_PENDING;
			sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
		}
		else if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
		{
			if ((a->ncci_state[ncci] == OUTG_CON_PENDING)
			    && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
			    && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
			{
				a->ncci_state[ncci] = INC_ACT_PENDING;
				if (plci->B3_prot == 4)
					sendf(plci->appl, msg, Id, 0, "s", "");
				else
					sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
				plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
			}
		}
		else
		{
			a->ncci_state[ncci] = INC_ACT_PENDING;
			sendf(plci->appl, msg, Id, 0, "S", plci->ncpi_buffer);
		}
		if (plci->adjust_b_restore)
		{
			plci->adjust_b_restore = false;
			start_internal_command(Id, plci, adjust_b_restore);
		}
		break;
	case N_DISC:
	case N_DISC_ACK:
		if (plci->internal_command_queue[0]
		    && ((plci->internal_command == FAX_DISCONNECT_COMMAND_1)
			|| (plci->internal_command == FAX_DISCONNECT_COMMAND_2)
			|| (plci->internal_command == FAX_DISCONNECT_COMMAND_3)))
		{
			(*(plci->internal_command_queue[0]))(Id, plci, 0);
			if (!plci->internal_command)
				next_internal_command(Id, plci);
		}
		ncci_state = a->ncci_state[ncci];
		ncci_remove(plci, ncci, false);

		/* with N_DISC or N_DISC_ACK the IDI frees the respective   */
		/* channel, so we cannot store the state in ncci_state! The */
		/* information which channel we received a N_DISC is thus   */
		/* stored in the inc_dis_ncci_table buffer.                 */
		for (i = 0; plci->inc_dis_ncci_table[i]; i++);
		plci->inc_dis_ncci_table[i] = (byte) ncci;

		/* need a connect_b3_ind before a disconnect_b3_ind with FAX */
		if (!plci->channels
		    && (plci->B1_resource == 16)
		    && (plci->State <= CONNECTED))
		{
			len = 9;
			i = ((T30_INFO *)plci->fax_connect_info_buffer)->rate_div_2400 * 2400;
			PUT_WORD(&plci->ncpi_buffer[1], i);
			PUT_WORD(&plci->ncpi_buffer[3], 0);
			i = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
			PUT_WORD(&plci->ncpi_buffer[5], i);
			PUT_WORD(&plci->ncpi_buffer[7], 0);
			plci->ncpi_buffer[len] = 0;
			plci->ncpi_buffer[0] = len;
			if (plci->B3_prot == 4)
				sendf(plci->appl, _CONNECT_B3_I, Id, 0, "s", "");
			else
			{

				if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id - 1])
				    & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
				{
					plci->ncpi_buffer[++len] = 0;
					plci->ncpi_buffer[++len] = 0;
					plci->ncpi_buffer[++len] = 0;
					plci->ncpi_buffer[0] = len;
				}

				sendf(plci->appl, _CONNECT_B3_I, Id, 0, "S", plci->ncpi_buffer);
			}
			sendf(plci->appl, _DISCONNECT_B3_I, Id, 0, "wS", info, plci->ncpi_buffer);
			plci->ncpi_state = 0;
			sig_req(plci, HANGUP, 0);
			send_req(plci);
			plci->State = OUTG_DIS_PENDING;
			/* disc here */
		}
		else if ((a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
			 && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
			 && ((ncci_state == INC_DIS_PENDING) || (ncci_state == IDLE)))
		{
			if (ncci_state == IDLE)
			{
				if (plci->channels)
					plci->channels--;
				if ((plci->State == IDLE || plci->State == SUSPENDING) && !plci->channels) {
					if (plci->State == SUSPENDING) {
						sendf(plci->appl,
						      _FACILITY_I,
						      Id & 0xffffL,
						      0,
						      "ws", (word)3, "\x03\x04\x00\x00");
						sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
					}
					plci_remove(plci);
					plci->State = IDLE;
				}
			}
		}
		else if (plci->channels)
		{
			sendf(plci->appl, _DISCONNECT_B3_I, Id, 0, "wS", info, plci->ncpi_buffer);
			plci->ncpi_state = 0;
			if ((ncci_state == OUTG_REJ_PENDING)
			    && ((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE)))
			{
				sig_req(plci, HANGUP, 0);
				send_req(plci);
				plci->State = OUTG_DIS_PENDING;
			}
		}
		break;
	case N_RESET:
		a->ncci_state[ncci] = INC_RES_PENDING;
		sendf(plci->appl, _RESET_B3_I, Id, 0, "S", plci->ncpi_buffer);
		break;
	case N_RESET_ACK:
		a->ncci_state[ncci] = CONNECTED;
		sendf(plci->appl, _RESET_B3_I, Id, 0, "S", plci->ncpi_buffer);
		break;

	case N_UDATA:
		if (!(udata_forwarding_table[plci->NL.RBuffer->P[0] >> 5] & (1L << (plci->NL.RBuffer->P[0] & 0x1f))))
		{
			plci->RData[0].P = plci->internal_ind_buffer + (-((int)(long)(plci->internal_ind_buffer)) & 3);
			plci->RData[0].PLength = INTERNAL_IND_BUFFER_SIZE;
			plci->NL.R = plci->RData;
			plci->NL.RNum = 1;
			return;
		}
		/* fall through */
	case N_BDATA:
	case N_DATA:
		if (((a->ncci_state[ncci] != CONNECTED) && (plci->B2_prot == 1)) /* transparent */
		    || (a->ncci_state[ncci] == IDLE)
		    || (a->ncci_state[ncci] == INC_DIS_PENDING))
		{
			plci->NL.RNR = 2;
			break;
		}
		if ((a->ncci_state[ncci] != CONNECTED)
		    && (a->ncci_state[ncci] != OUTG_DIS_PENDING)
		    && (a->ncci_state[ncci] != OUTG_REJ_PENDING))
		{
			dbug(1, dprintf("flow control"));
			plci->NL.RNR = 1; /* flow control  */
			channel_x_off(plci, ch, 0);
			break;
		}

		NCCIcode = ncci | (((word)a->Id) << 8);

		/* count all buffers within the Application pool    */
		/* belonging to the same NCCI. If this is below the */
		/* number of buffers available per NCCI we accept   */
		/* this packet, otherwise we reject it              */
		count = 0;
		Num = 0xffff;
		for (i = 0; i < APPLptr->MaxBuffer; i++) {
			if (NCCIcode == APPLptr->DataNCCI[i]) count++;
			if (!APPLptr->DataNCCI[i] && Num == 0xffff) Num = i;
		}

		if (count >= APPLptr->MaxNCCIData || Num == 0xffff)
		{
			dbug(3, dprintf("Flow-Control"));
			plci->NL.RNR = 1;
			if (++(APPLptr->NCCIDataFlowCtrlTimer) >=
			    (word)((a->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL) ? 40 : 2000))
			{
				plci->NL.RNR = 2;
				dbug(3, dprintf("DiscardData"));
			} else {
				channel_x_off(plci, ch, 0);
			}
			break;
		}
		else
		{
			APPLptr->NCCIDataFlowCtrlTimer = 0;
		}

		plci->RData[0].P = ReceiveBufferGet(APPLptr, Num);
		if (!plci->RData[0].P) {
			plci->NL.RNR = 1;
			channel_x_off(plci, ch, 0);
			break;
		}

		APPLptr->DataNCCI[Num] = NCCIcode;
		APPLptr->DataFlags[Num] = (plci->Id << 8) | (plci->NL.Ind >> 4);
		dbug(3, dprintf("Buffer(%d), Max = %d", Num, APPLptr->MaxBuffer));

		plci->RNum = Num;
		plci->RFlags = plci->NL.Ind >> 4;
		plci->RData[0].PLength = APPLptr->MaxDataLength;
		plci->NL.R = plci->RData;
		if ((plci->NL.RLength != 0)
		    && ((plci->B2_prot == B2_V120_ASYNC)
			|| (plci->B2_prot == B2_V120_ASYNC_V42BIS)
			|| (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
		{
			plci->RData[1].P = plci->RData[0].P;
			plci->RData[1].PLength = plci->RData[0].PLength;
			plci->RData[0].P = v120_header_buffer + (-((unsigned long)v120_header_buffer) & 3);
			if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
				plci->RData[0].PLength = 1;
			else
				plci->RData[0].PLength = 2;
			if (plci->NL.RBuffer->P[0] & V120_HEADER_BREAK_BIT)
				plci->RFlags |= 0x0010;
			if (plci->NL.RBuffer->P[0] & (V120_HEADER_C1_BIT | V120_HEADER_C2_BIT))
				plci->RFlags |= 0x8000;
			plci->NL.RNum = 2;
		}
		else
		{
			if ((plci->NL.Ind & 0x0f) == N_UDATA)
				plci->RFlags |= 0x0010;

			else if ((plci->B3_prot == B3_RTP) && ((plci->NL.Ind & 0x0f) == N_BDATA))
				plci->RFlags |= 0x0001;

			plci->NL.RNum = 1;
		}
		break;
	case N_DATA_ACK:
		data_ack(plci, ch);
		break;
	default:
		plci->NL.RNR = 2;
		break;
	}
}

/*------------------------------------------------------------------*/
/* find a free PLCI */
/*------------------------------------------------------------------*/

static word get_plci(DIVA_CAPI_ADAPTER *a)
{
	word i, j;
	PLCI *plci;

	for (i = 0; i < a->max_plci && a->plci[i].Id; i++);
	if (i == a->max_plci) {
		dbug(1, dprintf("get_plci: out of PLCIs"));
		return 0;
	}
	plci = &a->plci[i];
	plci->Id = (byte)(i + 1);

	plci->Sig.Id = 0;
	plci->NL.Id = 0;
	plci->sig_req = 0;
	plci->nl_req = 0;

	plci->appl = NULL;
	plci->relatedPTYPLCI = NULL;
	plci->State = IDLE;
	plci->SuppState = IDLE;
	plci->channels = 0;
	plci->tel = 0;
	plci->B1_resource = 0;
	plci->B2_prot = 0;
	plci->B3_prot = 0;

	plci->command = 0;
	plci->m_command = 0;
	init_internal_command_queue(plci);
	plci->number = 0;
	plci->req_in_start = 0;
	plci->req_in = 0;
	plci->req_out = 0;
	plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
	plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
	plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;

	plci->data_sent = false;
	plci->send_disc = 0;
	plci->sig_global_req = 0;
	plci->sig_remove_id = 0;
	plci->nl_global_req = 0;
	plci->nl_remove_id = 0;
	plci->adv_nl = 0;
	plci->manufacturer = false;
	plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
	plci->spoofed_msg = 0;
	plci->ptyState = 0;
	plci->cr_enquiry = false;
	plci->hangup_flow_ctrl_timer = 0;

	plci->ncci_ring_list = 0;
	for (j = 0; j < MAX_CHANNELS_PER_PLCI; j++) plci->inc_dis_ncci_table[j] = 0;
	bitmap_zero(plci->c_ind_mask_table, MAX_APPL);
	bitmap_fill(plci->group_optimization_mask_table, MAX_APPL);
	plci->fax_connect_info_length = 0;
	plci->nsf_control_bits = 0;
	plci->ncpi_state = 0x00;
	plci->ncpi_buffer[0] = 0;

	plci->requested_options_conn = 0;
	plci->requested_options = 0;
	plci->notifiedcall = 0;
	plci->vswitchstate = 0;
	plci->vsprot = 0;
	plci->vsprotdialect = 0;
	init_b1_config(plci);
	dbug(1, dprintf("get_plci(%x)", plci->Id));
	return i + 1;
}

/*------------------------------------------------------------------*/
/* put a parameter in the parameter buffer                          */
/*------------------------------------------------------------------*/

static void add_p(PLCI *plci, byte code, byte *p)
{
	word p_length;

	p_length = 0;
	if (p) p_length = p[0];
	add_ie(plci, code, p, p_length);
}

/*------------------------------------------------------------------*/
/* put a structure in the parameter buffer                          */
/*------------------------------------------------------------------*/
static void add_s(PLCI *plci, byte code, API_PARSE *p)
{
	if (p) add_ie(plci, code, p->info, (word)p->length);
}

/*------------------------------------------------------------------*/
/* put multiple structures in the parameter buffer                  */
/*------------------------------------------------------------------*/
static void add_ss(PLCI *plci, byte code, API_PARSE *p)
{
	byte i;

	if (p) {
		dbug(1, dprintf("add_ss(%x,len=%d)", code, p->length));
		for (i = 2; i < (byte)p->length; i += p->info[i] + 2) {
			dbug(1, dprintf("add_ss_ie(%x,len=%d)", p->info[i - 1], p->info[i]));
			add_ie(plci, p->info[i - 1], (byte *)&(p->info[i]), (word)p->info[i]);
		}
	}
}

/*------------------------------------------------------------------*/
/* return the channel number sent by the application in a esc_chi   */
/*------------------------------------------------------------------*/
static byte getChannel(API_PARSE *p)
{
	byte i;

	if (p) {
		for (i = 2; i < (byte)p->length; i += p->info[i] + 2) {
			if (p->info[i] == 2) {
				if (p->info[i - 1] == ESC && p->info[i + 1] == CHI) return (p->info[i + 2]);
			}
		}
	}
	return 0;
}


/*------------------------------------------------------------------*/
/* put an information element in the parameter buffer               */
/*------------------------------------------------------------------*/

static void add_ie(PLCI *plci, byte code, byte *p, word p_length)
{
	word i;

	if (!(code & 0x80) && !p_length) return;

	if (plci->req_in == plci->req_in_start) {
		plci->req_in += 2;
	}
	else {
		plci->req_in--;
	}
	plci->RBuffer[plci->req_in++] = code;

	if (p) {
		plci->RBuffer[plci->req_in++] = (byte)p_length;
		for (i = 0; i < p_length; i++) plci->RBuffer[plci->req_in++] = p[1 + i];
	}

	plci->RBuffer[plci->req_in++] = 0;
}

/*------------------------------------------------------------------*/
/* put a unstructured data into the buffer                          */
/*------------------------------------------------------------------*/

static void add_d(PLCI *plci, word length, byte *p)
{
	word i;

	if (plci->req_in == plci->req_in_start) {
		plci->req_in += 2;
	}
	else {
		plci->req_in--;
	}
	for (i = 0; i < length; i++) plci->RBuffer[plci->req_in++] = p[i];
}

/*------------------------------------------------------------------*/
/* put parameters from the Additional Info parameter in the         */
/* parameter buffer                                                 */
/*------------------------------------------------------------------*/

static void add_ai(PLCI *plci, API_PARSE *ai)
{
	word i;
	API_PARSE ai_parms[5];

	for (i = 0; i < 5; i++) ai_parms[i].length = 0;

	if (!ai->length)
		return;
	if (api_parse(&ai->info[1], (word)ai->length, "ssss", ai_parms))
		return;

	add_s(plci, KEY, &ai_parms[1]);
	add_s(plci, UUI, &ai_parms[2]);
	add_ss(plci, FTY, &ai_parms[3]);
}

/*------------------------------------------------------------------*/
/* put parameter for b1 protocol in the parameter buffer            */
/*------------------------------------------------------------------*/

static word add_b1(PLCI *plci, API_PARSE *bp, word b_channel_info,
		   word b1_facilities)
{
	API_PARSE bp_parms[8];
	API_PARSE mdm_cfg[9];
	API_PARSE global_config[2];
	byte cai[256];
	byte resource[] = {5, 9, 13, 12, 16, 39, 9, 17, 17, 18};
	byte voice_cai[] = "\x06\x14\x00\x00\x00\x00\x08";
	word i;

	API_PARSE mdm_cfg_v18[4];
	word j, n, w;
	dword d;


	for (i = 0; i < 8; i++) bp_parms[i].length = 0;
	for (i = 0; i < 2; i++) global_config[i].length = 0;

	dbug(1, dprintf("add_b1"));
	api_save_msg(bp, "s", &plci->B_protocol);

	if (b_channel_info == 2) {
		plci->B1_resource = 0;
		adjust_b1_facilities(plci, plci->B1_resource, b1_facilities);
		add_p(plci, CAI, "\x01\x00");
		dbug(1, dprintf("Cai=1,0 (no resource)"));
		return 0;
	}

	if (plci->tel == CODEC_PERMANENT) return 0;
	else if (plci->tel == CODEC) {
		plci->B1_resource = 1;
		adjust_b1_facilities(plci, plci->B1_resource, b1_facilities);
		add_p(plci, CAI, "\x01\x01");
		dbug(1, dprintf("Cai=1,1 (Codec)"));
		return 0;
	}
	else if (plci->tel == ADV_VOICE) {
		plci->B1_resource = add_b1_facilities(plci, 9, (word)(b1_facilities | B1_FACILITY_VOICE));
		adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities | B1_FACILITY_VOICE));
		voice_cai[1] = plci->B1_resource;
		PUT_WORD(&voice_cai[5], plci->appl->MaxDataLength);
		add_p(plci, CAI, voice_cai);
		dbug(1, dprintf("Cai=1,0x%x (AdvVoice)", voice_cai[1]));
		return 0;
	}
	plci->call_dir &= ~(CALL_DIR_ORIGINATE | CALL_DIR_ANSWER);
	if (plci->call_dir & CALL_DIR_OUT)
		plci->call_dir |= CALL_DIR_ORIGINATE;
	else if (plci->call_dir & CALL_DIR_IN)
		plci->call_dir |= CALL_DIR_ANSWER;

	if (!bp->length) {
		plci->B1_resource = 0x5;
		adjust_b1_facilities(plci, plci->B1_resource, b1_facilities);
		add_p(plci, CAI, "\x01\x05");
		return 0;
	}

	dbug(1, dprintf("b_prot_len=%d", (word)bp->length));
	if (bp->length > 256) return _WRONG_MESSAGE_FORMAT;
	if (api_parse(&bp->info[1], (word)bp->length, "wwwsssb", bp_parms))
	{
		bp_parms[6].length = 0;
		if (api_parse(&bp->info[1], (word)bp->length, "wwwsss", bp_parms))
		{
			dbug(1, dprintf("b-form.!"));
			return _WRONG_MESSAGE_FORMAT;
		}
	}
	else if (api_parse(&bp->info[1], (word)bp->length, "wwwssss", bp_parms))
	{
		dbug(1, dprintf("b-form.!"));
		return _WRONG_MESSAGE_FORMAT;
	}

	if (bp_parms[6].length)
	{
		if (api_parse(&bp_parms[6].info[1], (word)bp_parms[6].length, "w", global_config))
		{
			return _WRONG_MESSAGE_FORMAT;
		}
		switch (GET_WORD(global_config[0].info))
		{
		case 1:
			plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
			break;
		case 2:
			plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
			break;
		}
	}
	dbug(1, dprintf("call_dir=%04x", plci->call_dir));


	if ((GET_WORD(bp_parms[0].info) == B1_RTP)
	    && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
	{
		plci->B1_resource = add_b1_facilities(plci, 31, (word)(b1_facilities & ~B1_FACILITY_VOICE));
		adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
		cai[1] = plci->B1_resource;
		cai[2] = 0;
		cai[3] = 0;
		cai[4] = 0;
		PUT_WORD(&cai[5], plci->appl->MaxDataLength);
		for (i = 0; i < bp_parms[3].length; i++)
			cai[7 + i] = bp_parms[3].info[1 + i];
		cai[0] = 6 + bp_parms[3].length;
		add_p(plci, CAI, cai);
		return 0;
	}


	if ((GET_WORD(bp_parms[0].info) == B1_PIAFS)
	    && (plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))
	{
		plci->B1_resource = add_b1_facilities(plci, 35/* PIAFS HARDWARE FACILITY */, (word)(b1_facilities & ~B1_FACILITY_VOICE));
		adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
		cai[1] = plci->B1_resource;
		cai[2] = 0;
		cai[3] = 0;
		cai[4] = 0;
		PUT_WORD(&cai[5], plci->appl->MaxDataLength);
		cai[0] = 6;
		add_p(plci, CAI, cai);
		return 0;
	}


	if ((GET_WORD(bp_parms[0].info) >= 32)
	    || (!((1L << GET_WORD(bp_parms[0].info)) & plci->adapter->profile.B1_Protocols)
		&& ((GET_WORD(bp_parms[0].info) != 3)
		    || !((1L << B1_HDLC) & plci->adapter->profile.B1_Protocols)
		    || ((bp_parms[3].length != 0) && (GET_WORD(&bp_parms[3].info[1]) != 0) && (GET_WORD(&bp_parms[3].info[1]) != 56000)))))
	{
		return _B1_NOT_SUPPORTED;
	}
	plci->B1_resource = add_b1_facilities(plci, resource[GET_WORD(bp_parms[0].info)],
					      (word)(b1_facilities & ~B1_FACILITY_VOICE));
	adjust_b1_facilities(plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
	cai[0] = 6;
	cai[1] = plci->B1_resource;
	for (i = 2; i < sizeof(cai); i++) cai[i] = 0;

	if ((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
	    || (GET_WORD(bp_parms[0].info) == B1_MODEM_ASYNC)
	    || (GET_WORD(bp_parms[0].info) == B1_MODEM_SYNC_HDLC))
	{ /* B1 - modem */
		for (i = 0; i < 7; i++) mdm_cfg[i].length = 0;

		if (bp_parms[3].length)
		{
			if (api_parse(&bp_parms[3].info[1], (word)bp_parms[3].length, "wwwwww", mdm_cfg))
			{
				return (_WRONG_MESSAGE_FORMAT);
			}

			cai[2] = 0; /* Bit rate for adaptation */

			dbug(1, dprintf("MDM Max Bit Rate:<%d>", GET_WORD(mdm_cfg[0].info)));

			PUT_WORD(&cai[13], 0);                          /* Min Tx speed */
			PUT_WORD(&cai[15], GET_WORD(mdm_cfg[0].info)); /* Max Tx speed */
			PUT_WORD(&cai[17], 0);                          /* Min Rx speed */
			PUT_WORD(&cai[19], GET_WORD(mdm_cfg[0].info)); /* Max Rx speed */

			cai[3] = 0; /* Async framing parameters */
			switch (GET_WORD(mdm_cfg[2].info))
			{       /* Parity     */
			case 1: /* odd parity */
				cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_ODD);
				dbug(1, dprintf("MDM: odd parity"));
				break;

			case 2: /* even parity */
				cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_EVEN);
				dbug(1, dprintf("MDM: even parity"));
				break;

			default:
				dbug(1, dprintf("MDM: no parity"));
				break;
			}

			switch (GET_WORD(mdm_cfg[3].info))
			{       /* stop bits   */
			case 1: /* 2 stop bits */
				cai[3] |= DSP_CAI_ASYNC_TWO_STOP_BITS;
				dbug(1, dprintf("MDM: 2 stop bits"));
				break;

			default:
				dbug(1, dprintf("MDM: 1 stop bit"));
				break;
			}

			switch (GET_WORD(mdm_cfg[1].info))
			{     /* char length */
			case 5:
				cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_5;
				dbug(1, dprintf("MDM: 5 bits"));
				break;

			case 6:
				cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_6;
				dbug(1, dprintf("MDM: 6 bits"));
				break;

			case 7:
				cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_7;
				dbug(1, dprintf("MDM: 7 bits"));
				break;

			default:
				dbug(1, dprintf("MDM: 8 bits"));
				break;
			}

			cai[7] = 0; /* Line taking options */
			cai[8] = 0; /* Modulation negotiation options */
			cai[9] = 0; /* Modulation options */

			if (((plci->call_dir & CALL_DIR_ORIGINATE) != 0) ^ ((plci->call_dir & CALL_DIR_OUT) != 0))
			{
				cai[9] |= DSP_CAI_MODEM_REVERSE_DIRECTION;
				dbug(1, dprintf("MDM: Reverse direction"));
			}

			if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_DISABLE_RETRAIN)
			{
				cai[9] |= DSP_CAI_MODEM_DISABLE_RETRAIN;
				dbug(1, dprintf("MDM: Disable retrain"));
			}

			if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_DISABLE_RING_TONE)
			{
				cai[7] |= DSP_CAI_MODEM_DISABLE_CALLING_TONE | DSP_CAI_MODEM_DISABLE_ANSWER_TONE;
				dbug(1, dprintf("MDM: Disable ring tone"));
			}

			if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_GUARD_1800)
			{
				cai[8] |= DSP_CAI_MODEM_GUARD_TONE_1800HZ;
				dbug(1, dprintf("MDM: 1800 guard tone"));
			}
			else if (GET_WORD(mdm_cfg[4].info) & MDM_CAPI_GUARD_550)
			{
				cai[8] |= DSP_CAI_MODEM_GUARD_TONE_550HZ;
				dbug(1, dprintf("MDM: 550 guard tone"));
			}

			if ((GET_WORD(mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_V100)
			{
				cai[8] |= DSP_CAI_MODEM_NEGOTIATE_V100;
				dbug(1, dprintf("MDM: V100"));
			}
			else if ((GET_WORD(mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_MOD_CLASS)
			{
				cai[8] |= DSP_CAI_MODEM_NEGOTIATE_IN_CLASS;
				dbug(1, dprintf("MDM: IN CLASS"));
			}
			else if ((GET_WORD(mdm_cfg[5].info) & 0x00ff) == MDM_CAPI_NEG_DISABLED)
			{
				cai[8] |= DSP_CAI_MODEM_NEGOTIATE_DISABLED;
				dbug(1, dprintf("MDM: DISABLED"));
			}
			cai[0] = 20;

			if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_V18))
			    && (GET_WORD(mdm_cfg[5].info) & 0x8000)) /* Private V.18 enable */
			{
				plci->requested_options |= 1L << PRIVATE_V18;
			}
			if (GET_WORD(mdm_cfg[5].info) & 0x4000) /* Private VOWN enable */
				plci->requested_options |= 1L << PRIVATE_VOWN;

			if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
			    & ((1L << PRIVATE_V18) | (1L << PRIVATE_VOWN)))
			{
				if (!api_parse(&bp_parms[3].info[1], (word)bp_parms[3].length, "wwwwwws", mdm_cfg))
				{
					i = 27;
					if (mdm_cfg[6].length >= 4)
					{
						d = GET_DWORD(&mdm_cfg[6].info[1]);
						cai[7] |= (byte) d;          /* line taking options */
						cai[9] |= (byte)(d >> 8);    /* modulation options */
						cai[++i] = (byte)(d >> 16);  /* vown modulation options */
						cai[++i] = (byte)(d >> 24);
						if (mdm_cfg[6].length >= 8)
						{
							d = GET_DWORD(&mdm_cfg[6].info[5]);
							cai[10] |= (byte) d;        /* disabled modulations mask */
							cai[11] |= (byte)(d >> 8);
							if (mdm_cfg[6].length >= 12)
							{
								d = GET_DWORD(&mdm_cfg[6].info[9]);
								cai[12] = (byte) d;          /* enabled modulations mask */
								cai[++i] = (byte)(d >> 8);   /* vown enabled modulations */
								cai[++i] = (byte)(d >> 16);
								cai[++i] = (byte)(d >> 24);
								cai[++i] = 0;
								if (mdm_cfg[6].length >= 14)
								{
									w = GET_WORD(&mdm_cfg[6].info[13]);
									if (w != 0)
										PUT_WORD(&cai[13], w);  /* min tx speed */
									if (mdm_cfg[6].length >= 16)
									{
										w = GET_WORD(&mdm_cfg[6].info[15]);
										if (w != 0)
											PUT_WORD(&cai[15], w);  /* max tx speed */
										if (mdm_cfg[6].length >= 18)
										{
											w = GET_WORD(&mdm_cfg[6].info[17]);
											if (w != 0)
												PUT_WORD(&cai[17], w);  /* min rx speed */
											if (mdm_cfg[6].length >= 20)
											{
												w = GET_WORD(&mdm_cfg[6].info[19]);
												if (w != 0)
													PUT_WORD(&cai[19], w);  /* max rx speed */
												if (mdm_cfg[6].length >= 22)
												{
													w = GET_WORD(&mdm_cfg[6].info[21]);
													cai[23] = (byte)(-((short) w));  /* transmit level */
													if (mdm_cfg[6].length >= 24)
													{
														w = GET_WORD(&mdm_cfg[6].info[23]);
														cai[22] |= (byte) w;        /* info options mask */
														cai[21] |= (byte)(w >> 8);  /* disabled symbol rates */
													}
												}
											}
										}
									}
								}
							}
						}
					}
					cai[27] = i - 27;
					i++;
					if (!api_parse(&bp_parms[3].info[1], (word)bp_parms[3].length, "wwwwwwss", mdm_cfg))
					{
						if (!api_parse(&mdm_cfg[7].info[1], (word)mdm_cfg[7].length, "sss", mdm_cfg_v18))
						{
							for (n = 0; n < 3; n++)
							{
								cai[i] = (byte)(mdm_cfg_v18[n].length);
								for (j = 1; j < ((word)(cai[i] + 1)); j++)
									cai[i + j] = mdm_cfg_v18[n].info[j];
								i += cai[i] + 1;
							}
						}
					}
					cai[0] = (byte)(i - 1);
				}
			}

		}
	}
	if (GET_WORD(bp_parms[0].info) == 2 ||                         /* V.110 async */
	    GET_WORD(bp_parms[0].info) == 3)                           /* V.110 sync */
	{
		if (bp_parms[3].length) {
			dbug(1, dprintf("V.110,%d", GET_WORD(&bp_parms[3].info[1])));
			switch (GET_WORD(&bp_parms[3].info[1])) {                 /* Rate */
			case 0:
			case 56000:
				if (GET_WORD(bp_parms[0].info) == 3) {                  /* V.110 sync 56k */
					dbug(1, dprintf("56k sync HSCX"));
					cai[1] = 8;
					cai[2] = 0;
					cai[3] = 0;
				}
				else if (GET_WORD(bp_parms[0].info) == 2) {
					dbug(1, dprintf("56k async DSP"));
					cai[2] = 9;
				}
				break;
			case 50:     cai[2] = 1;  break;
			case 75:     cai[2] = 1;  break;
			case 110:    cai[2] = 1;  break;
			case 150:    cai[2] = 1;  break;
			case 200:    cai[2] = 1;  break;
			case 300:    cai[2] = 1;  break;
			case 600:    cai[2] = 1;  break;
			case 1200:   cai[2] = 2;  break;
			case 2400:   cai[2] = 3;  break;
			case 4800:   cai[2] = 4;  break;
			case 7200:   cai[2] = 10; break;
			case 9600:   cai[2] = 5;  break;
			case 12000:  cai[2] = 13; break;
			case 24000:  cai[2] = 0;  break;
			case 14400:  cai[2] = 11; break;
			case 19200:  cai[2] = 6;  break;
			case 28800:  cai[2] = 12; break;
			case 38400:  cai[2] = 7;  break;
			case 48000:  cai[2] = 8;  break;
			case 76:     cai[2] = 15; break;  /* 75/1200     */
			case 1201:   cai[2] = 14; break;  /* 1200/75     */
			case 56001:  cai[2] = 9;  break;  /* V.110 56000 */

			default:
				return _B1_PARM_NOT_SUPPORTED;
			}
			cai[3] = 0;
			if (cai[1] == 13)                                        /* v.110 async */
			{
				if (bp_parms[3].length >= 8)
				{
					switch (GET_WORD(&bp_parms[3].info[3]))
					{       /* char length */
					case 5:
						cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_5;
						break;
					case 6:
						cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_6;
						break;
					case 7:
						cai[3] |= DSP_CAI_ASYNC_CHAR_LENGTH_7;
						break;
					}
					switch (GET_WORD(&bp_parms[3].info[5]))
					{       /* Parity     */
					case 1: /* odd parity */
						cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_ODD);
						break;
					case 2: /* even parity */
						cai[3] |= (DSP_CAI_ASYNC_PARITY_ENABLE | DSP_CAI_ASYNC_PARITY_EVEN);
						break;
					}
					switch (GET_WORD(&bp_parms[3].info[7]))
					{       /* stop bits   */
					case 1: /* 2 stop bits */
						cai[3] |= DSP_CAI_ASYNC_TWO_STOP_BITS;
						break;
					}
				}
			}
		}
		else if (cai[1] == 8 || GET_WORD(bp_parms[0].info) == 3) {
			dbug(1, dprintf("V.110 default 56k sync"));
			cai[1] = 8;
			cai[2] = 0;
			cai[3] = 0;
		}
		else {
			dbug(1, dprintf("V.110 default 9600 async"));
			cai[2] = 5;
		}
	}
	PUT_WORD(&cai[5], plci->appl->MaxDataLength);
	dbug(1, dprintf("CAI[%d]=%x,%x,%x,%x,%x,%x", cai[0], cai[1], cai[2], cai[3], cai[4], cai[5], cai[6]));
/* HexDump ("CAI", sizeof(cai), &cai[0]); */

	add_p(plci, CAI, cai);
	return 0;
}

/*------------------------------------------------------------------*/
/* put parameter for b2 and B3  protocol in the parameter buffer    */
/*------------------------------------------------------------------*/

static word add_b23(PLCI *plci, API_PARSE *bp)
{
	word i, fax_control_bits;
	byte pos, len;
	byte SAPI = 0x40;  /* default SAPI 16 for x.31 */
	API_PARSE bp_parms[8];
	API_PARSE *b1_config;
	API_PARSE *b2_config;
	API_PARSE b2_config_parms[8];
	API_PARSE *b3_config;
	API_PARSE b3_config_parms[6];
	API_PARSE global_config[2];

	static byte llc[3] = {2,0,0};
	static byte dlc[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	static byte nlc[256];
	static byte lli[12] = {1,1};

	const byte llc2_out[] = {1,2,4,6,2,0,0,0, X75_V42BIS,V120_L2,V120_V42BIS,V120_L2,6};
	const byte llc2_in[]  = {1,3,4,6,3,0,0,0, X75_V42BIS,V120_L2,V120_V42BIS,V120_L2,6};

	const byte llc3[] = {4,3,2,2,6,6,0};
	const byte header[] = {0,2,3,3,0,0,0};

	for (i = 0; i < 8; i++) bp_parms[i].length = 0;
	for (i = 0; i < 6; i++) b2_config_parms[i].length = 0;
	for (i = 0; i < 5; i++) b3_config_parms[i].length = 0;

	lli[0] = 1;
	lli[1] = 1;
	if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
		lli[1] |= 2;
	if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
		lli[1] |= 4;

	if ((lli[1] & 0x02) && (diva_xdi_extended_features & DIVA_CAPI_USE_CMA)) {
		lli[1] |= 0x10;
		if (plci->rx_dma_descriptor <= 0) {
			plci->rx_dma_descriptor = diva_get_dma_descriptor(plci, &plci->rx_dma_magic);
			if (plci->rx_dma_descriptor >= 0)
				plci->rx_dma_descriptor++;
		}
		if (plci->rx_dma_descriptor > 0) {
			lli[0] = 6;
			lli[1] |= 0x40;
			lli[2] = (byte)(plci->rx_dma_descriptor - 1);
			lli[3] = (byte)plci->rx_dma_magic;
			lli[4] = (byte)(plci->rx_dma_magic >>  8);
			lli[5] = (byte)(plci->rx_dma_magic >> 16);
			lli[6] = (byte)(plci->rx_dma_magic >> 24);
		}
	}

	if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
		lli[1] |= 0x20;
	}

	dbug(1, dprintf("add_b23"));
	api_save_msg(bp, "s", &plci->B_protocol);

	if (!bp->length && plci->tel)
	{
		plci->adv_nl = true;
		dbug(1, dprintf("Default adv.Nl"));
		add_p(plci, LLI, lli);
		plci->B2_prot = 1 /*XPARENT*/;
		plci->B3_prot = 0 /*XPARENT*/;
		llc[1] = 2;
		llc[2] = 4;
		add_p(plci, LLC, llc);
		dlc[0] = 2;
		PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
		add_p(plci, DLC, dlc);
		return 0;
	}

	if (!bp->length) /*default*/
	{
		dbug(1, dprintf("ret default"));
		add_p(plci, LLI, lli);
		plci->B2_prot = 0 /*X.75   */;
		plci->B3_prot = 0 /*XPARENT*/;
		llc[1] = 1;
		llc[2] = 4;
		add_p(plci, LLC, llc);
		dlc[0] = 2;
		PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
		add_p(plci, DLC, dlc);
		return 0;
	}
	dbug(1, dprintf("b_prot_len=%d", (word)bp->length));
	if ((word)bp->length > 256)    return _WRONG_MESSAGE_FORMAT;

	if (api_parse(&bp->info[1], (word)bp->length, "wwwsssb", bp_parms))
	{
		bp_parms[6].length = 0;
		if (api_parse(&bp->info[1], (word)bp->length, "wwwsss", bp_parms))
		{
			dbug(1, dprintf("b-form.!"));
			return _WRONG_MESSAGE_FORMAT;
		}
	}
	else if (api_parse(&bp->info[1], (word)bp->length, "wwwssss", bp_parms))
	{
		dbug(1, dprintf("b-form.!"));
		return _WRONG_MESSAGE_FORMAT;
	}

	if (plci->tel == ADV_VOICE) /* transparent B on advanced voice */
	{
		if (GET_WORD(bp_parms[1].info) != 1
		    || GET_WORD(bp_parms[2].info) != 0) return _B2_NOT_SUPPORTED;
		plci->adv_nl = true;
	}
	else if (plci->tel) return _B2_NOT_SUPPORTED;


	if ((GET_WORD(bp_parms[1].info) == B2_RTP)
	    && (GET_WORD(bp_parms[2].info) == B3_RTP)
	    && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
	{
		add_p(plci, LLI, lli);
		plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
		plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
		llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ? 14 : 13;
		llc[2] = 4;
		add_p(plci, LLC, llc);
		dlc[0] = 2;
		PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
		dlc[3] = 3; /* Addr A */
		dlc[4] = 1; /* Addr B */
		dlc[5] = 7; /* modulo mode */
		dlc[6] = 7; /* window size */
		dlc[7] = 0; /* XID len Lo  */
		dlc[8] = 0; /* XID len Hi  */
		for (i = 0; i < bp_parms[4].length; i++)
			dlc[9 + i] = bp_parms[4].info[1 + i];
		dlc[0] = (byte)(8 + bp_parms[4].length);
		add_p(plci, DLC, dlc);
		for (i = 0; i < bp_parms[5].length; i++)
			nlc[1 + i] = bp_parms[5].info[1 + i];
		nlc[0] = (byte)(bp_parms[5].length);
		add_p(plci, NLC, nlc);
		return 0;
	}



	if ((GET_WORD(bp_parms[1].info) >= 32)
	    || (!((1L << GET_WORD(bp_parms[1].info)) & plci->adapter->profile.B2_Protocols)
		&& ((GET_WORD(bp_parms[1].info) != B2_PIAFS)
		    || !(plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))))

	{
		return _B2_NOT_SUPPORTED;
	}
	if ((GET_WORD(bp_parms[2].info) >= 32)
	    || !((1L << GET_WORD(bp_parms[2].info)) & plci->adapter->profile.B3_Protocols))
	{
		return _B3_NOT_SUPPORTED;
	}
	if ((GET_WORD(bp_parms[1].info) != B2_SDLC)
	    && ((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
		|| (GET_WORD(bp_parms[0].info) == B1_MODEM_ASYNC)
		|| (GET_WORD(bp_parms[0].info) == B1_MODEM_SYNC_HDLC)))
	{
		return (add_modem_b23(plci, bp_parms));
	}

	add_p(plci, LLI, lli);

	plci->B2_prot = (byte)GET_WORD(bp_parms[1].info);
	plci->B3_prot = (byte)GET_WORD(bp_parms[2].info);
	if (plci->B2_prot == 12) SAPI = 0; /* default SAPI D-channel */

	if (bp_parms[6].length)
	{
		if (api_parse(&bp_parms[6].info[1], (word)bp_parms[6].length, "w", global_config))
		{
			return _WRONG_MESSAGE_FORMAT;
		}
		switch (GET_WORD(global_config[0].info))
		{
		case 1:
			plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
			break;
		case 2:
			plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
			break;
		}
	}
	dbug(1, dprintf("call_dir=%04x", plci->call_dir));


	if (plci->B2_prot == B2_PIAFS)
		llc[1] = PIAFS_CRC;
	else
/* IMPLEMENT_PIAFS */
	{
		llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
			llc2_out[GET_WORD(bp_parms[1].info)] : llc2_in[GET_WORD(bp_parms[1].info)];
	}
	llc[2] = llc3[GET_WORD(bp_parms[2].info)];

	add_p(plci, LLC, llc);

	dlc[0] = 2;
	PUT_WORD(&dlc[1], plci->appl->MaxDataLength +
		 header[GET_WORD(bp_parms[2].info)]);

	b1_config = &bp_parms[3];
	nlc[0] = 0;
	if (plci->B3_prot == 4
	    || plci->B3_prot == 5)
	{
		for (i = 0; i < sizeof(T30_INFO); i++) nlc[i] = 0;
		nlc[0] = sizeof(T30_INFO);
		if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
			((T30_INFO *)&nlc[1])->operating_mode = T30_OPERATING_MODE_CAPI;
		((T30_INFO *)&nlc[1])->rate_div_2400 = 0xff;
		if (b1_config->length >= 2)
		{
			((T30_INFO *)&nlc[1])->rate_div_2400 = (byte)(GET_WORD(&b1_config->info[1]) / 2400);
		}
	}
	b2_config = &bp_parms[4];


	if (llc[1] == PIAFS_CRC)
	{
		if (plci->B3_prot != B3_TRANSPARENT)
		{
			return _B_STACK_NOT_SUPPORTED;
		}
		if (b2_config->length && api_parse(&b2_config->info[1], (word)b2_config->length, "bwww", b2_config_parms)) {
			return _WRONG_MESSAGE_FORMAT;
		}
		PUT_WORD(&dlc[1], plci->appl->MaxDataLength);
		dlc[3] = 0; /* Addr A */
		dlc[4] = 0; /* Addr B */
		dlc[5] = 0; /* modulo mode */
		dlc[6] = 0; /* window size */
		if (b2_config->length >= 7) {
			dlc[7] = 7;
			dlc[8] = 0;
			dlc[9] = b2_config_parms[0].info[0]; /* PIAFS protocol Speed configuration */
			dlc[10] = b2_config_parms[1].info[0]; /* V.42bis P0 */
			dlc[11] = b2_config_parms[1].info[1]; /* V.42bis P0 */
			dlc[12] = b2_config_parms[2].info[0]; /* V.42bis P1 */
			dlc[13] = b2_config_parms[2].info[1]; /* V.42bis P1 */
			dlc[14] = b2_config_parms[3].info[0]; /* V.42bis P2 */
			dlc[15] = b2_config_parms[3].info[1]; /* V.42bis P2 */
			dlc[0] = 15;
			if (b2_config->length >= 8) { /* PIAFS control abilities */
				dlc[7] = 10;
				dlc[16] = 2; /* Length of PIAFS extension */
				dlc[17] = PIAFS_UDATA_ABILITIES; /* control (UDATA) ability */
				dlc[18] = b2_config_parms[4].info[0]; /* value */
				dlc[0] = 18;
			}
		}
		else /* default values, 64K, variable, no compression */
		{
			dlc[7] = 7;
			dlc[8] = 0;
			dlc[9] = 0x03; /* PIAFS protocol Speed configuration */
			dlc[10] = 0x03; /* V.42bis P0 */
			dlc[11] = 0;    /* V.42bis P0 */
			dlc[12] = 0;    /* V.42bis P1 */
			dlc[13] = 0;    /* V.42bis P1 */
			dlc[14] = 0;    /* V.42bis P2 */
			dlc[15] = 0;    /* V.42bis P2 */
			dlc[0] = 15;
		}
		add_p(plci, DLC, dlc);
	}
	else

		if ((llc[1] == V120_L2) || (llc[1] == V120_V42BIS))
		{
			if (plci->B3_prot != B3_TRANSPARENT)
				return _B_STACK_NOT_SUPPORTED;

			dlc[0] = 6;
			PUT_WORD(&dlc[1], GET_WORD(&dlc[1]) + 2);
			dlc[3] = 0x08;
			dlc[4] = 0x01;
			dlc[5] = 127;
			dlc[6] = 7;
			if (b2_config->length != 0)
			{
				if ((llc[1] == V120_V42BIS) && api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbwww", b2_config_parms)) {
					return _WRONG_MESSAGE_FORMAT;
				}
				dlc[3] = (byte)((b2_config->info[2] << 3) | ((b2_config->info[1] >> 5) & 0x04));
				dlc[4] = (byte)((b2_config->info[1] << 1) | 0x01);
				if (b2_config->info[3] != 128)
				{
					dbug(1, dprintf("1D-dlc= %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
					return _B2_PARM_NOT_SUPPORTED;
				}
				dlc[5] = (byte)(b2_config->info[3] - 1);
				dlc[6] = b2_config->info[4];
				if (llc[1] == V120_V42BIS) {
					if (b2_config->length >= 10) {
						dlc[7] = 6;
						dlc[8] = 0;
						dlc[9] = b2_config_parms[4].info[0];
						dlc[10] = b2_config_parms[4].info[1];
						dlc[11] = b2_config_parms[5].info[0];
						dlc[12] = b2_config_parms[5].info[1];
						dlc[13] = b2_config_parms[6].info[0];
						dlc[14] = b2_config_parms[6].info[1];
						dlc[0] = 14;
						dbug(1, dprintf("b2_config_parms[4].info[0] [1]:  %x %x", b2_config_parms[4].info[0], b2_config_parms[4].info[1]));
						dbug(1, dprintf("b2_config_parms[5].info[0] [1]:  %x %x", b2_config_parms[5].info[0], b2_config_parms[5].info[1]));
						dbug(1, dprintf("b2_config_parms[6].info[0] [1]:  %x %x", b2_config_parms[6].info[0], b2_config_parms[6].info[1]));
					}
					else {
						dlc[6] = 14;
					}
				}
			}
		}
		else
		{
			if (b2_config->length)
			{
				dbug(1, dprintf("B2-Config"));
				if (llc[1] == X75_V42BIS) {
					if (api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbwww", b2_config_parms))
					{
						return _WRONG_MESSAGE_FORMAT;
					}
				}
				else {
					if (api_parse(&b2_config->info[1], (word)b2_config->length, "bbbbs", b2_config_parms))
					{
						return _WRONG_MESSAGE_FORMAT;
					}
				}
				/* if B2 Protocol is LAPD, b2_config structure is different */
				if (llc[1] == 6)
				{
					dlc[0] = 4;
					if (b2_config->length >= 1) dlc[2] = b2_config->info[1];      /* TEI */
					else dlc[2] = 0x01;
					if ((b2_config->length >= 2) && (plci->B2_prot == 12))
					{
						SAPI = b2_config->info[2];    /* SAPI */
					}
					dlc[1] = SAPI;
					if ((b2_config->length >= 3) && (b2_config->info[3] == 128))
					{
						dlc[3] = 127;      /* Mode */
					}
					else
					{
						dlc[3] = 7;        /* Mode */
					}

					if (b2_config->length >= 4) dlc[4] = b2_config->info[4];      /* Window */
					else dlc[4] = 1;
					dbug(1, dprintf("D-dlc[%d]=%x,%x,%x,%x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
					if (b2_config->length > 5) return _B2_PARM_NOT_SUPPORTED;
				}
				else
				{
					dlc[0] = (byte)(b2_config_parms[4].length + 6);
					dlc[3] = b2_config->info[1];
					dlc[4] = b2_config->info[2];
					if (b2_config->info[3] != 8 && b2_config->info[3] != 128) {
						dbug(1, dprintf("1D-dlc= %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4]));
						return _B2_PARM_NOT_SUPPORTED;
					}

					dlc[5] = (byte)(b2_config->info[3] - 1);
					dlc[6] = b2_config->info[4];
					if (dlc[6] > dlc[5]) {
						dbug(1, dprintf("2D-dlc= %x %x %x %x %x %x %x", dlc[0], dlc[1], dlc[2], dlc[3], dlc[4], dlc[5], dlc[6]));
						return _B2_PARM_NOT_SUPPORTED;
					}

					if (llc[1] == X75_V42BIS) {
						if (b2_config->length >= 10) {
							dlc[7] = 6;
							dlc[8] = 0;
							dlc[9] = b2_config_parms[4].info[0];
							dlc[10] = b2_config_parms[4].info[1];
							dlc[11] = b2_config_parms[5].info[0];
							dlc[12] = b2_config_parms[5].info[1];
							dlc[13] = b2_config_parms[6].info[0];
							dlc[14] = b2_config_parms[6].info[1];
							dlc[0] = 14;
							dbug(1, dprintf("b2_config_parms[4].info[0] [1]:  %x %x", b2_config_parms[4].info[0], b2_config_parms[4].info[1]));
							dbug(1, dprintf("b2_config_parms[5].info[0] [1]:  %x %x", b2_config_parms[5].info[0], b2_config_parms[5].info[1]));
							dbug(1, dprintf("b2_config_parms[6].info[0] [1]:  %x %x", b2_config_parms[6].info[0], b2_config_parms[6].info[1]));
						}
						else {
							dlc[6] = 14;
						}

					}
					else {
						PUT_WORD(&dlc[7], (word)b2_config_parms[4].length);
						for (i = 0; i < b2_config_parms[4].length; i++)
							dlc[11 + i] = b2_config_parms[4].info[1 + i];
					}
				}
			}
		}
	add_p(plci, DLC, dlc);

	b3_config = &bp_parms[5];
	if (b3_config->length)
	{
		if (plci->B3_prot == 4
		    || plci->B3_prot == 5)
		{
			if (api_parse(&b3_config->info[1], (word)b3_config->length, "wwss", b3_config_parms))
			{
				return _WRONG_MESSAGE_FORMAT;
			}
			i = GET_WORD((byte *)(b3_config_parms[0].info));
			((T30_INFO *)&nlc[1])->resolution = (byte)(((i & 0x0001) ||
								    ((plci->B3_prot == 4) && (((byte)(GET_WORD((byte *)b3_config_parms[1].info))) != 5))) ? T30_RESOLUTION_R8_0770_OR_200 : 0);
			((T30_INFO *)&nlc[1])->data_format = (byte)(GET_WORD((byte *)b3_config_parms[1].info));
			fax_control_bits = T30_CONTROL_BIT_ALL_FEATURES;
			if ((((T30_INFO *)&nlc[1])->rate_div_2400 != 0) && (((T30_INFO *)&nlc[1])->rate_div_2400 <= 6))
				fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_V34FAX;
			if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
			{

				if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
				    & (1L << PRIVATE_FAX_PAPER_FORMATS))
				{
					((T30_INFO *)&nlc[1])->resolution |= T30_RESOLUTION_R8_1540 |
						T30_RESOLUTION_R16_1540_OR_400 | T30_RESOLUTION_300_300 |
						T30_RESOLUTION_INCH_BASED | T30_RESOLUTION_METRIC_BASED;
				}

				((T30_INFO *)&nlc[1])->recording_properties =
					T30_RECORDING_WIDTH_ISO_A3 |
					(T30_RECORDING_LENGTH_UNLIMITED << 2) |
					(T30_MIN_SCANLINE_TIME_00_00_00 << 4);
			}
			if (plci->B3_prot == 5)
			{
				if (i & 0x0002) /* Accept incoming fax-polling requests */
					fax_control_bits |= T30_CONTROL_BIT_ACCEPT_POLLING;
				if (i & 0x2000) /* Do not use MR compression */
					fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_2D_CODING;
				if (i & 0x4000) /* Do not use MMR compression */
					fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_T6_CODING;
				if (i & 0x8000) /* Do not use ECM */
					fax_control_bits &= ~T30_CONTROL_BIT_ENABLE_ECM;
				if (plci->fax_connect_info_length != 0)
				{
					((T30_INFO *)&nlc[1])->resolution = ((T30_INFO *)plci->fax_connect_info_buffer)->resolution;
					((T30_INFO *)&nlc[1])->data_format = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
					((T30_INFO *)&nlc[1])->recording_properties = ((T30_INFO *)plci->fax_connect_info_buffer)->recording_properties;
					fax_control_bits |= GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) &
						(T30_CONTROL_BIT_REQUEST_POLLING | T30_CONTROL_BIT_MORE_DOCUMENTS);
				}
			}
			/* copy station id to NLC */
			for (i = 0; i < T30_MAX_STATION_ID_LENGTH; i++)
			{
				if (i < b3_config_parms[2].length)
				{
					((T30_INFO *)&nlc[1])->station_id[i] = ((byte *)b3_config_parms[2].info)[1 + i];
				}
				else
				{
					((T30_INFO *)&nlc[1])->station_id[i] = ' ';
				}
			}
			((T30_INFO *)&nlc[1])->station_id_len = T30_MAX_STATION_ID_LENGTH;
			/* copy head line to NLC */
			if (b3_config_parms[3].length)
			{

				pos = (byte)(fax_head_line_time(&(((T30_INFO *)&nlc[1])->station_id[T30_MAX_STATION_ID_LENGTH])));
				if (pos != 0)
				{
					if (CAPI_MAX_DATE_TIME_LENGTH + 2 + b3_config_parms[3].length > CAPI_MAX_HEAD_LINE_SPACE)
						pos = 0;
					else
					{
						nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
						nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
						len = (byte)b3_config_parms[2].length;
						if (len > 20)
							len = 20;
						if (CAPI_MAX_DATE_TIME_LENGTH + 2 + len + 2 + b3_config_parms[3].length <= CAPI_MAX_HEAD_LINE_SPACE)
						{
							for (i = 0; i < len; i++)
								nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ((byte *)b3_config_parms[2].info)[1 + i];
							nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
							nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' ';
						}
					}
				}

				len = (byte)b3_config_parms[3].length;
				if (len > CAPI_MAX_HEAD_LINE_SPACE - pos)
					len = (byte)(CAPI_MAX_HEAD_LINE_SPACE - pos);
				((T30_INFO *)&nlc[1])->head_line_len = (byte)(pos + len);
				nlc[0] += (byte)(pos + len);
				for (i = 0; i < len; i++)
					nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] =  ((byte *)b3_config_parms[3].info)[1 + i];
			} else
				((T30_INFO *)&nlc[1])->head_line_len = 0;

			plci->nsf_control_bits = 0;
			if (plci->B3_prot == 5)
			{
				if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
				    && (GET_WORD((byte *)b3_config_parms[1].info) & 0x8000)) /* Private SUB/SEP/PWD enable */
				{
					plci->requested_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;
				}
				if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
				    && (GET_WORD((byte *)b3_config_parms[1].info) & 0x4000)) /* Private non-standard facilities enable */
				{
					plci->requested_options |= 1L << PRIVATE_FAX_NONSTANDARD;
				}
				if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
				    & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD)))
				{
					if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
					    & (1L << PRIVATE_FAX_SUB_SEP_PWD))
					{
						fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SUBADDRESS | T30_CONTROL_BIT_ACCEPT_PASSWORD;
						if (fax_control_bits & T30_CONTROL_BIT_ACCEPT_POLLING)
							fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING;
					}
					len = nlc[0];
					pos = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
					if (pos < plci->fax_connect_info_length)
					{
						for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
							nlc[++len] = plci->fax_connect_info_buffer[pos++];
					}
					else
						nlc[++len] = 0;
					if (pos < plci->fax_connect_info_length)
					{
						for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
							nlc[++len] = plci->fax_connect_info_buffer[pos++];
					}
					else
						nlc[++len] = 0;
					if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id - 1])
					    & (1L << PRIVATE_FAX_NONSTANDARD))
					{
						if ((pos < plci->fax_connect_info_length) && (plci->fax_connect_info_buffer[pos] != 0))
						{
							if ((plci->fax_connect_info_buffer[pos] >= 3) && (plci->fax_connect_info_buffer[pos + 1] >= 2))
								plci->nsf_control_bits = GET_WORD(&plci->fax_connect_info_buffer[pos + 2]);
							for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
								nlc[++len] = plci->fax_connect_info_buffer[pos++];
						}
						else
						{
							if (api_parse(&b3_config->info[1], (word)b3_config->length, "wwsss", b3_config_parms))
							{
								dbug(1, dprintf("non-standard facilities info missing or wrong format"));
								nlc[++len] = 0;
							}
							else
							{
								if ((b3_config_parms[4].length >= 3) && (b3_config_parms[4].info[1] >= 2))
									plci->nsf_control_bits = GET_WORD(&b3_config_parms[4].info[2]);
								nlc[++len] = (byte)(b3_config_parms[4].length);
								for (i = 0; i < b3_config_parms[4].length; i++)
									nlc[++len] = b3_config_parms[4].info[1 + i];
							}
						}
					}
					nlc[0] = len;
					if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
					    && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
					{
						((T30_INFO *)&nlc[1])->operating_mode = T30_OPERATING_MODE_CAPI_NEG;
					}
				}
			}

			PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits);
			len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH;
			for (i = 0; i < len; i++)
				plci->fax_connect_info_buffer[i] = nlc[1 + i];
			((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0;
			i += ((T30_INFO *)&nlc[1])->head_line_len;
			while (i < nlc[0])
				plci->fax_connect_info_buffer[len++] = nlc[++i];
			plci->fax_connect_info_length = len;
		}
		else
		{
			nlc[0] = 14;
			if (b3_config->length != 16)
				return _B3_PARM_NOT_SUPPORTED;
			for (i = 0; i < 12; i++) nlc[1 + i] = b3_config->info[1 + i];
			if (GET_WORD(&b3_config->info[13]) != 8 && GET_WORD(&b3_config->info[13]) != 128)
				return _B3_PARM_NOT_SUPPORTED;
			nlc[13] = b3_config->info[13];
			if (GET_WORD(&b3_config->info[15]) >= nlc[13])
				return _B3_PARM_NOT_SUPPORTED;
			nlc[14] = b3_config->info[15];
		}
	}
	else
	{
		if (plci->B3_prot == 4
		    || plci->B3_prot == 5 /*T.30 - FAX*/) return _B3_PARM_NOT_SUPPORTED;
	}
	add_p(plci, NLC, nlc);
	return 0;
}

/*----------------------------------------------------------------*/
/*      make the same as add_b23, but only for the modem related  */
/*      L2 and L3 B-Chan protocol.                                */
/*                                                                */
/*      Enabled L2 and L3 Configurations:                         */
/*        If L1 == Modem all negotiation                          */
/*          only L2 == Modem with full negotiation is allowed     */
/*        If L1 == Modem async or sync                            */
/*          only L2 == Transparent is allowed                     */
/*        L3 == Modem or L3 == Transparent are allowed            */
/*      B2 Configuration for modem:                               */
/*          word : enable/disable compression, bitoptions         */
/*      B3 Configuration for modem:                               */
/*          empty                                                 */
/*----------------------------------------------------------------*/
static word add_modem_b23(PLCI *plci, API_PARSE *bp_parms)
{
	static byte lli[12] = {1,1};
	static byte llc[3] = {2,0,0};
	static byte dlc[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	API_PARSE mdm_config[2];
	word i;
	word b2_config = 0;

	for (i = 0; i < 2; i++) mdm_config[i].length = 0;
	for (i = 0; i < sizeof(dlc); i++) dlc[i] = 0;

	if (((GET_WORD(bp_parms[0].info) == B1_MODEM_ALL_NEGOTIATE)
	     && (GET_WORD(bp_parms[1].info) != B2_MODEM_EC_COMPRESSION))
	    || ((GET_WORD(bp_parms[0].info) != B1_MODEM_ALL_NEGOTIATE)
		&& (GET_WORD(bp_parms[1].info) != B2_TRANSPARENT)))
	{
		return (_B_STACK_NOT_SUPPORTED);
	}
	if ((GET_WORD(bp_parms[2].info) != B3_MODEM)
	    && (GET_WORD(bp_parms[2].info) != B3_TRANSPARENT))
	{
		return (_B_STACK_NOT_SUPPORTED);
	}

	plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
	plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);

	if ((GET_WORD(bp_parms[1].info) == B2_MODEM_EC_COMPRESSION) && bp_parms[4].length)
	{
		if (api_parse(&bp_parms[4].info[1],
			      (word)bp_parms[4].length, "w",
			      mdm_config))
		{
			return (_WRONG_MESSAGE_FORMAT);
		}
		b2_config = GET_WORD(mdm_config[0].info);
	}

	/* OK, L2 is modem */

	lli[0] = 1;
	lli[1] = 1;
	if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
		lli[1] |= 2;
	if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
		lli[1] |= 4;

	if ((lli[1] & 0x02) && (diva_xdi_extended_features & DIVA_CAPI_USE_CMA)) {
		lli[1] |= 0x10;
		if (plci->rx_dma_descriptor <= 0) {
			plci->rx_dma_descriptor = diva_get_dma_descriptor(plci, &plci->rx_dma_magic);
			if (plci->rx_dma_descriptor >= 0)
				plci->rx_dma_descriptor++;
		}
		if (plci->rx_dma_descriptor > 0) {
			lli[1] |= 0x40;
			lli[0] = 6;
			lli[2] = (byte)(plci->rx_dma_descriptor - 1);
			lli[3] = (byte)plci->rx_dma_magic;
			lli[4] = (byte)(plci->rx_dma_magic >>  8);
			lli[5] = (byte)(plci->rx_dma_magic >> 16);
			lli[6] = (byte)(plci->rx_dma_magic >> 24);
		}
	}

	if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
		lli[1] |= 0x20;
	}

	llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
		/*V42*/ 10 : /*V42_IN*/ 9;
	llc[2] = 4;                      /* pass L3 always transparent */
	add_p(plci, LLI, lli);
	add_p(plci, LLC, llc);
	i =  1;
	PUT_WORD(&dlc[i], plci->appl->MaxDataLength);
	i += 2;
	if (GET_WORD(bp_parms[1].info) == B2_MODEM_EC_COMPRESSION)
	{
		if (bp_parms[4].length)
		{
			dbug(1, dprintf("MDM b2_config=%02x", b2_config));
			dlc[i++] = 3; /* Addr A */
			dlc[i++] = 1; /* Addr B */
			dlc[i++] = 7; /* modulo mode */
			dlc[i++] = 7; /* window size */
			dlc[i++] = 0; /* XID len Lo  */
			dlc[i++] = 0; /* XID len Hi  */

			if (b2_config & MDM_B2_DISABLE_V42bis)
			{
				dlc[i] |= DLC_MODEMPROT_DISABLE_V42_V42BIS;
			}
			if (b2_config & MDM_B2_DISABLE_MNP)
			{
				dlc[i] |= DLC_MODEMPROT_DISABLE_MNP_MNP5;
			}
			if (b2_config & MDM_B2_DISABLE_TRANS)
			{
				dlc[i] |= DLC_MODEMPROT_REQUIRE_PROTOCOL;
			}
			if (b2_config & MDM_B2_DISABLE_V42)
			{
				dlc[i] |= DLC_MODEMPROT_DISABLE_V42_DETECT;
			}
			if (b2_config & MDM_B2_DISABLE_COMP)
			{
				dlc[i] |= DLC_MODEMPROT_DISABLE_COMPRESSION;
			}
			i++;
		}
	}
	else
	{
		dlc[i++] = 3; /* Addr A */
		dlc[i++] = 1; /* Addr B */
		dlc[i++] = 7; /* modulo mode */
		dlc[i++] = 7; /* window size */
		dlc[i++] = 0; /* XID len Lo  */
		dlc[i++] = 0; /* XID len Hi  */
		dlc[i++] = DLC_MODEMPROT_DISABLE_V42_V42BIS |
			DLC_MODEMPROT_DISABLE_MNP_MNP5 |
			DLC_MODEMPROT_DISABLE_V42_DETECT |
			DLC_MODEMPROT_DISABLE_COMPRESSION;
	}
	dlc[0] = (byte)(i - 1);
/* HexDump ("DLC", sizeof(dlc), &dlc[0]); */
	add_p(plci, DLC, dlc);
	return (0);
}


/*------------------------------------------------------------------*/
/* send a request for the signaling entity                          */
/*------------------------------------------------------------------*/

static void sig_req(PLCI *plci, byte req, byte Id)
{
	if (!plci) return;
	if (plci->adapter->adapter_disabled) return;
	dbug(1, dprintf("sig_req(%x)", req));
	if (req == REMOVE)
		plci->sig_remove_id = plci->Sig.Id;
	if (plci->req_in == plci->req_in_start) {
		plci->req_in += 2;
		plci->RBuffer[plci->req_in++] = 0;
	}
	PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start - 2);
	plci->RBuffer[plci->req_in++] = Id;   /* sig/nl flag */
	plci->RBuffer[plci->req_in++] = req;  /* request */
	plci->RBuffer[plci->req_in++] = 0;    /* channel */
	plci->req_in_start = plci->req_in;
}

/*------------------------------------------------------------------*/
/* send a request for the network layer entity                      */
/*------------------------------------------------------------------*/

static void nl_req_ncci(PLCI *plci, byte req, byte ncci)
{
	if (!plci) return;
	if (plci->adapter->adapter_disabled) return;
	dbug(1, dprintf("nl_req %02x %02x %02x", plci->Id, req, ncci));
	if (req == REMOVE)
	{
		plci->nl_remove_id = plci->NL.Id;
		ncci_remove(plci, 0, (byte)(ncci != 0));
		ncci = 0;
	}
	if (plci->req_in == plci->req_in_start) {
		plci->req_in += 2;
		plci->RBuffer[plci->req_in++] = 0;
	}
	PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start - 2);
	plci->RBuffer[plci->req_in++] = 1;    /* sig/nl flag */
	plci->RBuffer[plci->req_in++] = req;  /* request */
	plci->RBuffer[plci->req_in++] = plci->adapter->ncci_ch[ncci];   /* channel */
	plci->req_in_start = plci->req_in;
}

static void send_req(PLCI *plci)
{
	ENTITY *e;
	word l;
/*  word i; */

	if (!plci) return;
	if (plci->adapter->adapter_disabled) return;
	channel_xmit_xon(plci);

	/* if nothing to do, return */
	if (plci->req_in == plci->req_out) return;
	dbug(1, dprintf("send_req(in=%d,out=%d)", plci->req_in, plci->req_out));

	if (plci->nl_req || plci->sig_req) return;

	l = GET_WORD(&plci->RBuffer[plci->req_out]);
	plci->req_out += 2;
	plci->XData[0].P = &plci->RBuffer[plci->req_out];
	plci->req_out += l;
	if (plci->RBuffer[plci->req_out] == 1)
	{
		e = &plci->NL;
		plci->req_out++;
		e->Req = plci->nl_req = plci->RBuffer[plci->req_out++];
		e->ReqCh = plci->RBuffer[plci->req_out++];
		if (!(e->Id & 0x1f))
		{
			e->Id = NL_ID;
			plci->RBuffer[plci->req_out - 4] = CAI;
			plci->RBuffer[plci->req_out - 3] = 1;
			plci->RBuffer[plci->req_out - 2] = (plci->Sig.Id == 0xff) ? 0 : plci->Sig.Id;
			plci->RBuffer[plci->req_out - 1] = 0;
			l += 3;
			plci->nl_global_req = plci->nl_req;
		}
		dbug(1, dprintf("%x:NLREQ(%x:%x:%x)", plci->adapter->Id, e->Id, e->Req, e->ReqCh));
	}
	else
	{
		e = &plci->Sig;
		if (plci->RBuffer[plci->req_out])
			e->Id = plci->RBuffer[plci->req_out];
		plci->req_out++;
		e->Req = plci->sig_req = plci->RBuffer[plci->req_out++];
		e->ReqCh = plci->RBuffer[plci->req_out++];
		if (!(e->Id & 0x1f))
			plci->sig_global_req = plci->sig_req;
		dbug(1, dprintf("%x:SIGREQ(%x:%x:%x)", plci->adapter->Id, e->Id, e->Req, e->ReqCh));
	}
	plci->XData[0].PLength = l;
	e->X = plci->XData;
	plci->adapter->request(e);
	dbug(1, dprintf("send_ok"));
}

static void send_data(PLCI *plci)
{
	DIVA_CAPI_ADAPTER *a;
	DATA_B3_DESC *data;
	NCCI   *ncci_ptr;
	word ncci;

	if (!plci->nl_req && plci->ncci_ring_list)
	{
		a = plci->adapter;
		ncci = plci->ncci_ring_list;
		do
		{
			ncci = a->ncci_next[ncci];
			ncci_ptr = &(a->ncci[ncci]);
			if (!(a->ncci_ch[ncci]
			      && (a->ch_flow_control[a->ncci_ch[ncci]] & N_OK_FC_PENDING)))
			{
				if (ncci_ptr->data_pending)
				{
					if ((a->ncci_state[ncci] == CONNECTED)
					    || (a->ncci_state[ncci] == INC_ACT_PENDING)
					    || (plci->send_disc == ncci))
					{
						data = &(ncci_ptr->DBuffer[ncci_ptr->data_out]);
						if ((plci->B2_prot == B2_V120_ASYNC)
						    || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
						    || (plci->B2_prot == B2_V120_BIT_TRANSPARENT))
						{
							plci->NData[1].P = TransmitBufferGet(plci->appl, data->P);
							plci->NData[1].PLength = data->Length;
							if (data->Flags & 0x10)
								plci->NData[0].P = v120_break_header;
							else
								plci->NData[0].P = v120_default_header;
							plci->NData[0].PLength = 1;
							plci->NL.XNum = 2;
							plci->NL.Req = plci->nl_req = (byte)((data->Flags & 0x07) << 4 | N_DATA);
						}
						else
						{
							plci->NData[0].P = TransmitBufferGet(plci->appl, data->P);
							plci->NData[0].PLength = data->Length;
							if (data->Flags & 0x10)
								plci->NL.Req = plci->nl_req = (byte)N_UDATA;

							else if ((plci->B3_prot == B3_RTP) && (data->Flags & 0x01))
								plci->NL.Req = plci->nl_req = (byte)N_BDATA;

							else
								plci->NL.Req = plci->nl_req = (byte)((data->Flags & 0x07) << 4 | N_DATA);
						}
						plci->NL.X = plci->NData;
						plci->NL.ReqCh = a->ncci_ch[ncci];
						dbug(1, dprintf("%x:DREQ(%x:%x)", a->Id, plci->NL.Id, plci->NL.Req));
						plci->data_sent = true;
						plci->data_sent_ptr = data->P;
						a->request(&plci->NL);
					}
					else {
						cleanup_ncci_data(plci, ncci);
					}
				}
				else if (plci->send_disc == ncci)
				{
					/* dprintf("N_DISC"); */
					plci->NData[0].PLength = 0;
					plci->NL.ReqCh = a->ncci_ch[ncci];
					plci->NL.Req = plci->nl_req = N_DISC;
					a->request(&plci->NL);
					plci->command = _DISCONNECT_B3_R;
					plci->send_disc = 0;
				}
			}
		} while (!plci->nl_req && (ncci != plci->ncci_ring_list));
		plci->ncci_ring_list = ncci;
	}
}

static void listen_check(DIVA_CAPI_ADAPTER *a)
{
	word i, j;
	PLCI *plci;
	byte activnotifiedcalls = 0;

	dbug(1, dprintf("listen_check(%d,%d)", a->listen_active, a->max_listen));
	if (!remove_started && !a->adapter_disabled)
	{
		for (i = 0; i < a->max_plci; i++)
		{
			plci = &(a->plci[i]);
			if (plci->notifiedcall) activnotifiedcalls++;
		}
		dbug(1, dprintf("listen_check(%d)", activnotifiedcalls));

		for (i = a->listen_active; i < ((word)(a->max_listen + activnotifiedcalls)); i++) {
			if ((j = get_plci(a))) {
				a->listen_active++;
				plci = &a->plci[j - 1];
				plci->State = LISTENING;

				add_p(plci, OAD, "\x01\xfd");

				add_p(plci, KEY, "\x04\x43\x41\x32\x30");

				add_p(plci, CAI, "\x01\xc0");
				add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
				add_p(plci, LLI, "\x01\xc4");                  /* support Dummy CR FAC + MWI + SpoofNotify */
				add_p(plci, SHIFT | 6, NULL);
				add_p(plci, SIN, "\x02\x00\x00");
				plci->internal_command = LISTEN_SIG_ASSIGN_PEND;     /* do indicate_req if OK  */
				sig_req(plci, ASSIGN, DSIG_ID);
				send_req(plci);
			}
		}
	}
}

/*------------------------------------------------------------------*/
/* functions for all parameters sent in INDs                        */
/*------------------------------------------------------------------*/

static void IndParse(PLCI *plci, const word *parms_id, byte **parms, byte multiIEsize)
{
	word ploc;            /* points to current location within packet */
	byte w;
	byte wlen;
	byte codeset, lock;
	byte *in;
	word i;
	word code;
	word mIEindex = 0;
	ploc = 0;
	codeset = 0;
	lock = 0;

	in = plci->Sig.RBuffer->P;
	for (i = 0; i < parms_id[0]; i++)   /* multiIE parms_id contains just the 1st */
	{                            /* element but parms array is larger      */
		parms[i] = (byte *)"";
	}
	for (i = 0; i < multiIEsize; i++)
	{
		parms[i] = (byte *)"";
	}

	while (ploc < plci->Sig.RBuffer->length - 1) {

		/* read information element id and length                   */
		w = in[ploc];

		if (w & 0x80) {
/*    w &=0xf0; removed, cannot detect congestion levels */
/*    upper 4 bit masked with w==SHIFT now               */
			wlen = 0;
		}
		else {
			wlen = (byte)(in[ploc + 1] + 1);
		}
		/* check if length valid (not exceeding end of packet)      */
		if ((ploc + wlen) > 270) return;
		if (lock & 0x80) lock &= 0x7f;
		else codeset = lock;

		if ((w & 0xf0) == SHIFT) {
			codeset = in[ploc];
			if (!(codeset & 0x08)) lock = (byte)(codeset & 7);
			codeset &= 7;
			lock |= 0x80;
		}
		else {
			if (w == ESC && wlen >= 3) code = in[ploc + 2] | 0x800;
			else code = w;
			code |= (codeset << 8);

			for (i = 1; i < parms_id[0] + 1 && parms_id[i] != code; i++);

			if (i < parms_id[0] + 1) {
				if (!multiIEsize) { /* with multiIEs use next field index,          */
					mIEindex = i - 1;    /* with normal IEs use same index like parms_id */
				}

				parms[mIEindex] = &in[ploc + 1];
				dbug(1, dprintf("mIE[%d]=0x%x", *parms[mIEindex], in[ploc]));
				if (parms_id[i] == OAD
				    || parms_id[i] == CONN_NR
				    || parms_id[i] == CAD) {
					if (in[ploc + 2] & 0x80) {
						in[ploc + 0] = (byte)(in[ploc + 1] + 1);
						in[ploc + 1] = (byte)(in[ploc + 2] & 0x7f);
						in[ploc + 2] = 0x80;
						parms[mIEindex] = &in[ploc];
					}
				}
				mIEindex++;       /* effects multiIEs only */
			}
		}

		ploc += (wlen + 1);
	}
	return;
}

/*------------------------------------------------------------------*/
/* try to match a cip from received BC and HLC                      */
/*------------------------------------------------------------------*/

static byte ie_compare(byte *ie1, byte *ie2)
{
	word i;
	if (!ie1 || !ie2) return false;
	if (!ie1[0]) return false;
	for (i = 0; i < (word)(ie1[0] + 1); i++) if (ie1[i] != ie2[i]) return false;
	return true;
}

static word find_cip(DIVA_CAPI_ADAPTER *a, byte *bc, byte *hlc)
{
	word i;
	word j;

	for (i = 9; i && !ie_compare(bc, cip_bc[i][a->u_law]); i--);

	for (j = 16; j < 29 &&
		     (!ie_compare(bc, cip_bc[j][a->u_law]) || !ie_compare(hlc, cip_hlc[j])); j++);
	if (j == 29) return i;
	return j;
}


static byte AddInfo(byte **add_i,
		    byte **fty_i,
		    byte *esc_chi,
		    byte *facility)
{
	byte i;
	byte j;
	byte k;
	byte flen;
	byte len = 0;
	/* facility is a nested structure */
	/* FTY can be more than once      */

	if (esc_chi[0] && !(esc_chi[esc_chi[0]] & 0x7f))
	{
		add_i[0] = (byte *)"\x02\x02\x00"; /* use neither b nor d channel */
	}

	else
	{
		add_i[0] = (byte *)"";
	}
	if (!fty_i[0][0])
	{
		add_i[3] = (byte *)"";
	}
	else
	{    /* facility array found  */
		for (i = 0, j = 1; i < MAX_MULTI_IE && fty_i[i][0]; i++)
		{
			dbug(1, dprintf("AddIFac[%d]", fty_i[i][0]));
			len += fty_i[i][0];
			len += 2;
			flen = fty_i[i][0];
			facility[j++] = 0x1c; /* copy fac IE */
			for (k = 0; k <= flen; k++, j++)
			{
				facility[j] = fty_i[i][k];
/*      dbug(1, dprintf("%x ",facility[j])); */
			}
		}
		facility[0] = len;
		add_i[3] = facility;
	}
/*  dbug(1, dprintf("FacArrLen=%d ",len)); */
	len = add_i[0][0] + add_i[1][0] + add_i[2][0] + add_i[3][0];
	len += 4;                          /* calculate length of all */
	return (len);
}

/*------------------------------------------------------------------*/
/* voice and codec features                                         */
/*------------------------------------------------------------------*/

static void SetVoiceChannel(PLCI *plci, byte *chi, DIVA_CAPI_ADAPTER *a)
{
	byte voice_chi[] = "\x02\x18\x01";
	byte channel;

	channel = chi[chi[0]] & 0x3;
	dbug(1, dprintf("ExtDevON(Ch=0x%x)", channel));
	voice_chi[2] = (channel) ? channel : 1;
	add_p(plci, FTY, "\x02\x01\x07");             /* B On, default on 1 */
	add_p(plci, ESC, voice_chi);                  /* Channel */
	sig_req(plci, TEL_CTRL, 0);
	send_req(plci);
	if (a->AdvSignalPLCI)
	{
		adv_voice_write_coefs(a->AdvSignalPLCI, ADV_VOICE_WRITE_ACTIVATION);
	}
}

static void VoiceChannelOff(PLCI *plci)
{
	dbug(1, dprintf("ExtDevOFF"));
	add_p(plci, FTY, "\x02\x01\x08");             /* B Off */
	sig_req(plci, TEL_CTRL, 0);
	send_req(plci);
	if (plci->adapter->AdvSignalPLCI)
	{
		adv_voice_clear_config(plci->adapter->AdvSignalPLCI);
	}
}


static word AdvCodecSupport(DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl,
			    byte hook_listen)
{
	word j;
	PLCI *splci;

	/* check if hardware supports handset with hook states (adv.codec) */
	/* or if just a on board codec is supported                        */
	/* the advanced codec plci is just for internal use                */

	/* diva Pro with on-board codec:                                   */
	if (a->profile.Global_Options & HANDSET)
	{
		/* new call, but hook states are already signalled */
		if (a->AdvCodecFLAG)
		{
			if (a->AdvSignalAppl != appl || a->AdvSignalPLCI)
			{
				dbug(1, dprintf("AdvSigPlci=0x%x", a->AdvSignalPLCI));
				return 0x2001; /* codec in use by another application */
			}
			if (plci != NULL)
			{
				a->AdvSignalPLCI = plci;
				plci->tel = ADV_VOICE;
			}
			return 0;                      /* adv codec still used */
		}
		if ((j = get_plci(a)))
		{
			splci = &a->plci[j - 1];
			splci->tel = CODEC_PERMANENT;
			/* hook_listen indicates if a facility_req with handset/hook support */
			/* was sent. Otherwise if just a call on an external device was made */
			/* the codec will be used but the hook info will be discarded (just  */
			/* the external controller is in use                                 */
			if (hook_listen) splci->State = ADVANCED_VOICE_SIG;
			else
			{
				splci->State = ADVANCED_VOICE_NOSIG;
				if (plci)
				{
					plci->spoofed_msg = SPOOFING_REQUIRED;
				}
				/* indicate D-ch connect if  */
			}                                        /* codec is connected OK     */
			if (plci != NULL)
			{
				a->AdvSignalPLCI = plci;
				plci->tel = ADV_VOICE;
			}
			a->AdvSignalAppl = appl;
			a->AdvCodecFLAG = true;
			a->AdvCodecPLCI = splci;
			add_p(splci, CAI, "\x01\x15");
			add_p(splci, LLI, "\x01\x00");
			add_p(splci, ESC, "\x02\x18\x00");
			add_p(splci, UID, "\x06\x43\x61\x70\x69\x32\x30");
			splci->internal_command = PERM_COD_ASSIGN;
			dbug(1, dprintf("Codec Assign"));
			sig_req(splci, ASSIGN, DSIG_ID);
			send_req(splci);
		}
		else
		{
			return 0x2001; /* wrong state, no more plcis */
		}
	}
	else if (a->profile.Global_Options & ON_BOARD_CODEC)
	{
		if (hook_listen) return 0x300B;               /* Facility not supported */
		/* no hook with SCOM      */
		if (plci != NULL) plci->tel = CODEC;
		dbug(1, dprintf("S/SCOM codec"));
		/* first time we use the scom-s codec we must shut down the internal   */
		/* handset application of the card. This can be done by an assign with */
		/* a cai with the 0x80 bit set. Assign return code is 'out of resource'*/
		if (!a->scom_appl_disable) {
			if ((j = get_plci(a))) {
				splci = &a->plci[j - 1];
				add_p(splci, CAI, "\x01\x80");
				add_p(splci, UID, "\x06\x43\x61\x70\x69\x32\x30");
				sig_req(splci, ASSIGN, 0xC0);  /* 0xc0 is the TEL_ID */
				send_req(splci);
				a->scom_appl_disable = true;
			}
			else{
				return 0x2001; /* wrong state, no more plcis */
			}
		}
	}
	else return 0x300B;               /* Facility not supported */

	return 0;
}


static void CodecIdCheck(DIVA_CAPI_ADAPTER *a, PLCI *plci)
{

	dbug(1, dprintf("CodecIdCheck"));

	if (a->AdvSignalPLCI == plci)
	{
		dbug(1, dprintf("PLCI owns codec"));
		VoiceChannelOff(a->AdvCodecPLCI);
		if (a->AdvCodecPLCI->State == ADVANCED_VOICE_NOSIG)
		{
			dbug(1, dprintf("remove temp codec PLCI"));
			plci_remove(a->AdvCodecPLCI);
			a->AdvCodecFLAG  = 0;
			a->AdvCodecPLCI  = NULL;
			a->AdvSignalAppl = NULL;
		}
		a->AdvSignalPLCI = NULL;
	}
}

/* -------------------------------------------------------------------
   Ask for physical address of card on PCI bus
   ------------------------------------------------------------------- */
static void diva_ask_for_xdi_sdram_bar(DIVA_CAPI_ADAPTER *a,
				       IDI_SYNC_REQ *preq) {
	a->sdram_bar = 0;
	if (diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_SDRAM_BAR) {
		ENTITY *e = (ENTITY *)preq;

		e->user[0] = a->Id - 1;
		preq->xdi_sdram_bar.info.bar    = 0;
		preq->xdi_sdram_bar.Req         = 0;
		preq->xdi_sdram_bar.Rc           = IDI_SYNC_REQ_XDI_GET_ADAPTER_SDRAM_BAR;

		(*(a->request))(e);

		a->sdram_bar = preq->xdi_sdram_bar.info.bar;
		dbug(3, dprintf("A(%d) SDRAM BAR = %08x", a->Id, a->sdram_bar));
	}
}

/* -------------------------------------------------------------------
   Ask XDI about extended features
   ------------------------------------------------------------------- */
static void diva_get_extended_adapter_features(DIVA_CAPI_ADAPTER *a) {
	IDI_SYNC_REQ *preq;
	char buffer[((sizeof(preq->xdi_extended_features) + 4) > sizeof(ENTITY)) ? (sizeof(preq->xdi_extended_features) + 4) : sizeof(ENTITY)];

	char features[4];
	preq = (IDI_SYNC_REQ *)&buffer[0];

	if (!diva_xdi_extended_features) {
		ENTITY *e = (ENTITY *)preq;
		diva_xdi_extended_features |= 0x80000000;

		e->user[0] = a->Id - 1;
		preq->xdi_extended_features.Req = 0;
		preq->xdi_extended_features.Rc  = IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES;
		preq->xdi_extended_features.info.buffer_length_in_bytes = sizeof(features);
		preq->xdi_extended_features.info.features = &features[0];

		(*(a->request))(e);

		if (features[0] & DIVA_XDI_EXTENDED_FEATURES_VALID) {
			/*
			  Check features located in the byte '0'
			*/
			if (features[0] & DIVA_XDI_EXTENDED_FEATURE_CMA) {
				diva_xdi_extended_features |= DIVA_CAPI_USE_CMA;
			}
			if (features[0] & DIVA_XDI_EXTENDED_FEATURE_RX_DMA) {
				diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_RX_DMA;
				dbug(1, dprintf("XDI provides RxDMA"));
			}
			if (features[0] & DIVA_XDI_EXTENDED_FEATURE_SDRAM_BAR) {
				diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_SDRAM_BAR;
			}
			if (features[0] & DIVA_XDI_EXTENDED_FEATURE_NO_CANCEL_RC) {
				diva_xdi_extended_features |= DIVA_CAPI_XDI_PROVIDES_NO_CANCEL;
				dbug(3, dprintf("XDI provides NO_CANCEL_RC feature"));
			}

		}
	}

	diva_ask_for_xdi_sdram_bar(a, preq);
}

/*------------------------------------------------------------------*/
/* automatic law                                                    */
/*------------------------------------------------------------------*/
/* called from OS specific part after init time to get the Law              */
/* a-law (Euro) and u-law (us,japan) use different BCs in the Setup message */
void AutomaticLaw(DIVA_CAPI_ADAPTER *a)
{
	word j;
	PLCI *splci;

	if (a->automatic_law) {
		return;
	}
	if ((j = get_plci(a))) {
		diva_get_extended_adapter_features(a);
		splci = &a->plci[j - 1];
		a->automatic_lawPLCI = splci;
		a->automatic_law = 1;
		add_p(splci, CAI, "\x01\x80");
		add_p(splci, UID, "\x06\x43\x61\x70\x69\x32\x30");
		splci->internal_command = USELAW_REQ;
		splci->command = 0;
		splci->number = 0;
		sig_req(splci, ASSIGN, DSIG_ID);
		send_req(splci);
	}
}

/* called from OS specific part if an application sends an Capi20Release */
word CapiRelease(word Id)
{
	word i, j, appls_found;
	PLCI *plci;
	APPL   *this;
	DIVA_CAPI_ADAPTER *a;

	if (!Id)
	{
		dbug(0, dprintf("A: CapiRelease(Id==0)"));
		return (_WRONG_APPL_ID);
	}

	this = &application[Id - 1];               /* get application pointer */

	for (i = 0, appls_found = 0; i < max_appl; i++)
	{
		if (application[i].Id)       /* an application has been found        */
		{
			appls_found++;
		}
	}

	for (i = 0; i < max_adapter; i++)             /* scan all adapters...    */
	{
		a = &adapter[i];
		if (a->request)
		{
			a->Info_Mask[Id - 1] = 0;
			a->CIP_Mask[Id - 1] = 0;
			a->Notification_Mask[Id - 1] = 0;
			a->codec_listen[Id - 1] = NULL;
			a->requested_options_table[Id - 1] = 0;
			for (j = 0; j < a->max_plci; j++)           /* and all PLCIs connected */
			{                                      /* with this application   */
				plci = &a->plci[j];
				if (plci->Id)                         /* if plci owns no application */
				{                                    /* it may be not jet connected */
					if (plci->State == INC_CON_PENDING
					    || plci->State == INC_CON_ALERT)
					{
						if (test_bit(Id - 1, plci->c_ind_mask_table))
						{
							__clear_bit(Id - 1, plci->c_ind_mask_table);
							if (bitmap_empty(plci->c_ind_mask_table, MAX_APPL))
							{
								sig_req(plci, HANGUP, 0);
								send_req(plci);
								plci->State = OUTG_DIS_PENDING;
							}
						}
					}
					if (test_bit(Id - 1, plci->c_ind_mask_table))
					{
						__clear_bit(Id - 1, plci->c_ind_mask_table);
						if (bitmap_empty(plci->c_ind_mask_table, MAX_APPL))
						{
							if (!plci->appl)
							{
								plci_remove(plci);
								plci->State = IDLE;
							}
						}
					}
					if (plci->appl == this)
					{
						plci->appl = NULL;
						plci_remove(plci);
						plci->State = IDLE;
					}
				}
			}
			listen_check(a);

			if (a->flag_dynamic_l1_down)
			{
				if (appls_found == 1)            /* last application does a capi release */
				{
					if ((j = get_plci(a)))
					{
						plci = &a->plci[j - 1];
						plci->command = 0;
						add_p(plci, OAD, "\x01\xfd");
						add_p(plci, CAI, "\x01\x80");
						add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
						add_p(plci, SHIFT | 6, NULL);
						add_p(plci, SIN, "\x02\x00\x00");
						plci->internal_command = REM_L1_SIG_ASSIGN_PEND;
						sig_req(plci, ASSIGN, DSIG_ID);
						add_p(plci, FTY, "\x02\xff\x06"); /* l1 down */
						sig_req(plci, SIG_CTRL, 0);
						send_req(plci);
					}
				}
			}
			if (a->AdvSignalAppl == this)
			{
				this->NullCREnable = false;
				if (a->AdvCodecPLCI)
				{
					plci_remove(a->AdvCodecPLCI);
					a->AdvCodecPLCI->tel = 0;
					a->AdvCodecPLCI->adv_nl = 0;
				}
				a->AdvSignalAppl = NULL;
				a->AdvSignalPLCI = NULL;
				a->AdvCodecFLAG = 0;
				a->AdvCodecPLCI = NULL;
			}
		}
	}

	this->Id = 0;

	return GOOD;
}

static word plci_remove_check(PLCI *plci)
{
	if (!plci) return true;
	if (!plci->NL.Id && bitmap_empty(plci->c_ind_mask_table, MAX_APPL))
	{
		if (plci->Sig.Id == 0xff)
			plci->Sig.Id = 0;
		if (!plci->Sig.Id)
		{
			dbug(1, dprintf("plci_remove_complete(%x)", plci->Id));
			dbug(1, dprintf("tel=0x%x,Sig=0x%x", plci->tel, plci->Sig.Id));
			if (plci->Id)
			{
				CodecIdCheck(plci->adapter, plci);
				clear_b1_config(plci);
				ncci_remove(plci, 0, false);
				plci_free_msg_in_queue(plci);
				channel_flow_control_remove(plci);
				plci->Id = 0;
				plci->State = IDLE;
				plci->channels = 0;
				plci->appl = NULL;
				plci->notifiedcall = 0;
			}
			listen_check(plci->adapter);
			return true;
		}
	}
	return false;
}


/*------------------------------------------------------------------*/

static byte plci_nl_busy(PLCI *plci)
{
	/* only applicable for non-multiplexed protocols */
	return (plci->nl_req
		|| (plci->ncci_ring_list
		    && plci->adapter->ncci_ch[plci->ncci_ring_list]
		    && (plci->adapter->ch_flow_control[plci->adapter->ncci_ch[plci->ncci_ring_list]] & N_OK_FC_PENDING)));
}


/*------------------------------------------------------------------*/
/* DTMF facilities                                                  */
/*------------------------------------------------------------------*/


static struct
{
	byte send_mask;
	byte listen_mask;
	byte character;
	byte code;
} dtmf_digit_map[] =
{
	{ 0x01, 0x01, 0x23, DTMF_DIGIT_TONE_CODE_HASHMARK },
	{ 0x01, 0x01, 0x2a, DTMF_DIGIT_TONE_CODE_STAR },
	{ 0x01, 0x01, 0x30, DTMF_DIGIT_TONE_CODE_0 },
	{ 0x01, 0x01, 0x31, DTMF_DIGIT_TONE_CODE_1 },
	{ 0x01, 0x01, 0x32, DTMF_DIGIT_TONE_CODE_2 },
	{ 0x01, 0x01, 0x33, DTMF_DIGIT_TONE_CODE_3 },
	{ 0x01, 0x01, 0x34, DTMF_DIGIT_TONE_CODE_4 },
	{ 0x01, 0x01, 0x35, DTMF_DIGIT_TONE_CODE_5 },
	{ 0x01, 0x01, 0x36, DTMF_DIGIT_TONE_CODE_6 },
	{ 0x01, 0x01, 0x37, DTMF_DIGIT_TONE_CODE_7 },
	{ 0x01, 0x01, 0x38, DTMF_DIGIT_TONE_CODE_8 },
	{ 0x01, 0x01, 0x39, DTMF_DIGIT_TONE_CODE_9 },
	{ 0x01, 0x01, 0x41, DTMF_DIGIT_TONE_CODE_A },
	{ 0x01, 0x01, 0x42, DTMF_DIGIT_TONE_CODE_B },
	{ 0x01, 0x01, 0x43, DTMF_DIGIT_TONE_CODE_C },
	{ 0x01, 0x01, 0x44, DTMF_DIGIT_TONE_CODE_D },
	{ 0x01, 0x00, 0x61, DTMF_DIGIT_TONE_CODE_A },
	{ 0x01, 0x00, 0x62, DTMF_DIGIT_TONE_CODE_B },
	{ 0x01, 0x00, 0x63, DTMF_DIGIT_TONE_CODE_C },
	{ 0x01, 0x00, 0x64, DTMF_DIGIT_TONE_CODE_D },

	{ 0x04, 0x04, 0x80, DTMF_SIGNAL_NO_TONE },
	{ 0x00, 0x04, 0x81, DTMF_SIGNAL_UNIDENTIFIED_TONE },
	{ 0x04, 0x04, 0x82, DTMF_SIGNAL_DIAL_TONE },
	{ 0x04, 0x04, 0x83, DTMF_SIGNAL_PABX_INTERNAL_DIAL_TONE },
	{ 0x04, 0x04, 0x84, DTMF_SIGNAL_SPECIAL_DIAL_TONE },
	{ 0x04, 0x04, 0x85, DTMF_SIGNAL_SECOND_DIAL_TONE },
	{ 0x04, 0x04, 0x86, DTMF_SIGNAL_RINGING_TONE },
	{ 0x04, 0x04, 0x87, DTMF_SIGNAL_SPECIAL_RINGING_TONE },
	{ 0x04, 0x04, 0x88, DTMF_SIGNAL_BUSY_TONE },
	{ 0x04, 0x04, 0x89, DTMF_SIGNAL_CONGESTION_TONE },
	{ 0x04, 0x04, 0x8a, DTMF_SIGNAL_SPECIAL_INFORMATION_TONE },
	{ 0x04, 0x04, 0x8b, DTMF_SIGNAL_COMFORT_TONE },
	{ 0x04, 0x04, 0x8c, DTMF_SIGNAL_HOLD_TONE },
	{ 0x04, 0x04, 0x8d, DTMF_SIGNAL_RECORD_TONE },
	{ 0x04, 0x04, 0x8e, DTMF_SIGNAL_CALLER_WAITING_TONE },
	{ 0x04, 0x04, 0x8f, DTMF_SIGNAL_CALL_WAITING_TONE },
	{ 0x04, 0x04, 0x90, DTMF_SIGNAL_PAY_TONE },
	{ 0x04, 0x04, 0x91, DTMF_SIGNAL_POSITIVE_INDICATION_TONE },
	{ 0x04, 0x04, 0x92, DTMF_SIGNAL_NEGATIVE_INDICATION_TONE },
	{ 0x04, 0x04, 0x93, DTMF_SIGNAL_WARNING_TONE },
	{ 0x04, 0x04, 0x94, DTMF_SIGNAL_INTRUSION_TONE },
	{ 0x04, 0x04, 0x95, DTMF_SIGNAL_CALLING_CARD_SERVICE_TONE },
	{ 0x04, 0x04, 0x96, DTMF_SIGNAL_PAYPHONE_RECOGNITION_TONE },
	{ 0x04, 0x04, 0x97, DTMF_SIGNAL_CPE_ALERTING_SIGNAL },
	{ 0x04, 0x04, 0x98, DTMF_SIGNAL_OFF_HOOK_WARNING_TONE },
	{ 0x04, 0x04, 0xbf, DTMF_SIGNAL_INTERCEPT_TONE },
	{ 0x04, 0x04, 0xc0, DTMF_SIGNAL_MODEM_CALLING_TONE },
	{ 0x04, 0x04, 0xc1, DTMF_SIGNAL_FAX_CALLING_TONE },
	{ 0x04, 0x04, 0xc2, DTMF_SIGNAL_ANSWER_TONE },
	{ 0x04, 0x04, 0xc3, DTMF_SIGNAL_REVERSED_ANSWER_TONE },
	{ 0x04, 0x04, 0xc4, DTMF_SIGNAL_ANSAM_TONE },
	{ 0x04, 0x04, 0xc5, DTMF_SIGNAL_REVERSED_ANSAM_TONE },
	{ 0x04, 0x04, 0xc6, DTMF_SIGNAL_BELL103_ANSWER_TONE },
	{ 0x04, 0x04, 0xc7, DTMF_SIGNAL_FAX_FLAGS },
	{ 0x04, 0x04, 0xc8, DTMF_SIGNAL_G2_FAX_GROUP_ID },
	{ 0x00, 0x04, 0xc9, DTMF_SIGNAL_HUMAN_SPEECH },
	{ 0x04, 0x04, 0xca, DTMF_SIGNAL_ANSWERING_MACHINE_390 },
	{ 0x02, 0x02, 0xf1, DTMF_MF_DIGIT_TONE_CODE_1 },
	{ 0x02, 0x02, 0xf2, DTMF_MF_DIGIT_TONE_CODE_2 },
	{ 0x02, 0x02, 0xf3, DTMF_MF_DIGIT_TONE_CODE_3 },
	{ 0x02, 0x02, 0xf4, DTMF_MF_DIGIT_TONE_CODE_4 },
	{ 0x02, 0x02, 0xf5, DTMF_MF_DIGIT_TONE_CODE_5 },
	{ 0x02, 0x02, 0xf6, DTMF_MF_DIGIT_TONE_CODE_6 },
	{ 0x02, 0x02, 0xf7, DTMF_MF_DIGIT_TONE_CODE_7 },
	{ 0x02, 0x02, 0xf8, DTMF_MF_DIGIT_TONE_CODE_8 },
	{ 0x02, 0x02, 0xf9, DTMF_MF_DIGIT_TONE_CODE_9 },
	{ 0x02, 0x02, 0xfa, DTMF_MF_DIGIT_TONE_CODE_0 },
	{ 0x02, 0x02, 0xfb, DTMF_MF_DIGIT_TONE_CODE_K1 },
	{ 0x02, 0x02, 0xfc, DTMF_MF_DIGIT_TONE_CODE_K2 },
	{ 0x02, 0x02, 0xfd, DTMF_MF_DIGIT_TONE_CODE_KP },
	{ 0x02, 0x02, 0xfe, DTMF_MF_DIGIT_TONE_CODE_S1 },
	{ 0x02, 0x02, 0xff, DTMF_MF_DIGIT_TONE_CODE_ST },

};

#define DTMF_DIGIT_MAP_ENTRIES ARRAY_SIZE(dtmf_digit_map)


static void dtmf_enable_receiver(PLCI *plci, byte enable_mask)
{
	word min_digit_duration, min_gap_duration;

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_enable_receiver %02x",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, enable_mask));

	if (enable_mask != 0)
	{
		min_digit_duration = (plci->dtmf_rec_pulse_ms == 0) ? 40 : plci->dtmf_rec_pulse_ms;
		min_gap_duration = (plci->dtmf_rec_pause_ms == 0) ? 40 : plci->dtmf_rec_pause_ms;
		plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_ENABLE_RECEIVER;
		PUT_WORD(&plci->internal_req_buffer[1], min_digit_duration);
		PUT_WORD(&plci->internal_req_buffer[3], min_gap_duration);
		plci->NData[0].PLength = 5;

		PUT_WORD(&plci->internal_req_buffer[5], INTERNAL_IND_BUFFER_SIZE);
		plci->NData[0].PLength += 2;
		capidtmf_recv_enable(&(plci->capidtmf_state), min_digit_duration, min_gap_duration);

	}
	else
	{
		plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_DISABLE_RECEIVER;
		plci->NData[0].PLength = 1;

		capidtmf_recv_disable(&(plci->capidtmf_state));

	}
	plci->NData[0].P = plci->internal_req_buffer;
	plci->NL.X = plci->NData;
	plci->NL.ReqCh = 0;
	plci->NL.Req = plci->nl_req = (byte) N_UDATA;
	plci->adapter->request(&plci->NL);
}


static void dtmf_send_digits(PLCI *plci, byte *digit_buffer, word digit_count)
{
	word w, i;

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_send_digits %d",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, digit_count));

	plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_SEND_DIGITS;
	w = (plci->dtmf_send_pulse_ms == 0) ? 40 : plci->dtmf_send_pulse_ms;
	PUT_WORD(&plci->internal_req_buffer[1], w);
	w = (plci->dtmf_send_pause_ms == 0) ? 40 : plci->dtmf_send_pause_ms;
	PUT_WORD(&plci->internal_req_buffer[3], w);
	for (i = 0; i < digit_count; i++)
	{
		w = 0;
		while ((w < DTMF_DIGIT_MAP_ENTRIES)
		       && (digit_buffer[i] != dtmf_digit_map[w].character))
		{
			w++;
		}
		plci->internal_req_buffer[5 + i] = (w < DTMF_DIGIT_MAP_ENTRIES) ?
			dtmf_digit_map[w].code : DTMF_DIGIT_TONE_CODE_STAR;
	}
	plci->NData[0].PLength = 5 + digit_count;
	plci->NData[0].P = plci->internal_req_buffer;
	plci->NL.X = plci->NData;
	plci->NL.ReqCh = 0;
	plci->NL.Req = plci->nl_req = (byte) N_UDATA;
	plci->adapter->request(&plci->NL);
}


static void dtmf_rec_clear_config(PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_rec_clear_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	plci->dtmf_rec_active = 0;
	plci->dtmf_rec_pulse_ms = 0;
	plci->dtmf_rec_pause_ms = 0;

	capidtmf_init(&(plci->capidtmf_state), plci->adapter->u_law);

}


static void dtmf_send_clear_config(PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_send_clear_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	plci->dtmf_send_requests = 0;
	plci->dtmf_send_pulse_ms = 0;
	plci->dtmf_send_pause_ms = 0;
}


static void dtmf_prepare_switch(dword Id, PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_prepare_switch",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	while (plci->dtmf_send_requests != 0)
		dtmf_confirmation(Id, plci);
}


static word dtmf_save_config(dword Id, PLCI *plci, byte Rc)
{

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_save_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	return (GOOD);
}


static word dtmf_restore_config(dword Id, PLCI *plci, byte Rc)
{
	word Info;

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_restore_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	Info = GOOD;
	if (plci->B1_facilities & B1_FACILITY_DTMFR)
	{
		switch (plci->adjust_b_state)
		{
		case ADJUST_B_RESTORE_DTMF_1:
			plci->internal_command = plci->adjust_b_command;
			if (plci_nl_busy(plci))
			{
				plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
				break;
			}
			dtmf_enable_receiver(plci, plci->dtmf_rec_active);
			plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_2;
			break;
		case ADJUST_B_RESTORE_DTMF_2:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Reenable DTMF receiver failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _WRONG_STATE;
				break;
			}
			break;
		}
	}
	return (Info);
}


static void dtmf_command(dword Id, PLCI *plci, byte Rc)
{
	word internal_command, Info;
	byte mask;
	byte result[4];

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_command %02x %04x %04x %d %d %d %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
			plci->dtmf_cmd, plci->dtmf_rec_pulse_ms, plci->dtmf_rec_pause_ms,
			plci->dtmf_send_pulse_ms, plci->dtmf_send_pause_ms));

	Info = GOOD;
	result[0] = 2;
	PUT_WORD(&result[1], DTMF_SUCCESS);
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	mask = 0x01;
	switch (plci->dtmf_cmd)
	{

	case DTMF_LISTEN_TONE_START:
		mask <<= 1; /* fall through */
	case DTMF_LISTEN_MF_START:
		mask <<= 1; /* fall through */

	case DTMF_LISTEN_START:
		switch (internal_command)
		{
		default:
			adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
								  B1_FACILITY_DTMFR), DTMF_COMMAND_1);
			/* fall through */
		case DTMF_COMMAND_1:
			if (adjust_b_process(Id, plci, Rc) != GOOD)
			{
				dbug(1, dprintf("[%06lx] %s,%d: Load DTMF failed",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			if (plci->internal_command)
				return;
			/* fall through */
		case DTMF_COMMAND_2:
			if (plci_nl_busy(plci))
			{
				plci->internal_command = DTMF_COMMAND_2;
				return;
			}
			plci->internal_command = DTMF_COMMAND_3;
			dtmf_enable_receiver(plci, (byte)(plci->dtmf_rec_active | mask));
			return;
		case DTMF_COMMAND_3:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Enable DTMF receiver failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}

			plci->tone_last_indication_code = DTMF_SIGNAL_NO_TONE;

			plci->dtmf_rec_active |= mask;
			break;
		}
		break;


	case DTMF_LISTEN_TONE_STOP:
		mask <<= 1; /* fall through */
	case DTMF_LISTEN_MF_STOP:
		mask <<= 1; /* fall through */

	case DTMF_LISTEN_STOP:
		switch (internal_command)
		{
		default:
			plci->dtmf_rec_active &= ~mask;
			if (plci->dtmf_rec_active)
				break;
/*
  case DTMF_COMMAND_1:
  if (plci->dtmf_rec_active)
  {
  if (plci_nl_busy (plci))
  {
  plci->internal_command = DTMF_COMMAND_1;
  return;
  }
  plci->dtmf_rec_active &= ~mask;
  plci->internal_command = DTMF_COMMAND_2;
  dtmf_enable_receiver (plci, false);
  return;
  }
  Rc = OK;
  case DTMF_COMMAND_2:
  if ((Rc != OK) && (Rc != OK_FC))
  {
  dbug (1, dprintf("[%06lx] %s,%d: Disable DTMF receiver failed %02x",
  UnMapId (Id), (char far *)(FILE_), __LINE__, Rc));
  Info = _FACILITY_NOT_SUPPORTED;
  break;
  }
*/
			adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities &
								  ~(B1_FACILITY_DTMFX | B1_FACILITY_DTMFR)), DTMF_COMMAND_3);
			/* fall through */
		case DTMF_COMMAND_3:
			if (adjust_b_process(Id, plci, Rc) != GOOD)
			{
				dbug(1, dprintf("[%06lx] %s,%d: Unload DTMF failed",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			if (plci->internal_command)
				return;
			break;
		}
		break;


	case DTMF_SEND_TONE:
		mask <<= 1; /* fall through */
	case DTMF_SEND_MF:
		mask <<= 1; /* fall through */

	case DTMF_DIGITS_SEND:
		switch (internal_command)
		{
		default:
			adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
								  ((plci->dtmf_parameter_length != 0) ? B1_FACILITY_DTMFX | B1_FACILITY_DTMFR : B1_FACILITY_DTMFX)),
					   DTMF_COMMAND_1);
			/* fall through */
		case DTMF_COMMAND_1:
			if (adjust_b_process(Id, plci, Rc) != GOOD)
			{
				dbug(1, dprintf("[%06lx] %s,%d: Load DTMF failed",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			if (plci->internal_command)
				return;
			/* fall through */
		case DTMF_COMMAND_2:
			if (plci_nl_busy(plci))
			{
				plci->internal_command = DTMF_COMMAND_2;
				return;
			}
			plci->dtmf_msg_number_queue[(plci->dtmf_send_requests)++] = plci->number;
			plci->internal_command = DTMF_COMMAND_3;
			dtmf_send_digits(plci, &plci->saved_msg.parms[3].info[1], plci->saved_msg.parms[3].length);
			return;
		case DTMF_COMMAND_3:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Send DTMF digits failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				if (plci->dtmf_send_requests != 0)
					(plci->dtmf_send_requests)--;
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			return;
		}
		break;
	}
	sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
	      "wws", Info, SELECTOR_DTMF, result);
}


static byte dtmf_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL   *appl, API_PARSE *msg)
{
	word Info;
	word i, j;
	byte mask;
	API_PARSE dtmf_parms[5];
	byte result[40];

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_request",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	Info = GOOD;
	result[0] = 2;
	PUT_WORD(&result[1], DTMF_SUCCESS);
	if (!(a->profile.Global_Options & GL_DTMF_SUPPORTED))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		Info = _FACILITY_NOT_SUPPORTED;
	}
	else if (api_parse(&msg[1].info[1], msg[1].length, "w", dtmf_parms))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		Info = _WRONG_MESSAGE_FORMAT;
	}

	else if ((GET_WORD(dtmf_parms[0].info) == DTMF_GET_SUPPORTED_DETECT_CODES)
		 || (GET_WORD(dtmf_parms[0].info) == DTMF_GET_SUPPORTED_SEND_CODES))
	{
		if (!((a->requested_options_table[appl->Id - 1])
		      & (1L << PRIVATE_DTMF_TONE)))
		{
			dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
					UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(dtmf_parms[0].info)));
			PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
		}
		else
		{
			for (i = 0; i < 32; i++)
				result[4 + i] = 0;
			if (GET_WORD(dtmf_parms[0].info) == DTMF_GET_SUPPORTED_DETECT_CODES)
			{
				for (i = 0; i < DTMF_DIGIT_MAP_ENTRIES; i++)
				{
					if (dtmf_digit_map[i].listen_mask != 0)
						result[4 + (dtmf_digit_map[i].character >> 3)] |= (1 << (dtmf_digit_map[i].character & 0x7));
				}
			}
			else
			{
				for (i = 0; i < DTMF_DIGIT_MAP_ENTRIES; i++)
				{
					if (dtmf_digit_map[i].send_mask != 0)
						result[4 + (dtmf_digit_map[i].character >> 3)] |= (1 << (dtmf_digit_map[i].character & 0x7));
				}
			}
			result[0] = 3 + 32;
			result[3] = 32;
		}
	}

	else if (plci == NULL)
	{
		dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		Info = _WRONG_IDENTIFIER;
	}
	else
	{
		if (!plci->State
		    || !plci->NL.Id || plci->nl_remove_id)
		{
			dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
					UnMapId(Id), (char *)(FILE_), __LINE__));
			Info = _WRONG_STATE;
		}
		else
		{
			plci->command = 0;
			plci->dtmf_cmd = GET_WORD(dtmf_parms[0].info);
			mask = 0x01;
			switch (plci->dtmf_cmd)
			{

			case DTMF_LISTEN_TONE_START:
			case DTMF_LISTEN_TONE_STOP:
				mask <<= 1; /* fall through */
			case DTMF_LISTEN_MF_START:
			case DTMF_LISTEN_MF_STOP:
				mask <<= 1;
				if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id - 1])
				      & (1L << PRIVATE_DTMF_TONE)))
				{
					dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
							UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(dtmf_parms[0].info)));
					PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
					break;
				}
				/* fall through */

			case DTMF_LISTEN_START:
			case DTMF_LISTEN_STOP:
				if (!(a->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
				    && !(a->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
				{
					dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _FACILITY_NOT_SUPPORTED;
					break;
				}
				if (mask & DTMF_LISTEN_ACTIVE_FLAG)
				{
					if (api_parse(&msg[1].info[1], msg[1].length, "wwws", dtmf_parms))
					{
						plci->dtmf_rec_pulse_ms = 0;
						plci->dtmf_rec_pause_ms = 0;
					}
					else
					{
						plci->dtmf_rec_pulse_ms = GET_WORD(dtmf_parms[1].info);
						plci->dtmf_rec_pause_ms = GET_WORD(dtmf_parms[2].info);
					}
				}
				start_internal_command(Id, plci, dtmf_command);
				return (false);


			case DTMF_SEND_TONE:
				mask <<= 1; /* fall through */
			case DTMF_SEND_MF:
				mask <<= 1;
				if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id - 1])
				      & (1L << PRIVATE_DTMF_TONE)))
				{
					dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
							UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(dtmf_parms[0].info)));
					PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
					break;
				}
				/* fall through */

			case DTMF_DIGITS_SEND:
				if (api_parse(&msg[1].info[1], msg[1].length, "wwws", dtmf_parms))
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				if (mask & DTMF_LISTEN_ACTIVE_FLAG)
				{
					plci->dtmf_send_pulse_ms = GET_WORD(dtmf_parms[1].info);
					plci->dtmf_send_pause_ms = GET_WORD(dtmf_parms[2].info);
				}
				i = 0;
				j = 0;
				while ((i < dtmf_parms[3].length) && (j < DTMF_DIGIT_MAP_ENTRIES))
				{
					j = 0;
					while ((j < DTMF_DIGIT_MAP_ENTRIES)
					       && ((dtmf_parms[3].info[i + 1] != dtmf_digit_map[j].character)
						   || ((dtmf_digit_map[j].send_mask & mask) == 0)))
					{
						j++;
					}
					i++;
				}
				if (j == DTMF_DIGIT_MAP_ENTRIES)
				{
					dbug(1, dprintf("[%06lx] %s,%d: Incorrect DTMF digit %02x",
							UnMapId(Id), (char *)(FILE_), __LINE__, dtmf_parms[3].info[i]));
					PUT_WORD(&result[1], DTMF_INCORRECT_DIGIT);
					break;
				}
				if (plci->dtmf_send_requests >= ARRAY_SIZE(plci->dtmf_msg_number_queue))
				{
					dbug(1, dprintf("[%06lx] %s,%d: DTMF request overrun",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_STATE;
					break;
				}
				api_save_msg(dtmf_parms, "wwws", &plci->saved_msg);
				start_internal_command(Id, plci, dtmf_command);
				return (false);

			default:
				dbug(1, dprintf("[%06lx] %s,%d: DTMF unknown request %04x",
						UnMapId(Id), (char *)(FILE_), __LINE__, plci->dtmf_cmd));
				PUT_WORD(&result[1], DTMF_UNKNOWN_REQUEST);
			}
		}
	}
	sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
	      "wws", Info, SELECTOR_DTMF, result);
	return (false);
}


static void dtmf_confirmation(dword Id, PLCI *plci)
{
	word i;
	byte result[4];

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_confirmation",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	result[0] = 2;
	PUT_WORD(&result[1], DTMF_SUCCESS);
	if (plci->dtmf_send_requests != 0)
	{
		sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->dtmf_msg_number_queue[0],
		      "wws", GOOD, SELECTOR_DTMF, result);
		(plci->dtmf_send_requests)--;
		for (i = 0; i < plci->dtmf_send_requests; i++)
			plci->dtmf_msg_number_queue[i] = plci->dtmf_msg_number_queue[i + 1];
	}
}


static void dtmf_indication(dword Id, PLCI *plci, byte *msg, word length)
{
	word i, j, n;

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_indication",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	n = 0;
	for (i = 1; i < length; i++)
	{
		j = 0;
		while ((j < DTMF_DIGIT_MAP_ENTRIES)
		       && ((msg[i] != dtmf_digit_map[j].code)
			   || ((dtmf_digit_map[j].listen_mask & plci->dtmf_rec_active) == 0)))
		{
			j++;
		}
		if (j < DTMF_DIGIT_MAP_ENTRIES)
		{

			if ((dtmf_digit_map[j].listen_mask & DTMF_TONE_LISTEN_ACTIVE_FLAG)
			    && (plci->tone_last_indication_code == DTMF_SIGNAL_NO_TONE)
			    && (dtmf_digit_map[j].character != DTMF_SIGNAL_UNIDENTIFIED_TONE))
			{
				if (n + 1 == i)
				{
					for (i = length; i > n + 1; i--)
						msg[i] = msg[i - 1];
					length++;
					i++;
				}
				msg[++n] = DTMF_SIGNAL_UNIDENTIFIED_TONE;
			}
			plci->tone_last_indication_code = dtmf_digit_map[j].character;

			msg[++n] = dtmf_digit_map[j].character;
		}
	}
	if (n != 0)
	{
		msg[0] = (byte) n;
		sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "wS", SELECTOR_DTMF, msg);
	}
}


/*------------------------------------------------------------------*/
/* DTMF parameters                                                  */
/*------------------------------------------------------------------*/

static void dtmf_parameter_write(PLCI *plci)
{
	word i;
	byte parameter_buffer[DTMF_PARAMETER_BUFFER_SIZE + 2];

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_write",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	parameter_buffer[0] = plci->dtmf_parameter_length + 1;
	parameter_buffer[1] = DSP_CTRL_SET_DTMF_PARAMETERS;
	for (i = 0; i < plci->dtmf_parameter_length; i++)
		parameter_buffer[2 + i] = plci->dtmf_parameter_buffer[i];
	add_p(plci, FTY, parameter_buffer);
	sig_req(plci, TEL_CTRL, 0);
	send_req(plci);
}


static void dtmf_parameter_clear_config(PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_clear_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	plci->dtmf_parameter_length = 0;
}


static void dtmf_parameter_prepare_switch(dword Id, PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_prepare_switch",
			UnMapId(Id), (char *)(FILE_), __LINE__));

}


static word dtmf_parameter_save_config(dword Id, PLCI *plci, byte Rc)
{

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_save_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	return (GOOD);
}


static word dtmf_parameter_restore_config(dword Id, PLCI *plci, byte Rc)
{
	word Info;

	dbug(1, dprintf("[%06lx] %s,%d: dtmf_parameter_restore_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	Info = GOOD;
	if ((plci->B1_facilities & B1_FACILITY_DTMFR)
	    && (plci->dtmf_parameter_length != 0))
	{
		switch (plci->adjust_b_state)
		{
		case ADJUST_B_RESTORE_DTMF_PARAMETER_1:
			plci->internal_command = plci->adjust_b_command;
			if (plci->sig_req)
			{
				plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
				break;
			}
			dtmf_parameter_write(plci);
			plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_2;
			break;
		case ADJUST_B_RESTORE_DTMF_PARAMETER_2:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Restore DTMF parameters failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _WRONG_STATE;
				break;
			}
			break;
		}
	}
	return (Info);
}


/*------------------------------------------------------------------*/
/* Line interconnect facilities                                     */
/*------------------------------------------------------------------*/


LI_CONFIG   *li_config_table;
word li_total_channels;


/*------------------------------------------------------------------*/
/* translate a CHI information element to a channel number          */
/* returns 0xff - any channel                                       */
/*         0xfe - chi wrong coding                                  */
/*         0xfd - D-channel                                         */
/*         0x00 - no channel                                        */
/*         else channel number / PRI: timeslot                      */
/* if channels is provided we accept more than one channel.         */
/*------------------------------------------------------------------*/

static byte chi_to_channel(byte *chi, dword *pchannelmap)
{
	int p;
	int i;
	dword map;
	byte excl;
	byte ofs;
	byte ch;

	if (pchannelmap) *pchannelmap = 0;
	if (!chi[0]) return 0xff;
	excl = 0;

	if (chi[1] & 0x20) {
		if (chi[0] == 1 && chi[1] == 0xac) return 0xfd; /* exclusive d-channel */
		for (i = 1; i < chi[0] && !(chi[i] & 0x80); i++);
		if (i == chi[0] || !(chi[i] & 0x80)) return 0xfe;
		if ((chi[1] | 0xc8) != 0xe9) return 0xfe;
		if (chi[1] & 0x08) excl = 0x40;

		/* int. id present */
		if (chi[1] & 0x40) {
			p = i + 1;
			for (i = p; i < chi[0] && !(chi[i] & 0x80); i++);
			if (i == chi[0] || !(chi[i] & 0x80)) return 0xfe;
		}

		/* coding standard, Number/Map, Channel Type */
		p = i + 1;
		for (i = p; i < chi[0] && !(chi[i] & 0x80); i++);
		if (i == chi[0] || !(chi[i] & 0x80)) return 0xfe;
		if ((chi[p] | 0xd0) != 0xd3) return 0xfe;

		/* Number/Map */
		if (chi[p] & 0x10) {

			/* map */
			if ((chi[0] - p) == 4) ofs = 0;
			else if ((chi[0] - p) == 3) ofs = 1;
			else return 0xfe;
			ch = 0;
			map = 0;
			for (i = 0; i < 4 && p < chi[0]; i++) {
				p++;
				ch += 8;
				map <<= 8;
				if (chi[p]) {
					for (ch = 0; !(chi[p] & (1 << ch)); ch++);
					map |= chi[p];
				}
			}
			ch += ofs;
			map <<= ofs;
		}
		else {

			/* number */
			p = i + 1;
			ch = chi[p] & 0x3f;
			if (pchannelmap) {
				if ((byte)(chi[0] - p) > 30) return 0xfe;
				map = 0;
				for (i = p; i <= chi[0]; i++) {
					if ((chi[i] & 0x7f) > 31) return 0xfe;
					map |= (1L << (chi[i] & 0x7f));
				}
			}
			else {
				if (p != chi[0]) return 0xfe;
				if (ch > 31) return 0xfe;
				map = (1L << ch);
			}
			if (chi[p] & 0x40) return 0xfe;
		}
		if (pchannelmap) *pchannelmap = map;
		else if (map != ((dword)(1L << ch))) return 0xfe;
		return (byte)(excl | ch);
	}
	else {  /* not PRI */
		for (i = 1; i < chi[0] && !(chi[i] & 0x80); i++);
		if (i != chi[0] || !(chi[i] & 0x80)) return 0xfe;
		if (chi[1] & 0x08) excl = 0x40;

		switch (chi[1] | 0x98) {
		case 0x98: return 0;
		case 0x99:
			if (pchannelmap) *pchannelmap = 2;
			return excl | 1;
		case 0x9a:
			if (pchannelmap) *pchannelmap = 4;
			return excl | 2;
		case 0x9b: return 0xff;
		case 0x9c: return 0xfd; /* d-ch */
		default: return 0xfe;
		}
	}
}


static void mixer_set_bchannel_id_esc(PLCI *plci, byte bchannel_id)
{
	DIVA_CAPI_ADAPTER *a;
	PLCI *splci;
	byte old_id;

	a = plci->adapter;
	old_id = plci->li_bchannel_id;
	if (a->li_pri)
	{
		if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
			li_config_table[a->li_base + (old_id - 1)].plci = NULL;
		plci->li_bchannel_id = (bchannel_id & 0x1f) + 1;
		if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
			li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
	}
	else
	{
		if (((bchannel_id & 0x03) == 1) || ((bchannel_id & 0x03) == 2))
		{
			if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
				li_config_table[a->li_base + (old_id - 1)].plci = NULL;
			plci->li_bchannel_id = bchannel_id & 0x03;
			if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
			{
				splci = a->AdvSignalPLCI;
				if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
				{
					if ((splci->li_bchannel_id != 0)
					    && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
					{
						li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
					}
					splci->li_bchannel_id = 3 - plci->li_bchannel_id;
					li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
					dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id_esc %d",
							(dword)((splci->Id << 8) | UnMapController(splci->adapter->Id)),
							(char *)(FILE_), __LINE__, splci->li_bchannel_id));
				}
			}
			if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
				li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
		}
	}
	if ((old_id == 0) && (plci->li_bchannel_id != 0)
	    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
	{
		mixer_clear_config(plci);
	}
	dbug(1, dprintf("[%06lx] %s,%d: mixer_set_bchannel_id_esc %d %d",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, bchannel_id, plci->li_bchannel_id));
}


static void mixer_set_bchannel_id(PLCI *plci, byte *chi)
{
	DIVA_CAPI_ADAPTER *a;
	PLCI *splci;
	byte ch, old_id;

	a = plci->adapter;
	old_id = plci->li_bchannel_id;
	ch = chi_to_channel(chi, NULL);
	if (!(ch & 0x80))
	{
		if (a->li_pri)
		{
			if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
				li_config_table[a->li_base + (old_id - 1)].plci = NULL;
			plci->li_bchannel_id = (ch & 0x1f) + 1;
			if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
				li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
		}
		else
		{
			if (((ch & 0x1f) == 1) || ((ch & 0x1f) == 2))
			{
				if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
					li_config_table[a->li_base + (old_id - 1)].plci = NULL;
				plci->li_bchannel_id = ch & 0x1f;
				if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
				{
					splci = a->AdvSignalPLCI;
					if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
					{
						if ((splci->li_bchannel_id != 0)
						    && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
						{
							li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
						}
						splci->li_bchannel_id = 3 - plci->li_bchannel_id;
						li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
						dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
								(dword)((splci->Id << 8) | UnMapController(splci->adapter->Id)),
								(char *)(FILE_), __LINE__, splci->li_bchannel_id));
					}
				}
				if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
					li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
			}
		}
	}
	if ((old_id == 0) && (plci->li_bchannel_id != 0)
	    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
	{
		mixer_clear_config(plci);
	}
	dbug(1, dprintf("[%06lx] %s,%d: mixer_set_bchannel_id %02x %d",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, ch, plci->li_bchannel_id));
}


#define MIXER_MAX_DUMP_CHANNELS 34

static void mixer_calculate_coefs(DIVA_CAPI_ADAPTER *a)
{
	word n, i, j;
	char *p;
	char hex_line[2 * MIXER_MAX_DUMP_CHANNELS + MIXER_MAX_DUMP_CHANNELS / 8 + 4];

	dbug(1, dprintf("[%06lx] %s,%d: mixer_calculate_coefs",
			(dword)(UnMapController(a->Id)), (char *)(FILE_), __LINE__));

	for (i = 0; i < li_total_channels; i++)
	{
		li_config_table[i].channel &= LI_CHANNEL_ADDRESSES_SET;
		if (li_config_table[i].chflags != 0)
			li_config_table[i].channel |= LI_CHANNEL_INVOLVED;
		else
		{
			for (j = 0; j < li_total_channels; j++)
			{
				if (((li_config_table[i].flag_table[j]) != 0)
				    || ((li_config_table[j].flag_table[i]) != 0))
				{
					li_config_table[i].channel |= LI_CHANNEL_INVOLVED;
				}
				if (((li_config_table[i].flag_table[j] & LI_FLAG_CONFERENCE) != 0)
				    || ((li_config_table[j].flag_table[i] & LI_FLAG_CONFERENCE) != 0))
				{
					li_config_table[i].channel |= LI_CHANNEL_CONFERENCE;
				}
			}
		}
	}
	for (i = 0; i < li_total_channels; i++)
	{
		for (j = 0; j < li_total_channels; j++)
		{
			li_config_table[i].coef_table[j] &= ~(LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC);
			if (li_config_table[i].flag_table[j] & LI_FLAG_CONFERENCE)
				li_config_table[i].coef_table[j] |= LI_COEF_CH_CH;
		}
	}
	for (n = 0; n < li_total_channels; n++)
	{
		if (li_config_table[n].channel & LI_CHANNEL_CONFERENCE)
		{
			for (i = 0; i < li_total_channels; i++)
			{
				if (li_config_table[i].channel & LI_CHANNEL_CONFERENCE)
				{
					for (j = 0; j < li_total_channels; j++)
					{
						li_config_table[i].coef_table[j] |=
							li_config_table[i].coef_table[n] & li_config_table[n].coef_table[j];
					}
				}
			}
		}
	}
	for (i = 0; i < li_total_channels; i++)
	{
		if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
		{
			li_config_table[i].coef_table[i] &= ~LI_COEF_CH_CH;
			for (j = 0; j < li_total_channels; j++)
			{
				if (li_config_table[i].coef_table[j] & LI_COEF_CH_CH)
					li_config_table[i].flag_table[j] |= LI_FLAG_CONFERENCE;
			}
			if (li_config_table[i].flag_table[i] & LI_FLAG_CONFERENCE)
				li_config_table[i].coef_table[i] |= LI_COEF_CH_CH;
		}
	}
	for (i = 0; i < li_total_channels; i++)
	{
		if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
		{
			for (j = 0; j < li_total_channels; j++)
			{
				if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
					li_config_table[i].coef_table[j] |= LI_COEF_CH_CH;
				if (li_config_table[i].flag_table[j] & LI_FLAG_MONITOR)
					li_config_table[i].coef_table[j] |= LI_COEF_CH_PC;
				if (li_config_table[i].flag_table[j] & LI_FLAG_MIX)
					li_config_table[i].coef_table[j] |= LI_COEF_PC_CH;
				if (li_config_table[i].flag_table[j] & LI_FLAG_PCCONNECT)
					li_config_table[i].coef_table[j] |= LI_COEF_PC_PC;
			}
			if (li_config_table[i].chflags & LI_CHFLAG_MONITOR)
			{
				for (j = 0; j < li_total_channels; j++)
				{
					if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
					{
						li_config_table[i].coef_table[j] |= LI_COEF_CH_PC;
						if (li_config_table[j].chflags & LI_CHFLAG_MIX)
							li_config_table[i].coef_table[j] |= LI_COEF_PC_CH | LI_COEF_PC_PC;
					}
				}
			}
			if (li_config_table[i].chflags & LI_CHFLAG_MIX)
			{
				for (j = 0; j < li_total_channels; j++)
				{
					if (li_config_table[j].flag_table[i] & LI_FLAG_INTERCONNECT)
						li_config_table[j].coef_table[i] |= LI_COEF_PC_CH;
				}
			}
			if (li_config_table[i].chflags & LI_CHFLAG_LOOP)
			{
				for (j = 0; j < li_total_channels; j++)
				{
					if (li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
					{
						for (n = 0; n < li_total_channels; n++)
						{
							if (li_config_table[n].flag_table[i] & LI_FLAG_INTERCONNECT)
							{
								li_config_table[n].coef_table[j] |= LI_COEF_CH_CH;
								if (li_config_table[j].chflags & LI_CHFLAG_MIX)
								{
									li_config_table[n].coef_table[j] |= LI_COEF_PC_CH;
									if (li_config_table[n].chflags & LI_CHFLAG_MONITOR)
										li_config_table[n].coef_table[j] |= LI_COEF_CH_PC | LI_COEF_PC_PC;
								}
								else if (li_config_table[n].chflags & LI_CHFLAG_MONITOR)
									li_config_table[n].coef_table[j] |= LI_COEF_CH_PC;
							}
						}
					}
				}
			}
		}
	}
	for (i = 0; i < li_total_channels; i++)
	{
		if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
		{
			if (li_config_table[i].chflags & (LI_CHFLAG_MONITOR | LI_CHFLAG_MIX | LI_CHFLAG_LOOP))
				li_config_table[i].channel |= LI_CHANNEL_ACTIVE;
			if (li_config_table[i].chflags & LI_CHFLAG_MONITOR)
				li_config_table[i].channel |= LI_CHANNEL_RX_DATA;
			if (li_config_table[i].chflags & LI_CHFLAG_MIX)
				li_config_table[i].channel |= LI_CHANNEL_TX_DATA;
			for (j = 0; j < li_total_channels; j++)
			{
				if ((li_config_table[i].flag_table[j] &
				     (LI_FLAG_INTERCONNECT | LI_FLAG_PCCONNECT | LI_FLAG_CONFERENCE | LI_FLAG_MONITOR))
				    || (li_config_table[j].flag_table[i] &
					(LI_FLAG_INTERCONNECT | LI_FLAG_PCCONNECT | LI_FLAG_CONFERENCE | LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX)))
				{
					li_config_table[i].channel |= LI_CHANNEL_ACTIVE;
				}
				if (li_config_table[i].flag_table[j] & (LI_FLAG_PCCONNECT | LI_FLAG_MONITOR))
					li_config_table[i].channel |= LI_CHANNEL_RX_DATA;
				if (li_config_table[j].flag_table[i] & (LI_FLAG_PCCONNECT | LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX))
					li_config_table[i].channel |= LI_CHANNEL_TX_DATA;
			}
			if (!(li_config_table[i].channel & LI_CHANNEL_ACTIVE))
			{
				li_config_table[i].coef_table[i] |= LI_COEF_PC_CH | LI_COEF_CH_PC;
				li_config_table[i].channel |= LI_CHANNEL_TX_DATA | LI_CHANNEL_RX_DATA;
			}
		}
	}
	for (i = 0; i < li_total_channels; i++)
	{
		if (li_config_table[i].channel & LI_CHANNEL_INVOLVED)
		{
			j = 0;
			while ((j < li_total_channels) && !(li_config_table[i].flag_table[j] & LI_FLAG_ANNOUNCEMENT))
				j++;
			if (j < li_total_channels)
			{
				for (j = 0; j < li_total_channels; j++)
				{
					li_config_table[i].coef_table[j] &= ~(LI_COEF_CH_CH | LI_COEF_PC_CH);
					if (li_config_table[i].flag_table[j] & LI_FLAG_ANNOUNCEMENT)
						li_config_table[i].coef_table[j] |= LI_COEF_PC_CH;
				}
			}
		}
	}
	n = li_total_channels;
	if (n > MIXER_MAX_DUMP_CHANNELS)
		n = MIXER_MAX_DUMP_CHANNELS;

	p = hex_line;
	for (j = 0; j < n; j++)
	{
		if ((j & 0x7) == 0)
			*(p++) = ' ';
		p = hex_byte_pack(p, li_config_table[j].curchnl);
	}
	*p = '\0';
	dbug(1, dprintf("[%06lx] CURRENT %s",
			(dword)(UnMapController(a->Id)), (char *)hex_line));
	p = hex_line;
	for (j = 0; j < n; j++)
	{
		if ((j & 0x7) == 0)
			*(p++) = ' ';
		p = hex_byte_pack(p, li_config_table[j].channel);
	}
	*p = '\0';
	dbug(1, dprintf("[%06lx] CHANNEL %s",
			(dword)(UnMapController(a->Id)), (char *)hex_line));
	p = hex_line;
	for (j = 0; j < n; j++)
	{
		if ((j & 0x7) == 0)
			*(p++) = ' ';
		p = hex_byte_pack(p, li_config_table[j].chflags);
	}
	*p = '\0';
	dbug(1, dprintf("[%06lx] CHFLAG  %s",
			(dword)(UnMapController(a->Id)), (char *)hex_line));
	for (i = 0; i < n; i++)
	{
		p = hex_line;
		for (j = 0; j < n; j++)
		{
			if ((j & 0x7) == 0)
				*(p++) = ' ';
			p = hex_byte_pack(p, li_config_table[i].flag_table[j]);
		}
		*p = '\0';
		dbug(1, dprintf("[%06lx] FLAG[%02x]%s",
				(dword)(UnMapController(a->Id)), i, (char *)hex_line));
	}
	for (i = 0; i < n; i++)
	{
		p = hex_line;
		for (j = 0; j < n; j++)
		{
			if ((j & 0x7) == 0)
				*(p++) = ' ';
			p = hex_byte_pack(p, li_config_table[i].coef_table[j]);
		}
		*p = '\0';
		dbug(1, dprintf("[%06lx] COEF[%02x]%s",
				(dword)(UnMapController(a->Id)), i, (char *)hex_line));
	}
}


static struct
{
	byte mask;
	byte line_flags;
} mixer_write_prog_pri[] =
{
	{ LI_COEF_CH_CH, 0 },
	{ LI_COEF_CH_PC, MIXER_COEF_LINE_TO_PC_FLAG },
	{ LI_COEF_PC_CH, MIXER_COEF_LINE_FROM_PC_FLAG },
	{ LI_COEF_PC_PC, MIXER_COEF_LINE_TO_PC_FLAG | MIXER_COEF_LINE_FROM_PC_FLAG }
};

static struct
{
	byte from_ch;
	byte to_ch;
	byte mask;
	byte xconnect_override;
} mixer_write_prog_bri[] =
{
	{ 0, 0, LI_COEF_CH_CH, 0x01 },  /* B      to B      */
	{ 1, 0, LI_COEF_CH_CH, 0x01 },  /* Alt B  to B      */
	{ 0, 0, LI_COEF_PC_CH, 0x80 },  /* PC     to B      */
	{ 1, 0, LI_COEF_PC_CH, 0x01 },  /* Alt PC to B      */
	{ 2, 0, LI_COEF_CH_CH, 0x00 },  /* IC     to B      */
	{ 3, 0, LI_COEF_CH_CH, 0x00 },  /* Alt IC to B      */
	{ 0, 0, LI_COEF_CH_PC, 0x80 },  /* B      to PC     */
	{ 1, 0, LI_COEF_CH_PC, 0x01 },  /* Alt B  to PC     */
	{ 0, 0, LI_COEF_PC_PC, 0x01 },  /* PC     to PC     */
	{ 1, 0, LI_COEF_PC_PC, 0x01 },  /* Alt PC to PC     */
	{ 2, 0, LI_COEF_CH_PC, 0x00 },  /* IC     to PC     */
	{ 3, 0, LI_COEF_CH_PC, 0x00 },  /* Alt IC to PC     */
	{ 0, 2, LI_COEF_CH_CH, 0x00 },  /* B      to IC     */
	{ 1, 2, LI_COEF_CH_CH, 0x00 },  /* Alt B  to IC     */
	{ 0, 2, LI_COEF_PC_CH, 0x00 },  /* PC     to IC     */
	{ 1, 2, LI_COEF_PC_CH, 0x00 },  /* Alt PC to IC     */
	{ 2, 2, LI_COEF_CH_CH, 0x00 },  /* IC     to IC     */
	{ 3, 2, LI_COEF_CH_CH, 0x00 },  /* Alt IC to IC     */
	{ 1, 1, LI_COEF_CH_CH, 0x01 },  /* Alt B  to Alt B  */
	{ 0, 1, LI_COEF_CH_CH, 0x01 },  /* B      to Alt B  */
	{ 1, 1, LI_COEF_PC_CH, 0x80 },  /* Alt PC to Alt B  */
	{ 0, 1, LI_COEF_PC_CH, 0x01 },  /* PC     to Alt B  */
	{ 3, 1, LI_COEF_CH_CH, 0x00 },  /* Alt IC to Alt B  */
	{ 2, 1, LI_COEF_CH_CH, 0x00 },  /* IC     to Alt B  */
	{ 1, 1, LI_COEF_CH_PC, 0x80 },  /* Alt B  to Alt PC */
	{ 0, 1, LI_COEF_CH_PC, 0x01 },  /* B      to Alt PC */
	{ 1, 1, LI_COEF_PC_PC, 0x01 },  /* Alt PC to Alt PC */
	{ 0, 1, LI_COEF_PC_PC, 0x01 },  /* PC     to Alt PC */
	{ 3, 1, LI_COEF_CH_PC, 0x00 },  /* Alt IC to Alt PC */
	{ 2, 1, LI_COEF_CH_PC, 0x00 },  /* IC     to Alt PC */
	{ 1, 3, LI_COEF_CH_CH, 0x00 },  /* Alt B  to Alt IC */
	{ 0, 3, LI_COEF_CH_CH, 0x00 },  /* B      to Alt IC */
	{ 1, 3, LI_COEF_PC_CH, 0x00 },  /* Alt PC to Alt IC */
	{ 0, 3, LI_COEF_PC_CH, 0x00 },  /* PC     to Alt IC */
	{ 3, 3, LI_COEF_CH_CH, 0x00 },  /* Alt IC to Alt IC */
	{ 2, 3, LI_COEF_CH_CH, 0x00 }   /* IC     to Alt IC */
};

static byte mixer_swapped_index_bri[] =
{
	18,  /* B      to B      */
	19,  /* Alt B  to B      */
	20,  /* PC     to B      */
	21,  /* Alt PC to B      */
	22,  /* IC     to B      */
	23,  /* Alt IC to B      */
	24,  /* B      to PC     */
	25,  /* Alt B  to PC     */
	26,  /* PC     to PC     */
	27,  /* Alt PC to PC     */
	28,  /* IC     to PC     */
	29,  /* Alt IC to PC     */
	30,  /* B      to IC     */
	31,  /* Alt B  to IC     */
	32,  /* PC     to IC     */
	33,  /* Alt PC to IC     */
	34,  /* IC     to IC     */
	35,  /* Alt IC to IC     */
	0,   /* Alt B  to Alt B  */
	1,   /* B      to Alt B  */
	2,   /* Alt PC to Alt B  */
	3,   /* PC     to Alt B  */
	4,   /* Alt IC to Alt B  */
	5,   /* IC     to Alt B  */
	6,   /* Alt B  to Alt PC */
	7,   /* B      to Alt PC */
	8,   /* Alt PC to Alt PC */
	9,   /* PC     to Alt PC */
	10,  /* Alt IC to Alt PC */
	11,  /* IC     to Alt PC */
	12,  /* Alt B  to Alt IC */
	13,  /* B      to Alt IC */
	14,  /* Alt PC to Alt IC */
	15,  /* PC     to Alt IC */
	16,  /* Alt IC to Alt IC */
	17   /* IC     to Alt IC */
};

static struct
{
	byte mask;
	byte from_pc;
	byte to_pc;
} xconnect_write_prog[] =
{
	{ LI_COEF_CH_CH, false, false },
	{ LI_COEF_CH_PC, false, true },
	{ LI_COEF_PC_CH, true, false },
	{ LI_COEF_PC_PC, true, true }
};


static void xconnect_query_addresses(PLCI *plci)
{
	DIVA_CAPI_ADAPTER *a;
	word w, ch;
	byte *p;

	dbug(1, dprintf("[%06lx] %s,%d: xconnect_query_addresses",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	a = plci->adapter;
	if (a->li_pri && ((plci->li_bchannel_id == 0)
			  || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci)))
	{
		dbug(1, dprintf("[%06x] %s,%d: Channel id wiped out",
				(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
				(char *)(FILE_), __LINE__));
		return;
	}
	p = plci->internal_req_buffer;
	ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
	*(p++) = UDATA_REQUEST_XCONNECT_FROM;
	w = ch;
	*(p++) = (byte) w;
	*(p++) = (byte)(w >> 8);
	w = ch | XCONNECT_CHANNEL_PORT_PC;
	*(p++) = (byte) w;
	*(p++) = (byte)(w >> 8);
	plci->NData[0].P = plci->internal_req_buffer;
	plci->NData[0].PLength = p - plci->internal_req_buffer;
	plci->NL.X = plci->NData;
	plci->NL.ReqCh = 0;
	plci->NL.Req = plci->nl_req = (byte) N_UDATA;
	plci->adapter->request(&plci->NL);
}


static void xconnect_write_coefs(PLCI *plci, word internal_command)
{

	dbug(1, dprintf("[%06lx] %s,%d: xconnect_write_coefs %04x",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, internal_command));

	plci->li_write_command = internal_command;
	plci->li_write_channel = 0;
}


static byte xconnect_write_coefs_process(dword Id, PLCI *plci, byte Rc)
{
	DIVA_CAPI_ADAPTER *a;
	word w, n, i, j, r, s, to_ch;
	dword d;
	byte *p;
	struct xconnect_transfer_address_s   *transfer_address;
	byte ch_map[MIXER_CHANNELS_BRI];

	dbug(1, dprintf("[%06x] %s,%d: xconnect_write_coefs_process %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->li_write_channel));

	a = plci->adapter;
	if ((plci->li_bchannel_id == 0)
	    || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
	{
		dbug(1, dprintf("[%06x] %s,%d: Channel id wiped out",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		return (true);
	}
	i = a->li_base + (plci->li_bchannel_id - 1);
	j = plci->li_write_channel;
	p = plci->internal_req_buffer;
	if (j != 0)
	{
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: LI write coefs failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			return (false);
		}
	}
	if (li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
	{
		r = 0;
		s = 0;
		if (j < li_total_channels)
		{
			if (li_config_table[i].channel & LI_CHANNEL_ADDRESSES_SET)
			{
				s = ((li_config_table[i].send_b.card_address.low | li_config_table[i].send_b.card_address.high) ?
				     (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_PC | LI_COEF_PC_PC)) &
					((li_config_table[i].send_pc.card_address.low | li_config_table[i].send_pc.card_address.high) ?
					 (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_PC_CH));
			}
			r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
			while ((j < li_total_channels)
			       && ((r == 0)
				   || (!(li_config_table[j].channel & LI_CHANNEL_ADDRESSES_SET))
				   || (!li_config_table[j].adapter->li_pri
				       && (j >= li_config_table[j].adapter->li_base + MIXER_BCHANNELS_BRI))
				   || (((li_config_table[j].send_b.card_address.low != li_config_table[i].send_b.card_address.low)
					|| (li_config_table[j].send_b.card_address.high != li_config_table[i].send_b.card_address.high))
				       && (!(a->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)
					   || !(li_config_table[j].adapter->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)))
				   || ((li_config_table[j].adapter->li_base != a->li_base)
				       && !(r & s &
					    ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
					     (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
					    ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
					     (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC))))))
			{
				j++;
				if (j < li_total_channels)
					r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
			}
		}
		if (j < li_total_channels)
		{
			plci->internal_command = plci->li_write_command;
			if (plci_nl_busy(plci))
				return (true);
			to_ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
			*(p++) = UDATA_REQUEST_XCONNECT_TO;
			do
			{
				if (li_config_table[j].adapter->li_base != a->li_base)
				{
					r &= s &
						((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
						 (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
						((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
						 (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC));
				}
				n = 0;
				do
				{
					if (r & xconnect_write_prog[n].mask)
					{
						if (xconnect_write_prog[n].from_pc)
							transfer_address = &(li_config_table[j].send_pc);
						else
							transfer_address = &(li_config_table[j].send_b);
						d = transfer_address->card_address.low;
						*(p++) = (byte) d;
						*(p++) = (byte)(d >> 8);
						*(p++) = (byte)(d >> 16);
						*(p++) = (byte)(d >> 24);
						d = transfer_address->card_address.high;
						*(p++) = (byte) d;
						*(p++) = (byte)(d >> 8);
						*(p++) = (byte)(d >> 16);
						*(p++) = (byte)(d >> 24);
						d = transfer_address->offset;
						*(p++) = (byte) d;
						*(p++) = (byte)(d >> 8);
						*(p++) = (byte)(d >> 16);
						*(p++) = (byte)(d >> 24);
						w = xconnect_write_prog[n].to_pc ? to_ch | XCONNECT_CHANNEL_PORT_PC : to_ch;
						*(p++) = (byte) w;
						*(p++) = (byte)(w >> 8);
						w = ((li_config_table[i].coef_table[j] & xconnect_write_prog[n].mask) == 0) ? 0x01 :
							(li_config_table[i].adapter->u_law ?
							 (li_config_table[j].adapter->u_law ? 0x80 : 0x86) :
							 (li_config_table[j].adapter->u_law ? 0x7a : 0x80));
						*(p++) = (byte) w;
						*(p++) = (byte) 0;
						li_config_table[i].coef_table[j] ^= xconnect_write_prog[n].mask << 4;
					}
					n++;
				} while ((n < ARRAY_SIZE(xconnect_write_prog))
					 && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
				if (n == ARRAY_SIZE(xconnect_write_prog))
				{
					do
					{
						j++;
						if (j < li_total_channels)
							r = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
					} while ((j < li_total_channels)
						 && ((r == 0)
						     || (!(li_config_table[j].channel & LI_CHANNEL_ADDRESSES_SET))
						     || (!li_config_table[j].adapter->li_pri
							 && (j >= li_config_table[j].adapter->li_base + MIXER_BCHANNELS_BRI))
						     || (((li_config_table[j].send_b.card_address.low != li_config_table[i].send_b.card_address.low)
							  || (li_config_table[j].send_b.card_address.high != li_config_table[i].send_b.card_address.high))
							 && (!(a->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)
							     || !(li_config_table[j].adapter->manufacturer_features & MANUFACTURER_FEATURE_DMACONNECT)))
						     || ((li_config_table[j].adapter->li_base != a->li_base)
							 && !(r & s &
							      ((li_config_table[j].send_b.card_address.low | li_config_table[j].send_b.card_address.high) ?
							       (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_PC_CH | LI_COEF_PC_PC)) &
							      ((li_config_table[j].send_pc.card_address.low | li_config_table[j].send_pc.card_address.high) ?
							       (LI_COEF_CH_CH | LI_COEF_CH_PC | LI_COEF_PC_CH | LI_COEF_PC_PC) : (LI_COEF_CH_CH | LI_COEF_CH_PC))))));
				}
			} while ((j < li_total_channels)
				 && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
		}
		else if (j == li_total_channels)
		{
			plci->internal_command = plci->li_write_command;
			if (plci_nl_busy(plci))
				return (true);
			if (a->li_pri)
			{
				*(p++) = UDATA_REQUEST_SET_MIXER_COEFS_PRI_SYNC;
				w = 0;
				if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
					w |= MIXER_FEATURE_ENABLE_TX_DATA;
				if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
					w |= MIXER_FEATURE_ENABLE_RX_DATA;
				*(p++) = (byte) w;
				*(p++) = (byte)(w >> 8);
			}
			else
			{
				*(p++) = UDATA_REQUEST_SET_MIXER_COEFS_BRI;
				w = 0;
				if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
				    && (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length))
				{
					w = GET_WORD(a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
				}
				if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
					w |= MIXER_FEATURE_ENABLE_TX_DATA;
				if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
					w |= MIXER_FEATURE_ENABLE_RX_DATA;
				*(p++) = (byte) w;
				*(p++) = (byte)(w >> 8);
				for (j = 0; j < sizeof(ch_map); j += 2)
				{
					if (plci->li_bchannel_id == 2)
					{
						ch_map[j] = (byte)(j + 1);
						ch_map[j + 1] = (byte) j;
					}
					else
					{
						ch_map[j] = (byte) j;
						ch_map[j + 1] = (byte)(j + 1);
					}
				}
				for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
				{
					i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
					j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
					if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
					{
						*p = (mixer_write_prog_bri[n].xconnect_override != 0) ?
							mixer_write_prog_bri[n].xconnect_override :
							((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
						if ((i >= a->li_base + MIXER_BCHANNELS_BRI) || (j >= a->li_base + MIXER_BCHANNELS_BRI))
						{
							w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
							li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
						}
					}
					else
					{
						*p = 0x00;
						if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI->tel == ADV_VOICE))
						{
							w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
							if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w < a->adv_voice_coef_length)
								*p = a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w];
						}
					}
					p++;
				}
			}
			j = li_total_channels + 1;
		}
	}
	else
	{
		if (j <= li_total_channels)
		{
			plci->internal_command = plci->li_write_command;
			if (plci_nl_busy(plci))
				return (true);
			if (j < a->li_base)
				j = a->li_base;
			if (a->li_pri)
			{
				*(p++) = UDATA_REQUEST_SET_MIXER_COEFS_PRI_SYNC;
				w = 0;
				if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
					w |= MIXER_FEATURE_ENABLE_TX_DATA;
				if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
					w |= MIXER_FEATURE_ENABLE_RX_DATA;
				*(p++) = (byte) w;
				*(p++) = (byte)(w >> 8);
				for (n = 0; n < ARRAY_SIZE(mixer_write_prog_pri); n++)
				{
					*(p++) = (byte)((plci->li_bchannel_id - 1) | mixer_write_prog_pri[n].line_flags);
					for (j = a->li_base; j < a->li_base + MIXER_CHANNELS_PRI; j++)
					{
						w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
						if (w & mixer_write_prog_pri[n].mask)
						{
							*(p++) = (li_config_table[i].coef_table[j] & mixer_write_prog_pri[n].mask) ? 0x80 : 0x01;
							li_config_table[i].coef_table[j] ^= mixer_write_prog_pri[n].mask << 4;
						}
						else
							*(p++) = 0x00;
					}
					*(p++) = (byte)((plci->li_bchannel_id - 1) | MIXER_COEF_LINE_ROW_FLAG | mixer_write_prog_pri[n].line_flags);
					for (j = a->li_base; j < a->li_base + MIXER_CHANNELS_PRI; j++)
					{
						w = ((li_config_table[j].coef_table[i] & 0xf) ^ (li_config_table[j].coef_table[i] >> 4));
						if (w & mixer_write_prog_pri[n].mask)
						{
							*(p++) = (li_config_table[j].coef_table[i] & mixer_write_prog_pri[n].mask) ? 0x80 : 0x01;
							li_config_table[j].coef_table[i] ^= mixer_write_prog_pri[n].mask << 4;
						}
						else
							*(p++) = 0x00;
					}
				}
			}
			else
			{
				*(p++) = UDATA_REQUEST_SET_MIXER_COEFS_BRI;
				w = 0;
				if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
				    && (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length))
				{
					w = GET_WORD(a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
				}
				if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
					w |= MIXER_FEATURE_ENABLE_TX_DATA;
				if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
					w |= MIXER_FEATURE_ENABLE_RX_DATA;
				*(p++) = (byte) w;
				*(p++) = (byte)(w >> 8);
				for (j = 0; j < sizeof(ch_map); j += 2)
				{
					if (plci->li_bchannel_id == 2)
					{
						ch_map[j] = (byte)(j + 1);
						ch_map[j + 1] = (byte) j;
					}
					else
					{
						ch_map[j] = (byte) j;
						ch_map[j + 1] = (byte)(j + 1);
					}
				}
				for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
				{
					i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
					j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
					if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
					{
						*p = ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
						w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
						li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
					}
					else
					{
						*p = 0x00;
						if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI->tel == ADV_VOICE))
						{
							w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
							if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w < a->adv_voice_coef_length)
								*p = a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + w];
						}
					}
					p++;
				}
			}
			j = li_total_channels + 1;
		}
	}
	plci->li_write_channel = j;
	if (p != plci->internal_req_buffer)
	{
		plci->NData[0].P = plci->internal_req_buffer;
		plci->NData[0].PLength = p - plci->internal_req_buffer;
		plci->NL.X = plci->NData;
		plci->NL.ReqCh = 0;
		plci->NL.Req = plci->nl_req = (byte) N_UDATA;
		plci->adapter->request(&plci->NL);
	}
	return (true);
}


static void mixer_notify_update(PLCI *plci, byte others)
{
	DIVA_CAPI_ADAPTER *a;
	word i, w;
	PLCI *notify_plci;
	byte msg[sizeof(CAPI_MSG_HEADER) + 6];

	dbug(1, dprintf("[%06lx] %s,%d: mixer_notify_update %d",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, others));

	a = plci->adapter;
	if (a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED)
	{
		if (others)
			plci->li_notify_update = true;
		i = 0;
		do
		{
			notify_plci = NULL;
			if (others)
			{
				while ((i < li_total_channels) && (li_config_table[i].plci == NULL))
					i++;
				if (i < li_total_channels)
					notify_plci = li_config_table[i++].plci;
			}
			else
			{
				if ((plci->li_bchannel_id != 0)
				    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
				{
					notify_plci = plci;
				}
			}
			if ((notify_plci != NULL)
			    && !notify_plci->li_notify_update
			    && (notify_plci->appl != NULL)
			    && (notify_plci->State)
			    && notify_plci->NL.Id && !notify_plci->nl_remove_id)
			{
				notify_plci->li_notify_update = true;
				((CAPI_MSG *) msg)->header.length = 18;
				((CAPI_MSG *) msg)->header.appl_id = notify_plci->appl->Id;
				((CAPI_MSG *) msg)->header.command = _FACILITY_R;
				((CAPI_MSG *) msg)->header.number = 0;
				((CAPI_MSG *) msg)->header.controller = notify_plci->adapter->Id;
				((CAPI_MSG *) msg)->header.plci = notify_plci->Id;
				((CAPI_MSG *) msg)->header.ncci = 0;
				((CAPI_MSG *) msg)->info.facility_req.Selector = SELECTOR_LINE_INTERCONNECT;
				((CAPI_MSG *) msg)->info.facility_req.structs[0] = 3;
				((CAPI_MSG *) msg)->info.facility_req.structs[1] = LI_REQ_SILENT_UPDATE & 0xff;
				((CAPI_MSG *) msg)->info.facility_req.structs[2] = LI_REQ_SILENT_UPDATE >> 8;
				((CAPI_MSG *) msg)->info.facility_req.structs[3] = 0;
				w = api_put(notify_plci->appl, (CAPI_MSG *) msg);
				if (w != _QUEUE_FULL)
				{
					if (w != 0)
					{
						dbug(1, dprintf("[%06lx] %s,%d: Interconnect notify failed %06x %d",
								(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
								(char *)(FILE_), __LINE__,
								(dword)((notify_plci->Id << 8) | UnMapController(notify_plci->adapter->Id)), w));
					}
					notify_plci->li_notify_update = false;
				}
			}
		} while (others && (notify_plci != NULL));
		if (others)
			plci->li_notify_update = false;
	}
}


static void mixer_clear_config(PLCI *plci)
{
	DIVA_CAPI_ADAPTER *a;
	word i, j;

	dbug(1, dprintf("[%06lx] %s,%d: mixer_clear_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	plci->li_notify_update = false;
	plci->li_plci_b_write_pos = 0;
	plci->li_plci_b_read_pos = 0;
	plci->li_plci_b_req_pos = 0;
	a = plci->adapter;
	if ((plci->li_bchannel_id != 0)
	    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
	{
		i = a->li_base + (plci->li_bchannel_id - 1);
		li_config_table[i].curchnl = 0;
		li_config_table[i].channel = 0;
		li_config_table[i].chflags = 0;
		for (j = 0; j < li_total_channels; j++)
		{
			li_config_table[j].flag_table[i] = 0;
			li_config_table[i].flag_table[j] = 0;
			li_config_table[i].coef_table[j] = 0;
			li_config_table[j].coef_table[i] = 0;
		}
		if (!a->li_pri)
		{
			li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
			if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
			{
				i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
				li_config_table[i].curchnl = 0;
				li_config_table[i].channel = 0;
				li_config_table[i].chflags = 0;
				for (j = 0; j < li_total_channels; j++)
				{
					li_config_table[i].flag_table[j] = 0;
					li_config_table[j].flag_table[i] = 0;
					li_config_table[i].coef_table[j] = 0;
					li_config_table[j].coef_table[i] = 0;
				}
				if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
				{
					i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
					li_config_table[i].curchnl = 0;
					li_config_table[i].channel = 0;
					li_config_table[i].chflags = 0;
					for (j = 0; j < li_total_channels; j++)
					{
						li_config_table[i].flag_table[j] = 0;
						li_config_table[j].flag_table[i] = 0;
						li_config_table[i].coef_table[j] = 0;
						li_config_table[j].coef_table[i] = 0;
					}
				}
			}
		}
	}
}


static void mixer_prepare_switch(dword Id, PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: mixer_prepare_switch",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	do
	{
		mixer_indication_coefs_set(Id, plci);
	} while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
}


static word mixer_save_config(dword Id, PLCI *plci, byte Rc)
{
	DIVA_CAPI_ADAPTER *a;
	word i, j;

	dbug(1, dprintf("[%06lx] %s,%d: mixer_save_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	a = plci->adapter;
	if ((plci->li_bchannel_id != 0)
	    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
	{
		i = a->li_base + (plci->li_bchannel_id - 1);
		for (j = 0; j < li_total_channels; j++)
		{
			li_config_table[i].coef_table[j] &= 0xf;
			li_config_table[j].coef_table[i] &= 0xf;
		}
		if (!a->li_pri)
			li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
	}
	return (GOOD);
}


static word mixer_restore_config(dword Id, PLCI *plci, byte Rc)
{
	DIVA_CAPI_ADAPTER *a;
	word Info;

	dbug(1, dprintf("[%06lx] %s,%d: mixer_restore_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	Info = GOOD;
	a = plci->adapter;
	if ((plci->B1_facilities & B1_FACILITY_MIXER)
	    && (plci->li_bchannel_id != 0)
	    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
	{
		switch (plci->adjust_b_state)
		{
		case ADJUST_B_RESTORE_MIXER_1:
			if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
			{
				plci->internal_command = plci->adjust_b_command;
				if (plci_nl_busy(plci))
				{
					plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
					break;
				}
				xconnect_query_addresses(plci);
				plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_2;
				break;
			}
			plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
			Rc = OK;
			/* fall through */
		case ADJUST_B_RESTORE_MIXER_2:
		case ADJUST_B_RESTORE_MIXER_3:
		case ADJUST_B_RESTORE_MIXER_4:
			if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Adjust B query addresses failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _WRONG_STATE;
				break;
			}
			if (Rc == OK)
			{
				if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
					plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_3;
				else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)
					plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
			}
			else if (Rc == 0)
			{
				if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
					plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_4;
				else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
					plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
			}
			if (plci->adjust_b_state != ADJUST_B_RESTORE_MIXER_5)
			{
				plci->internal_command = plci->adjust_b_command;
				break;
			}
			/* fall through */
		case ADJUST_B_RESTORE_MIXER_5:
			xconnect_write_coefs(plci, plci->adjust_b_command);
			plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_6;
			Rc = OK;
			/* fall through */
		case ADJUST_B_RESTORE_MIXER_6:
			if (!xconnect_write_coefs_process(Id, plci, Rc))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Write mixer coefs failed",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			if (plci->internal_command)
				break;
			plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_7;
		case ADJUST_B_RESTORE_MIXER_7:
			break;
		}
	}
	return (Info);
}


static void mixer_command(dword Id, PLCI *plci, byte Rc)
{
	DIVA_CAPI_ADAPTER *a;
	word i, internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: mixer_command %02x %04x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
			plci->li_cmd));

	a = plci->adapter;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (plci->li_cmd)
	{
	case LI_REQ_CONNECT:
	case LI_REQ_DISCONNECT:
	case LI_REQ_SILENT_UPDATE:
		switch (internal_command)
		{
		default:
			if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
			{
				adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
									  B1_FACILITY_MIXER), MIXER_COMMAND_1);
			}
			/* fall through */
		case MIXER_COMMAND_1:
			if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
			{
				if (adjust_b_process(Id, plci, Rc) != GOOD)
				{
					dbug(1, dprintf("[%06lx] %s,%d: Load mixer failed",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					break;
				}
				if (plci->internal_command)
					return;
			}
			plci->li_plci_b_req_pos = plci->li_plci_b_write_pos;
			if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
			    || ((get_b1_facilities(plci, plci->B1_resource) & B1_FACILITY_MIXER)
				&& (add_b1_facilities(plci, plci->B1_resource, (word)(plci->B1_facilities &
										      ~B1_FACILITY_MIXER)) == plci->B1_resource)))
			{
				xconnect_write_coefs(plci, MIXER_COMMAND_2);
			}
			else
			{
				do
				{
					mixer_indication_coefs_set(Id, plci);
				} while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
			}
			/* fall through */
		case MIXER_COMMAND_2:
			if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
			    || ((get_b1_facilities(plci, plci->B1_resource) & B1_FACILITY_MIXER)
				&& (add_b1_facilities(plci, plci->B1_resource, (word)(plci->B1_facilities &
										      ~B1_FACILITY_MIXER)) == plci->B1_resource)))
			{
				if (!xconnect_write_coefs_process(Id, plci, Rc))
				{
					dbug(1, dprintf("[%06lx] %s,%d: Write mixer coefs failed",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					if (plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
					{
						do
						{
							plci->li_plci_b_write_pos = (plci->li_plci_b_write_pos == 0) ?
								LI_PLCI_B_QUEUE_ENTRIES - 1 : plci->li_plci_b_write_pos - 1;
							i = (plci->li_plci_b_write_pos == 0) ?
								LI_PLCI_B_QUEUE_ENTRIES - 1 : plci->li_plci_b_write_pos - 1;
						} while ((plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
							 && !(plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG));
					}
					break;
				}
				if (plci->internal_command)
					return;
			}
			if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
			{
				adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities &
									  ~B1_FACILITY_MIXER), MIXER_COMMAND_3);
			}
			/* fall through */
		case MIXER_COMMAND_3:
			if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
			{
				if (adjust_b_process(Id, plci, Rc) != GOOD)
				{
					dbug(1, dprintf("[%06lx] %s,%d: Unload mixer failed",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					break;
				}
				if (plci->internal_command)
					return;
			}
			break;
		}
		break;
	}
	if ((plci->li_bchannel_id == 0)
	    || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
	{
		dbug(1, dprintf("[%06x] %s,%d: Channel id wiped out %d",
				UnMapId(Id), (char *)(FILE_), __LINE__, (int)(plci->li_bchannel_id)));
	}
	else
	{
		i = a->li_base + (plci->li_bchannel_id - 1);
		li_config_table[i].curchnl = plci->li_channel_bits;
		if (!a->li_pri && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
		{
			i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
			li_config_table[i].curchnl = plci->li_channel_bits;
			if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
			{
				i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
				li_config_table[i].curchnl = plci->li_channel_bits;
			}
		}
	}
}


static void li_update_connect(dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
			      dword plci_b_id, byte connect, dword li_flags)
{
	word i, ch_a, ch_a_v, ch_a_s, ch_b, ch_b_v, ch_b_s;
	PLCI *plci_b;
	DIVA_CAPI_ADAPTER *a_b;

	a_b = &(adapter[MapController((byte)(plci_b_id & 0x7f)) - 1]);
	plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
	ch_a = a->li_base + (plci->li_bchannel_id - 1);
	if (!a->li_pri && (plci->tel == ADV_VOICE)
	    && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
	{
		ch_a_v = ch_a + MIXER_IC_CHANNEL_BASE;
		ch_a_s = (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
			a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
	}
	else
	{
		ch_a_v = ch_a;
		ch_a_s = ch_a;
	}
	ch_b = a_b->li_base + (plci_b->li_bchannel_id - 1);
	if (!a_b->li_pri && (plci_b->tel == ADV_VOICE)
	    && (plci_b == a_b->AdvSignalPLCI) && (plci_b_id & EXT_CONTROLLER))
	{
		ch_b_v = ch_b + MIXER_IC_CHANNEL_BASE;
		ch_b_s = (a_b->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
			a_b->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci_b->li_bchannel_id) : ch_b_v;
	}
	else
	{
		ch_b_v = ch_b;
		ch_b_s = ch_b;
	}
	if (connect)
	{
		li_config_table[ch_a].flag_table[ch_a_v] &= ~LI_FLAG_MONITOR;
		li_config_table[ch_a].flag_table[ch_a_s] &= ~LI_FLAG_MONITOR;
		li_config_table[ch_a_v].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
		li_config_table[ch_a_s].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
	}
	li_config_table[ch_a].flag_table[ch_b_v] &= ~LI_FLAG_MONITOR;
	li_config_table[ch_a].flag_table[ch_b_s] &= ~LI_FLAG_MONITOR;
	li_config_table[ch_b_v].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
	li_config_table[ch_b_s].flag_table[ch_a] &= ~(LI_FLAG_ANNOUNCEMENT | LI_FLAG_MIX);
	if (ch_a_v == ch_b_v)
	{
		li_config_table[ch_a_v].flag_table[ch_b_v] &= ~LI_FLAG_CONFERENCE;
		li_config_table[ch_a_s].flag_table[ch_b_s] &= ~LI_FLAG_CONFERENCE;
	}
	else
	{
		if (li_config_table[ch_a_v].flag_table[ch_b_v] & LI_FLAG_CONFERENCE)
		{
			for (i = 0; i < li_total_channels; i++)
			{
				if (i != ch_a_v)
					li_config_table[ch_a_v].flag_table[i] &= ~LI_FLAG_CONFERENCE;
			}
		}
		if (li_config_table[ch_a_s].flag_table[ch_b_v] & LI_FLAG_CONFERENCE)
		{
			for (i = 0; i < li_total_channels; i++)
			{
				if (i != ch_a_s)
					li_config_table[ch_a_s].flag_table[i] &= ~LI_FLAG_CONFERENCE;
			}
		}
		if (li_config_table[ch_b_v].flag_table[ch_a_v] & LI_FLAG_CONFERENCE)
		{
			for (i = 0; i < li_total_channels; i++)
			{
				if (i != ch_a_v)
					li_config_table[i].flag_table[ch_a_v] &= ~LI_FLAG_CONFERENCE;
			}
		}
		if (li_config_table[ch_b_v].flag_table[ch_a_s] & LI_FLAG_CONFERENCE)
		{
			for (i = 0; i < li_total_channels; i++)
			{
				if (i != ch_a_s)
					li_config_table[i].flag_table[ch_a_s] &= ~LI_FLAG_CONFERENCE;
			}
		}
	}
	if (li_flags & LI_FLAG_CONFERENCE_A_B)
	{
		li_config_table[ch_b_v].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_b_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_b_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
	}
	if (li_flags & LI_FLAG_CONFERENCE_B_A)
	{
		li_config_table[ch_a_v].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_a_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_a_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
	}
	if (li_flags & LI_FLAG_MONITOR_A)
	{
		li_config_table[ch_a].flag_table[ch_a_v] |= LI_FLAG_MONITOR;
		li_config_table[ch_a].flag_table[ch_a_s] |= LI_FLAG_MONITOR;
	}
	if (li_flags & LI_FLAG_MONITOR_B)
	{
		li_config_table[ch_a].flag_table[ch_b_v] |= LI_FLAG_MONITOR;
		li_config_table[ch_a].flag_table[ch_b_s] |= LI_FLAG_MONITOR;
	}
	if (li_flags & LI_FLAG_ANNOUNCEMENT_A)
	{
		li_config_table[ch_a_v].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
		li_config_table[ch_a_s].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
	}
	if (li_flags & LI_FLAG_ANNOUNCEMENT_B)
	{
		li_config_table[ch_b_v].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
		li_config_table[ch_b_s].flag_table[ch_a] |= LI_FLAG_ANNOUNCEMENT;
	}
	if (li_flags & LI_FLAG_MIX_A)
	{
		li_config_table[ch_a_v].flag_table[ch_a] |= LI_FLAG_MIX;
		li_config_table[ch_a_s].flag_table[ch_a] |= LI_FLAG_MIX;
	}
	if (li_flags & LI_FLAG_MIX_B)
	{
		li_config_table[ch_b_v].flag_table[ch_a] |= LI_FLAG_MIX;
		li_config_table[ch_b_s].flag_table[ch_a] |= LI_FLAG_MIX;
	}
	if (ch_a_v != ch_a_s)
	{
		li_config_table[ch_a_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_a_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
	}
	if (ch_b_v != ch_b_s)
	{
		li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
	}
}


static void li2_update_connect(dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
			       dword plci_b_id, byte connect, dword li_flags)
{
	word ch_a, ch_a_v, ch_a_s, ch_b, ch_b_v, ch_b_s;
	PLCI *plci_b;
	DIVA_CAPI_ADAPTER *a_b;

	a_b = &(adapter[MapController((byte)(plci_b_id & 0x7f)) - 1]);
	plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
	ch_a = a->li_base + (plci->li_bchannel_id - 1);
	if (!a->li_pri && (plci->tel == ADV_VOICE)
	    && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
	{
		ch_a_v = ch_a + MIXER_IC_CHANNEL_BASE;
		ch_a_s = (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
			a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
	}
	else
	{
		ch_a_v = ch_a;
		ch_a_s = ch_a;
	}
	ch_b = a_b->li_base + (plci_b->li_bchannel_id - 1);
	if (!a_b->li_pri && (plci_b->tel == ADV_VOICE)
	    && (plci_b == a_b->AdvSignalPLCI) && (plci_b_id & EXT_CONTROLLER))
	{
		ch_b_v = ch_b + MIXER_IC_CHANNEL_BASE;
		ch_b_s = (a_b->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC) ?
			a_b->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci_b->li_bchannel_id) : ch_b_v;
	}
	else
	{
		ch_b_v = ch_b;
		ch_b_s = ch_b;
	}
	if (connect)
	{
		li_config_table[ch_b].flag_table[ch_b_v] &= ~LI_FLAG_MONITOR;
		li_config_table[ch_b].flag_table[ch_b_s] &= ~LI_FLAG_MONITOR;
		li_config_table[ch_b_v].flag_table[ch_b] &= ~LI_FLAG_MIX;
		li_config_table[ch_b_s].flag_table[ch_b] &= ~LI_FLAG_MIX;
		li_config_table[ch_b].flag_table[ch_b] &= ~LI_FLAG_PCCONNECT;
		li_config_table[ch_b].chflags &= ~(LI_CHFLAG_MONITOR | LI_CHFLAG_MIX | LI_CHFLAG_LOOP);
	}
	li_config_table[ch_b_v].flag_table[ch_a_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	li_config_table[ch_b_s].flag_table[ch_a_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	li_config_table[ch_b_v].flag_table[ch_a_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	li_config_table[ch_b_s].flag_table[ch_a_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	li_config_table[ch_a_v].flag_table[ch_b_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	li_config_table[ch_a_v].flag_table[ch_b_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	li_config_table[ch_a_s].flag_table[ch_b_v] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	li_config_table[ch_a_s].flag_table[ch_b_s] &= ~(LI_FLAG_INTERCONNECT | LI_FLAG_CONFERENCE);
	if (li_flags & LI2_FLAG_INTERCONNECT_A_B)
	{
		li_config_table[ch_b_v].flag_table[ch_a_v] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_b_s].flag_table[ch_a_v] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_b_v].flag_table[ch_a_s] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_INTERCONNECT;
	}
	if (li_flags & LI2_FLAG_INTERCONNECT_B_A)
	{
		li_config_table[ch_a_v].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_a_v].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_a_s].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
	}
	if (li_flags & LI2_FLAG_MONITOR_B)
	{
		li_config_table[ch_b].flag_table[ch_b_v] |= LI_FLAG_MONITOR;
		li_config_table[ch_b].flag_table[ch_b_s] |= LI_FLAG_MONITOR;
	}
	if (li_flags & LI2_FLAG_MIX_B)
	{
		li_config_table[ch_b_v].flag_table[ch_b] |= LI_FLAG_MIX;
		li_config_table[ch_b_s].flag_table[ch_b] |= LI_FLAG_MIX;
	}
	if (li_flags & LI2_FLAG_MONITOR_X)
		li_config_table[ch_b].chflags |= LI_CHFLAG_MONITOR;
	if (li_flags & LI2_FLAG_MIX_X)
		li_config_table[ch_b].chflags |= LI_CHFLAG_MIX;
	if (li_flags & LI2_FLAG_LOOP_B)
	{
		li_config_table[ch_b_v].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
		li_config_table[ch_b_s].flag_table[ch_b_s] |= LI_FLAG_INTERCONNECT;
	}
	if (li_flags & LI2_FLAG_LOOP_PC)
		li_config_table[ch_b].flag_table[ch_b] |= LI_FLAG_PCCONNECT;
	if (li_flags & LI2_FLAG_LOOP_X)
		li_config_table[ch_b].chflags |= LI_CHFLAG_LOOP;
	if (li_flags & LI2_FLAG_PCCONNECT_A_B)
		li_config_table[ch_b_s].flag_table[ch_a_s] |= LI_FLAG_PCCONNECT;
	if (li_flags & LI2_FLAG_PCCONNECT_B_A)
		li_config_table[ch_a_s].flag_table[ch_b_s] |= LI_FLAG_PCCONNECT;
	if (ch_a_v != ch_a_s)
	{
		li_config_table[ch_a_v].flag_table[ch_a_s] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_a_s].flag_table[ch_a_v] |= LI_FLAG_CONFERENCE;
	}
	if (ch_b_v != ch_b_s)
	{
		li_config_table[ch_b_v].flag_table[ch_b_s] |= LI_FLAG_CONFERENCE;
		li_config_table[ch_b_s].flag_table[ch_b_v] |= LI_FLAG_CONFERENCE;
	}
}


static word li_check_main_plci(dword Id, PLCI *plci)
{
	if (plci == NULL)
	{
		dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		return (_WRONG_IDENTIFIER);
	}
	if (!plci->State
	    || !plci->NL.Id || plci->nl_remove_id
	    || (plci->li_bchannel_id == 0))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		return (_WRONG_STATE);
	}
	li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = plci;
	return (GOOD);
}


static PLCI *li_check_plci_b(dword Id, PLCI *plci,
			     dword plci_b_id, word plci_b_write_pos, byte *p_result)
{
	byte ctlr_b;
	PLCI *plci_b;

	if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
	     LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		PUT_WORD(p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
		return (NULL);
	}
	ctlr_b = 0;
	if ((plci_b_id & 0x7f) != 0)
	{
		ctlr_b = MapController((byte)(plci_b_id & 0x7f));
		if ((ctlr_b > max_adapter) || ((ctlr_b != 0) && (adapter[ctlr_b - 1].request == NULL)))
			ctlr_b = 0;
	}
	if ((ctlr_b == 0)
	    || (((plci_b_id >> 8) & 0xff) == 0)
	    || (((plci_b_id >> 8) & 0xff) > adapter[ctlr_b - 1].max_plci))
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI invalid second PLCI %08lx",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
		PUT_WORD(p_result, _WRONG_IDENTIFIER);
		return (NULL);
	}
	plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
	if (!plci_b->State
	    || !plci_b->NL.Id || plci_b->nl_remove_id
	    || (plci_b->li_bchannel_id == 0))
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI peer in wrong state %08lx",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
		PUT_WORD(p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
		return (NULL);
	}
	li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci = plci_b;
	if (((byte)(plci_b_id & ~EXT_CONTROLLER)) !=
	    ((byte)(UnMapController(plci->adapter->Id) & ~EXT_CONTROLLER))
	    && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
		|| !(plci_b->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)))
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI not on same ctrl %08lx",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
		PUT_WORD(p_result, _WRONG_IDENTIFIER);
		return (NULL);
	}
	if (!(get_b1_facilities(plci_b, add_b1_facilities(plci_b, plci_b->B1_resource,
							  (word)(plci_b->B1_facilities | B1_FACILITY_MIXER))) & B1_FACILITY_MIXER))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Interconnect peer cannot mix %d",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b->B1_resource));
		PUT_WORD(p_result, _REQUEST_NOT_ALLOWED_IN_THIS_STATE);
		return (NULL);
	}
	return (plci_b);
}


static PLCI *li2_check_plci_b(dword Id, PLCI *plci,
			      dword plci_b_id, word plci_b_write_pos, byte *p_result)
{
	byte ctlr_b;
	PLCI *plci_b;

	if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
	     LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		PUT_WORD(p_result, _WRONG_STATE);
		return (NULL);
	}
	ctlr_b = 0;
	if ((plci_b_id & 0x7f) != 0)
	{
		ctlr_b = MapController((byte)(plci_b_id & 0x7f));
		if ((ctlr_b > max_adapter) || ((ctlr_b != 0) && (adapter[ctlr_b - 1].request == NULL)))
			ctlr_b = 0;
	}
	if ((ctlr_b == 0)
	    || (((plci_b_id >> 8) & 0xff) == 0)
	    || (((plci_b_id >> 8) & 0xff) > adapter[ctlr_b - 1].max_plci))
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI invalid second PLCI %08lx",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
		PUT_WORD(p_result, _WRONG_IDENTIFIER);
		return (NULL);
	}
	plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
	if (!plci_b->State
	    || !plci_b->NL.Id || plci_b->nl_remove_id
	    || (plci_b->li_bchannel_id == 0)
	    || (li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci != plci_b))
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI peer in wrong state %08lx",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
		PUT_WORD(p_result, _WRONG_STATE);
		return (NULL);
	}
	if (((byte)(plci_b_id & ~EXT_CONTROLLER)) !=
	    ((byte)(UnMapController(plci->adapter->Id) & ~EXT_CONTROLLER))
	    && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
		|| !(plci_b->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)))
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI not on same ctrl %08lx",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b_id));
		PUT_WORD(p_result, _WRONG_IDENTIFIER);
		return (NULL);
	}
	if (!(get_b1_facilities(plci_b, add_b1_facilities(plci_b, plci_b->B1_resource,
							  (word)(plci_b->B1_facilities | B1_FACILITY_MIXER))) & B1_FACILITY_MIXER))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Interconnect peer cannot mix %d",
				UnMapId(Id), (char *)(FILE_), __LINE__, plci_b->B1_resource));
		PUT_WORD(p_result, _WRONG_STATE);
		return (NULL);
	}
	return (plci_b);
}


static byte mixer_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL   *appl, API_PARSE *msg)
{
	word Info;
	word i;
	dword d, li_flags, plci_b_id;
	PLCI *plci_b;
	API_PARSE li_parms[3];
	API_PARSE li_req_parms[3];
	API_PARSE li_participant_struct[2];
	API_PARSE li_participant_parms[3];
	word participant_parms_pos;
	byte result_buffer[32];
	byte *result;
	word result_pos;
	word plci_b_write_pos;

	dbug(1, dprintf("[%06lx] %s,%d: mixer_request",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	Info = GOOD;
	result = result_buffer;
	result_buffer[0] = 0;
	if (!(a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		Info = _FACILITY_NOT_SUPPORTED;
	}
	else if (api_parse(&msg[1].info[1], msg[1].length, "ws", li_parms))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		Info = _WRONG_MESSAGE_FORMAT;
	}
	else
	{
		result_buffer[0] = 3;
		PUT_WORD(&result_buffer[1], GET_WORD(li_parms[0].info));
		result_buffer[3] = 0;
		switch (GET_WORD(li_parms[0].info))
		{
		case LI_GET_SUPPORTED_SERVICES:
			if (appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
			{
				result_buffer[0] = 17;
				result_buffer[3] = 14;
				PUT_WORD(&result_buffer[4], GOOD);
				d = 0;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_CH)
					d |= LI_CONFERENCING_SUPPORTED;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_PC)
					d |= LI_MONITORING_SUPPORTED;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_CH)
					d |= LI_ANNOUNCEMENTS_SUPPORTED | LI_MIXING_SUPPORTED;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
					d |= LI_CROSS_CONTROLLER_SUPPORTED;
				PUT_DWORD(&result_buffer[6], d);
				if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
				{
					d = 0;
					for (i = 0; i < li_total_channels; i++)
					{
						if ((li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
						    && (li_config_table[i].adapter->li_pri
							|| (i < li_config_table[i].adapter->li_base + MIXER_BCHANNELS_BRI)))
						{
							d++;
						}
					}
				}
				else
				{
					d = a->li_pri ? a->li_channels : MIXER_BCHANNELS_BRI;
				}
				PUT_DWORD(&result_buffer[10], d / 2);
				PUT_DWORD(&result_buffer[14], d);
			}
			else
			{
				result_buffer[0] = 25;
				result_buffer[3] = 22;
				PUT_WORD(&result_buffer[4], GOOD);
				d = LI2_ASYMMETRIC_SUPPORTED | LI2_B_LOOPING_SUPPORTED | LI2_X_LOOPING_SUPPORTED;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_CH_PC)
					d |= LI2_MONITORING_SUPPORTED | LI2_REMOTE_MONITORING_SUPPORTED;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_CH)
					d |= LI2_MIXING_SUPPORTED | LI2_REMOTE_MIXING_SUPPORTED;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_MIXER_PC_PC)
					d |= LI2_PC_LOOPING_SUPPORTED;
				if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
					d |= LI2_CROSS_CONTROLLER_SUPPORTED;
				PUT_DWORD(&result_buffer[6], d);
				d = a->li_pri ? a->li_channels : MIXER_BCHANNELS_BRI;
				PUT_DWORD(&result_buffer[10], d / 2);
				PUT_DWORD(&result_buffer[14], d - 1);
				if (a->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
				{
					d = 0;
					for (i = 0; i < li_total_channels; i++)
					{
						if ((li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
						    && (li_config_table[i].adapter->li_pri
							|| (i < li_config_table[i].adapter->li_base + MIXER_BCHANNELS_BRI)))
						{
							d++;
						}
					}
				}
				PUT_DWORD(&result_buffer[18], d / 2);
				PUT_DWORD(&result_buffer[22], d - 1);
			}
			break;

		case LI_REQ_CONNECT:
			if (li_parms[1].length == 8)
			{
				appl->appl_flags |= APPL_FLAG_OLD_LI_SPEC;
				if (api_parse(&li_parms[1].info[1], li_parms[1].length, "dd", li_req_parms))
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				plci_b_id = GET_DWORD(li_req_parms[0].info) & 0xffff;
				li_flags = GET_DWORD(li_req_parms[1].info);
				Info = li_check_main_plci(Id, plci);
				result_buffer[0] = 9;
				result_buffer[3] = 6;
				PUT_DWORD(&result_buffer[4], plci_b_id);
				PUT_WORD(&result_buffer[8], GOOD);
				if (Info != GOOD)
					break;
				result = plci->saved_msg.info;
				for (i = 0; i <= result_buffer[0]; i++)
					result[i] = result_buffer[i];
				plci_b_write_pos = plci->li_plci_b_write_pos;
				plci_b = li_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
				if (plci_b == NULL)
					break;
				li_update_connect(Id, a, plci, plci_b_id, true, li_flags);
				plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_LAST_FLAG;
				plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
				plci->li_plci_b_write_pos = plci_b_write_pos;
			}
			else
			{
				appl->appl_flags &= ~APPL_FLAG_OLD_LI_SPEC;
				if (api_parse(&li_parms[1].info[1], li_parms[1].length, "ds", li_req_parms))
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				li_flags = GET_DWORD(li_req_parms[0].info) & ~(LI2_FLAG_INTERCONNECT_A_B | LI2_FLAG_INTERCONNECT_B_A);
				Info = li_check_main_plci(Id, plci);
				result_buffer[0] = 7;
				result_buffer[3] = 4;
				PUT_WORD(&result_buffer[4], Info);
				result_buffer[6] = 0;
				if (Info != GOOD)
					break;
				result = plci->saved_msg.info;
				for (i = 0; i <= result_buffer[0]; i++)
					result[i] = result_buffer[i];
				plci_b_write_pos = plci->li_plci_b_write_pos;
				participant_parms_pos = 0;
				result_pos = 7;
				li2_update_connect(Id, a, plci, UnMapId(Id), true, li_flags);
				while (participant_parms_pos < li_req_parms[1].length)
				{
					result[result_pos] = 6;
					result_pos += 7;
					PUT_DWORD(&result[result_pos - 6], 0);
					PUT_WORD(&result[result_pos - 2], GOOD);
					if (api_parse(&li_req_parms[1].info[1 + participant_parms_pos],
						      (word)(li_parms[1].length - participant_parms_pos), "s", li_participant_struct))
					{
						dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
								UnMapId(Id), (char *)(FILE_), __LINE__));
						PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
						break;
					}
					if (api_parse(&li_participant_struct[0].info[1],
						      li_participant_struct[0].length, "dd", li_participant_parms))
					{
						dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
								UnMapId(Id), (char *)(FILE_), __LINE__));
						PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
						break;
					}
					plci_b_id = GET_DWORD(li_participant_parms[0].info) & 0xffff;
					li_flags = GET_DWORD(li_participant_parms[1].info);
					PUT_DWORD(&result[result_pos - 6], plci_b_id);
					if (sizeof(result) - result_pos < 7)
					{
						dbug(1, dprintf("[%06lx] %s,%d: LI result overrun",
								UnMapId(Id), (char *)(FILE_), __LINE__));
						PUT_WORD(&result[result_pos - 2], _WRONG_STATE);
						break;
					}
					plci_b = li2_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
					if (plci_b != NULL)
					{
						li2_update_connect(Id, a, plci, plci_b_id, true, li_flags);
						plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id |
							((li_flags & (LI2_FLAG_INTERCONNECT_A_B | LI2_FLAG_INTERCONNECT_B_A |
								      LI2_FLAG_PCCONNECT_A_B | LI2_FLAG_PCCONNECT_B_A)) ? 0 : LI_PLCI_B_DISC_FLAG);
						plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
					}
					participant_parms_pos = (word)((&li_participant_struct[0].info[1 + li_participant_struct[0].length]) -
								       (&li_req_parms[1].info[1]));
				}
				result[0] = (byte)(result_pos - 1);
				result[3] = (byte)(result_pos - 4);
				result[6] = (byte)(result_pos - 7);
				i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES - 1 : plci_b_write_pos - 1;
				if ((plci_b_write_pos == plci->li_plci_b_read_pos)
				    || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
				{
					plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
					plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
				}
				else
					plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
				plci->li_plci_b_write_pos = plci_b_write_pos;
			}
			mixer_calculate_coefs(a);
			plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
			mixer_notify_update(plci, true);
			sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
			      "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
			plci->command = 0;
			plci->li_cmd = GET_WORD(li_parms[0].info);
			start_internal_command(Id, plci, mixer_command);
			return (false);

		case LI_REQ_DISCONNECT:
			if (li_parms[1].length == 4)
			{
				appl->appl_flags |= APPL_FLAG_OLD_LI_SPEC;
				if (api_parse(&li_parms[1].info[1], li_parms[1].length, "d", li_req_parms))
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				plci_b_id = GET_DWORD(li_req_parms[0].info) & 0xffff;
				Info = li_check_main_plci(Id, plci);
				result_buffer[0] = 9;
				result_buffer[3] = 6;
				PUT_DWORD(&result_buffer[4], GET_DWORD(li_req_parms[0].info));
				PUT_WORD(&result_buffer[8], GOOD);
				if (Info != GOOD)
					break;
				result = plci->saved_msg.info;
				for (i = 0; i <= result_buffer[0]; i++)
					result[i] = result_buffer[i];
				plci_b_write_pos = plci->li_plci_b_write_pos;
				plci_b = li_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
				if (plci_b == NULL)
					break;
				li_update_connect(Id, a, plci, plci_b_id, false, 0);
				plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG | LI_PLCI_B_LAST_FLAG;
				plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
				plci->li_plci_b_write_pos = plci_b_write_pos;
			}
			else
			{
				appl->appl_flags &= ~APPL_FLAG_OLD_LI_SPEC;
				if (api_parse(&li_parms[1].info[1], li_parms[1].length, "s", li_req_parms))
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_MESSAGE_FORMAT;
					break;
				}
				Info = li_check_main_plci(Id, plci);
				result_buffer[0] = 7;
				result_buffer[3] = 4;
				PUT_WORD(&result_buffer[4], Info);
				result_buffer[6] = 0;
				if (Info != GOOD)
					break;
				result = plci->saved_msg.info;
				for (i = 0; i <= result_buffer[0]; i++)
					result[i] = result_buffer[i];
				plci_b_write_pos = plci->li_plci_b_write_pos;
				participant_parms_pos = 0;
				result_pos = 7;
				while (participant_parms_pos < li_req_parms[0].length)
				{
					result[result_pos] = 6;
					result_pos += 7;
					PUT_DWORD(&result[result_pos - 6], 0);
					PUT_WORD(&result[result_pos - 2], GOOD);
					if (api_parse(&li_req_parms[0].info[1 + participant_parms_pos],
						      (word)(li_parms[1].length - participant_parms_pos), "s", li_participant_struct))
					{
						dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
								UnMapId(Id), (char *)(FILE_), __LINE__));
						PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
						break;
					}
					if (api_parse(&li_participant_struct[0].info[1],
						      li_participant_struct[0].length, "d", li_participant_parms))
					{
						dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
								UnMapId(Id), (char *)(FILE_), __LINE__));
						PUT_WORD(&result[result_pos - 2], _WRONG_MESSAGE_FORMAT);
						break;
					}
					plci_b_id = GET_DWORD(li_participant_parms[0].info) & 0xffff;
					PUT_DWORD(&result[result_pos - 6], plci_b_id);
					if (sizeof(result) - result_pos < 7)
					{
						dbug(1, dprintf("[%06lx] %s,%d: LI result overrun",
								UnMapId(Id), (char *)(FILE_), __LINE__));
						PUT_WORD(&result[result_pos - 2], _WRONG_STATE);
						break;
					}
					plci_b = li2_check_plci_b(Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
					if (plci_b != NULL)
					{
						li2_update_connect(Id, a, plci, plci_b_id, false, 0);
						plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
						plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
					}
					participant_parms_pos = (word)((&li_participant_struct[0].info[1 + li_participant_struct[0].length]) -
								       (&li_req_parms[0].info[1]));
				}
				result[0] = (byte)(result_pos - 1);
				result[3] = (byte)(result_pos - 4);
				result[6] = (byte)(result_pos - 7);
				i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES - 1 : plci_b_write_pos - 1;
				if ((plci_b_write_pos == plci->li_plci_b_read_pos)
				    || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
				{
					plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
					plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
				}
				else
					plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
				plci->li_plci_b_write_pos = plci_b_write_pos;
			}
			mixer_calculate_coefs(a);
			plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
			mixer_notify_update(plci, true);
			sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
			      "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
			plci->command = 0;
			plci->li_cmd = GET_WORD(li_parms[0].info);
			start_internal_command(Id, plci, mixer_command);
			return (false);

		case LI_REQ_SILENT_UPDATE:
			if (!plci || !plci->State
			    || !plci->NL.Id || plci->nl_remove_id
			    || (plci->li_bchannel_id == 0)
			    || (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci != plci))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				return (false);
			}
			plci_b_write_pos = plci->li_plci_b_write_pos;
			if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
			     LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
			{
				dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				return (false);
			}
			i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES - 1 : plci_b_write_pos - 1;
			if ((plci_b_write_pos == plci->li_plci_b_read_pos)
			    || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
			{
				plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
				plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
			}
			else
				plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
			plci->li_plci_b_write_pos = plci_b_write_pos;
			plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
			plci->command = 0;
			plci->li_cmd = GET_WORD(li_parms[0].info);
			start_internal_command(Id, plci, mixer_command);
			return (false);

		default:
			dbug(1, dprintf("[%06lx] %s,%d: LI unknown request %04x",
					UnMapId(Id), (char *)(FILE_), __LINE__, GET_WORD(li_parms[0].info)));
			Info = _FACILITY_NOT_SUPPORTED;
		}
	}
	sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
	      "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
	return (false);
}


static void mixer_indication_coefs_set(dword Id, PLCI *plci)
{
	dword d;
	byte result[12];

	dbug(1, dprintf("[%06lx] %s,%d: mixer_indication_coefs_set",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	if (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos)
	{
		do
		{
			d = plci->li_plci_b_queue[plci->li_plci_b_read_pos];
			if (!(d & LI_PLCI_B_SKIP_FLAG))
			{
				if (plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
				{
					if (d & LI_PLCI_B_DISC_FLAG)
					{
						result[0] = 5;
						PUT_WORD(&result[1], LI_IND_DISCONNECT);
						result[3] = 2;
						PUT_WORD(&result[4], _LI_USER_INITIATED);
					}
					else
					{
						result[0] = 7;
						PUT_WORD(&result[1], LI_IND_CONNECT_ACTIVE);
						result[3] = 4;
						PUT_DWORD(&result[4], d & ~LI_PLCI_B_FLAG_MASK);
					}
				}
				else
				{
					if (d & LI_PLCI_B_DISC_FLAG)
					{
						result[0] = 9;
						PUT_WORD(&result[1], LI_IND_DISCONNECT);
						result[3] = 6;
						PUT_DWORD(&result[4], d & ~LI_PLCI_B_FLAG_MASK);
						PUT_WORD(&result[8], _LI_USER_INITIATED);
					}
					else
					{
						result[0] = 7;
						PUT_WORD(&result[1], LI_IND_CONNECT_ACTIVE);
						result[3] = 4;
						PUT_DWORD(&result[4], d & ~LI_PLCI_B_FLAG_MASK);
					}
				}
				sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,
				      "ws", SELECTOR_LINE_INTERCONNECT, result);
			}
			plci->li_plci_b_read_pos = (plci->li_plci_b_read_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ?
				0 : plci->li_plci_b_read_pos + 1;
		} while (!(d & LI_PLCI_B_LAST_FLAG) && (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos));
	}
}


static void mixer_indication_xconnect_from(dword Id, PLCI *plci, byte *msg, word length)
{
	word i, j, ch;
	struct xconnect_transfer_address_s s,   *p;
	DIVA_CAPI_ADAPTER *a;

	dbug(1, dprintf("[%06lx] %s,%d: mixer_indication_xconnect_from %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, (int)length));

	a = plci->adapter;
	i = 1;
	for (i = 1; i < length; i += 16)
	{
		s.card_address.low = msg[i] | (msg[i + 1] << 8) | (((dword)(msg[i + 2])) << 16) | (((dword)(msg[i + 3])) << 24);
		s.card_address.high = msg[i + 4] | (msg[i + 5] << 8) | (((dword)(msg[i + 6])) << 16) | (((dword)(msg[i + 7])) << 24);
		s.offset = msg[i + 8] | (msg[i + 9] << 8) | (((dword)(msg[i + 10])) << 16) | (((dword)(msg[i + 11])) << 24);
		ch = msg[i + 12] | (msg[i + 13] << 8);
		j = ch & XCONNECT_CHANNEL_NUMBER_MASK;
		if (!a->li_pri && (plci->li_bchannel_id == 2))
			j = 1 - j;
		j += a->li_base;
		if (ch & XCONNECT_CHANNEL_PORT_PC)
			p = &(li_config_table[j].send_pc);
		else
			p = &(li_config_table[j].send_b);
		p->card_address.low = s.card_address.low;
		p->card_address.high = s.card_address.high;
		p->offset = s.offset;
		li_config_table[j].channel |= LI_CHANNEL_ADDRESSES_SET;
	}
	if (plci->internal_command_queue[0]
	    && ((plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
		|| (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
		|| (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)))
	{
		(*(plci->internal_command_queue[0]))(Id, plci, 0);
		if (!plci->internal_command)
			next_internal_command(Id, plci);
	}
	mixer_notify_update(plci, true);
}


static void mixer_indication_xconnect_to(dword Id, PLCI *plci, byte *msg, word length)
{

	dbug(1, dprintf("[%06lx] %s,%d: mixer_indication_xconnect_to %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, (int) length));

}


static byte mixer_notify_source_removed(PLCI *plci, dword plci_b_id)
{
	word plci_b_write_pos;

	plci_b_write_pos = plci->li_plci_b_write_pos;
	if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
	     LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 1)
	{
		dbug(1, dprintf("[%06lx] %s,%d: LI request overrun",
				(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
				(char *)(FILE_), __LINE__));
		return (false);
	}
	plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
	plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES - 1) ? 0 : plci_b_write_pos + 1;
	plci->li_plci_b_write_pos = plci_b_write_pos;
	return (true);
}


static void mixer_remove(PLCI *plci)
{
	DIVA_CAPI_ADAPTER *a;
	PLCI *notify_plci;
	dword plci_b_id;
	word i, j;

	dbug(1, dprintf("[%06lx] %s,%d: mixer_remove",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	a = plci->adapter;
	plci_b_id = (plci->Id << 8) | UnMapController(plci->adapter->Id);
	if (a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED)
	{
		if ((plci->li_bchannel_id != 0)
		    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
		{
			i = a->li_base + (plci->li_bchannel_id - 1);
			if ((li_config_table[i].curchnl | li_config_table[i].channel) & LI_CHANNEL_INVOLVED)
			{
				for (j = 0; j < li_total_channels; j++)
				{
					if ((li_config_table[i].flag_table[j] & LI_FLAG_INTERCONNECT)
					    || (li_config_table[j].flag_table[i] & LI_FLAG_INTERCONNECT))
					{
						notify_plci = li_config_table[j].plci;
						if ((notify_plci != NULL)
						    && (notify_plci != plci)
						    && (notify_plci->appl != NULL)
						    && !(notify_plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
						    && (notify_plci->State)
						    && notify_plci->NL.Id && !notify_plci->nl_remove_id)
						{
							mixer_notify_source_removed(notify_plci, plci_b_id);
						}
					}
				}
				mixer_clear_config(plci);
				mixer_calculate_coefs(a);
				mixer_notify_update(plci, true);
			}
			li_config_table[i].plci = NULL;
			plci->li_bchannel_id = 0;
		}
	}
}


/*------------------------------------------------------------------*/
/* Echo canceller facilities                                        */
/*------------------------------------------------------------------*/


static void ec_write_parameters(PLCI *plci)
{
	word w;
	byte parameter_buffer[6];

	dbug(1, dprintf("[%06lx] %s,%d: ec_write_parameters",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	parameter_buffer[0] = 5;
	parameter_buffer[1] = DSP_CTRL_SET_LEC_PARAMETERS;
	PUT_WORD(&parameter_buffer[2], plci->ec_idi_options);
	plci->ec_idi_options &= ~LEC_RESET_COEFFICIENTS;
	w = (plci->ec_tail_length == 0) ? 128 : plci->ec_tail_length;
	PUT_WORD(&parameter_buffer[4], w);
	add_p(plci, FTY, parameter_buffer);
	sig_req(plci, TEL_CTRL, 0);
	send_req(plci);
}


static void ec_clear_config(PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: ec_clear_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
		LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING;
	plci->ec_tail_length = 0;
}


static void ec_prepare_switch(dword Id, PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: ec_prepare_switch",
			UnMapId(Id), (char *)(FILE_), __LINE__));

}


static word ec_save_config(dword Id, PLCI *plci, byte Rc)
{

	dbug(1, dprintf("[%06lx] %s,%d: ec_save_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	return (GOOD);
}


static word ec_restore_config(dword Id, PLCI *plci, byte Rc)
{
	word Info;

	dbug(1, dprintf("[%06lx] %s,%d: ec_restore_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	Info = GOOD;
	if (plci->B1_facilities & B1_FACILITY_EC)
	{
		switch (plci->adjust_b_state)
		{
		case ADJUST_B_RESTORE_EC_1:
			plci->internal_command = plci->adjust_b_command;
			if (plci->sig_req)
			{
				plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
				break;
			}
			ec_write_parameters(plci);
			plci->adjust_b_state = ADJUST_B_RESTORE_EC_2;
			break;
		case ADJUST_B_RESTORE_EC_2:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Restore EC failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _WRONG_STATE;
				break;
			}
			break;
		}
	}
	return (Info);
}


static void ec_command(dword Id, PLCI *plci, byte Rc)
{
	word internal_command, Info;
	byte result[8];

	dbug(1, dprintf("[%06lx] %s,%d: ec_command %02x %04x %04x %04x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
			plci->ec_cmd, plci->ec_idi_options, plci->ec_tail_length));

	Info = GOOD;
	if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
	{
		result[0] = 2;
		PUT_WORD(&result[1], EC_SUCCESS);
	}
	else
	{
		result[0] = 5;
		PUT_WORD(&result[1], plci->ec_cmd);
		result[3] = 2;
		PUT_WORD(&result[4], GOOD);
	}
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (plci->ec_cmd)
	{
	case EC_ENABLE_OPERATION:
	case EC_FREEZE_COEFFICIENTS:
	case EC_RESUME_COEFFICIENT_UPDATE:
	case EC_RESET_COEFFICIENTS:
		switch (internal_command)
		{
		default:
			adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities |
								  B1_FACILITY_EC), EC_COMMAND_1);
			/* fall through */
		case EC_COMMAND_1:
			if (adjust_b_process(Id, plci, Rc) != GOOD)
			{
				dbug(1, dprintf("[%06lx] %s,%d: Load EC failed",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			if (plci->internal_command)
				return;
			/* fall through */
		case EC_COMMAND_2:
			if (plci->sig_req)
			{
				plci->internal_command = EC_COMMAND_2;
				return;
			}
			plci->internal_command = EC_COMMAND_3;
			ec_write_parameters(plci);
			return;
		case EC_COMMAND_3:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Enable EC failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			break;
		}
		break;

	case EC_DISABLE_OPERATION:
		switch (internal_command)
		{
		default:
		case EC_COMMAND_1:
			if (plci->B1_facilities & B1_FACILITY_EC)
			{
				if (plci->sig_req)
				{
					plci->internal_command = EC_COMMAND_1;
					return;
				}
				plci->internal_command = EC_COMMAND_2;
				ec_write_parameters(plci);
				return;
			}
			Rc = OK;
			/* fall through */
		case EC_COMMAND_2:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Disable EC failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			adjust_b1_resource(Id, plci, NULL, (word)(plci->B1_facilities &
								  ~B1_FACILITY_EC), EC_COMMAND_3);
			/* fall through */
		case EC_COMMAND_3:
			if (adjust_b_process(Id, plci, Rc) != GOOD)
			{
				dbug(1, dprintf("[%06lx] %s,%d: Unload EC failed",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _FACILITY_NOT_SUPPORTED;
				break;
			}
			if (plci->internal_command)
				return;
			break;
		}
		break;
	}
	sendf(plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
	      "wws", Info, (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
	      PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
}


static byte ec_request(dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL   *appl, API_PARSE *msg)
{
	word Info;
	word opt;
	API_PARSE ec_parms[3];
	byte result[16];

	dbug(1, dprintf("[%06lx] %s,%d: ec_request",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	Info = GOOD;
	result[0] = 0;
	if (!(a->man_profile.private_options & (1L << PRIVATE_ECHO_CANCELLER)))
	{
		dbug(1, dprintf("[%06lx] %s,%d: Facility not supported",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		Info = _FACILITY_NOT_SUPPORTED;
	}
	else
	{
		if (appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
		{
			if (api_parse(&msg[1].info[1], msg[1].length, "w", ec_parms))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _WRONG_MESSAGE_FORMAT;
			}
			else
			{
				if (plci == NULL)
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_IDENTIFIER;
				}
				else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_STATE;
				}
				else
				{
					plci->command = 0;
					plci->ec_cmd = GET_WORD(ec_parms[0].info);
					plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
					result[0] = 2;
					PUT_WORD(&result[1], EC_SUCCESS);
					if (msg[1].length >= 4)
					{
						opt = GET_WORD(&ec_parms[0].info[2]);
						plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
									  LEC_ENABLE_2100HZ_DETECTOR | LEC_REQUIRE_2100HZ_REVERSALS);
						if (!(opt & EC_DISABLE_NON_LINEAR_PROCESSING))
							plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
						if (opt & EC_DETECT_DISABLE_TONE)
							plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
						if (!(opt & EC_DO_NOT_REQUIRE_REVERSALS))
							plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
						if (msg[1].length >= 6)
						{
							plci->ec_tail_length = GET_WORD(&ec_parms[0].info[4]);
						}
					}
					switch (plci->ec_cmd)
					{
					case EC_ENABLE_OPERATION:
						plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
						start_internal_command(Id, plci, ec_command);
						return (false);

					case EC_DISABLE_OPERATION:
						plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
							LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
							LEC_RESET_COEFFICIENTS;
						start_internal_command(Id, plci, ec_command);
						return (false);

					case EC_FREEZE_COEFFICIENTS:
						plci->ec_idi_options |= LEC_FREEZE_COEFFICIENTS;
						start_internal_command(Id, plci, ec_command);
						return (false);

					case EC_RESUME_COEFFICIENT_UPDATE:
						plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
						start_internal_command(Id, plci, ec_command);
						return (false);

					case EC_RESET_COEFFICIENTS:
						plci->ec_idi_options |= LEC_RESET_COEFFICIENTS;
						start_internal_command(Id, plci, ec_command);
						return (false);

					default:
						dbug(1, dprintf("[%06lx] %s,%d: EC unknown request %04x",
								UnMapId(Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
						PUT_WORD(&result[1], EC_UNSUPPORTED_OPERATION);
					}
				}
			}
		}
		else
		{
			if (api_parse(&msg[1].info[1], msg[1].length, "ws", ec_parms))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Wrong message format",
						UnMapId(Id), (char *)(FILE_), __LINE__));
				Info = _WRONG_MESSAGE_FORMAT;
			}
			else
			{
				if (GET_WORD(ec_parms[0].info) == EC_GET_SUPPORTED_SERVICES)
				{
					result[0] = 11;
					PUT_WORD(&result[1], EC_GET_SUPPORTED_SERVICES);
					result[3] = 8;
					PUT_WORD(&result[4], GOOD);
					PUT_WORD(&result[6], 0x0007);
					PUT_WORD(&result[8], LEC_MAX_SUPPORTED_TAIL_LENGTH);
					PUT_WORD(&result[10], 0);
				}
				else if (plci == NULL)
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong PLCI",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_IDENTIFIER;
				}
				else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
				{
					dbug(1, dprintf("[%06lx] %s,%d: Wrong state",
							UnMapId(Id), (char *)(FILE_), __LINE__));
					Info = _WRONG_STATE;
				}
				else
				{
					plci->command = 0;
					plci->ec_cmd = GET_WORD(ec_parms[0].info);
					plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
					result[0] = 5;
					PUT_WORD(&result[1], plci->ec_cmd);
					result[3] = 2;
					PUT_WORD(&result[4], GOOD);
					plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
								  LEC_ENABLE_2100HZ_DETECTOR | LEC_REQUIRE_2100HZ_REVERSALS);
					plci->ec_tail_length = 0;
					if (ec_parms[1].length >= 2)
					{
						opt = GET_WORD(&ec_parms[1].info[1]);
						if (opt & EC_ENABLE_NON_LINEAR_PROCESSING)
							plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
						if (opt & EC_DETECT_DISABLE_TONE)
							plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
						if (!(opt & EC_DO_NOT_REQUIRE_REVERSALS))
							plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
						if (ec_parms[1].length >= 4)
						{
							plci->ec_tail_length = GET_WORD(&ec_parms[1].info[3]);
						}
					}
					switch (plci->ec_cmd)
					{
					case EC_ENABLE_OPERATION:
						plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
						start_internal_command(Id, plci, ec_command);
						return (false);

					case EC_DISABLE_OPERATION:
						plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
							LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
							LEC_RESET_COEFFICIENTS;
						start_internal_command(Id, plci, ec_command);
						return (false);

					default:
						dbug(1, dprintf("[%06lx] %s,%d: EC unknown request %04x",
								UnMapId(Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
						PUT_WORD(&result[4], _FACILITY_SPECIFIC_FUNCTION_NOT_SUPP);
					}
				}
			}
		}
	}
	sendf(appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
	      "wws", Info, (appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
	      PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
	return (false);
}


static void ec_indication(dword Id, PLCI *plci, byte *msg, word length)
{
	byte result[8];

	dbug(1, dprintf("[%06lx] %s,%d: ec_indication",
			UnMapId(Id), (char *)(FILE_), __LINE__));

	if (!(plci->ec_idi_options & LEC_MANUAL_DISABLE))
	{
		if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
		{
			result[0] = 2;
			PUT_WORD(&result[1], 0);
			switch (msg[1])
			{
			case LEC_DISABLE_TYPE_CONTIGNUOUS_2100HZ:
				PUT_WORD(&result[1], EC_BYPASS_DUE_TO_CONTINUOUS_2100HZ);
				break;
			case LEC_DISABLE_TYPE_REVERSED_2100HZ:
				PUT_WORD(&result[1], EC_BYPASS_DUE_TO_REVERSED_2100HZ);
				break;
			case LEC_DISABLE_RELEASED:
				PUT_WORD(&result[1], EC_BYPASS_RELEASED);
				break;
			}
		}
		else
		{
			result[0] = 5;
			PUT_WORD(&result[1], EC_BYPASS_INDICATION);
			result[3] = 2;
			PUT_WORD(&result[4], 0);
			switch (msg[1])
			{
			case LEC_DISABLE_TYPE_CONTIGNUOUS_2100HZ:
				PUT_WORD(&result[4], EC_BYPASS_DUE_TO_CONTINUOUS_2100HZ);
				break;
			case LEC_DISABLE_TYPE_REVERSED_2100HZ:
				PUT_WORD(&result[4], EC_BYPASS_DUE_TO_REVERSED_2100HZ);
				break;
			case LEC_DISABLE_RELEASED:
				PUT_WORD(&result[4], EC_BYPASS_RELEASED);
				break;
			}
		}
		sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
		      PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
	}
}



/*------------------------------------------------------------------*/
/* Advanced voice                                                   */
/*------------------------------------------------------------------*/

static void adv_voice_write_coefs(PLCI *plci, word write_command)
{
	DIVA_CAPI_ADAPTER *a;
	word i;
	byte *p;

	word w, n, j, k;
	byte ch_map[MIXER_CHANNELS_BRI];

	byte coef_buffer[ADV_VOICE_COEF_BUFFER_SIZE + 2];

	dbug(1, dprintf("[%06lx] %s,%d: adv_voice_write_coefs %d",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, write_command));

	a = plci->adapter;
	p = coef_buffer + 1;
	*(p++) = DSP_CTRL_OLD_SET_MIXER_COEFFICIENTS;
	i = 0;
	while (i + sizeof(word) <= a->adv_voice_coef_length)
	{
		PUT_WORD(p, GET_WORD(a->adv_voice_coef_buffer + i));
		p += 2;
		i += 2;
	}
	while (i < ADV_VOICE_OLD_COEF_COUNT * sizeof(word))
	{
		PUT_WORD(p, 0x8000);
		p += 2;
		i += 2;
	}

	if (!a->li_pri && (plci->li_bchannel_id == 0))
	{
		if ((li_config_table[a->li_base].plci == NULL) && (li_config_table[a->li_base + 1].plci != NULL))
		{
			plci->li_bchannel_id = 1;
			li_config_table[a->li_base].plci = plci;
			dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
					(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
					(char *)(FILE_), __LINE__, plci->li_bchannel_id));
		}
		else if ((li_config_table[a->li_base].plci != NULL) && (li_config_table[a->li_base + 1].plci == NULL))
		{
			plci->li_bchannel_id = 2;
			li_config_table[a->li_base + 1].plci = plci;
			dbug(1, dprintf("[%06lx] %s,%d: adv_voice_set_bchannel_id %d",
					(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
					(char *)(FILE_), __LINE__, plci->li_bchannel_id));
		}
	}
	if (!a->li_pri && (plci->li_bchannel_id != 0)
	    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
	{
		i = a->li_base + (plci->li_bchannel_id - 1);
		switch (write_command)
		{
		case ADV_VOICE_WRITE_ACTIVATION:
			j = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
			k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
			if (!(plci->B1_facilities & B1_FACILITY_MIXER))
			{
				li_config_table[j].flag_table[i] |= LI_FLAG_CONFERENCE | LI_FLAG_MIX;
				li_config_table[i].flag_table[j] |= LI_FLAG_CONFERENCE | LI_FLAG_MONITOR;
			}
			if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
			{
				li_config_table[k].flag_table[i] |= LI_FLAG_CONFERENCE | LI_FLAG_MIX;
				li_config_table[i].flag_table[k] |= LI_FLAG_CONFERENCE | LI_FLAG_MONITOR;
				li_config_table[k].flag_table[j] |= LI_FLAG_CONFERENCE;
				li_config_table[j].flag_table[k] |= LI_FLAG_CONFERENCE;
			}
			mixer_calculate_coefs(a);
			li_config_table[i].curchnl = li_config_table[i].channel;
			li_config_table[j].curchnl = li_config_table[j].channel;
			if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
				li_config_table[k].curchnl = li_config_table[k].channel;
			break;

		case ADV_VOICE_WRITE_DEACTIVATION:
			for (j = 0; j < li_total_channels; j++)
			{
				li_config_table[i].flag_table[j] = 0;
				li_config_table[j].flag_table[i] = 0;
			}
			k = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
			for (j = 0; j < li_total_channels; j++)
			{
				li_config_table[k].flag_table[j] = 0;
				li_config_table[j].flag_table[k] = 0;
			}
			if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
			{
				k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
				for (j = 0; j < li_total_channels; j++)
				{
					li_config_table[k].flag_table[j] = 0;
					li_config_table[j].flag_table[k] = 0;
				}
			}
			mixer_calculate_coefs(a);
			break;
		}
		if (plci->B1_facilities & B1_FACILITY_MIXER)
		{
			w = 0;
			if (ADV_VOICE_NEW_COEF_BASE + sizeof(word) <= a->adv_voice_coef_length)
				w = GET_WORD(a->adv_voice_coef_buffer + ADV_VOICE_NEW_COEF_BASE);
			if (li_config_table[i].channel & LI_CHANNEL_TX_DATA)
				w |= MIXER_FEATURE_ENABLE_TX_DATA;
			if (li_config_table[i].channel & LI_CHANNEL_RX_DATA)
				w |= MIXER_FEATURE_ENABLE_RX_DATA;
			*(p++) = (byte) w;
			*(p++) = (byte)(w >> 8);
			for (j = 0; j < sizeof(ch_map); j += 2)
			{
				ch_map[j] = (byte)(j + (plci->li_bchannel_id - 1));
				ch_map[j + 1] = (byte)(j + (2 - plci->li_bchannel_id));
			}
			for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
			{
				i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
				j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
				if (li_config_table[i].channel & li_config_table[j].channel & LI_CHANNEL_INVOLVED)
				{
					*(p++) = ((li_config_table[i].coef_table[j] & mixer_write_prog_bri[n].mask) ? 0x80 : 0x01);
					w = ((li_config_table[i].coef_table[j] & 0xf) ^ (li_config_table[i].coef_table[j] >> 4));
					li_config_table[i].coef_table[j] ^= (w & mixer_write_prog_bri[n].mask) << 4;
				}
				else
				{
					*(p++) = (ADV_VOICE_NEW_COEF_BASE + sizeof(word) + n < a->adv_voice_coef_length) ?
						a->adv_voice_coef_buffer[ADV_VOICE_NEW_COEF_BASE + sizeof(word) + n] : 0x00;
				}
			}
		}
		else
		{
			for (i = ADV_VOICE_NEW_COEF_BASE; i < a->adv_voice_coef_length; i++)
				*(p++) = a->adv_voice_coef_buffer[i];
		}
	}
	else

	{
		for (i = ADV_VOICE_NEW_COEF_BASE; i < a->adv_voice_coef_length; i++)
			*(p++) = a->adv_voice_coef_buffer[i];
	}
	coef_buffer[0] = (p - coef_buffer) - 1;
	add_p(plci, FTY, coef_buffer);
	sig_req(plci, TEL_CTRL, 0);
	send_req(plci);
}


static void adv_voice_clear_config(PLCI *plci)
{
	DIVA_CAPI_ADAPTER *a;

	word i, j;


	dbug(1, dprintf("[%06lx] %s,%d: adv_voice_clear_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	a = plci->adapter;
	if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
	{
		a->adv_voice_coef_length = 0;

		if (!a->li_pri && (plci->li_bchannel_id != 0)
		    && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
		{
			i = a->li_base + (plci->li_bchannel_id - 1);
			li_config_table[i].curchnl = 0;
			li_config_table[i].channel = 0;
			li_config_table[i].chflags = 0;
			for (j = 0; j < li_total_channels; j++)
			{
				li_config_table[i].flag_table[j] = 0;
				li_config_table[j].flag_table[i] = 0;
				li_config_table[i].coef_table[j] = 0;
				li_config_table[j].coef_table[i] = 0;
			}
			li_config_table[i].coef_table[i] |= LI_COEF_CH_PC_SET | LI_COEF_PC_CH_SET;
			i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
			li_config_table[i].curchnl = 0;
			li_config_table[i].channel = 0;
			li_config_table[i].chflags = 0;
			for (j = 0; j < li_total_channels; j++)
			{
				li_config_table[i].flag_table[j] = 0;
				li_config_table[j].flag_table[i] = 0;
				li_config_table[i].coef_table[j] = 0;
				li_config_table[j].coef_table[i] = 0;
			}
			if (a->manufacturer_features & MANUFACTURER_FEATURE_SLAVE_CODEC)
			{
				i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
				li_config_table[i].curchnl = 0;
				li_config_table[i].channel = 0;
				li_config_table[i].chflags = 0;
				for (j = 0; j < li_total_channels; j++)
				{
					li_config_table[i].flag_table[j] = 0;
					li_config_table[j].flag_table[i] = 0;
					li_config_table[i].coef_table[j] = 0;
					li_config_table[j].coef_table[i] = 0;
				}
			}
		}

	}
}


static void adv_voice_prepare_switch(dword Id, PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: adv_voice_prepare_switch",
			UnMapId(Id), (char *)(FILE_), __LINE__));

}


static word adv_voice_save_config(dword Id, PLCI *plci, byte Rc)
{

	dbug(1, dprintf("[%06lx] %s,%d: adv_voice_save_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	return (GOOD);
}


static word adv_voice_restore_config(dword Id, PLCI *plci, byte Rc)
{
	DIVA_CAPI_ADAPTER *a;
	word Info;

	dbug(1, dprintf("[%06lx] %s,%d: adv_voice_restore_config %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	Info = GOOD;
	a = plci->adapter;
	if ((plci->B1_facilities & B1_FACILITY_VOICE)
	    && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
	{
		switch (plci->adjust_b_state)
		{
		case ADJUST_B_RESTORE_VOICE_1:
			plci->internal_command = plci->adjust_b_command;
			if (plci->sig_req)
			{
				plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
				break;
			}
			adv_voice_write_coefs(plci, ADV_VOICE_WRITE_UPDATE);
			plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_2;
			break;
		case ADJUST_B_RESTORE_VOICE_2:
			if ((Rc != OK) && (Rc != OK_FC))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Restore voice config failed %02x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
				Info = _WRONG_STATE;
				break;
			}
			break;
		}
	}
	return (Info);
}




/*------------------------------------------------------------------*/
/* B1 resource switching                                            */
/*------------------------------------------------------------------*/

static byte b1_facilities_table[] =
{
	0x00,  /* 0  No bchannel resources      */
	0x00,  /* 1  Codec (automatic law)      */
	0x00,  /* 2  Codec (A-law)              */
	0x00,  /* 3  Codec (y-law)              */
	0x00,  /* 4  HDLC for X.21              */
	0x00,  /* 5  HDLC                       */
	0x00,  /* 6  External Device 0          */
	0x00,  /* 7  External Device 1          */
	0x00,  /* 8  HDLC 56k                   */
	0x00,  /* 9  Transparent                */
	0x00,  /* 10 Loopback to network        */
	0x00,  /* 11 Test pattern to net        */
	0x00,  /* 12 Rate adaptation sync       */
	0x00,  /* 13 Rate adaptation async      */
	0x00,  /* 14 R-Interface                */
	0x00,  /* 15 HDLC 128k leased line      */
	0x00,  /* 16 FAX                        */
	0x00,  /* 17 Modem async                */
	0x00,  /* 18 Modem sync HDLC            */
	0x00,  /* 19 V.110 async HDLC           */
	0x12,  /* 20 Adv voice (Trans,mixer)    */
	0x00,  /* 21 Codec connected to IC      */
	0x0c,  /* 22 Trans,DTMF                 */
	0x1e,  /* 23 Trans,DTMF+mixer           */
	0x1f,  /* 24 Trans,DTMF+mixer+local     */
	0x13,  /* 25 Trans,mixer+local          */
	0x12,  /* 26 HDLC,mixer                 */
	0x12,  /* 27 HDLC 56k,mixer             */
	0x2c,  /* 28 Trans,LEC+DTMF             */
	0x3e,  /* 29 Trans,LEC+DTMF+mixer       */
	0x3f,  /* 30 Trans,LEC+DTMF+mixer+local */
	0x2c,  /* 31 RTP,LEC+DTMF               */
	0x3e,  /* 32 RTP,LEC+DTMF+mixer         */
	0x3f,  /* 33 RTP,LEC+DTMF+mixer+local   */
	0x00,  /* 34 Signaling task             */
	0x00,  /* 35 PIAFS                      */
	0x0c,  /* 36 Trans,DTMF+TONE            */
	0x1e,  /* 37 Trans,DTMF+TONE+mixer      */
	0x1f   /* 38 Trans,DTMF+TONE+mixer+local*/
};


static word get_b1_facilities(PLCI *plci, byte b1_resource)
{
	word b1_facilities;

	b1_facilities = b1_facilities_table[b1_resource];
	if ((b1_resource == 9) || (b1_resource == 20) || (b1_resource == 25))
	{

		if (!(((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
		      || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id - 1] & (1L << PRIVATE_DTMF_TONE)))))

		{
			if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND)
				b1_facilities |= B1_FACILITY_DTMFX;
			if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)
				b1_facilities |= B1_FACILITY_DTMFR;
		}
	}
	if ((b1_resource == 17) || (b1_resource == 18))
	{
		if (plci->adapter->manufacturer_features & (MANUFACTURER_FEATURE_V18 | MANUFACTURER_FEATURE_VOWN))
			b1_facilities |= B1_FACILITY_DTMFX | B1_FACILITY_DTMFR;
	}
/*
  dbug (1, dprintf("[%06lx] %s,%d: get_b1_facilities %d %04x",
  (dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
  (char far *)(FILE_), __LINE__, b1_resource, b1_facilites));
*/
	return (b1_facilities);
}


static byte add_b1_facilities(PLCI *plci, byte b1_resource, word b1_facilities)
{
	byte b;

	switch (b1_resource)
	{
	case 5:
	case 26:
		if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
			b = 26;
		else
			b = 5;
		break;

	case 8:
	case 27:
		if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
			b = 27;
		else
			b = 8;
		break;

	case 9:
	case 20:
	case 22:
	case 23:
	case 24:
	case 25:
	case 28:
	case 29:
	case 30:
	case 36:
	case 37:
	case 38:
		if (b1_facilities & B1_FACILITY_EC)
		{
			if (b1_facilities & B1_FACILITY_LOCAL)
				b = 30;
			else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
				b = 29;
			else
				b = 28;
		}

		else if ((b1_facilities & (B1_FACILITY_DTMFX | B1_FACILITY_DTMFR | B1_FACILITY_MIXER))
			 && (((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
			     || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id - 1] & (1L << PRIVATE_DTMF_TONE)))))
		{
			if (b1_facilities & B1_FACILITY_LOCAL)
				b = 38;
			else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
				b = 37;
			else
				b = 36;
		}

		else if (((plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
			  && !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
			 || ((b1_facilities & B1_FACILITY_DTMFR)
			     && ((b1_facilities & B1_FACILITY_MIXER)
				 || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)))
			 || ((b1_facilities & B1_FACILITY_DTMFX)
			     && ((b1_facilities & B1_FACILITY_MIXER)
				 || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND))))
		{
			if (b1_facilities & B1_FACILITY_LOCAL)
				b = 24;
			else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
				b = 23;
			else
				b = 22;
		}
		else
		{
			if (b1_facilities & B1_FACILITY_LOCAL)
				b = 25;
			else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
				b = 20;
			else
				b = 9;
		}
		break;

	case 31:
	case 32:
	case 33:
		if (b1_facilities & B1_FACILITY_LOCAL)
			b = 33;
		else if (b1_facilities & (B1_FACILITY_MIXER | B1_FACILITY_VOICE))
			b = 32;
		else
			b = 31;
		break;

	default:
		b = b1_resource;
	}
	dbug(1, dprintf("[%06lx] %s,%d: add_b1_facilities %d %04x %d %04x",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__,
			b1_resource, b1_facilities, b, get_b1_facilities(plci, b)));
	return (b);
}


static void adjust_b1_facilities(PLCI *plci, byte new_b1_resource, word new_b1_facilities)
{
	word removed_facilities;

	dbug(1, dprintf("[%06lx] %s,%d: adjust_b1_facilities %d %04x %04x",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__, new_b1_resource, new_b1_facilities,
			new_b1_facilities & get_b1_facilities(plci, new_b1_resource)));

	new_b1_facilities &= get_b1_facilities(plci, new_b1_resource);
	removed_facilities = plci->B1_facilities & ~new_b1_facilities;

	if (removed_facilities & B1_FACILITY_EC)
		ec_clear_config(plci);


	if (removed_facilities & B1_FACILITY_DTMFR)
	{
		dtmf_rec_clear_config(plci);
		dtmf_parameter_clear_config(plci);
	}
	if (removed_facilities & B1_FACILITY_DTMFX)
		dtmf_send_clear_config(plci);


	if (removed_facilities & B1_FACILITY_MIXER)
		mixer_clear_config(plci);

	if (removed_facilities & B1_FACILITY_VOICE)
		adv_voice_clear_config(plci);
	plci->B1_facilities = new_b1_facilities;
}


static void adjust_b_clear(PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: adjust_b_clear",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	plci->adjust_b_restore = false;
}


static word adjust_b_process(dword Id, PLCI *plci, byte Rc)
{
	word Info;
	byte b1_resource;
	NCCI *ncci_ptr;
	API_PARSE bp[2];

	dbug(1, dprintf("[%06lx] %s,%d: adjust_b_process %02x %d",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));

	Info = GOOD;
	switch (plci->adjust_b_state)
	{
	case ADJUST_B_START:
		if ((plci->adjust_b_parms_msg == NULL)
		    && (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
		    && ((plci->adjust_b_mode & ~(ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 |
						 ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_RESTORE)) == 0))
		{
			b1_resource = (plci->adjust_b_mode == ADJUST_B_MODE_NO_RESOURCE) ?
				0 : add_b1_facilities(plci, plci->B1_resource, plci->adjust_b_facilities);
			if (b1_resource == plci->B1_resource)
			{
				adjust_b1_facilities(plci, b1_resource, plci->adjust_b_facilities);
				break;
			}
			if (plci->adjust_b_facilities & ~get_b1_facilities(plci, b1_resource))
			{
				dbug(1, dprintf("[%06lx] %s,%d: Adjust B nonsupported facilities %d %d %04x",
						UnMapId(Id), (char *)(FILE_), __LINE__,
						plci->B1_resource, b1_resource, plci->adjust_b_facilities));
				Info = _WRONG_STATE;
				break;
			}
		}
		if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
		{

			mixer_prepare_switch(Id, plci);


			dtmf_prepare_switch(Id, plci);
			dtmf_parameter_prepare_switch(Id, plci);


			ec_prepare_switch(Id, plci);

			adv_voice_prepare_switch(Id, plci);
		}
		plci->adjust_b_state = ADJUST_B_SAVE_MIXER_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_SAVE_MIXER_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
		{

			Info = mixer_save_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_SAVE_DTMF_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_SAVE_DTMF_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
		{

			Info = dtmf_save_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_REMOVE_L23_1;
		/* fall through */
	case ADJUST_B_REMOVE_L23_1:
		if ((plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
		    && plci->NL.Id && !plci->nl_remove_id)
		{
			plci->internal_command = plci->adjust_b_command;
			if (plci->adjust_b_ncci != 0)
			{
				ncci_ptr = &(plci->adapter->ncci[plci->adjust_b_ncci]);
				while (ncci_ptr->data_pending)
				{
					plci->data_sent_ptr = ncci_ptr->DBuffer[ncci_ptr->data_out].P;
					data_rc(plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
				}
				while (ncci_ptr->data_ack_pending)
					data_ack(plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
			}
			nl_req_ncci(plci, REMOVE,
				    (byte)((plci->adjust_b_mode & ADJUST_B_MODE_CONNECT) ? plci->adjust_b_ncci : 0));
			send_req(plci);
			plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
			break;
		}
		plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
		Rc = OK;
		/* fall through */
	case ADJUST_B_REMOVE_L23_2:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: Adjust B remove failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			Info = _WRONG_STATE;
			break;
		}
		if (plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
		{
			if (plci_nl_busy(plci))
			{
				plci->internal_command = plci->adjust_b_command;
				break;
			}
		}
		plci->adjust_b_state = ADJUST_B_SAVE_EC_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_SAVE_EC_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
		{

			Info = ec_save_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_SAVE_DTMF_PARAMETER_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_SAVE_DTMF_PARAMETER_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
		{

			Info = dtmf_parameter_save_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_SAVE_VOICE_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_SAVE_VOICE_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
		{
			Info = adv_voice_save_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;
		}
		plci->adjust_b_state = ADJUST_B_SWITCH_L1_1;
		/* fall through */
	case ADJUST_B_SWITCH_L1_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
		{
			if (plci->sig_req)
			{
				plci->internal_command = plci->adjust_b_command;
				break;
			}
			if (plci->adjust_b_parms_msg != NULL)
				api_load_msg(plci->adjust_b_parms_msg, bp);
			else
				api_load_msg(&plci->B_protocol, bp);
			Info = add_b1(plci, bp,
				      (word)((plci->adjust_b_mode & ADJUST_B_MODE_NO_RESOURCE) ? 2 : 0),
				      plci->adjust_b_facilities);
			if (Info != GOOD)
			{
				dbug(1, dprintf("[%06lx] %s,%d: Adjust B invalid L1 parameters %d %04x",
						UnMapId(Id), (char *)(FILE_), __LINE__,
						plci->B1_resource, plci->adjust_b_facilities));
				break;
			}
			plci->internal_command = plci->adjust_b_command;
			sig_req(plci, RESOURCES, 0);
			send_req(plci);
			plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
			break;
		}
		plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
		Rc = OK;
		/* fall through */
	case ADJUST_B_SWITCH_L1_2:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: Adjust B switch failed %02x %d %04x",
					UnMapId(Id), (char *)(FILE_), __LINE__,
					Rc, plci->B1_resource, plci->adjust_b_facilities));
			Info = _WRONG_STATE;
			break;
		}
		plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_RESTORE_VOICE_1:
	case ADJUST_B_RESTORE_VOICE_2:
		if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
		{
			Info = adv_voice_restore_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;
		}
		plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_RESTORE_DTMF_PARAMETER_1:
	case ADJUST_B_RESTORE_DTMF_PARAMETER_2:
		if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
		{

			Info = dtmf_parameter_restore_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_RESTORE_EC_1:
	case ADJUST_B_RESTORE_EC_2:
		if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
		{

			Info = ec_restore_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_ASSIGN_L23_1;
		/* fall through */
	case ADJUST_B_ASSIGN_L23_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
		{
			if (plci_nl_busy(plci))
			{
				plci->internal_command = plci->adjust_b_command;
				break;
			}
			if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
				plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
			if (plci->adjust_b_parms_msg != NULL)
				api_load_msg(plci->adjust_b_parms_msg, bp);
			else
				api_load_msg(&plci->B_protocol, bp);
			Info = add_b23(plci, bp);
			if (Info != GOOD)
			{
				dbug(1, dprintf("[%06lx] %s,%d: Adjust B invalid L23 parameters %04x",
						UnMapId(Id), (char *)(FILE_), __LINE__, Info));
				break;
			}
			plci->internal_command = plci->adjust_b_command;
			nl_req_ncci(plci, ASSIGN, 0);
			send_req(plci);
			plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
			break;
		}
		plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
		Rc = ASSIGN_OK;
		/* fall through */
	case ADJUST_B_ASSIGN_L23_2:
		if ((Rc != OK) && (Rc != OK_FC) && (Rc != ASSIGN_OK))
		{
			dbug(1, dprintf("[%06lx] %s,%d: Adjust B assign failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			Info = _WRONG_STATE;
			break;
		}
		if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
		{
			if (Rc != ASSIGN_OK)
			{
				plci->internal_command = plci->adjust_b_command;
				break;
			}
		}
		if (plci->adjust_b_mode & ADJUST_B_MODE_USER_CONNECT)
		{
			plci->adjust_b_restore = true;
			break;
		}
		plci->adjust_b_state = ADJUST_B_CONNECT_1;
		/* fall through */
	case ADJUST_B_CONNECT_1:
		if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
		{
			plci->internal_command = plci->adjust_b_command;
			if (plci_nl_busy(plci))
				break;
			nl_req_ncci(plci, N_CONNECT, 0);
			send_req(plci);
			plci->adjust_b_state = ADJUST_B_CONNECT_2;
			break;
		}
		plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_CONNECT_2:
	case ADJUST_B_CONNECT_3:
	case ADJUST_B_CONNECT_4:
		if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
		{
			dbug(1, dprintf("[%06lx] %s,%d: Adjust B connect failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			Info = _WRONG_STATE;
			break;
		}
		if (Rc == OK)
		{
			if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
			{
				get_ncci(plci, (byte)(Id >> 16), plci->adjust_b_ncci);
				Id = (Id & 0xffff) | (((dword)(plci->adjust_b_ncci)) << 16);
			}
			if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
				plci->adjust_b_state = ADJUST_B_CONNECT_3;
			else if (plci->adjust_b_state == ADJUST_B_CONNECT_4)
				plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
		}
		else if (Rc == 0)
		{
			if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
				plci->adjust_b_state = ADJUST_B_CONNECT_4;
			else if (plci->adjust_b_state == ADJUST_B_CONNECT_3)
				plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
		}
		if (plci->adjust_b_state != ADJUST_B_RESTORE_DTMF_1)
		{
			plci->internal_command = plci->adjust_b_command;
			break;
		}
		Rc = OK;
		/* fall through */
	case ADJUST_B_RESTORE_DTMF_1:
	case ADJUST_B_RESTORE_DTMF_2:
		if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
		{

			Info = dtmf_restore_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
		Rc = OK;
		/* fall through */
	case ADJUST_B_RESTORE_MIXER_1:
	case ADJUST_B_RESTORE_MIXER_2:
	case ADJUST_B_RESTORE_MIXER_3:
	case ADJUST_B_RESTORE_MIXER_4:
	case ADJUST_B_RESTORE_MIXER_5:
	case ADJUST_B_RESTORE_MIXER_6:
	case ADJUST_B_RESTORE_MIXER_7:
		if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
		{

			Info = mixer_restore_config(Id, plci, Rc);
			if ((Info != GOOD) || plci->internal_command)
				break;

		}
		plci->adjust_b_state = ADJUST_B_END;
	case ADJUST_B_END:
		break;
	}
	return (Info);
}


static void adjust_b1_resource(dword Id, PLCI *plci, API_SAVE   *bp_msg, word b1_facilities, word internal_command)
{

	dbug(1, dprintf("[%06lx] %s,%d: adjust_b1_resource %d %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__,
			plci->B1_resource, b1_facilities));

	plci->adjust_b_parms_msg = bp_msg;
	plci->adjust_b_facilities = b1_facilities;
	plci->adjust_b_command = internal_command;
	plci->adjust_b_ncci = (word)(Id >> 16);
	if ((bp_msg == NULL) && (plci->B1_resource == 0))
		plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_SWITCH_L1;
	else
		plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 | ADJUST_B_MODE_RESTORE;
	plci->adjust_b_state = ADJUST_B_START;
	dbug(1, dprintf("[%06lx] %s,%d: Adjust B1 resource %d %04x...",
			UnMapId(Id), (char *)(FILE_), __LINE__,
			plci->B1_resource, b1_facilities));
}


static void adjust_b_restore(dword Id, PLCI *plci, byte Rc)
{
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: adjust_b_restore %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0;
		if (plci->req_in != 0)
		{
			plci->internal_command = ADJUST_B_RESTORE_1;
			break;
		}
		Rc = OK;
		/* fall through */
	case ADJUST_B_RESTORE_1:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: Adjust B enqueued failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
		}
		plci->adjust_b_parms_msg = NULL;
		plci->adjust_b_facilities = plci->B1_facilities;
		plci->adjust_b_command = ADJUST_B_RESTORE_2;
		plci->adjust_b_ncci = (word)(Id >> 16);
		plci->adjust_b_mode = ADJUST_B_MODE_RESTORE;
		plci->adjust_b_state = ADJUST_B_START;
		dbug(1, dprintf("[%06lx] %s,%d: Adjust B restore...",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		/* fall through */
	case ADJUST_B_RESTORE_2:
		if (adjust_b_process(Id, plci, Rc) != GOOD)
		{
			dbug(1, dprintf("[%06lx] %s,%d: Adjust B restore failed",
					UnMapId(Id), (char *)(FILE_), __LINE__));
		}
		if (plci->internal_command)
			break;
		break;
	}
}


static void reset_b3_command(dword Id, PLCI *plci, byte Rc)
{
	word Info;
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: reset_b3_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	Info = GOOD;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0;
		plci->adjust_b_parms_msg = NULL;
		plci->adjust_b_facilities = plci->B1_facilities;
		plci->adjust_b_command = RESET_B3_COMMAND_1;
		plci->adjust_b_ncci = (word)(Id >> 16);
		plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_CONNECT;
		plci->adjust_b_state = ADJUST_B_START;
		dbug(1, dprintf("[%06lx] %s,%d: Reset B3...",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		/* fall through */
	case RESET_B3_COMMAND_1:
		Info = adjust_b_process(Id, plci, Rc);
		if (Info != GOOD)
		{
			dbug(1, dprintf("[%06lx] %s,%d: Reset failed",
					UnMapId(Id), (char *)(FILE_), __LINE__));
			break;
		}
		if (plci->internal_command)
			return;
		break;
	}
/*  sendf (plci->appl, _RESET_B3_R | CONFIRM, Id, plci->number, "w", Info);*/
	sendf(plci->appl, _RESET_B3_I, Id, 0, "s", "");
}


static void select_b_command(dword Id, PLCI *plci, byte Rc)
{
	word Info;
	word internal_command;
	byte esc_chi[3];

	dbug(1, dprintf("[%06lx] %s,%d: select_b_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	Info = GOOD;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0;
		plci->adjust_b_parms_msg = &plci->saved_msg;
		if ((plci->tel == ADV_VOICE) && (plci == plci->adapter->AdvSignalPLCI))
			plci->adjust_b_facilities = plci->B1_facilities | B1_FACILITY_VOICE;
		else
			plci->adjust_b_facilities = plci->B1_facilities & ~B1_FACILITY_VOICE;
		plci->adjust_b_command = SELECT_B_COMMAND_1;
		plci->adjust_b_ncci = (word)(Id >> 16);
		if (plci->saved_msg.parms[0].length == 0)
		{
			plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
				ADJUST_B_MODE_NO_RESOURCE;
		}
		else
		{
			plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
				ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
		}
		plci->adjust_b_state = ADJUST_B_START;
		dbug(1, dprintf("[%06lx] %s,%d: Select B protocol...",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		/* fall through */
	case SELECT_B_COMMAND_1:
		Info = adjust_b_process(Id, plci, Rc);
		if (Info != GOOD)
		{
			dbug(1, dprintf("[%06lx] %s,%d: Select B protocol failed",
					UnMapId(Id), (char *)(FILE_), __LINE__));
			break;
		}
		if (plci->internal_command)
			return;
		if (plci->tel == ADV_VOICE)
		{
			esc_chi[0] = 0x02;
			esc_chi[1] = 0x18;
			esc_chi[2] = plci->b_channel;
			SetVoiceChannel(plci->adapter->AdvCodecPLCI, esc_chi, plci->adapter);
		}
		break;
	}
	sendf(plci->appl, _SELECT_B_REQ | CONFIRM, Id, plci->number, "w", Info);
}


static void fax_connect_ack_command(dword Id, PLCI *plci, byte Rc)
{
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: fax_connect_ack_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0; /* fall through */
	case FAX_CONNECT_ACK_COMMAND_1:
		if (plci_nl_busy(plci))
		{
			plci->internal_command = FAX_CONNECT_ACK_COMMAND_1;
			return;
		}
		plci->internal_command = FAX_CONNECT_ACK_COMMAND_2;
		plci->NData[0].P = plci->fax_connect_info_buffer;
		plci->NData[0].PLength = plci->fax_connect_info_length;
		plci->NL.X = plci->NData;
		plci->NL.ReqCh = 0;
		plci->NL.Req = plci->nl_req = (byte) N_CONNECT_ACK;
		plci->adapter->request(&plci->NL);
		return;
	case FAX_CONNECT_ACK_COMMAND_2:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: FAX issue CONNECT ACK failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			break;
		}
	}
	if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
	    && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
	{
		if (plci->B3_prot == 4)
			sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
		else
			sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "S", plci->ncpi_buffer);
		plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
	}
}


static void fax_edata_ack_command(dword Id, PLCI *plci, byte Rc)
{
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: fax_edata_ack_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0;
		/* fall through */
	case FAX_EDATA_ACK_COMMAND_1:
		if (plci_nl_busy(plci))
		{
			plci->internal_command = FAX_EDATA_ACK_COMMAND_1;
			return;
		}
		plci->internal_command = FAX_EDATA_ACK_COMMAND_2;
		plci->NData[0].P = plci->fax_connect_info_buffer;
		plci->NData[0].PLength = plci->fax_edata_ack_length;
		plci->NL.X = plci->NData;
		plci->NL.ReqCh = 0;
		plci->NL.Req = plci->nl_req = (byte) N_EDATA;
		plci->adapter->request(&plci->NL);
		return;
	case FAX_EDATA_ACK_COMMAND_2:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: FAX issue EDATA ACK failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			break;
		}
	}
}


static void fax_connect_info_command(dword Id, PLCI *plci, byte Rc)
{
	word Info;
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: fax_connect_info_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	Info = GOOD;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0; /* fall through */
	case FAX_CONNECT_INFO_COMMAND_1:
		if (plci_nl_busy(plci))
		{
			plci->internal_command = FAX_CONNECT_INFO_COMMAND_1;
			return;
		}
		plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
		plci->NData[0].P = plci->fax_connect_info_buffer;
		plci->NData[0].PLength = plci->fax_connect_info_length;
		plci->NL.X = plci->NData;
		plci->NL.ReqCh = 0;
		plci->NL.Req = plci->nl_req = (byte) N_EDATA;
		plci->adapter->request(&plci->NL);
		return;
	case FAX_CONNECT_INFO_COMMAND_2:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: FAX setting connect info failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			Info = _WRONG_STATE;
			break;
		}
		if (plci_nl_busy(plci))
		{
			plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
			return;
		}
		plci->command = _CONNECT_B3_R;
		nl_req_ncci(plci, N_CONNECT, 0);
		send_req(plci);
		return;
	}
	sendf(plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
}


static void fax_adjust_b23_command(dword Id, PLCI *plci, byte Rc)
{
	word Info;
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: fax_adjust_b23_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	Info = GOOD;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0;
		plci->adjust_b_parms_msg = NULL;
		plci->adjust_b_facilities = plci->B1_facilities;
		plci->adjust_b_command = FAX_ADJUST_B23_COMMAND_1;
		plci->adjust_b_ncci = (word)(Id >> 16);
		plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23;
		plci->adjust_b_state = ADJUST_B_START;
		dbug(1, dprintf("[%06lx] %s,%d: FAX adjust B23...",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		/* fall through */
	case FAX_ADJUST_B23_COMMAND_1:
		Info = adjust_b_process(Id, plci, Rc);
		if (Info != GOOD)
		{
			dbug(1, dprintf("[%06lx] %s,%d: FAX adjust failed",
					UnMapId(Id), (char *)(FILE_), __LINE__));
			break;
		}
		if (plci->internal_command)
			return;
		/* fall through */
	case FAX_ADJUST_B23_COMMAND_2:
		if (plci_nl_busy(plci))
		{
			plci->internal_command = FAX_ADJUST_B23_COMMAND_2;
			return;
		}
		plci->command = _CONNECT_B3_R;
		nl_req_ncci(plci, N_CONNECT, 0);
		send_req(plci);
		return;
	}
	sendf(plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
}


static void fax_disconnect_command(dword Id, PLCI *plci, byte Rc)
{
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: fax_disconnect_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0;
		plci->internal_command = FAX_DISCONNECT_COMMAND_1;
		return;
	case FAX_DISCONNECT_COMMAND_1:
	case FAX_DISCONNECT_COMMAND_2:
	case FAX_DISCONNECT_COMMAND_3:
		if ((Rc != OK) && (Rc != OK_FC) && (Rc != 0))
		{
			dbug(1, dprintf("[%06lx] %s,%d: FAX disconnect EDATA failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			break;
		}
		if (Rc == OK)
		{
			if ((internal_command == FAX_DISCONNECT_COMMAND_1)
			    || (internal_command == FAX_DISCONNECT_COMMAND_2))
			{
				plci->internal_command = FAX_DISCONNECT_COMMAND_2;
			}
		}
		else if (Rc == 0)
		{
			if (internal_command == FAX_DISCONNECT_COMMAND_1)
				plci->internal_command = FAX_DISCONNECT_COMMAND_3;
		}
		return;
	}
}



static void rtp_connect_b3_req_command(dword Id, PLCI *plci, byte Rc)
{
	word Info;
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: rtp_connect_b3_req_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	Info = GOOD;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0; /* fall through */
	case RTP_CONNECT_B3_REQ_COMMAND_1:
		if (plci_nl_busy(plci))
		{
			plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_1;
			return;
		}
		plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
		nl_req_ncci(plci, N_CONNECT, 0);
		send_req(plci);
		return;
	case RTP_CONNECT_B3_REQ_COMMAND_2:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: RTP setting connect info failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			Info = _WRONG_STATE;
			break;
		}
		if (plci_nl_busy(plci))
		{
			plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
			return;
		}
		plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_3;
		plci->NData[0].PLength = plci->internal_req_buffer[0];
		plci->NData[0].P = plci->internal_req_buffer + 1;
		plci->NL.X = plci->NData;
		plci->NL.ReqCh = 0;
		plci->NL.Req = plci->nl_req = (byte) N_UDATA;
		plci->adapter->request(&plci->NL);
		break;
	case RTP_CONNECT_B3_REQ_COMMAND_3:
		return;
	}
	sendf(plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
}


static void rtp_connect_b3_res_command(dword Id, PLCI *plci, byte Rc)
{
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: rtp_connect_b3_res_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0; /* fall through */
	case RTP_CONNECT_B3_RES_COMMAND_1:
		if (plci_nl_busy(plci))
		{
			plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_1;
			return;
		}
		plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
		nl_req_ncci(plci, N_CONNECT_ACK, (byte)(Id >> 16));
		send_req(plci);
		return;
	case RTP_CONNECT_B3_RES_COMMAND_2:
		if ((Rc != OK) && (Rc != OK_FC))
		{
			dbug(1, dprintf("[%06lx] %s,%d: RTP setting connect resp info failed %02x",
					UnMapId(Id), (char *)(FILE_), __LINE__, Rc));
			break;
		}
		if (plci_nl_busy(plci))
		{
			plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
			return;
		}
		sendf(plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
		plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_3;
		plci->NData[0].PLength = plci->internal_req_buffer[0];
		plci->NData[0].P = plci->internal_req_buffer + 1;
		plci->NL.X = plci->NData;
		plci->NL.ReqCh = 0;
		plci->NL.Req = plci->nl_req = (byte) N_UDATA;
		plci->adapter->request(&plci->NL);
		return;
	case RTP_CONNECT_B3_RES_COMMAND_3:
		return;
	}
}



static void hold_save_command(dword Id, PLCI *plci, byte Rc)
{
	byte SS_Ind[] = "\x05\x02\x00\x02\x00\x00"; /* Hold_Ind struct*/
	word Info;
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: hold_save_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	Info = GOOD;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		if (!plci->NL.Id)
			break;
		plci->command = 0;
		plci->adjust_b_parms_msg = NULL;
		plci->adjust_b_facilities = plci->B1_facilities;
		plci->adjust_b_command = HOLD_SAVE_COMMAND_1;
		plci->adjust_b_ncci = (word)(Id >> 16);
		plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23;
		plci->adjust_b_state = ADJUST_B_START;
		dbug(1, dprintf("[%06lx] %s,%d: HOLD save...",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		/* fall through */
	case HOLD_SAVE_COMMAND_1:
		Info = adjust_b_process(Id, plci, Rc);
		if (Info != GOOD)
		{
			dbug(1, dprintf("[%06lx] %s,%d: HOLD save failed",
					UnMapId(Id), (char *)(FILE_), __LINE__));
			break;
		}
		if (plci->internal_command)
			return;
	}
	sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
}


static void retrieve_restore_command(dword Id, PLCI *plci, byte Rc)
{
	byte SS_Ind[] = "\x05\x03\x00\x02\x00\x00"; /* Retrieve_Ind struct*/
	word Info;
	word internal_command;

	dbug(1, dprintf("[%06lx] %s,%d: retrieve_restore_command %02x %04x",
			UnMapId(Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));

	Info = GOOD;
	internal_command = plci->internal_command;
	plci->internal_command = 0;
	switch (internal_command)
	{
	default:
		plci->command = 0;
		plci->adjust_b_parms_msg = NULL;
		plci->adjust_b_facilities = plci->B1_facilities;
		plci->adjust_b_command = RETRIEVE_RESTORE_COMMAND_1;
		plci->adjust_b_ncci = (word)(Id >> 16);
		plci->adjust_b_mode = ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
		plci->adjust_b_state = ADJUST_B_START;
		dbug(1, dprintf("[%06lx] %s,%d: RETRIEVE restore...",
				UnMapId(Id), (char *)(FILE_), __LINE__));
		/* fall through */
	case RETRIEVE_RESTORE_COMMAND_1:
		Info = adjust_b_process(Id, plci, Rc);
		if (Info != GOOD)
		{
			dbug(1, dprintf("[%06lx] %s,%d: RETRIEVE restore failed",
					UnMapId(Id), (char *)(FILE_), __LINE__));
			break;
		}
		if (plci->internal_command)
			return;
	}
	sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
}


static void init_b1_config(PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: init_b1_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	plci->B1_resource = 0;
	plci->B1_facilities = 0;

	plci->li_bchannel_id = 0;
	mixer_clear_config(plci);


	ec_clear_config(plci);


	dtmf_rec_clear_config(plci);
	dtmf_send_clear_config(plci);
	dtmf_parameter_clear_config(plci);

	adv_voice_clear_config(plci);
	adjust_b_clear(plci);
}


static void clear_b1_config(PLCI *plci)
{

	dbug(1, dprintf("[%06lx] %s,%d: clear_b1_config",
			(dword)((plci->Id << 8) | UnMapController(plci->adapter->Id)),
			(char *)(FILE_), __LINE__));

	adv_voice_clear_config(plci);
	adjust_b_clear(plci);

	ec_clear_config(plci);


	dtmf_rec_clear_config(plci);
	dtmf_send_clear_config(plci);
	dtmf_parameter_clear_config(plci);


	if ((plci->li_bchannel_id != 0)
	    && (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci == plci))
	{
		mixer_clear_config(plci);
		li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = NULL;
		plci->li_bchannel_id = 0;
	}

	plci->B1_resource = 0;
	plci->B1_facilities = 0;
}


/* -----------------------------------------------------------------
   XON protocol local helpers
   ----------------------------------------------------------------- */
static void channel_flow_control_remove(PLCI *plci) {
	DIVA_CAPI_ADAPTER *a = plci->adapter;
	word i;
	for (i = 1; i < MAX_NL_CHANNEL + 1; i++) {
		if (a->ch_flow_plci[i] == plci->Id) {
			a->ch_flow_plci[i] = 0;
			a->ch_flow_control[i] = 0;
		}
	}
}

static void channel_x_on(PLCI *plci, byte ch) {
	DIVA_CAPI_ADAPTER *a = plci->adapter;
	if (a->ch_flow_control[ch] & N_XON_SENT) {
		a->ch_flow_control[ch] &= ~N_XON_SENT;
	}
}

static void channel_x_off(PLCI *plci, byte ch, byte flag) {
	DIVA_CAPI_ADAPTER *a = plci->adapter;
	if ((a->ch_flow_control[ch] & N_RX_FLOW_CONTROL_MASK) == 0) {
		a->ch_flow_control[ch] |= (N_CH_XOFF | flag);
		a->ch_flow_plci[ch] = plci->Id;
		a->ch_flow_control_pending++;
	}
}

static void channel_request_xon(PLCI *plci, byte ch) {
	DIVA_CAPI_ADAPTER *a = plci->adapter;

	if (a->ch_flow_control[ch] & N_CH_XOFF) {
		a->ch_flow_control[ch] |= N_XON_REQ;
		a->ch_flow_control[ch] &= ~N_CH_XOFF;
		a->ch_flow_control[ch] &= ~N_XON_CONNECT_IND;
	}
}

static void channel_xmit_extended_xon(PLCI *plci) {
	DIVA_CAPI_ADAPTER *a;
	int max_ch = ARRAY_SIZE(a->ch_flow_control);
	int i, one_requested = 0;

	if ((!plci) || (!plci->Id) || ((a = plci->adapter) == NULL)) {
		return;
	}

	for (i = 0; i < max_ch; i++) {
		if ((a->ch_flow_control[i] & N_CH_XOFF) &&
		    (a->ch_flow_control[i] & N_XON_CONNECT_IND) &&
		    (plci->Id == a->ch_flow_plci[i])) {
			channel_request_xon(plci, (byte)i);
			one_requested = 1;
		}
	}

	if (one_requested) {
		channel_xmit_xon(plci);
	}
}

/*
  Try to xmit next X_ON
*/
static int find_channel_with_pending_x_on(DIVA_CAPI_ADAPTER *a, PLCI *plci) {
	int max_ch = ARRAY_SIZE(a->ch_flow_control);
	int i;

	if (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)) {
		return (0);
	}

	if (a->last_flow_control_ch >= max_ch) {
		a->last_flow_control_ch = 1;
	}
	for (i = a->last_flow_control_ch; i < max_ch; i++) {
		if ((a->ch_flow_control[i] & N_XON_REQ) &&
		    (plci->Id == a->ch_flow_plci[i])) {
			a->last_flow_control_ch = i + 1;
			return (i);
		}
	}

	for (i = 1; i < a->last_flow_control_ch; i++) {
		if ((a->ch_flow_control[i] & N_XON_REQ) &&
		    (plci->Id == a->ch_flow_plci[i])) {
			a->last_flow_control_ch = i + 1;
			return (i);
		}
	}

	return (0);
}

static void channel_xmit_xon(PLCI *plci) {
	DIVA_CAPI_ADAPTER *a = plci->adapter;
	byte ch;

	if (plci->nl_req || !plci->NL.Id || plci->nl_remove_id) {
		return;
	}
	if ((ch = (byte)find_channel_with_pending_x_on(a, plci)) == 0) {
		return;
	}
	a->ch_flow_control[ch] &= ~N_XON_REQ;
	a->ch_flow_control[ch] |= N_XON_SENT;

	plci->NL.Req = plci->nl_req = (byte)N_XON;
	plci->NL.ReqCh         = ch;
	plci->NL.X             = plci->NData;
	plci->NL.XNum          = 1;
	plci->NData[0].P       = &plci->RBuffer[0];
	plci->NData[0].PLength = 0;

	plci->adapter->request(&plci->NL);
}

static int channel_can_xon(PLCI *plci, byte ch) {
	APPL *APPLptr;
	DIVA_CAPI_ADAPTER *a;
	word NCCIcode;
	dword count;
	word Num;
	word i;

	APPLptr = plci->appl;
	a = plci->adapter;

	if (!APPLptr)
		return (0);

	NCCIcode = a->ch_ncci[ch] | (((word) a->Id) << 8);

	/* count all buffers within the Application pool    */
	/* belonging to the same NCCI. XON if a first is    */
	/* used.                                            */
	count = 0;
	Num = 0xffff;
	for (i = 0; i < APPLptr->MaxBuffer; i++) {
		if (NCCIcode == APPLptr->DataNCCI[i]) count++;
		if (!APPLptr->DataNCCI[i] && Num == 0xffff) Num = i;
	}
	if ((count > 2) || (Num == 0xffff)) {
		return (0);
	}
	return (1);
}


/*------------------------------------------------------------------*/

static word CPN_filter_ok(byte *cpn, DIVA_CAPI_ADAPTER *a, word offset)
{
	return 1;
}



/**********************************************************************************/
/* function groups the listening applications according to the CIP mask and the   */
/* Info_Mask. Each group gets just one Connect_Ind. Some application manufacturer */
/* are not multi-instance capable, so they start e.g. 30 applications what causes */
/* big problems on application level (one call, 30 Connect_Ind, ect). The         */
/* function must be enabled by setting "a->group_optimization_enabled" from the   */
/* OS specific part (per adapter).                                                */
/**********************************************************************************/
static void group_optimization(DIVA_CAPI_ADAPTER *a, PLCI *plci)
{
	word i, j, k, busy, group_found;
	dword info_mask_group[MAX_CIP_TYPES];
	dword cip_mask_group[MAX_CIP_TYPES];
	word appl_number_group_type[MAX_APPL];
	PLCI *auxplci;

	/* all APPLs within this inc. call are allowed to dial in */
	bitmap_fill(plci->group_optimization_mask_table, MAX_APPL);

	if (!a->group_optimization_enabled)
	{
		dbug(1, dprintf("No group optimization"));
		return;
	}

	dbug(1, dprintf("Group optimization = 0x%x...", a->group_optimization_enabled));

	for (i = 0; i < MAX_CIP_TYPES; i++)
	{
		info_mask_group[i] = 0;
		cip_mask_group[i] = 0;
	}
	for (i = 0; i < MAX_APPL; i++)
	{
		appl_number_group_type[i] = 0;
	}
	for (i = 0; i < max_appl; i++) /* check if any multi instance capable application is present */
	{  /* group_optimization set to 1 means not to optimize multi-instance capable applications (default) */
		if (application[i].Id && (application[i].MaxNCCI) > 1 && (a->CIP_Mask[i]) && (a->group_optimization_enabled == 1))
		{
			dbug(1, dprintf("Multi-Instance capable, no optimization required"));
			return; /* allow good application unfiltered access */
		}
	}
	for (i = 0; i < max_appl; i++) /* Build CIP Groups */
	{
		if (application[i].Id && a->CIP_Mask[i])
		{
			for (k = 0, busy = false; k < a->max_plci; k++)
			{
				if (a->plci[k].Id)
				{
					auxplci = &a->plci[k];
					if (auxplci->appl == &application[i]) {
						/* application has a busy PLCI */
						busy = true;
						dbug(1, dprintf("Appl 0x%x is busy", i + 1));
					} else if (test_bit(i, plci->c_ind_mask_table)) {
						/* application has an incoming call pending */
						busy = true;
						dbug(1, dprintf("Appl 0x%x has inc. call pending", i + 1));
					}
				}
			}

			for (j = 0, group_found = 0; j <= (MAX_CIP_TYPES) && !busy && !group_found; j++)     /* build groups with free applications only */
			{
				if (j == MAX_CIP_TYPES)       /* all groups are in use but group still not found */
				{                           /* the MAX_CIP_TYPES group enables all calls because of field overflow */
					appl_number_group_type[i] = MAX_CIP_TYPES;
					group_found = true;
					dbug(1, dprintf("Field overflow appl 0x%x", i + 1));
				}
				else if ((info_mask_group[j] == a->CIP_Mask[i]) && (cip_mask_group[j] == a->Info_Mask[i]))
				{                                      /* is group already present ?                  */
					appl_number_group_type[i] = j | 0x80;  /* store the group number for each application */
					group_found = true;
					dbug(1, dprintf("Group 0x%x found with appl 0x%x, CIP=0x%lx", appl_number_group_type[i], i + 1, info_mask_group[j]));
				}
				else if (!info_mask_group[j])
				{                                      /* establish a new group                       */
					appl_number_group_type[i] = j | 0x80;  /* store the group number for each application */
					info_mask_group[j] = a->CIP_Mask[i]; /* store the new CIP mask for the new group    */
					cip_mask_group[j] = a->Info_Mask[i]; /* store the new Info_Mask for this new group  */
					group_found = true;
					dbug(1, dprintf("New Group 0x%x established with appl 0x%x, CIP=0x%lx", appl_number_group_type[i], i + 1, info_mask_group[j]));
				}
			}
		}
	}

	for (i = 0; i < max_appl; i++) /* Build group_optimization_mask_table */
	{
		if (appl_number_group_type[i]) /* application is free, has listens and is member of a group */
		{
			if (appl_number_group_type[i] == MAX_CIP_TYPES)
			{
				dbug(1, dprintf("OverflowGroup 0x%x, valid appl = 0x%x, call enabled", appl_number_group_type[i], i + 1));
			}
			else
			{
				dbug(1, dprintf("Group 0x%x, valid appl = 0x%x", appl_number_group_type[i], i + 1));
				for (j = i + 1; j < max_appl; j++)   /* search other group members and mark them as busy        */
				{
					if (appl_number_group_type[i] == appl_number_group_type[j])
					{
						dbug(1, dprintf("Appl 0x%x is member of group 0x%x, no call", j + 1, appl_number_group_type[j]));
						/* disable call on other group members */
						__clear_bit(j, plci->group_optimization_mask_table);
						appl_number_group_type[j] = 0;       /* remove disabled group member from group list */
					}
				}
			}
		}
		else                                                 /* application should not get a call */
		{
			__clear_bit(i, plci->group_optimization_mask_table);
		}
	}

}



/* OS notifies the driver about a application Capi_Register */
word CapiRegister(word id)
{
	word i, j, appls_found;

	PLCI *plci;
	DIVA_CAPI_ADAPTER *a;

	for (i = 0, appls_found = 0; i < max_appl; i++)
	{
		if (application[i].Id && (application[i].Id != id))
		{
			appls_found++;                       /* an application has been found */
		}
	}

	if (appls_found) return true;
	for (i = 0; i < max_adapter; i++)                   /* scan all adapters...    */
	{
		a = &adapter[i];
		if (a->request)
		{
			if (a->flag_dynamic_l1_down)  /* remove adapter from L1 tristate (Huntgroup) */
			{
				if (!appls_found)           /* first application does a capi register   */
				{
					if ((j = get_plci(a)))                    /* activate L1 of all adapters */
					{
						plci = &a->plci[j - 1];
						plci->command = 0;
						add_p(plci, OAD, "\x01\xfd");
						add_p(plci, CAI, "\x01\x80");
						add_p(plci, UID, "\x06\x43\x61\x70\x69\x32\x30");
						add_p(plci, SHIFT | 6, NULL);
						add_p(plci, SIN, "\x02\x00\x00");
						plci->internal_command = START_L1_SIG_ASSIGN_PEND;
						sig_req(plci, ASSIGN, DSIG_ID);
						add_p(plci, FTY, "\x02\xff\x07"); /* l1 start */
						sig_req(plci, SIG_CTRL, 0);
						send_req(plci);
					}
				}
			}
		}
	}
	return false;
}

/*------------------------------------------------------------------*/

/* Functions for virtual Switching e.g. Transfer by join, Conference */

static void VSwitchReqInd(PLCI *plci, dword Id, byte **parms)
{
	word i;
	/* Format of vswitch_t:
	   0 byte length
	   1 byte VSWITCHIE
	   2 byte VSWITCH_REQ/VSWITCH_IND
	   3 byte reserved
	   4 word VSwitchcommand
	   6 word returnerror
	   8... Params
	*/
	if (!plci ||
	    !plci->appl ||
	    !plci->State ||
	    plci->Sig.Ind == NCR_FACILITY
		)
		return;

	for (i = 0; i < MAX_MULTI_IE; i++)
	{
		if (!parms[i][0]) continue;
		if (parms[i][0] < 7)
		{
			parms[i][0] = 0; /* kill it */
			continue;
		}
		dbug(1, dprintf("VSwitchReqInd(%d)", parms[i][4]));
		switch (parms[i][4])
		{
		case VSJOIN:
			if (!plci->relatedPTYPLCI ||
			    (plci->ptyState != S_ECT && plci->relatedPTYPLCI->ptyState != S_ECT))
			{ /* Error */
				break;
			}
			/* remember all necessary informations */
			if (parms[i][0] != 11 || parms[i][8] != 3) /* Length Test */
			{
				break;
			}
			if (parms[i][2] == VSWITCH_IND && parms[i][9] == 1)
			{   /* first indication after ECT-Request on Consultation Call */
				plci->vswitchstate = parms[i][9];
				parms[i][9] = 2; /* State */
				/* now ask first Call to join */
			}
			else if (parms[i][2] == VSWITCH_REQ && parms[i][9] == 3)
			{ /* Answer of VSWITCH_REQ from first Call */
				plci->vswitchstate = parms[i][9];
				/* tell consultation call to join
				   and the protocol capabilities of the first call */
			}
			else
			{ /* Error */
				break;
			}
			plci->vsprot = parms[i][10]; /* protocol */
			plci->vsprotdialect = parms[i][11]; /* protocoldialect */
			/* send join request to related PLCI */
			parms[i][1] = VSWITCHIE;
			parms[i][2] = VSWITCH_REQ;

			plci->relatedPTYPLCI->command = 0;
			plci->relatedPTYPLCI->internal_command = VSWITCH_REQ_PEND;
			add_p(plci->relatedPTYPLCI, ESC, &parms[i][0]);
			sig_req(plci->relatedPTYPLCI, VSWITCH_REQ, 0);
			send_req(plci->relatedPTYPLCI);
			break;
		case VSTRANSPORT:
		default:
			if (plci->relatedPTYPLCI &&
			    plci->vswitchstate == 3 &&
			    plci->relatedPTYPLCI->vswitchstate == 3)
			{
				add_p(plci->relatedPTYPLCI, ESC, &parms[i][0]);
				sig_req(plci->relatedPTYPLCI, VSWITCH_REQ, 0);
				send_req(plci->relatedPTYPLCI);
			}
			break;
		}
		parms[i][0] = 0; /* kill it */
	}
}


/*------------------------------------------------------------------*/

static int diva_get_dma_descriptor(PLCI *plci, dword   *dma_magic) {
	ENTITY e;
	IDI_SYNC_REQ *pReq = (IDI_SYNC_REQ *)&e;

	if (!(diva_xdi_extended_features & DIVA_CAPI_XDI_PROVIDES_RX_DMA)) {
		return (-1);
	}

	pReq->xdi_dma_descriptor_operation.Req = 0;
	pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;

	pReq->xdi_dma_descriptor_operation.info.operation = IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC;
	pReq->xdi_dma_descriptor_operation.info.descriptor_number  = -1;
	pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
	pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;

	e.user[0] = plci->adapter->Id - 1;
	plci->adapter->request((ENTITY *)pReq);

	if (!pReq->xdi_dma_descriptor_operation.info.operation &&
	    (pReq->xdi_dma_descriptor_operation.info.descriptor_number >= 0) &&
	    pReq->xdi_dma_descriptor_operation.info.descriptor_magic) {
		*dma_magic = pReq->xdi_dma_descriptor_operation.info.descriptor_magic;
		dbug(3, dprintf("dma_alloc, a:%d (%d-%08x)",
				plci->adapter->Id,
				pReq->xdi_dma_descriptor_operation.info.descriptor_number,
				*dma_magic));
		return (pReq->xdi_dma_descriptor_operation.info.descriptor_number);
	} else {
		dbug(1, dprintf("dma_alloc failed"));
		return (-1);
	}
}

static void diva_free_dma_descriptor(PLCI *plci, int nr) {
	ENTITY e;
	IDI_SYNC_REQ *pReq = (IDI_SYNC_REQ *)&e;

	if (nr < 0) {
		return;
	}

	pReq->xdi_dma_descriptor_operation.Req = 0;
	pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;

	pReq->xdi_dma_descriptor_operation.info.operation = IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE;
	pReq->xdi_dma_descriptor_operation.info.descriptor_number  = nr;
	pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
	pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;

	e.user[0] = plci->adapter->Id - 1;
	plci->adapter->request((ENTITY *)pReq);

	if (!pReq->xdi_dma_descriptor_operation.info.operation) {
		dbug(1, dprintf("dma_free(%d)", nr));
	} else {
		dbug(1, dprintf("dma_free failed (%d)", nr));
	}
}

/*------------------------------------------------------------------*/
