• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/isdn/hardware/eicon/

Lines Matching defs:plci

74 static void group_optimization(DIVA_CAPI_ADAPTER   * a, PLCI   * plci);
75 static void set_group_ind_mask (PLCI *plci);
76 static void clear_group_ind_mask_bit (PLCI *plci, word b);
77 static byte test_group_ind_mask_bit (PLCI *plci, word b);
101 static void SendSSExtInd(APPL *, PLCI * plci, dword Id, byte * * parms);
103 static void VSwitchReqInd(PLCI *plci, dword Id, byte **parms);
134 static void add_s(PLCI * plci, byte code, API_PARSE * p);
135 static void add_ss(PLCI * plci, byte code, API_PARSE * p);
136 static void add_ie(PLCI * plci, byte code, byte * p, word p_length);
141 static word add_modem_b23 (PLCI * plci, API_PARSE* bp_parms);
158 static void channel_flow_control_remove (PLCI * plci);
159 static void channel_x_off (PLCI * plci, byte ch, byte flag);
160 static void channel_x_on (PLCI * plci, byte ch);
161 static void channel_request_xon (PLCI * plci, byte ch);
162 static void channel_xmit_xon (PLCI * plci);
163 static int channel_can_xon (PLCI * plci, byte ch);
164 static void channel_xmit_extended_xon (PLCI * plci);
166 static byte SendMultiIE(PLCI * plci, dword Id, byte * * parms, byte ie_type, dword info_mask, byte setupParse);
170 static void VoiceChannelOff(PLCI *plci);
171 static void adv_voice_write_coefs (PLCI *plci, word write_command);
172 static void adv_voice_clear_config (PLCI *plci);
174 static word get_b1_facilities (PLCI * plci, byte b1_resource);
175 static byte add_b1_facilities (PLCI * plci, byte b1_resource, word b1_facilities);
176 static void adjust_b1_facilities (PLCI *plci, byte new_b1_resource, word new_b1_facilities);
177 static word adjust_b_process (dword Id, PLCI *plci, byte Rc);
178 static void adjust_b1_resource (dword Id, PLCI *plci, API_SAVE *bp_msg, word b1_facilities, word internal_command);
179 static void adjust_b_restore (dword Id, PLCI *plci, byte Rc);
180 static void reset_b3_command (dword Id, PLCI *plci, byte Rc);
181 static void select_b_command (dword Id, PLCI *plci, byte Rc);
182 static void fax_connect_ack_command (dword Id, PLCI *plci, byte Rc);
183 static void fax_edata_ack_command (dword Id, PLCI *plci, byte Rc);
184 static void fax_connect_info_command (dword Id, PLCI *plci, byte Rc);
185 static void fax_adjust_b23_command (dword Id, PLCI *plci, byte Rc);
186 static void fax_disconnect_command (dword Id, PLCI *plci, byte Rc);
187 static void hold_save_command (dword Id, PLCI *plci, byte Rc);
188 static void retrieve_restore_command (dword Id, PLCI *plci, byte Rc);
189 static void init_b1_config (PLCI *plci);
190 static void clear_b1_config (PLCI *plci);
192 static void dtmf_command (dword Id, PLCI *plci, byte Rc);
193 static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
194 static void dtmf_confirmation (dword Id, PLCI *plci);
195 static void dtmf_indication (dword Id, PLCI *plci, byte *msg, word length);
196 static void dtmf_parameter_write (PLCI *plci);
199 static void mixer_set_bchannel_id_esc (PLCI *plci, byte bchannel_id);
200 static void mixer_set_bchannel_id (PLCI *plci, byte *chi);
201 static void mixer_clear_config (PLCI *plci);
202 static void mixer_notify_update (PLCI *plci, byte others);
203 static void mixer_command (dword Id, PLCI *plci, byte Rc);
204 static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
205 static void mixer_indication_coefs_set (dword Id, PLCI *plci);
206 static void mixer_indication_xconnect_from (dword Id, PLCI *plci, byte *msg, word length);
207 static void mixer_indication_xconnect_to (dword Id, PLCI *plci, byte *msg, word length);
208 static void mixer_remove (PLCI *plci);
211 static void ec_command (dword Id, PLCI *plci, byte Rc);
212 static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg);
213 static void ec_indication (dword Id, PLCI *plci, byte *msg, word length);
216 static void rtp_connect_b3_req_command (dword Id, PLCI *plci, byte Rc);
217 static void rtp_connect_b3_res_command (dword Id, PLCI *plci, byte Rc);
220 static int diva_get_dma_descriptor (PLCI *plci, dword *dma_magic);
221 static void diva_free_dma_descriptor (PLCI *plci, int nr);
393 PLCI * plci;
415 plci = NULL;
416 if ((msg->header.plci != 0) && (msg->header.plci <= a->max_plci) && !a->adapter_disabled)
418 dbug(1,dprintf("plci=%x",msg->header.plci));
419 plci = &a->plci[msg->header.plci-1];
421 if (plci->Id
422 && (plci->appl
423 || (plci->State == INC_CON_PENDING)
424 || (plci->State == INC_CON_ALERT)
428 || ((ncci < MAX_NCCI+1) && (a->ncci_plci[ncci] == plci->Id))))
430 i = plci->msg_in_read_pos;
431 j = plci->msg_in_write_pos;
442 n = (((CAPI_MSG *)(plci->msg_in_queue))->header.length + MSG_IN_OVERHEAD + 3) & 0xfffc;
453 msg->header.length, plci->msg_in_write_pos,
454 plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));
459 if ((((byte *) msg) < ((byte *)(plci->msg_in_queue)))
460 || (((byte *) msg) >= ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
462 if (plci->msg_in_write_pos != plci->msg_in_read_pos)
475 k = plci->msg_in_read_pos;
476 while (k != plci->msg_in_write_pos)
478 if (k == plci->msg_in_wrap_pos)
480 if ((((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.command == _DATA_B3_R)
481 && (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.ncci == ncci))
484 if (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->info.data_b3_req.Flags & 0x0004)
488 k += (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[k]))->header.length +
499 if (plci->req_in || plci->internal_command)
501 if ((((byte *) msg) >= ((byte *)(plci->msg_in_queue)))
502 && (((byte *) msg) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
513 if (plci->req_in || plci->internal_command)
517 plci->command = msg->header.command;
518 plci->number = msg->header.number;
524 msg->header.command, plci->req_in, plci->internal_command,
525 msg->header.length, plci->msg_in_write_pos,
526 plci->msg_in_read_pos, plci->msg_in_wrap_pos, i));
528 plci->msg_in_wrap_pos = plci->msg_in_write_pos;
529 m = (CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]);
531 ((byte *)(plci->msg_in_queue))[j++] = ((byte *) msg)[i];
541 *((APPL * *)(&((byte *)(plci->msg_in_queue))[j])) = appl;
542 plci->msg_in_write_pos = j + MSG_IN_OVERHEAD;
548 plci = NULL;
570 if(plci) plci->command = 0;
578 plci,
582 channel_xmit_extended_xon (plci);
584 if(c==1) send_req(plci);
585 if(c==2 && plci) plci->req_in = plci->req_in_start = plci->req_out = 0;
586 if(plci && !plci->req_in) plci->command = 0;
693 if(adapter[i].plci[j].Sig.Id) plci_remove(&adapter[i].plci[j]);
703 if(adapter[i].plci[j].Sig.Id) return 1;
717 static void init_internal_command_queue (PLCI *plci)
724 plci->internal_command = 0;
726 plci->internal_command_queue[i] = NULL;
730 static void start_internal_command (dword Id, PLCI *plci, t_std_internal_command command_function)
737 if (plci->internal_command == 0)
739 plci->internal_command_queue[0] = command_function;
740 (* command_function)(Id, plci, OK);
745 while (plci->internal_command_queue[i] != 0)
747 plci->internal_command_queue[i] = command_function;
752 static void next_internal_command (dword Id, PLCI *plci)
759 plci->internal_command = 0;
760 plci->internal_command_queue[0] = NULL;
761 while (plci->internal_command_queue[1] != 0)
764 plci->internal_command_queue[i] = plci->internal_command_queue[i+1];
765 plci->internal_command_queue[MAX_INTERNAL_COMMAND_LEVELS - 1] = NULL;
766 (*(plci->internal_command_queue[0]))(Id, plci, OK);
767 if (plci->internal_command != 0)
769 plci->internal_command_queue[0] = NULL;
780 static word get_ncci (PLCI *plci, byte ch, word force_ncci)
785 a = plci->adapter;
837 a->ncci_plci[ncci] = plci->Id;
839 if (!plci->ncci_ring_list)
840 plci->ncci_ring_list = ncci;
842 a->ncci_next[ncci] = a->ncci_next[plci->ncci_ring_list];
843 a->ncci_next[plci->ncci_ring_list] = (byte) ncci;
854 static void ncci_free_receive_buffers (PLCI *plci, word ncci)
861 a = plci->adapter;
862 Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
865 if (a->ncci_plci[ncci] == plci->Id)
867 if (!plci->appl)
875 appl = plci->appl;
880 && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
892 if (a->ncci_plci[ncci] == plci->Id)
894 if (!plci->appl)
902 appl = plci->appl;
907 && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
919 static void cleanup_ncci_data (PLCI *plci, word ncci)
923 if (ncci && (plci->adapter->ncci_plci[ncci] == plci->Id))
925 ncci_ptr = &(plci->adapter->ncci[ncci]);
926 if (plci->appl)
930 if (!plci->data_sent || (ncci_ptr->DBuffer[ncci_ptr->data_out].P != plci->data_sent_ptr))
931 TransmitBufferFree (plci->appl, ncci_ptr->DBuffer[ncci_ptr->data_out].P);
946 static void ncci_remove (PLCI *plci, word ncci, byte preserve_ncci)
952 a = plci->adapter;
953 Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
955 ncci_free_receive_buffers (plci, ncci);
958 if (a->ncci_plci[ncci] != plci->Id)
966 cleanup_ncci_data (plci, ncci);
975 i = plci->ncci_ring_list;
976 while ((i != 0) && (a->ncci_next[i] != plci->ncci_ring_list) && (a->ncci_next[i] != ncci))
981 plci->ncci_ring_list = 0;
982 else if (plci->ncci_ring_list == ncci)
983 plci->ncci_ring_list = i;
994 if (a->ncci_plci[ncci] == plci->Id)
996 cleanup_ncci_data (plci, ncci);
1010 plci->ncci_ring_list = 0;
1019 static void plci_free_msg_in_queue (PLCI *plci)
1023 if (plci->appl)
1025 i = plci->msg_in_read_pos;
1026 while (i != plci->msg_in_write_pos)
1028 if (i == plci->msg_in_wrap_pos)
1030 if (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.command == _DATA_B3_R)
1033 TransmitBufferFree (plci->appl,
1034 (byte *)(long)(((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->info.data_b3_req.Data));
1038 i += (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.length +
1043 plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
1044 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
1045 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
1049 static void plci_remove(PLCI * plci)
1052 if(!plci) {
1053 dbug(1,dprintf("plci_remove(no plci)"));
1056 init_internal_command_queue (plci);
1057 dbug(1,dprintf("plci_remove(%x,tel=%x)",plci->Id,plci->tel));
1058 if(plci_remove_check(plci))
1062 if (plci->Sig.Id == 0xff)
1064 dbug(1,dprintf("D-channel X.25 plci->NL.Id:%0x", plci->NL.Id));
1065 if (plci->NL.Id && !plci->nl_remove_id)
1067 nl_req_ncci(plci,REMOVE,0);
1068 send_req(plci);
1073 if (!plci->sig_remove_id
1074 && (plci->Sig.Id
1075 || (plci->req_in!=plci->req_out)
1076 || (plci->nl_req || plci->sig_req)))
1078 sig_req(plci,HANGUP,0);
1079 send_req(plci);
1082 ncci_remove (plci, 0, false);
1083 plci_free_msg_in_queue (plci);
1085 plci->channels = 0;
1086 plci->appl = NULL;
1087 if ((plci->State == INC_CON_PENDING) || (plci->State == INC_CON_ALERT))
1088 plci->State = OUTG_DIS_PENDING;
1095 static void set_group_ind_mask (PLCI *plci)
1100 plci->group_optimization_mask_table[i] = 0xffffffffL;
1103 static void clear_group_ind_mask_bit (PLCI *plci, word b)
1105 plci->group_optimization_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
1108 static byte test_group_ind_mask_bit (PLCI *plci, word b)
1110 return ((plci->group_optimization_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
1117 static void clear_c_ind_mask (PLCI *plci)
1122 plci->c_ind_mask_table[i] = 0;
1125 static byte c_ind_mask_empty (PLCI *plci)
1130 while ((i < C_IND_MASK_DWORDS) && (plci->c_ind_mask_table[i] == 0))
1135 static void set_c_ind_mask_bit (PLCI *plci, word b)
1137 plci->c_ind_mask_table[b >> 5] |= (1L << (b & 0x1f));
1140 static void clear_c_ind_mask_bit (PLCI *plci, word b)
1142 plci->c_ind_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
1145 static byte test_c_ind_mask_bit (PLCI *plci, word b)
1147 return ((plci->c_ind_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
1150 static void dump_c_ind_mask (PLCI *plci)
1167 d = plci->c_ind_mask_table[i+j];
1197 byte connect_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
1234 plci = &a->plci[i-1];
1235 plci->appl = appl;
1236 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
1240 if(AdvCodecSupport(a, plci, appl, 0) )
1242 plci->Id = 0;
1316 plci->b_channel = (byte)channel; /* not correct for ETSI ch 17..31 */
1317 add_p(plci,LLI,lli);
1318 add_p(plci,ESC,esc_chi);
1319 plci->State = LOCAL_CONNECT;
1320 if(!dir) plci->call_dir |= CALL_DIR_FORCE_OUTG_NL; /* dir 0=DTE, 1=DCE */
1329 plci->command = _CONNECT_R;
1330 plci->number = Number;
1337 if(noCh) Info = add_b1(plci,&parms[5],2,0); /* no resource */
1338 else Info = add_b1(plci,&parms[5],ch,0);
1339 add_s(plci,OAD,&parms[2]);
1340 add_s(plci,OSA,&parms[4]);
1341 add_s(plci,BC,&parms[6]);
1342 add_s(plci,LLC,&parms[7]);
1343 add_s(plci,HLC,&parms[8]);
1348 add_p(plci,LLI,"\x01\x01");
1351 add_p(plci,BC,cip_bc[GET_WORD(parms[0].info)][a->u_law]);
1352 add_p(plci,HLC,cip_hlc[GET_WORD(parms[0].info)]);
1354 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
1355 sig_req(plci,ASSIGN,DSIG_ID);
1360 plci->Sig.Id = 0xff;
1365 Info = add_b23(plci,&parms[5]);
1367 if(!(plci->tel && !plci->adv_nl))nl_req_ncci(plci,ASSIGN,0);
1375 if(plci->spoofed_msg==SPOOFING_REQUIRED)
1377 api_save_msg(parms, "wsssssssss", &plci->saved_msg);
1378 plci->spoofed_msg = CALL_REQ;
1379 plci->internal_command = BLOCK_PLCI;
1380 plci->command = 0;
1382 send_req(plci);
1385 if(ch==4)add_p(plci,CHI,p_chi);
1386 add_s(plci,CPN,&parms[1]);
1387 add_s(plci,DSA,&parms[3]);
1388 if(noCh) add_p(plci,ESC,"\x02\x18\xfd"); /* D-channel, no B-L3 */
1389 add_ai(plci,&parms[9]);
1390 if(!dir)sig_req(plci,CALL_REQ,0);
1393 plci->command = PERM_LIST_REQ;
1394 plci->appl = appl;
1395 sig_req(plci,LISTEN_REQ,0);
1396 send_req(plci);
1400 send_req(plci);
1403 plci->Id = 0;
1414 byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
1424 if(!plci) {
1425 dbug(1,dprintf("connect_res(no plci)"));
1426 return 0; /* no plci, no send */
1429 dbug(1,dprintf("connect_res(State=0x%x)",plci->State));
1448 if(plci->State==INC_CON_CONNECTED_ALERT)
1454 add_p(plci,LLI,"\x01\x01");
1456 add_s(plci, CONN_NR, &parms[2]);
1457 add_s(plci, LLC, &parms[4]);
1458 add_ai(plci, &parms[5]);
1459 plci->State = INC_CON_ACCEPT;
1460 sig_req(plci, CALL_RES,0);
1463 else if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT) {
1464 clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
1465 dump_c_ind_mask (plci);
1470 if(c_ind_mask_empty (plci))
1475 add_p(plci,ESC,esc_t);
1476 add_ai(plci, &parms[5]);
1477 sig_req(plci,REJECT,0);
1481 add_ai(plci, &parms[5]);
1482 sig_req(plci,HANGUP,0);
1487 add_p(plci,ESC,esc_t);
1488 add_ai(plci, &parms[5]);
1489 sig_req(plci,REJECT,0);
1491 plci->appl = appl;
1499 plci->appl = appl;
1501 if(AdvCodecSupport(a, plci, appl, 0)){
1503 sig_req(plci,HANGUP,0);
1506 if(plci->tel == ADV_VOICE && a->AdvCodecPLCI)
1508 Info = add_b23(plci, &parms[1]);
1512 sig_req(plci,HANGUP,0);
1515 if(plci->adv_nl)
1517 nl_req_ncci(plci, ASSIGN, 0);
1523 plci->tel = 0;
1526 Info = add_b23(plci, &parms[1]);
1530 sig_req(plci,HANGUP,0);
1534 nl_req_ncci(plci, ASSIGN, 0);
1537 if(plci->spoofed_msg==SPOOFING_REQUIRED)
1539 api_save_msg(parms, "wsssss", &plci->saved_msg);
1540 plci->spoofed_msg = CALL_RES;
1541 plci->internal_command = BLOCK_PLCI;
1542 plci->command = 0;
1547 add_b1 (plci, &parms[1], ch, plci->B1_facilities);
1551 add_p(plci,LLI,"\x01\x01");
1553 add_s(plci, CONN_NR, &parms[2]);
1554 add_s(plci, LLC, &parms[4]);
1555 add_ai(plci, &parms[5]);
1556 plci->State = INC_CON_ACCEPT;
1557 sig_req(plci, CALL_RES,0);
1561 if(test_c_ind_mask_bit (plci, i)) {
1570 byte connect_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
1576 byte disconnect_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
1585 if(plci)
1587 if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT)
1589 clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
1590 plci->appl = appl;
1593 if(test_c_ind_mask_bit (plci, i))
1596 plci->State = OUTG_DIS_PENDING;
1598 if(plci->Sig.Id && plci->appl)
1601 if(plci->Sig.Id!=0xff)
1603 if(plci->State!=INC_DIS_PENDING)
1605 add_ai(plci, &msg[0]);
1606 sig_req(plci,HANGUP,0);
1607 plci->State = OUTG_DIS_PENDING;
1613 if (plci->NL.Id && !plci->nl_remove_id)
1615 mixer_remove (plci);
1616 nl_req_ncci(plci,REMOVE,0);
1619 plci->State = INC_DIS_PENDING;
1631 byte disconnect_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
1634 if(plci)
1638 clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
1639 ncci_free_receive_buffers (plci, 0);
1640 if(plci_remove_check(plci))
1644 if(plci->State==INC_DIS_PENDING
1645 || plci->State==SUSPENDING) {
1646 if(c_ind_mask_empty (plci)) {
1647 if(plci->State!=SUSPENDING)plci->State = IDLE;
1648 dbug(1,dprintf("chs=%d",plci->channels));
1649 if(!plci->channels) {
1650 plci_remove(plci);
1658 byte listen_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
1707 byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
1730 if(!Info && plci)
1732 rc_plci = plci;
1733 if(!ai_parms[3].length && plci->State && (msg[0].length || ai_parms[1].length) )
1737 add_s(plci,CPN,&msg[0]);
1738 add_s(plci,KEY,&ai_parms[1]);
1739 sig_req(plci,INFO_REQ,0);
1740 send_req(plci);
1744 if(plci->State && ai_parms[2].length)
1748 add_s(plci,UUI,&ai_parms[2]);
1749 sig_req(plci,USER_DATA,0);
1751 else if(plci->State && ai_parms[3].length)
1755 add_s(plci,CPN,&msg[0]);
1756 add_ai(plci, &msg[1]);
1757 sig_req(plci,FACILITY_REQ,0);
1770 rc_plci = &a->plci[i-1];
1816 byte info_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
1822 byte alert_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
1831 if(plci) {
1833 if(plci->State!=INC_CON_ALERT) {
1835 if(plci->State==INC_CON_PENDING) {
1837 plci->State=INC_CON_ALERT;
1838 add_ai(plci, &msg[0]);
1839 sig_req(plci,CALL_ALERT,0);
1852 byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
1889 Info = AdvCodecSupport(a, plci, appl, HOOK_SUPPORT);
1906 rplci = &a->plci[i-1];
1947 rplci = &a->plci[i-1];
1967 if(plci && plci->State && plci->SuppState==IDLE)
1969 plci->SuppState = HOLD_REQUEST;
1970 plci->command = C_HOLD_REQ;
1971 add_s(plci,CAI,&ss_parms[1]);
1972 sig_req(plci,CALL_HOLD,0);
1973 send_req(plci);
1979 if(plci && plci->State && plci->SuppState==CALL_HELD)
1983 if(AdvCodecSupport(a, plci, appl, 0))
1989 else plci->tel = 0;
1991 plci->SuppState = RETRIEVE_REQUEST;
1992 plci->command = C_RETRIEVE_REQ;
1993 if(plci->spoofed_msg==SPOOFING_REQUIRED)
1995 plci->spoofed_msg = CALL_RETRIEVE;
1996 plci->internal_command = BLOCK_PLCI;
1997 plci->command = 0;
2003 sig_req(plci,CALL_RETRIEVE,0);
2004 send_req(plci);
2020 if(plci && plci->State)
2022 add_s(plci,CAI,&ss_parms[2]);
2023 plci->command = SUSPEND_REQ;
2024 sig_req(plci,SUSPEND,0);
2025 plci->State = SUSPENDING;
2026 send_req(plci);
2037 rplci = &a->plci[i-1];
2090 if(plci && plci->State && ((plci->SuppState==IDLE)||(plci->SuppState==CALL_HELD)))
2099 plci->ptyState = (byte)SSreq;
2100 plci->command = 0;
2106 plci->internal_command = CONF_BEGIN_REQ_PEND;
2110 plci->internal_command = CONF_DROP_REQ_PEND;
2114 plci->internal_command = CONF_ISOLATE_REQ_PEND;
2118 plci->internal_command = CONF_REATTACH_REQ_PEND;
2122 add_p(plci,CAI,cai);
2123 sig_req(plci,S_SERVICE,0);
2124 send_req(plci);
2162 if (!plci)
2178 rplci = plci;
2193 if(relatedadapter->plci[i].Id == (byte)relatedPLCIvalue)
2195 rplci = &relatedadapter->plci[i];
2203 rplci = plci;
2214 dbug(1,dprintf("plci:%x",plci));
2216 dbug(1,dprintf("plci->ptyState:%x",plci->ptyState));
2225 plci->command = 0;
2226 rplci->relatedPTYPLCI = plci;
2227 plci->relatedPTYPLCI = rplci;
2237 plci->vswitchstate=0;
2238 plci->vsprot=0;
2239 plci->vsprotdialect=0;
2253 if(plci!=rplci) /* explicit invocation */
2256 cai[2] = plci->Sig.Id;
2284 if (!plci)
2291 plci->command = 0;
2292 plci->internal_command = CD_REQ_PEND;
2296 add_p(plci,CAI,cai);
2297 add_p(plci,CPN,ss_parms[3].info);
2298 sig_req(plci,S_SERVICE,0);
2299 send_req(plci);
2313 rplci = &a->plci[i-1];
2385 rplci = &a->plci[i-1];
2468 if(!plci)
2472 rplci = &a->plci[i-1];
2488 rplci = plci;
2520 if(!plci)
2524 rplci = &a->plci[i-1];
2540 rplci = plci;
2568 return (dtmf_request (Id, Number, a, plci, appl, msg));
2573 return (mixer_request (Id, Number, a, plci, appl, msg));
2579 return (ec_request (Id, Number, a, plci, appl, msg));
2583 return (ec_request (Id, Number, a, plci, appl, msg));
2602 byte facility_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
2608 byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
2623 if(plci)
2625 if ((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING)
2626 || (plci->State == INC_DIS_PENDING) || (plci->SuppState != IDLE))
2637 if (!plci->NL.Id
2638 || (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
2639 && ((plci->channels != 0)
2640 || (((plci->B2_prot != B2_SDLC) && (plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL))
2641 && ((plci->call_dir & CALL_DIR_ANSWER) && !(plci->call_dir & CALL_DIR_FORCE_OUTG_NL))))))
2644 plci->channels,plci->NL.Id,plci->call_dir,plci->SuppState));
2653 plci->requested_options_conn = 0;
2657 if(plci->B3_prot==2 || plci->B3_prot==3)
2666 add_d(plci,2,pvc);
2672 add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
2676 else if(plci->B3_prot==5)
2678 if (plci->NL.Id && !plci->nl_remove_id)
2680 fax_control_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low);
2681 fax_feature_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low);
2690 if ((w & 0x0001) != ((word)(((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & 0x0001)))
2692 ((T30_INFO *)(plci->fax_connect_info_buffer))->resolution =
2693 (byte)((((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & ~T30_RESOLUTION_R8_0770_OR_200) |
2708 if (((byte) w) != ((T30_INFO *)(plci->fax_connect_info_buffer))->data_format)
2710 ((T30_INFO *)(plci->fax_connect_info_buffer))->data_format = (byte) w;
2717 plci->requested_options_conn |= (1L << PRIVATE_FAX_SUB_SEP_PWD);
2722 plci->requested_options_conn |= (1L << PRIVATE_FAX_NONSTANDARD);
2726 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
2733 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
2743 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = (byte) w;
2745 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i];
2746 ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
2751 plci->fax_connect_info_buffer[len++] = (byte) w;
2753 plci->fax_connect_info_buffer[len++] = fax_parms[5].info[1+i];
2757 plci->fax_connect_info_buffer[len++] = (byte) w;
2759 plci->fax_connect_info_buffer[len++] = fax_parms[6].info[1+i];
2760 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
2766 plci->fax_connect_info_buffer[len++] = 0;
2771 plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
2772 plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
2774 plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
2786 if (fax_control_bits != GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low))
2788 PUT_WORD (&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low, fax_control_bits);
2794 plci->fax_connect_info_length = len;
2799 start_internal_command (Id, plci, fax_connect_info_command);
2804 start_internal_command (Id, plci, fax_adjust_b23_command);
2815 else if (plci->B3_prot == B3_RTP)
2817 plci->internal_req_buffer[0] = ncpi->length + 1;
2818 plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
2820 plci->internal_req_buffer[2+w] = ncpi->info[1+w];
2821 start_internal_command (Id, plci, rtp_connect_b3_req_command);
2827 nl_req_ncci(plci,req,0);
2842 byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
2859 if(plci && ncci) {
2864 channel_request_xon (plci, a->ncci_ch[ncci]);
2865 channel_xmit_xon (plci);
2866 cleanup_ncci_data (plci, ncci);
2867 nl_req_ncci(plci,N_DISC,(byte)ncci);
2874 if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
2877 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
2880 if (((plci->B3_prot == 4) || (plci->B3_prot == 5))
2881 && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
2882 && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
2885 if (plci->fax_connect_info_length < len)
2887 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
2888 ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
2896 if (plci->fax_connect_info_length <= len)
2897 plci->fax_connect_info_buffer[len] = 0;
2898 len += 1 + plci->fax_connect_info_buffer[len];
2899 if (plci->fax_connect_info_length <= len)
2900 plci->fax_connect_info_buffer[len] = 0;
2901 len += 1 + plci->fax_connect_info_buffer[len];
2903 plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
2904 plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
2906 plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
2908 plci->fax_connect_info_length = len;
2909 ((T30_INFO *)(plci->fax_connect_info_buffer))->code = 0;
2910 start_internal_command (Id, plci, fax_connect_ack_command);
2915 nl_req_ncci(plci,req,(byte)ncci);
2916 if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
2917 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
2919 if (plci->B3_prot == 4)
2922 sendf(appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
2923 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
2927 else if (plci->B3_prot == B3_RTP)
2929 plci->internal_req_buffer[0] = ncpi->length + 1;
2930 plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
2932 plci->internal_req_buffer[2+w] = ncpi->info[1+w];
2933 start_internal_command (Id, plci, rtp_connect_b3_res_command);
2941 add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
2943 nl_req_ncci(plci,req,(byte)ncci);
2945 if (plci->adjust_b_restore)
2947 plci->adjust_b_restore = false;
2948 start_internal_command (Id, plci, adjust_b_restore);
2957 byte connect_b3_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
2964 if (plci && ncci && (plci->State != IDLE) && (plci->State != INC_DIS_PENDING)
2965 && (plci->State != OUTG_DIS_PENDING))
2969 if(plci->State!=INC_CON_CONNECTED_ALERT) plci->State = CONNECTED;
2970 channel_request_xon (plci, a->ncci_ch[ncci]);
2971 channel_xmit_xon (plci);
2977 byte disconnect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
2987 if (plci && ncci)
2996 channel_request_xon (plci, a->ncci_ch[ncci]);
2997 channel_xmit_xon (plci);
3000 && ((plci->B3_prot == B3_TRANSPARENT)
3001 || (plci->B3_prot == B3_T30)
3002 || (plci->B3_prot == B3_T30_WITH_EXTENSIONS)))
3004 plci->send_disc = (byte)ncci;
3005 plci->command = 0;
3010 cleanup_ncci_data (plci, ncci);
3012 if(plci->B3_prot==2 || plci->B3_prot==3)
3017 add_d(plci, (word)(ncpi->length - 3) ,(byte *)&(ncpi->info[4]));
3020 nl_req_ncci(plci,N_DISC,(byte)ncci);
3033 byte disconnect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
3040 if(plci && ncci) {
3041 plci->requested_options_conn = 0;
3042 plci->fax_connect_info_length = 0;
3043 plci->ncpi_state = 0x00;
3044 if (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
3045 && ((plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL)))
3047 plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
3049 for(i=0; i<MAX_CHANNELS_PER_PLCI && plci->inc_dis_ncci_table[i]!=(byte)ncci; i++);
3051 if(plci->channels)plci->channels--;
3052 for(; i<MAX_CHANNELS_PER_PLCI-1; i++) plci->inc_dis_ncci_table[i] = plci->inc_dis_ncci_table[i+1];
3053 plci->inc_dis_ncci_table[MAX_CHANNELS_PER_PLCI-1] = 0;
3055 ncci_free_receive_buffers (plci, ncci);
3057 if((plci->State==IDLE || plci->State==SUSPENDING) && !plci->channels){
3058 if(plci->State == SUSPENDING){
3059 sendf(plci->appl,
3064 sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
3066 plci_remove(plci);
3067 plci->State=IDLE;
3073 && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
3076 ncci_free_receive_buffers (plci, ncci);
3078 nl_req_ncci(plci,N_EDATA,(byte)ncci);
3080 plci->adapter->ncci_state[ncci] = IDLE;
3081 start_internal_command (Id, plci, fax_disconnect_command);
3089 byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
3101 dbug(1,dprintf("ncci=0x%x, plci=0x%x",ncci,plci));
3103 if (plci && ncci)
3116 if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
3117 && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
3141 send_data(plci);
3147 if (plci)
3149 if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
3150 && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
3166 byte data_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
3175 if(plci && ncci) {
3181 (byte)(appl->DataFlags[n]>>8)==plci->Id) {
3185 if (channel_can_xon (plci, a->ncci_ch[ncci])) {
3186 channel_request_xon (plci, a->ncci_ch[ncci]);
3188 channel_xmit_xon (plci);
3191 nl_req_ncci(plci,N_DATA_ACK,(byte)ncci);
3199 byte reset_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
3208 if(plci && ncci)
3211 switch (plci->B3_prot)
3217 nl_req_ncci(plci,N_RESET,(byte)ncci);
3218 send_req(plci);
3225 start_internal_command (Id, plci, reset_b3_command);
3240 byte reset_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
3247 if(plci && ncci) {
3248 switch (plci->B3_prot)
3255 nl_req_ncci(plci,N_RESET_ACK,(byte)ncci);
3264 byte connect_b3_t90_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
3273 if(plci && ncci) {
3287 add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
3290 nl_req_ncci(plci,req,(byte)ncci);
3298 byte select_b_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
3305 if(!plci || !msg)
3312 msg->length,plci->Id,plci->tel,plci->NL.Id,plci->appl,plci->SuppState));
3313 dbug(1,dprintf("PlciState=0x%x",plci->State));
3317 if((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING) || (plci->State == INC_DIS_PENDING)
3318 || (plci->SuppState != IDLE) || plci->channels || plci->nl_remove_id)
3329 if((plci->State==INC_CON_PENDING) || (plci->State==INC_CON_ALERT)) /* send alert tone inband to the network, */
3336 plci->State=INC_CON_CONNECTED_ALERT;
3337 plci->appl = appl;
3338 clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
3339 dump_c_ind_mask (plci);
3342 if(test_c_ind_mask_bit (plci, i))
3347 api_save_msg(msg, "s", &plci->saved_msg);
3348 tel = plci->tel;
3369 if(AdvCodecSupport(a, plci, appl, 0) )
3374 else if(plci->spoofed_msg==SPOOFING_REQUIRED) /* wait until codec is active */
3376 plci->spoofed_msg = AWAITING_SELECT_B;
3377 plci->internal_command = BLOCK_PLCI; /* lock other commands */
3378 plci->command = 0;
3391 CodecIdCheck(a, plci);
3392 plci->tel = 0;
3393 plci->adv_nl = 0;
3404 if (plci->call_dir & CALL_DIR_OUT)
3405 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
3406 else if (plci->call_dir & CALL_DIR_IN)
3407 plci->call_dir = CALL_DIR_IN | CALL_DIR_ANSWER;
3408 start_internal_command (Id, plci, select_b_command);
3417 byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * parms)
3456 plci = &a->plci[i-1];
3457 plci->appl = appl;
3458 plci->command = _MANUFACTURER_R;
3459 plci->m_command = command;
3460 plci->number = Number;
3461 plci->State = LOCAL_CONNECT;
3462 Id = ( ((word)plci->Id<<8)|plci->adapter->Id|0x80);
3463 dbug(1,dprintf("ManCMD,plci=0x%x",Id));
3468 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
3472 Info = add_b1(plci,&m_parms[3],0,0);
3475 add_p(plci,CAI,codec_cai);
3478 /* first 'assign plci' with this function, then use */
3480 if(AdvCodecSupport(a, plci, appl, 0) ) {
3484 Info = add_b1(plci,&null_parms,0,B1_FACILITY_LOCAL);
3490 plci->State = LOCAL_CONNECT;
3491 plci->manufacturer = true;
3492 plci->command = _MANUFACTURER_R;
3493 plci->m_command = command;
3494 plci->number = Number;
3498 add_p(plci,LLI,lli);
3499 add_p(plci,CHI,chi);
3500 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
3501 sig_req(plci,ASSIGN,DSIG_ID);
3505 Info = add_b23(plci,&m_parms[3]);
3508 nl_req_ncci(plci,ASSIGN,0);
3509 send_req(plci);
3514 dbug(1,dprintf("dir=0x%x,spoof=0x%x",dir,plci->spoofed_msg));
3515 if (plci->spoofed_msg==SPOOFING_REQUIRED)
3517 api_save_msg (m_parms, "wbbs", &plci->saved_msg);
3518 plci->spoofed_msg = AWAITING_MANUF_CON;
3519 plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
3520 plci->command = 0;
3521 send_req(plci);
3525 sig_req(plci,CALL_REQ,0);
3528 sig_req(plci,LISTEN_REQ,0);
3530 send_req(plci);
3548 if(!plci)
3558 plci->command = _MANUFACTURER_R;
3559 plci->m_command = command;
3560 plci->number = Number;
3563 plci->b_channel = getChannel(&m_parms[1]);
3564 mixer_set_bchannel_id_esc (plci, plci->b_channel);
3565 if(plci->spoofed_msg==SPOOFING_REQUIRED)
3567 plci->spoofed_msg = CALL_REQ | AWAITING_MANUF_CON;
3568 plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
3569 plci->command = 0;
3575 plci->cr_enquiry = true;
3577 add_ss(plci,FTY,&m_parms[1]);
3578 sig_req(plci,req,0);
3579 send_req(plci);
3582 if (plci->NL.Id && !plci->nl_remove_id)
3584 if (plci->channels)
3588 if ((a->ncci_plci[ncci] == plci->Id) && (a->ncci_state[ncci] == CONNECTED))
3591 cleanup_ncci_data (plci, ncci);
3592 nl_req_ncci(plci,N_DISC,(byte)ncci);
3596 mixer_remove (plci);
3597 nl_req_ncci(plci,REMOVE,0);
3598 send_req(plci);
3605 if(!plci)
3611 plci->command = _MANUFACTURER_R;
3612 plci->number = Number;
3613 add_ss(plci,FTY,m);
3614 sig_req(plci,SIG_CTRL,0);
3615 send_req(plci);
3622 if(!plci)
3628 plci->command = _MANUFACTURER_R;
3629 plci->number = Number;
3630 add_ss(plci,FTY,m);
3631 sig_req(plci,DSP_CTRL,0);
3632 send_req(plci);
3654 if (plci
3661 if ((plci->tel != ADV_VOICE) || (plci != a->AdvSignalPLCI))
3673 if (plci->B1_facilities & B1_FACILITY_VOICE)
3674 adv_voice_write_coefs (plci, ADV_VOICE_WRITE_UPDATE);
3685 plci->dtmf_parameter_length = m->info[2] - 1;
3686 if (plci->dtmf_parameter_length > m->length - 3)
3687 plci->dtmf_parameter_length = (byte)(m->length - 3);
3688 if (plci->dtmf_parameter_length > DTMF_PARAMETER_BUFFER_SIZE)
3689 plci->dtmf_parameter_length = DTMF_PARAMETER_BUFFER_SIZE;
3690 for (i = 0; i < plci->dtmf_parameter_length; i++)
3691 plci->dtmf_parameter_buffer[i] = m->info[4+i];
3692 if (plci->B1_facilities & B1_FACILITY_DTMFR)
3693 dtmf_parameter_write (plci);
3698 v_plci = plci;
3745 byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg)
3769 if(!plci)
3771 if (((plci->B3_prot != 4) && (plci->B3_prot != 5))
3772 || !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
3784 if (plci->fax_connect_info_length < len)
3786 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
3787 ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
3795 if (plci->fax_connect_info_length <= len)
3796 plci->fax_connect_info_buffer[len] = 0;
3797 len += 1 + plci->fax_connect_info_buffer[len];
3798 if (plci->fax_connect_info_length <= len)
3799 plci->fax_connect_info_buffer[len] = 0;
3800 len += 1 + plci->fax_connect_info_buffer[len];
3802 plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
3803 plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
3805 plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
3807 plci->fax_connect_info_length = len;
3808 plci->fax_edata_ack_length = plci->fax_connect_info_length;
3809 start_internal_command (Id, plci, fax_edata_ack_command);
3824 PLCI * plci;
3837 plci = &(a->plci[e->user[1]]);
3866 channel_flow_control_remove (plci);
3869 if (a->FlowControlIdTable[i] == plci->nl_remove_id)
3872 plci->nl_remove_id = 0;
3873 if (plci->rx_dma_descriptor > 0) {
3874 diva_free_dma_descriptor (plci, plci->rx_dma_descriptor - 1);
3875 plci->rx_dma_descriptor = 0;
3884 a->ch_flow_plci[ch] = plci->Id;
3885 plci->nl_req = 0;
3904 plci->nl_req = 0;
3907 plci->nl_req = 0;
3909 if (plci->nl_req)
3910 control_rc (plci, 0, rc, ch, 0, true);
3915 channel_x_on (plci, ch);
3916 if (plci->internal_command)
3917 control_rc (plci, req, rc, ch, 0, true);
3921 if (plci->nl_global_req)
3923 global_req = plci->nl_global_req;
3924 plci->nl_global_req = 0;
3927 if (plci->rx_dma_descriptor > 0) {
3928 diva_free_dma_descriptor (plci, plci->rx_dma_descriptor - 1);
3929 plci->rx_dma_descriptor = 0;
3932 channel_xmit_xon (plci);
3933 control_rc (plci, 0, rc, ch, global_req, true);
3935 else if (plci->data_sent)
3937 channel_xmit_xon (plci);
3938 plci->data_sent = false;
3939 plci->NL.XNum = 1;
3940 data_rc (plci, ch);
3941 if (plci->internal_command)
3942 control_rc (plci, req, rc, ch, 0, true);
3946 channel_xmit_xon (plci);
3947 control_rc (plci, req, rc, ch, 0, true);
3966 plci->sig_remove_id = 0;
3968 plci->sig_req = 0;
3969 if (plci->sig_global_req)
3971 global_req = plci->sig_global_req;
3972 plci->sig_global_req = 0;
3975 channel_xmit_xon (plci);
3976 control_rc (plci, 0, rc, ch, global_req, false);
3980 channel_xmit_xon (plci);
3981 control_rc (plci, req, rc, ch, 0, false);
3990 channel_xmit_xon(plci);
3995 channel_xmit_xon(plci);
4002 (a->ch_flow_plci[Ch] == plci->Id)) {
4008 nl_ind(plci);
4010 (a->ch_flow_plci[Ch] == plci->Id) &&
4016 sig_ind(plci);
4023 while (!plci->req_in
4024 && !plci->internal_command
4025 && (plci->msg_in_write_pos != plci->msg_in_read_pos))
4027 j = (plci->msg_in_read_pos == plci->msg_in_wrap_pos) ? 0 : plci->msg_in_read_pos;
4029 i = (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]))->header.length + 3) & 0xfffc;
4031 m = (CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]);
4032 appl = *((APPL * *)(&((byte *)(plci->msg_in_queue))[j+i]));
4034 m->header.command, plci->msg_in_write_pos, plci->msg_in_read_pos, plci->msg_in_wrap_pos));
4035 if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
4037 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
4038 plci->msg_in_read_pos = i + MSG_IN_OVERHEAD;
4042 plci->msg_in_read_pos = j + i + MSG_IN_OVERHEAD;
4044 if (plci->msg_in_read_pos == plci->msg_in_write_pos)
4046 plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
4047 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
4049 else if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
4051 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
4052 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
4065 if (plci->li_notify_update)
4067 plci->li_notify_update = false;
4068 mixer_notify_update (plci, false);
4072 send_data(plci);
4073 send_req(plci);
4077 void control_rc(PLCI * plci, byte req, byte rc, byte ch, byte global_req, byte nl_rc)
4091 if (!plci) {
4092 dbug(0,dprintf("A: control_rc, no plci %02x:%02x:%02x:%02x:%02x", req, rc, ch, global_req, nl_rc));
4095 dbug(1,dprintf("req0_in/out=%d/%d",plci->req_in,plci->req_out));
4096 if(plci->req_in!=plci->req_out)
4105 plci->req_in = plci->req_in_start = plci->req_out = 0;
4108 appl = plci->appl;
4109 a = plci->adapter;
4113 Id = (((dword)(ncci ? ncci : ch)) << 16) | ((word)plci->Id << 8) | a->Id;
4114 if(plci->tel && plci->SuppState!=CALL_HELD) Id|=EXT_CONTROLLER;
4115 Number = plci->number;
4116 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));
4117 dbug(1,dprintf("channels=0x%x",plci->channels));
4118 if (plci_remove_check(plci))
4122 sig_req(plci,HANGUP,0);
4123 sig_req(plci,REMOVE,0);
4124 send_req(plci);
4126 if(plci->command)
4128 switch(plci->command)
4135 plci->SuppState = IDLE;
4146 plci->SuppState = CALL_HELD;
4160 if (plci->State == INC_DIS_PENDING)
4162 if(plci->Sig.Id!=0xff)
4169 plci_remove(plci);
4170 plci->State = IDLE;
4173 if(plci->State!=LOCAL_CONNECT)plci->State = OUTG_CON_PENDING;
4182 plci_remove(plci);
4183 plci->State = IDLE;
4187 sendf(plci->appl,_CONNECT_ACTIVE_I,Id,0,"sss","","","");
4188 plci->State = INC_ACT_PENDING;
4193 if (plci->State != INC_DIS_PENDING)
4194 plci->State = INC_CON_ACCEPT;
4198 if (plci->State == INC_DIS_PENDING)
4200 if(plci->Sig.Id!=0xff)
4202 plci->State = OUTG_DIS_PENDING;
4219 ncci = get_ncci (plci, ch, 0);
4221 plci->channels++;
4253 sendf(plci->appl,_CONNECT_R|CONFIRM,Id,Number,"w",Info);
4254 plci_remove(plci);
4257 sendf(plci->appl,_CONNECT_R|CONFIRM,Id,Number,"w",Info);
4263 plci->command = 0;
4265 else if (plci->internal_command)
4267 switch(plci->internal_command)
4277 plci_remove(plci);
4288 plci_remove(plci);
4298 switch(plci->internal_command)
4327 if(!plci->appl) break;
4336 sendf(plci->appl,_FACILITY_R|CONFIRM,Id&0x7,
4337 plci->number,"wws",Info,(word)3,SSparms);
4338 if(Info) plci_remove(plci);
4343 if(!plci->relatedPTYPLCI) break;
4344 rplci = plci->relatedPTYPLCI;
4345 SSparms[1] = plci->ptyState;
4351 plci->relatedPTYPLCI = NULL;
4352 plci->ptyState = 0;
4357 plci->number,
4364 if(!plci->relatedPTYPLCI) break;
4365 rplci = plci->relatedPTYPLCI;
4372 plci->relatedPTYPLCI = NULL;
4373 plci->ptyState = 0;
4378 plci->number,
4388 plci_remove(plci); /* after codec init, internal codec commands pending */
4398 plci_remove(plci); /* after codec init, internal codec commands pending */
4407 plci->internal_command = PERM_COD_CONN_PEND;
4413 sig_req(plci,CALL_REQ,0);
4414 send_req(plci);
4415 plci->internal_command = PERM_COD_CALL;
4431 plci_remove(plci);
4445 plci_remove(plci);
4450 if(plci->channels)
4455 cleanup_ncci_data (plci, ncci);
4456 nl_req_ncci(plci,N_DISC,(byte)ncci);
4463 if (plci->State == INC_DIS_PENDING)
4465 sig_req(plci,CALL_REQ,0);
4466 send_req(plci);
4467 plci->State=OUTG_CON_PENDING;
4494 if(plci->internal_command==MWI_ACTIVATE_REQ_PEND)
4500 if(plci->cr_enquiry)
4502 sendf(plci->appl,
4505 plci->number,
4507 if(rc!=OK) plci_remove(plci);
4511 sendf(plci->appl,
4514 plci->number,
4526 if((plci->internal_command==CONF_ADD_REQ_PEND)&&(!plci->relatedPTYPLCI)) break;
4527 rplci = plci;
4529 switch(plci->internal_command)
4536 rplci = plci->relatedPTYPLCI;
4556 plci->relatedPTYPLCI = NULL;
4557 plci->ptyState = 0;
4562 plci->number,
4569 if(plci->relatedPTYPLCI)
4571 plci->relatedPTYPLCI->vswitchstate=0;
4572 plci->relatedPTYPLCI->vsprot=0;
4573 plci->relatedPTYPLCI->vsprotdialect=0;
4575 plci->vswitchstate=0;
4576 plci->vsprot=0;
4577 plci->vsprotdialect=0;
4581 if(plci->relatedPTYPLCI &&
4582 plci->vswitchstate==1 &&
4583 plci->relatedPTYPLCI->vswitchstate==3) /* join complete */
4584 plci->vswitchstate=3;
4594 plci->appl->CDEnable = 0;
4596 sendf(plci->appl,_FACILITY_R|CONFIRM,Id,
4597 plci->number,"wws",Info,(word)3,SSparms);
4603 ncci = get_ncci (plci, ch, 0);
4605 plci->channels++;
4610 if (plci->internal_command_queue[0])
4612 (*(plci->internal_command_queue[0]))(Id, plci, rc);
4613 if (plci->internal_command)
4618 next_internal_command (Id, plci);
4623 Id = ((word)plci->Id<<8)|plci->adapter->Id;
4624 if(plci->tel) Id|=EXT_CONTROLLER;
4626 switch(plci->internal_command)
4640 plci->internal_command = 0;
4641 sig_req(plci,REMOVE,0);
4642 send_req(plci);
4661 plci->number,"wws",Info,(word)3,SSparms);
4666 plci->internal_command = 0;
4673 plci->internal_command = PERM_COD_CONN_PEND;
4679 plci->internal_command = 0;
4681 plci->internal_command = PERM_COD_CALL;
4682 sig_req(plci,CALL_REQ,0);
4683 send_req(plci);
4689 plci->internal_command = 0;
4690 dbug(1,dprintf("ListenCheck, new SIG_ID = 0x%x",plci->Sig.Id));
4691 add_p(plci,ESC,"\x02\x18\x00"); /* support call waiting */
4692 sig_req(plci,INDICATE_REQ,0);
4693 send_req(plci);
4699 plci_remove(plci);
4700 plci->State = IDLE;
4709 sig_req(plci,LAW_REQ,0);
4710 send_req(plci);
4717 plci->internal_command = 0;
4726 plci->internal_command = 0;
4732 plci->internal_command = 0;
4733 sig_req(plci,REMOVE,0);
4734 send_req(plci);
4739 plci_remove_check(plci);
4743 void data_rc(PLCI * plci, byte ch)
4751 if (plci->appl)
4753 TransmitBufferFree (plci->appl, plci->data_sent_ptr);
4754 a = plci->adapter;
4756 if (ncci && (a->ncci_plci[ncci] == plci->Id))
4765 Id = (((dword)ncci)<<16)|((word)plci->Id<<8)|a->Id;
4766 if(plci->tel) Id|=EXT_CONTROLLER;
4767 sendf(plci->appl,_DATA_B3_R|CONFIRM,Id,data->Number,
4779 void data_ack(PLCI * plci, byte ch)
4786 a = plci->adapter;
4791 if (a->ncci_state[ncci] && (a->ncci_plci[ncci] == plci->Id))
4793 Id = (((dword)ncci)<<16)|((word)plci->Id<<8)|a->Id;
4794 if(plci->tel) Id|=EXT_CONTROLLER;
4795 sendf(plci->appl,_DATA_B3_R|CONFIRM,Id,ncci_ptr->DataAck[ncci_ptr->data_ack_out].Number,
4805 void sig_ind(PLCI * plci)
4869 a = plci->adapter;
4870 Id = ((word)plci->Id<<8)|a->Id;
4873 if (plci->sig_remove_id)
4875 plci->Sig.RNR = 2; /* discard */
4879 if(plci->tel && plci->SuppState!=CALL_HELD) Id|=EXT_CONTROLLER;
4880 dbug(1,dprintf("SigInd-Id=%08lx,plci=%x,tel=%x,state=0x%x,channels=%d,Discflowcl=%d",
4881 Id,plci->Id,plci->tel,plci->State,plci->channels,plci->hangup_flow_ctrl_timer));
4882 if(plci->Sig.Ind==CALL_HOLD_ACK && plci->channels)
4884 plci->Sig.RNR = 1;
4887 if(plci->Sig.Ind==HANGUP && plci->channels)
4889 plci->Sig.RNR = 1;
4890 plci->hangup_flow_ctrl_timer++;
4892 if(plci->hangup_flow_ctrl_timer==100)
4895 plci->Sig.RNR = 0;
4896 plci->hangup_flow_ctrl_timer = 0;
4899 if (a->ncci_plci[ncci] == plci->Id)
4901 cleanup_ncci_data (plci, ncci);
4902 if(plci->channels)plci->channels--;
4903 if (plci->appl)
4904 sendf(plci->appl,_DISCONNECT_B3_I, (((dword) ncci) << 16) | Id,0,"ws",0,"");
4907 if (plci->appl)
4908 sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
4909 plci_remove(plci);
4910 plci->State=IDLE;
4918 IndParse(plci,multi_fac_id,multi_fac_parms,MAX_MULTI_IE);
4919 IndParse(plci,multi_pi_id,multi_pi_parms,MAX_MULTI_IE);
4920 IndParse(plci,multi_ssext_id,multi_ssext_parms,MAX_MULTI_IE);
4922 IndParse(plci,multi_vswitch_id,multi_vswitch_parms,MAX_MULTI_IE);
4924 IndParse(plci,parms_id,parms,0);
4925 IndParse(plci,multi_CiPN_id,multi_CiPN_parms,MAX_MULTI_IE);
4931 if(esc_cr[0] && plci)
4933 if(plci->cr_enquiry && plci->appl)
4935 plci->cr_enquiry = false;
4945 sendf(plci->appl,
4949 "dwbbbbSbS",_DI_MANU_ID,plci->m_command,
4950 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);
4973 if(plci==a->automatic_lawPLCI) {
4974 plci->internal_command = 0;
4975 sig_req(plci,REMOVE,0);
4976 send_req(plci);
5064 /* codec plci for the handset/hook state support is just an internal id */
5065 if(plci!=a->AdvCodecPLCI)
5067 force_mt_info = SendMultiIE(plci,Id,multi_fac_parms, FTY, 0x20, 0);
5068 force_mt_info |= SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, 0);
5069 SendSSExtInd(NULL,plci,Id,multi_ssext_parms);
5070 SendInfo(plci,Id, parms, force_mt_info);
5072 VSwitchReqInd(plci,Id,multi_vswitch_parms);
5077 if(esc_chi[0] && plci && !plci->SuppState){
5078 plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
5079 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5080 dbug(1,dprintf("storeChannel=0x%x",plci->b_channel));
5081 if(plci->tel==ADV_VOICE && plci->appl) {
5086 if(plci->appl) Number = plci->appl->Number++;
5088 switch(plci->Sig.Ind) {
5092 if(!plci->appl) break;
5103 sendf(plci->appl,_FACILITY_R|CONFIRM,Id&0x7,plci->number, "wws",0,3,CF_Ind);
5104 plci_remove(plci);
5116 if(!plci->relatedPTYPLCI) break;
5117 tplci = plci->relatedPTYPLCI;
5124 plci->vswitchstate=0;
5125 plci->relatedPTYPLCI->vswitchstate=0;
5140 plci->relatedPTYPLCI = NULL;
5141 plci->ptyState = 0;
5174 if(!plci->appl) break;
5230 PUT_DWORD(&Interr_Err_Ind[6],plci->appl->S_Handle);
5231 sendf(plci->appl,_FACILITY_I,Id&0x7,0,"ws",3, Interr_Err_Ind);
5232 plci_remove(plci);
5251 if(plci->cr_enquiry)
5253 sendf(plci->appl,_FACILITY_I,Id&0xf,0,"ws",3, SS_Ind);
5254 plci_remove(plci);
5258 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5272 plci->ptyState = 0;
5278 plci->ptyState = CONNECTED;
5284 plci->ptyState = CONNECTED;
5290 plci->ptyState = CONNECTED;
5294 plci->relatedPTYPLCI = NULL;
5295 tplci=plci->relatedPTYPLCI;
5297 plci->ptyState = CONNECTED;
5312 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
5326 if(!plci->relatedPTYPLCI) break;
5327 tplci = plci->relatedPTYPLCI;
5334 if(plci->vswitchstate!=3)
5337 plci->ptyState = IDLE;
5338 plci->relatedPTYPLCI = NULL;
5339 plci->ptyState = 0;
5351 switch (plci->ptyState)
5354 plci->ptyState = CONNECTED;
5359 plci->ptyState = IDLE;
5360 plci->relatedPTYPLCI = NULL;
5361 plci->ptyState = 0;
5384 if(!plci->appl) break;
5386 PUT_DWORD(&CF_Ind[6],plci->appl->S_Handle);
5387 sendf(plci->appl,_FACILITY_I,Id&0x7,0,"ws",3, CF_Ind);
5388 plci_remove(plci);
5398 if(!plci->appl) break;
5430 PUT_DWORD(&pty_cai[6],plci->appl->S_Handle);
5431 sendf(plci->appl,_FACILITY_I,Id&0x7,0,"wS",3, pty_cai);
5432 plci_remove(plci);
5442 if(plci->cr_enquiry)
5444 sendf(plci->appl,_FACILITY_I,Id&0xf,0,"ws",3, SS_Ind);
5445 plci_remove(plci);
5449 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5458 if(plci->appl && (a->Notification_Mask[plci->appl->Id-1]&SMASK_MWI))
5460 if(plci->internal_command==GET_MWI_STATE) /* result on Message Waiting Listen */
5462 sendf(plci->appl,_FACILITY_I,Id&0xf,0,"wS",3, &pty_cai[2]);
5463 plci_remove(plci);
5466 else sendf(plci->appl,_FACILITY_I,Id,0,"wS",3, &pty_cai[2]);
5494 add_p(plci,CAI,facility);
5495 add_p(plci,ESC,multi_ssext_parms[0]); /* remembered parameter -> only one possible */
5496 sig_req(plci,S_SERVICE,0);
5497 send_req(plci);
5498 plci->command = 0;
5499 next_internal_command (Id, plci);
5542 tplci=plci->relatedPTYPLCI;
5553 plci->ptyState = CONNECTED;
5554 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
5580 if(plci->appl && (a->Notification_Mask[plci->appl->Id-1]&SMASK_CCBS))
5582 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
5606 if(plci->SuppState == HOLD_REQUEST)
5608 plci->SuppState = IDLE;
5609 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5614 if(plci->SuppState == HOLD_REQUEST)
5616 plci->SuppState = CALL_HELD;
5617 CodecIdCheck(a, plci);
5618 start_internal_command (Id, plci, hold_save_command);
5635 if(plci->SuppState == RETRIEVE_REQUEST)
5637 plci->SuppState = CALL_HELD;
5638 CodecIdCheck(a, plci);
5639 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5645 if(plci->SuppState == RETRIEVE_REQUEST)
5647 plci->SuppState = IDLE;
5648 plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
5649 plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
5650 if(plci->tel)
5652 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5653 dbug(1,dprintf("RetrChannel=0x%x",plci->b_channel));
5655 if(plci->B2_prot==B2_TRANSPARENT && plci->B3_prot==B3_TRANSPARENT)
5658 start_internal_command (Id, plci, retrieve_restore_command);
5661 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5664 start_internal_command (Id, plci, retrieve_restore_command);
5669 if(plci->State != LISTENING) {
5670 sig_req(plci,HANGUP,0);
5671 send_req(plci);
5677 clear_c_ind_mask (plci);
5680 set_c_ind_mask_bit (plci, MAX_APPL);
5681 group_optimization(a, plci);
5686 && test_group_ind_mask_bit (plci, i) ) {
5688 set_c_ind_mask_bit (plci, i);
5689 dump_c_ind_mask (plci);
5690 plci->State = INC_CON_PENDING;
5691 plci->call_dir = (plci->call_dir & ~(CALL_DIR_OUT | CALL_DIR_ORIGINATE)) |
5694 plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
5695 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5701 plci->tel = ADV_VOICE;
5703 plci->tel = CODEC;
5704 if(plci->tel) Id|=EXT_CONTROLLER;
5705 a->codec_listen[i] = plci;
5725 plci,
5729 plci,
5732 SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, true));
5735 clear_c_ind_mask_bit (plci, MAX_APPL);
5736 dump_c_ind_mask (plci);
5738 if(c_ind_mask_empty (plci)) {
5739 sig_req(plci,HANGUP,0);
5740 send_req(plci);
5741 plci->State = IDLE;
5743 plci->notifiedcall = 0;
5749 plci->notifiedcall = 1;
5755 if(plci->State==ADVANCED_VOICE_SIG || plci->State==ADVANCED_VOICE_NOSIG)
5757 if(plci->internal_command==PERM_COD_CONN_PEND)
5759 if(plci->State==ADVANCED_VOICE_NOSIG)
5849 next_internal_command (Id, plci);
5853 plci->internal_command = PERM_COD_HOOK;
5854 add_p(plci,FTY,"\x01\x09"); /* Get Hook State*/
5855 sig_req(plci,TEL_CTRL,0);
5856 send_req(plci);
5859 else if(plci->command != _MANUFACTURER_R /* old style permanent connect */
5860 && plci->State!=INC_ACT_PENDING)
5862 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5863 if(plci->tel == ADV_VOICE && plci->SuppState == IDLE) /* with permanent codec switch on immediately */
5865 chi[2] = plci->b_channel;
5868 sendf(plci->appl,_CONNECT_ACTIVE_I,Id,0,"Sss",parms[21],"","");
5869 plci->State = INC_ACT_PENDING;
5876 if(plci->State==ADVANCED_VOICE_SIG && ie[0]){
5880 if(plci->internal_command==PERM_COD_HOOK)
5883 plci->hook_state = ie[1];
5884 next_internal_command (Id, plci);
5889 if( ((plci->hook_state)&0xf0)==0x80)
5894 plci->hook_state = ie[1]&0x91;
5912 a->AdvSignalPLCI = &a->plci[i-1];
5948 if(plci->internal_command==PERM_COD_HOOK)
5951 plci->hook_state = ie[1]&0x91;
5952 next_internal_command (Id, plci);
5957 if( ((plci->hook_state)&0xf0)==0x90) break;
5958 plci->hook_state = ie[1]&0x91;
5963 if(plci->tel) Id|=EXT_CONTROLLER;
5980 clear_c_ind_mask_bit (plci, (word)(plci->appl->Id-1));
5982 sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, resume_cau);
5986 clear_c_ind_mask (plci);
5988 if (plci->NL.Id && !plci->nl_remove_id) {
5989 mixer_remove (plci);
5990 nl_req_ncci(plci,REMOVE,0);
5992 if (!plci->sig_remove_id) {
5993 plci->internal_command = 0;
5994 sig_req(plci,REMOVE,0);
5996 send_req(plci);
5997 if(!plci->channels) {
5998 sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, "\x05\x04\x00\x02\x00\x00");
5999 sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
6007 plci->hangup_flow_ctrl_timer=0;
6008 if(plci->manufacturer && plci->State==LOCAL_CONNECT) break;
6021 if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT)
6025 if(test_c_ind_mask_bit (plci, i))
6031 clear_c_ind_mask (plci);
6033 if(!plci->appl)
6035 if (plci->State == LISTENING)
6037 plci->notifiedcall=0;
6040 plci->State = INC_DIS_PENDING;
6041 if(c_ind_mask_empty (plci))
6043 plci->State = IDLE;
6044 if (plci->NL.Id && !plci->nl_remove_id)
6046 mixer_remove (plci);
6047 nl_req_ncci(plci,REMOVE,0);
6049 if (!plci->sig_remove_id)
6051 plci->internal_command = 0;
6052 sig_req(plci,REMOVE,0);
6054 send_req(plci);
6062 if(plci->State!=IDLE && plci->State!=INC_DIS_PENDING)
6064 if(plci->State==RESUMING)
6067 sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, resume_cau);
6069 plci->State = INC_DIS_PENDING;
6070 sendf(plci->appl,_DISCONNECT_I,Id,0,"w",i);
6076 SendSSExtInd(NULL,plci,Id,multi_ssext_parms);
6080 VSwitchReqInd(plci,Id,multi_vswitch_parms);
6083 if(plci->relatedPTYPLCI &&
6084 plci->vswitchstate==3 &&
6085 plci->relatedPTYPLCI->vswitchstate==3 &&
6088 add_p(plci->relatedPTYPLCI,SMSG,parms[MAXPARMSIDS-1]);
6089 sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
6090 send_req(plci->relatedPTYPLCI);
6092 else VSwitchReqInd(plci,Id,multi_vswitch_parms);
6099 static void SendSetupInfo(APPL * appl, PLCI * plci, dword Id, byte * * parms, byte Info_Sent_Flag)
6132 mixer_set_bchannel_id (plci, Info_Element);
6165 if(plci->adapter->Info_Mask[appl->Id-1] & Info_Mask) {
6173 void SendInfo(PLCI * plci, dword Id, byte * * parms, byte iesent)
6189 !plci->appl
6190 && !plci->State
6191 && plci->Sig.Ind!=NCR_FACILITY
6260 mixer_set_bchannel_id (plci, Info_Element);
6304 if(plci->Sig.Ind==NCR_FACILITY) /* check controller broadcast */
6311 && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
6319 else if(!plci->appl)
6329 if(test_c_ind_mask_bit (plci, j))
6339 && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
6343 sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
6349 byte SendMultiIE(PLCI * plci, dword Id, byte * * parms, byte ie_type, dword info_mask, byte setupParse)
6361 !plci->appl
6362 && !plci->State
6363 && plci->Sig.Ind!=NCR_FACILITY
6379 dbug(1,dprintf("[Ind0x%x]:IE=0x%x",plci->Sig.Ind,ie_type));
6384 if(plci->Sig.Ind==NCR_FACILITY) /* check controller broadcast */
6391 && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
6399 else if(!plci->appl && Info_Number)
6403 if(test_c_ind_mask_bit (plci, j))
6412 && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
6416 sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
6422 static void SendSSExtInd(APPL * appl, PLCI * plci, dword Id, byte * * parms)
6434 plci
6435 && plci->State
6436 && plci->Sig.Ind!=NCR_FACILITY
6454 else if(plci->appl)
6457 sendf(plci->appl,_MANUFACTURER_I,
6468 void nl_ind(PLCI * plci)
6549 ch = plci->NL.IndCh;
6550 a = plci->adapter;
6552 Id = (((dword)(ncci ? ncci : ch)) << 16) | (((word) plci->Id) << 8) | a->Id;
6553 if(plci->tel) Id|=EXT_CONTROLLER;
6554 APPLptr = plci->appl;
6555 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",
6556 plci->NL.Id,Id,plci->Id,plci->tel,plci->State,ch,plci->channels,plci->NL.Ind &0x0f));
6560 if (plci->nl_remove_id)
6562 plci->NL.RNR = 2; /* discard */
6566 if((plci->NL.Ind &0x0f)==N_CONNECT)
6568 if(plci->State==INC_DIS_PENDING
6569 || plci->State==OUTG_DIS_PENDING
6570 || plci->State==IDLE)
6572 plci->NL.RNR = 2; /* discard */
6576 if(plci->State < INC_ACT_PENDING)
6578 plci->NL.RNR = 1; /* flow control */
6579 channel_x_off (plci, ch, N_XON_CONNECT_IND);
6587 plci->NL.RNR = 2;
6591 if (((plci->NL.Ind &0x0f) == N_UDATA)
6592 && (((plci->B2_prot != B2_SDLC) && ((plci->B1_resource == 17) || (plci->B1_resource == 18)))
6593 || (plci->B2_prot == 7)
6594 || (plci->B3_prot == 7)) )
6596 plci->ncpi_buffer[0] = 0;
6598 ncpi_state = plci->ncpi_state;
6599 if (plci->NL.complete == 1)
6601 byte * data = &plci->NL.RBuffer->P[0];
6603 if ((plci->NL.RBuffer->length >= 12)
6608 /* HexDump ("MDM N_UDATA:", plci->NL.RBuffer->length, data); */
6611 plci->ncpi_state |= NCPI_MDM_DCD_ON_RECEIVED;
6613 plci->ncpi_state |= NCPI_MDM_CTS_ON_RECEIVED;
6623 PUT_WORD (&(plci->ncpi_buffer[1]), (word)(GET_DWORD(data) & 0x0000FFFF));
6641 PUT_WORD (&(plci->ncpi_buffer[3]), ncpi_opt);
6642 plci->ncpi_buffer[0] = 4;
6644 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND | NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
6647 if (plci->B3_prot == 7)
6650 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6651 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6654 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6655 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6659 if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
6665 plci->NL.RNR = 2;
6670 if(plci->NL.complete == 2)
6672 if (((plci->NL.Ind &0x0f) == N_UDATA)
6673 && !(udata_forwarding_table[plci->RData[0].P[0] >> 5] & (1L << (plci->RData[0].P[0] & 0x1f))))
6675 switch(plci->RData[0].P[0])
6679 if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
6680 sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,"ws", SELECTOR_DTMF, "\x01X");
6683 if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
6684 sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,"ws", SELECTOR_DTMF, "\x01Y");
6687 dtmf_indication (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6690 dtmf_confirmation (Id, plci);
6695 capidtmf_recv_process_block (&(plci->capidtmf_state), plci->RData[0].P + 1, (word)(plci->RData[0].PLength - 1));
6696 i = capidtmf_indication (&(plci->capidtmf_state), dtmf_code_buffer + 1);
6700 dtmf_indication (Id, plci, dtmf_code_buffer, (word)(i + 1));
6706 mixer_indication_coefs_set (Id, plci);
6709 mixer_indication_xconnect_from (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6712 mixer_indication_xconnect_to (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6717 ec_indication (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6728 if ((plci->RData[0].PLength != 0)
6729 && ((plci->B2_prot == B2_V120_ASYNC)
6730 || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
6731 || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
6734 sendf(plci->appl,_DATA_B3_I,Id,0,
6736 plci->RData[1].P,
6737 (plci->NL.RNum < 2) ? 0 : plci->RData[1].PLength,
6738 plci->RNum,
6739 plci->RFlags);
6745 sendf(plci->appl,_DATA_B3_I,Id,0,
6747 plci->RData[0].P,
6748 plci->RData[0].PLength,
6749 plci->RNum,
6750 plci->RFlags);
6758 if((plci->NL.Ind &0x0f)==N_CONNECT ||
6759 (plci->NL.Ind &0x0f)==N_CONNECT_ACK ||
6760 (plci->NL.Ind &0x0f)==N_DISC ||
6761 (plci->NL.Ind &0x0f)==N_EDATA ||
6762 (plci->NL.Ind &0x0f)==N_DISC_ACK)
6765 plci->ncpi_buffer[0] = 0;
6766 switch (plci->B3_prot) {
6772 for(i=0; i<plci->NL.RLength; i++) plci->ncpi_buffer[4+i] = plci->NL.RBuffer->P[i];
6773 plci->ncpi_buffer[0] = (byte)(i+3);
6774 plci->ncpi_buffer[1] = (byte)(plci->NL.Ind &N_D_BIT? 1:0);
6775 plci->ncpi_buffer[2] = 0;
6776 plci->ncpi_buffer[3] = 0;
6780 if(plci->NL.RLength>=sizeof(T30_INFO))
6782 dbug(1,dprintf("FaxStatus %04x", ((T30_INFO *)plci->NL.RBuffer->P)->code));
6784 PUT_WORD(&(plci->ncpi_buffer[1]),((T30_INFO *)plci->NL.RBuffer->P)->rate_div_2400 * 2400);
6785 fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
6786 i = (((T30_INFO *)plci->NL.RBuffer->P)->resolution & T30_RESOLUTION_R8_0770_OR_200) ? 0x0001 : 0x0000;
6787 if (plci->B3_prot == 5)
6801 PUT_WORD(&(plci->ncpi_buffer[3]),i);
6802 PUT_WORD(&(plci->ncpi_buffer[5]),((T30_INFO *)plci->NL.RBuffer->P)->data_format);
6803 plci->ncpi_buffer[7] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_low;
6804 plci->ncpi_buffer[8] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_high;
6805 plci->ncpi_buffer[len] = 0;
6806 if(((T30_INFO *)plci->NL.RBuffer->P)->station_id_len)
6808 plci->ncpi_buffer[len] = 20;
6810 plci->ncpi_buffer[++len] = ((T30_INFO *)plci->NL.RBuffer->P)->station_id[i];
6812 if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
6814 if (((T30_INFO *)plci->NL.RBuffer->P)->code < ARRAY_SIZE(fax_info))
6815 info = fax_info[((T30_INFO *)plci->NL.RBuffer->P)->code];
6820 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
6823 i = ((word)(((T30_INFO *) 0)->station_id + 20)) + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
6824 while (i < plci->NL.RBuffer->length)
6825 plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
6828 plci->ncpi_buffer[0] = len;
6829 fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
6830 PUT_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low, fax_feature_bits);
6832 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND;
6833 if (((plci->NL.Ind &0x0f) == N_CONNECT_ACK)
6834 || (((plci->NL.Ind &0x0f) == N_CONNECT)
6836 || (((plci->NL.Ind &0x0f) == N_EDATA)
6837 && ((((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_TRAIN_OK)
6838 || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
6839 || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DTC))))
6841 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT;
6843 if (((plci->NL.Ind &0x0f) == N_DISC)
6844 || ((plci->NL.Ind &0x0f) == N_DISC_ACK)
6845 || (((plci->NL.Ind &0x0f) == N_EDATA)
6846 && (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_EOP_CAPI)))
6848 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
6854 if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
6856 if (plci->NL.RLength != 0)
6858 info = rtp_info[plci->NL.RBuffer->P[0]];
6859 plci->ncpi_buffer[0] = plci->NL.RLength - 1;
6860 for (i = 1; i < plci->NL.RLength; i++)
6861 plci->ncpi_buffer[i] = plci->NL.RBuffer->P[i];
6867 plci->NL.RNR = 2;
6869 switch(plci->NL.Ind &0x0f) {
6871 if ((plci->B3_prot == 4) || (plci->B3_prot == 5))
6874 ((T30_INFO *)plci->NL.RBuffer->P)->code));
6875 fax_send_edata_ack = (((T30_INFO *)(plci->fax_connect_info_buffer))->operating_mode == T30_OPERATING_MODE_CAPI_NEG);
6877 if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
6878 && (plci->nsf_control_bits & (T30_NSF_CONTROL_BIT_NEGOTIATE_IND | T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
6879 && (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
6881 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6882 && !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
6884 ((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
6885 sendf(plci->appl,_MANUFACTURER_I,Id,0,"dwbS",_DI_MANU_ID,_DI_NEGOTIATE_B3,
6886 (byte)(plci->ncpi_buffer[0] + 1), plci->ncpi_buffer);
6887 plci->ncpi_state |= NCPI_NEGOTIATE_B3_SENT;
6888 if (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)
6894 switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
6898 && !(GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) & T30_CONTROL_BIT_REQUEST_POLLING)
6899 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6900 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6903 if (plci->B3_prot == 4)
6904 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
6906 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6907 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6913 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6914 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6916 if (plci->B3_prot == 4)
6917 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
6919 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6920 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6927 sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",GOOD,plci->ncpi_buffer);
6929 plci->ncpi_state = 0;
6937 switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
6941 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6942 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6944 if (plci->B3_prot == 4)
6945 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
6947 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6948 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6955 ((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
6956 plci->fax_edata_ack_length = 1;
6957 start_internal_command (Id, plci, fax_edata_ack_command);
6968 ncci = get_ncci (plci, ch, 0);
6971 dbug(1,dprintf("N_CONNECT: ch=%d state=%d plci=%lx plci_Id=%lx plci_State=%d",
6972 ch, a->ncci_state[ncci], a->ncci_plci[ncci], plci->Id, plci->State));
6976 plci->channels++;
6977 else if (plci->B3_prot == 1)
6981 if(plci->B3_prot == 4)
6982 sendf(plci->appl,msg,Id,0,"s","");
6984 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
6988 if (plci->internal_command_queue[0]
6989 && ((plci->adjust_b_state == ADJUST_B_CONNECT_2)
6990 || (plci->adjust_b_state == ADJUST_B_CONNECT_3)
6991 || (plci->adjust_b_state == ADJUST_B_CONNECT_4)))
6993 (*(plci->internal_command_queue[0]))(Id, plci, 0);
6994 if (!plci->internal_command)
6995 next_internal_command (Id, plci);
6999 if (plci->B3_prot == 1)
7004 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
7006 else if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
7009 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
7010 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
7013 if (plci->B3_prot == 4)
7014 sendf(plci->appl,msg,Id,0,"s","");
7016 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
7017 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
7023 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
7025 if (plci->adjust_b_restore)
7027 plci->adjust_b_restore = false;
7028 start_internal_command (Id, plci, adjust_b_restore);
7033 if (plci->internal_command_queue[0]
7034 && ((plci->internal_command == FAX_DISCONNECT_COMMAND_1)
7035 || (plci->internal_command == FAX_DISCONNECT_COMMAND_2)
7036 || (plci->internal_command == FAX_DISCONNECT_COMMAND_3)))
7038 (*(plci->internal_command_queue[0]))(Id, plci, 0);
7039 if (!plci->internal_command)
7040 next_internal_command (Id, plci);
7043 ncci_remove (plci, ncci, false);
7049 for(i=0; plci->inc_dis_ncci_table[i]; i++);
7050 plci->inc_dis_ncci_table[i] = (byte) ncci;
7053 if (!plci->channels
7054 && (plci->B1_resource == 16)
7055 && (plci->State <= CONNECTED))
7058 i = ((T30_INFO *)plci->fax_connect_info_buffer)->rate_div_2400 * 2400;
7059 PUT_WORD (&plci->ncpi_buffer[1], i);
7060 PUT_WORD (&plci->ncpi_buffer[3], 0);
7061 i = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
7062 PUT_WORD (&plci->ncpi_buffer[5], i);
7063 PUT_WORD (&plci->ncpi_buffer[7], 0);
7064 plci->ncpi_buffer[len] = 0;
7065 plci->ncpi_buffer[0] = len;
7066 if(plci->B3_prot == 4)
7067 sendf(plci->appl,_CONNECT_B3_I,Id,0,"s","");
7071 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
7074 plci->ncpi_buffer[++len] = 0;
7075 plci->ncpi_buffer[++len] = 0;
7076 plci->ncpi_buffer[++len] = 0;
7077 plci->ncpi_buffer[0] = len;
7080 sendf(plci->appl,_CONNECT_B3_I,Id,0,"S",plci->ncpi_buffer);
7082 sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",info,plci->ncpi_buffer);
7083 plci->ncpi_state = 0;
7084 sig_req(plci,HANGUP,0);
7085 send_req(plci);
7086 plci->State = OUTG_DIS_PENDING;
7090 && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
7095 if (plci->channels)
7096 plci->channels--;
7097 if((plci->State==IDLE || plci->State==SUSPENDING) && !plci->channels){
7098 if(plci->State == SUSPENDING){
7099 sendf(plci->appl,
7104 sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
7106 plci_remove(plci);
7107 plci->State=IDLE;
7111 else if (plci->channels)
7113 sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",info,plci->ncpi_buffer);
7114 plci->ncpi_state = 0;
7116 && ((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE)))
7118 sig_req(plci,HANGUP,0);
7119 send_req(plci);
7120 plci->State = OUTG_DIS_PENDING;
7126 sendf(plci->appl,_RESET_B3_I,Id,0,"S",plci->ncpi_buffer);
7130 sendf(plci->appl,_RESET_B3_I,Id,0,"S",plci->ncpi_buffer);
7134 if (!(udata_forwarding_table[plci->NL.RBuffer->P[0] >> 5] & (1L << (plci->NL.RBuffer->P[0] & 0x1f))))
7136 plci->RData[0].P = plci->internal_ind_buffer + (-((int)(long)(plci->internal_ind_buffer)) & 3);
7137 plci->RData[0].PLength = INTERNAL_IND_BUFFER_SIZE;
7138 plci->NL.R = plci->RData;
7139 plci->NL.RNum = 1;
7144 if (((a->ncci_state[ncci] != CONNECTED) && (plci->B2_prot == 1)) /* transparent */
7148 plci->NL.RNR = 2;
7156 plci->NL.RNR = 1; /* flow control */
7157 channel_x_off (plci, ch, 0);
7177 plci->NL.RNR = 1;
7181 plci->NL.RNR = 2;
7184 channel_x_off (plci, ch, 0);
7193 plci->RData[0].P = ReceiveBufferGet(APPLptr,Num);
7194 if(!plci->RData[0].P) {
7195 plci->NL.RNR = 1;
7196 channel_x_off (plci, ch, 0);
7201 APPLptr->DataFlags[Num] = (plci->Id<<8) | (plci->NL.Ind>>4);
7204 plci->RNum = Num;
7205 plci->RFlags = plci->NL.Ind>>4;
7206 plci->RData[0].PLength = APPLptr->MaxDataLength;
7207 plci->NL.R = plci->RData;
7208 if ((plci->NL.RLength != 0)
7209 && ((plci->B2_prot == B2_V120_ASYNC)
7210 || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
7211 || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
7213 plci->RData[1].P = plci->RData[0].P;
7214 plci->RData[1].PLength = plci->RData[0].PLength;
7215 plci->RData[0].P = v120_header_buffer + (-((int) v120_header_buffer) & 3);
7216 if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
7217 plci->RData[0].PLength = 1;
7219 plci->RData[0].PLength = 2;
7220 if (plci->NL.RBuffer->P[0] & V120_HEADER_BREAK_BIT)
7221 plci->RFlags |= 0x0010;
7222 if (plci->NL.RBuffer->P[0] & (V120_HEADER_C1_BIT | V120_HEADER_C2_BIT))
7223 plci->RFlags |= 0x8000;
7224 plci->NL.RNum = 2;
7228 if((plci->NL.Ind &0x0f)==N_UDATA)
7229 plci->RFlags |= 0x0010;
7231 else if ((plci->B3_prot == B3_RTP) && ((plci->NL.Ind & 0x0f) == N_BDATA))
7232 plci->RFlags |= 0x0001;
7234 plci->NL.RNum = 1;
7238 data_ack (plci, ch);
7241 plci->NL.RNR = 2;
7253 PLCI * plci;
7256 for(i=0;i<a->max_plci && a->plci[i].Id;i++);
7261 plci = &a->plci[i];
7262 plci->Id = (byte)(i+1);
7264 plci->Sig.Id = 0;
7265 plci->NL.Id = 0;
7266 plci->sig_req = 0;
7267 plci->nl_req = 0;
7269 plci->appl = NULL;
7270 plci->relatedPTYPLCI = NULL;
7271 plci->State = IDLE;
7272 plci->SuppState = IDLE;
7273 plci->channels = 0;
7274 plci->tel = 0;
7275 plci->B1_resource = 0;
7276 plci->B2_prot = 0;
7277 plci->B3_prot = 0;
7279 plci->command = 0;
7280 plci->m_command = 0;
7281 init_internal_command_queue (plci);
7282 plci->number = 0;
7283 plci->req_in_start = 0;
7284 plci->req_in = 0;
7285 plci->req_out = 0;
7286 plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
7287 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
7288 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
7290 plci->data_sent = false;
7291 plci->send_disc = 0;
7292 plci->sig_global_req = 0;
7293 plci->sig_remove_id = 0;
7294 plci->nl_global_req = 0;
7295 plci->nl_remove_id = 0;
7296 plci->adv_nl = 0;
7297 plci->manufacturer = false;
7298 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
7299 plci->spoofed_msg = 0;
7300 plci->ptyState = 0;
7301 plci->cr_enquiry = false;
7302 plci->hangup_flow_ctrl_timer = 0;
7304 plci->ncci_ring_list = 0;
7305 for(j=0;j<MAX_CHANNELS_PER_PLCI;j++) plci->inc_dis_ncci_table[j] = 0;
7306 clear_c_ind_mask (plci);
7307 set_group_ind_mask (plci);
7308 plci->fax_connect_info_length = 0;
7309 plci->nsf_control_bits = 0;
7310 plci->ncpi_state = 0x00;
7311 plci->ncpi_buffer[0] = 0;
7313 plci->requested_options_conn = 0;
7314 plci->requested_options = 0;
7315 plci->notifiedcall = 0;
7316 plci->vswitchstate = 0;
7317 plci->vsprot = 0;
7318 plci->vsprotdialect = 0;
7319 init_b1_config (plci);
7320 dbug(1,dprintf("get_plci(%x)",plci->Id));
7328 static void add_p(PLCI * plci, byte code, byte * p)
7334 add_ie(plci, code, p, p_length);
7340 static void add_s(PLCI * plci, byte code, API_PARSE * p)
7342 if(p) add_ie(plci, code, p->info, (word)p->length);
7348 static void add_ss(PLCI * plci, byte code, API_PARSE * p)
7356 add_ie(plci, p->info[i-1], (byte *)&(p->info[i]), (word)p->info[i]);
7383 static void add_ie(PLCI * plci, byte code, byte * p, word p_length)
7389 if(plci->req_in==plci->req_in_start) {
7390 plci->req_in +=2;
7393 plci->req_in--;
7395 plci->RBuffer[plci->req_in++] = code;
7398 plci->RBuffer[plci->req_in++] = (byte)p_length;
7399 for(i=0;i<p_length;i++) plci->RBuffer[plci->req_in++] = p[1+i];
7402 plci->RBuffer[plci->req_in++] = 0;
7409 void add_d(PLCI * plci, word length, byte * p)
7413 if(plci->req_in==plci->req_in_start) {
7414 plci->req_in +=2;
7417 plci->req_in--;
7419 for(i=0;i<length;i++) plci->RBuffer[plci->req_in++] = p[i];
7427 void add_ai(PLCI * plci, API_PARSE * ai)
7439 add_s (plci,KEY,&ai_parms[1]);
7440 add_s (plci,UUI,&ai_parms[2]);
7441 add_ss(plci,FTY,&ai_parms[3]);
7448 word add_b1(PLCI * plci, API_PARSE * bp, word b_channel_info, word b1_facilities)
7467 api_save_msg(bp, "s", &plci->B_protocol);
7470 plci->B1_resource = 0;
7471 adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
7472 add_p(plci, CAI, "\x01\x00");
7477 if(plci->tel == CODEC_PERMANENT) return 0;
7478 else if(plci->tel == CODEC){
7479 plci->B1_resource = 1;
7480 adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
7481 add_p(plci, CAI, "\x01\x01");
7485 else if(plci->tel == ADV_VOICE){
7486 plci->B1_resource = add_b1_facilities (plci, 9, (word)(b1_facilities | B1_FACILITY_VOICE));
7487 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities | B1_FACILITY_VOICE));
7488 voice_cai[1] = plci->B1_resource;
7489 PUT_WORD (&voice_cai[5], plci->appl->MaxDataLength);
7490 add_p(plci, CAI, voice_cai);
7494 plci->call_dir &= ~(CALL_DIR_ORIGINATE | CALL_DIR_ANSWER);
7495 if (plci->call_dir & CALL_DIR_OUT)
7496 plci->call_dir |= CALL_DIR_ORIGINATE;
7497 else if (plci->call_dir & CALL_DIR_IN)
7498 plci->call_dir |= CALL_DIR_ANSWER;
7501 plci->B1_resource = 0x5;
7502 adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
7503 add_p(plci, CAI, "\x01\x05");
7533 plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
7536 plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
7540 dbug(1,dprintf("call_dir=%04x", plci->call_dir));
7544 && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
7546 plci->B1_resource = add_b1_facilities (plci, 31, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7547 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7548 cai[1] = plci->B1_resource;
7552 PUT_WORD(&cai[5],plci->appl->MaxDataLength);
7556 add_p(plci, CAI, cai);
7562 && (plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))
7564 plci->B1_resource = add_b1_facilities (plci, 35/* PIAFS HARDWARE FACILITY */, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7565 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7566 cai[1] = plci->B1_resource;
7570 PUT_WORD(&cai[5],plci->appl->MaxDataLength);
7572 add_p(plci, CAI, cai);
7578 || (!((1L << GET_WORD(bp_parms[0].info)) & plci->adapter->profile.B1_Protocols)
7580 || !((1L << B1_HDLC) & plci->adapter->profile.B1_Protocols)
7585 plci->B1_resource = add_b1_facilities (plci, resource[GET_WORD(bp_parms[0].info)],
7587 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7589 cai[1] = plci->B1_resource;
7670 if (((plci->call_dir & CALL_DIR_ORIGINATE) != 0) ^ ((plci->call_dir & CALL_DIR_OUT) != 0))
7716 if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_V18))
7719 plci->requested_options |= 1L << PRIVATE_V18;
7722 plci->requested_options |= 1L << PRIVATE_VOWN;
7724 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
7900 PUT_WORD(&cai[5],plci->appl->MaxDataLength);
7904 add_p(plci, CAI, cai);
7912 word add_b23(PLCI * plci, API_PARSE * bp)
7942 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
7944 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
7949 if (plci->rx_dma_descriptor <= 0) {
7950 plci->rx_dma_descriptor=diva_get_dma_descriptor(plci,&plci->rx_dma_magic);
7951 if (plci->rx_dma_descriptor >= 0)
7952 plci->rx_dma_descriptor++;
7954 if (plci->rx_dma_descriptor > 0) {
7957 lli[2] = (byte)(plci->rx_dma_descriptor - 1);
7958 lli[3] = (byte)plci->rx_dma_magic;
7959 lli[4] = (byte)(plci->rx_dma_magic >> 8);
7960 lli[5] = (byte)(plci->rx_dma_magic >> 16);
7961 lli[6] = (byte)(plci->rx_dma_magic >> 24);
7965 if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
7970 api_save_msg(bp, "s", &plci->B_protocol);
7972 if(!bp->length && plci->tel)
7974 plci->adv_nl = true;
7976 add_p(plci,LLI,lli);
7977 plci->B2_prot = 1 /*XPARENT*/;
7978 plci->B3_prot = 0 /*XPARENT*/;
7981 add_p(plci, LLC, llc);
7983 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
7984 add_p(plci, DLC, dlc);
7991 add_p(plci,LLI,lli);
7992 plci->B2_prot = 0 /*X.75 */;
7993 plci->B3_prot = 0 /*XPARENT*/;
7996 add_p(plci, LLC, llc);
7998 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
7999 add_p(plci, DLC, dlc);
8020 if(plci->tel==ADV_VOICE) /* transparent B on advanced voice */
8024 plci->adv_nl = true;
8026 else if(plci->tel) return _B2_NOT_SUPPORTED;
8031 && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
8033 add_p(plci,LLI,lli);
8034 plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
8035 plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
8036 llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ? 14 : 13;
8038 add_p(plci, LLC, llc);
8040 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
8050 add_p(plci, DLC, dlc);
8054 add_p(plci, NLC, nlc);
8061 || (!((1L << GET_WORD(bp_parms[1].info)) & plci->adapter->profile.B2_Protocols)
8063 || !(plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))))
8069 || !((1L << GET_WORD(bp_parms[2].info)) & plci->adapter->profile.B3_Protocols))
8078 return (add_modem_b23 (plci, bp_parms));
8081 add_p(plci,LLI,lli);
8083 plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
8084 plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
8085 if(plci->B2_prot==12) SAPI = 0; /* default SAPI D-channel */
8096 plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
8099 plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
8103 dbug(1,dprintf("call_dir=%04x", plci->call_dir));
8106 if (plci->B2_prot == B2_PIAFS)
8111 llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
8116 add_p(plci, LLC, llc);
8119 PUT_WORD(&dlc[1], plci->appl->MaxDataLength +
8124 if(plci->B3_prot == 4
8125 || plci->B3_prot == 5)
8129 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
8142 if (plci->B3_prot != B3_TRANSPARENT)
8149 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
8186 add_p(plci, DLC, dlc);
8192 if (plci->B3_prot != B3_TRANSPARENT)
8259 if( (b2_config->length>=2) && (plci->B2_prot==12) )
8323 add_p(plci, DLC, dlc);
8328 if(plci->B3_prot == 4
8329 || plci->B3_prot == 5)
8337 ((plci->B3_prot == 4) && (((byte)(GET_WORD((byte *)b3_config_parms[1].info))) != 5))) ? T30_RESOLUTION_R8_0770_OR_200 : 0);
8342 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
8345 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8358 if(plci->B3_prot == 5)
8368 if (plci->fax_connect_info_length != 0)
8370 ((T30_INFO *)&nlc[1])->resolution = ((T30_INFO *)plci->fax_connect_info_buffer)->resolution;
8371 ((T30_INFO *)&nlc[1])->data_format = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
8372 ((T30_INFO *)&nlc[1])->recording_properties = ((T30_INFO *)plci->fax_connect_info_buffer)->recording_properties;
8373 fax_control_bits |= GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) &
8427 plci->nsf_control_bits = 0;
8428 if(plci->B3_prot == 5)
8430 if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
8433 plci->requested_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;
8435 if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
8438 plci->requested_options |= 1L << PRIVATE_FAX_NONSTANDARD;
8440 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8443 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8452 if (pos < plci->fax_connect_info_length)
8454 for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
8455 nlc[++len] = plci->fax_connect_info_buffer[pos++];
8459 if (pos < plci->fax_connect_info_length)
8461 for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
8462 nlc[++len] = plci->fax_connect_info_buffer[pos++];
8466 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8469 if ((pos < plci->fax_connect_info_length) && (plci->fax_connect_info_buffer[pos] != 0))
8471 if ((plci->fax_connect_info_buffer[pos] >= 3) && (plci->fax_connect_info_buffer[pos+1] >= 2))
8472 plci->nsf_control_bits = GET_WORD(&plci->fax_connect_info_buffer[pos+2]);
8473 for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
8474 nlc[++len] = plci->fax_connect_info_buffer[pos++];
8486 plci->nsf_control_bits = GET_WORD(&b3_config_parms[4].info[2]);
8494 if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
8495 && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
8505 plci->fax_connect_info_buffer[i] = nlc[1+i];
8506 ((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0;
8509 plci->fax_connect_info_buffer[len++] = nlc[++i];
8510 plci->fax_connect_info_length = len;
8528 if (plci->B3_prot == 4
8529 || plci->B3_prot == 5 /*T.30 - FAX*/ ) return _B3_PARM_NOT_SUPPORTED;
8531 add_p(plci, NLC, nlc);
8550 static word add_modem_b23 (PLCI * plci, API_PARSE* bp_parms)
8575 plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
8576 plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
8593 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
8595 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
8600 if (plci->rx_dma_descriptor <= 0) {
8601 plci->rx_dma_descriptor=diva_get_dma_descriptor(plci,&plci->rx_dma_magic);
8602 if (plci->rx_dma_descriptor >= 0)
8603 plci->rx_dma_descriptor++;
8605 if (plci->rx_dma_descriptor > 0) {
8608 lli[2] = (byte)(plci->rx_dma_descriptor - 1);
8609 lli[3] = (byte)plci->rx_dma_magic;
8610 lli[4] = (byte)(plci->rx_dma_magic >> 8);
8611 lli[5] = (byte)(plci->rx_dma_magic >> 16);
8612 lli[6] = (byte)(plci->rx_dma_magic >> 24);
8616 if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
8620 llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
8623 add_p(plci, LLI, lli);
8624 add_p(plci, LLC, llc);
8626 PUT_WORD (&dlc[i], plci->appl->MaxDataLength);
8678 add_p(plci, DLC, dlc);
8687 void sig_req(PLCI * plci, byte req, byte Id)
8689 if(!plci) return;
8690 if(plci->adapter->adapter_disabled) return;
8693 plci->sig_remove_id = plci->Sig.Id;
8694 if(plci->req_in==plci->req_in_start) {
8695 plci->req_in +=2;
8696 plci->RBuffer[plci->req_in++] = 0;
8698 PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start-2);
8699 plci->RBuffer[plci->req_in++] = Id; /* sig/nl flag */
8700 plci->RBuffer[plci->req_in++] = req; /* request */
8701 plci->RBuffer[plci->req_in++] = 0; /* channel */
8702 plci->req_in_start = plci->req_in;
8709 void nl_req_ncci(PLCI * plci, byte req, byte ncci)
8711 if(!plci) return;
8712 if(plci->adapter->adapter_disabled) return;
8713 dbug(1,dprintf("nl_req %02x %02x %02x", plci->Id, req, ncci));
8716 plci->nl_remove_id = plci->NL.Id;
8717 ncci_remove (plci, 0, (byte)(ncci != 0));
8720 if(plci->req_in==plci->req_in_start) {
8721 plci->req_in +=2;
8722 plci->RBuffer[plci->req_in++] = 0;
8724 PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start-2);
8725 plci->RBuffer[plci->req_in++] = 1; /* sig/nl flag */
8726 plci->RBuffer[plci->req_in++] = req; /* request */
8727 plci->RBuffer[plci->req_in++] = plci->adapter->ncci_ch[ncci]; /* channel */
8728 plci->req_in_start = plci->req_in;
8731 void send_req(PLCI * plci)
8737 if(!plci) return;
8738 if(plci->adapter->adapter_disabled) return;
8739 channel_xmit_xon (plci);
8742 if(plci->req_in==plci->req_out) return;
8743 dbug(1,dprintf("send_req(in=%d,out=%d)",plci->req_in,plci->req_out));
8745 if(plci->nl_req || plci->sig_req) return;
8747 l = GET_WORD(&plci->RBuffer[plci->req_out]);
8748 plci->req_out += 2;
8749 plci->XData[0].P = &plci->RBuffer[plci->req_out];
8750 plci->req_out += l;
8751 if(plci->RBuffer[plci->req_out]==1)
8753 e = &plci->NL;
8754 plci->req_out++;
8755 e->Req = plci->nl_req = plci->RBuffer[plci->req_out++];
8756 e->ReqCh = plci->RBuffer[plci->req_out++];
8760 plci->RBuffer[plci->req_out-4] = CAI;
8761 plci->RBuffer[plci->req_out-3] = 1;
8762 plci->RBuffer[plci->req_out-2] = (plci->Sig.Id==0xff) ? 0 : plci->Sig.Id;
8763 plci->RBuffer[plci->req_out-1] = 0;
8765 plci->nl_global_req = plci->nl_req;
8767 dbug(1,dprintf("%x:NLREQ(%x:%x:%x)",plci->adapter->Id,e->Id,e->Req,e->ReqCh));
8771 e = &plci->Sig;
8772 if(plci->RBuffer[plci->req_out])
8773 e->Id = plci->RBuffer[plci->req_out];
8774 plci->req_out++;
8775 e->Req = plci->sig_req = plci->RBuffer[plci->req_out++];
8776 e->ReqCh = plci->RBuffer[plci->req_out++];
8778 plci->sig_global_req = plci->sig_req;
8779 dbug(1,dprintf("%x:SIGREQ(%x:%x:%x)",plci->adapter->Id,e->Id,e->Req,e->ReqCh));
8781 plci->XData[0].PLength = l;
8782 e->X = plci->XData;
8783 plci->adapter->request(e);
8787 void send_data(PLCI * plci)
8794 if (!plci->nl_req && plci->ncci_ring_list)
8796 a = plci->adapter;
8797 ncci = plci->ncci_ring_list;
8809 || (plci->send_disc == ncci))
8812 if ((plci->B2_prot == B2_V120_ASYNC)
8813 || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
8814 || (plci->B2_prot == B2_V120_BIT_TRANSPARENT))
8816 plci->NData[1].P = TransmitBufferGet (plci->appl, data->P);
8817 plci->NData[1].PLength = data->Length;
8819 plci->NData[0].P = v120_break_header;
8821 plci->NData[0].P = v120_default_header;
8822 plci->NData[0].PLength = 1 ;
8823 plci->NL.XNum = 2;
8824 plci->NL.Req = plci->nl_req = (byte)((data->Flags&0x07)<<4 |N_DATA);
8828 plci->NData[0].P = TransmitBufferGet (plci->appl, data->P);
8829 plci->NData[0].PLength = data->Length;
8831 plci->NL.Req = plci->nl_req = (byte)N_UDATA;
8833 else if ((plci->B3_prot == B3_RTP) && (data->Flags & 0x01))
8834 plci->NL.Req = plci->nl_req = (byte)N_BDATA;
8837 plci->NL.Req = plci->nl_req = (byte)((data->Flags&0x07)<<4 |N_DATA);
8839 plci->NL.X = plci->NData;
8840 plci->NL.ReqCh = a->ncci_ch[ncci];
8841 dbug(1,dprintf("%x:DREQ(%x:%x)",a->Id,plci->NL.Id,plci->NL.Req));
8842 plci->data_sent = true;
8843 plci->data_sent_ptr = data->P;
8844 a->request(&plci->NL);
8847 cleanup_ncci_data (plci, ncci);
8850 else if (plci->send_disc == ncci)
8853 plci->NData[0].PLength = 0;
8854 plci->NL.ReqCh = a->ncci_ch[ncci];
8855 plci->NL.Req = plci->nl_req = N_DISC;
8856 a->request(&plci->NL);
8857 plci->command = _DISCONNECT_B3_R;
8858 plci->send_disc = 0;
8861 } while (!plci->nl_req && (ncci != plci->ncci_ring_list));
8862 plci->ncci_ring_list = ncci;
8869 PLCI * plci;
8877 plci = &(a->plci[i]);
8878 if(plci->notifiedcall) activnotifiedcalls++;
8885 plci = &a->plci[j-1];
8886 plci->State = LISTENING;
8888 add_p(plci,OAD,"\x01\xfd");
8890 add_p(plci,KEY,"\x04\x43\x41\x32\x30");
8892 add_p(plci,CAI,"\x01\xc0");
8893 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
8894 add_p(plci,LLI,"\x01\xc4"); /* support Dummy CR FAC + MWI + SpoofNotify */
8895 add_p(plci,SHIFT|6,NULL);
8896 add_p(plci,SIN,"\x02\x00\x00");
8897 plci->internal_command = LISTEN_SIG_ASSIGN_PEND; /* do indicate_req if OK */
8898 sig_req(plci,ASSIGN,DSIG_ID);
8899 send_req(plci);
8909 void IndParse(PLCI * plci, word * parms_id, byte ** parms, byte multiIEsize)
8923 in = plci->Sig.RBuffer->P;
8933 while(ploc<plci->Sig.RBuffer->length-1) {
9071 void SetVoiceChannel(PLCI *plci, byte *chi, DIVA_CAPI_ADAPTER * a)
9079 add_p(plci,FTY,"\x02\x01\x07"); /* B On, default on 1 */
9080 add_p(plci,ESC,voice_chi); /* Channel */
9081 sig_req(plci,TEL_CTRL,0);
9082 send_req(plci);
9089 void VoiceChannelOff(PLCI *plci)
9092 add_p(plci,FTY,"\x02\x01\x08"); /* B Off */
9093 sig_req(plci,TEL_CTRL,0);
9094 send_req(plci);
9095 if(plci->adapter->AdvSignalPLCI)
9097 adv_voice_clear_config (plci->adapter->AdvSignalPLCI);
9102 word AdvCodecSupport(DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, byte hook_listen)
9109 /* the advanced codec plci is just for internal use */
9122 if(plci!=0)
9124 a->AdvSignalPLCI = plci;
9125 plci->tel=ADV_VOICE;
9131 splci = &a->plci[j-1];
9141 if(plci)
9143 plci->spoofed_msg = SPOOFING_REQUIRED;
9147 if(plci!=0)
9149 a->AdvSignalPLCI = plci;
9150 plci->tel=ADV_VOICE;
9173 if(plci!=0) plci->tel = CODEC;
9180 splci = &a->plci[j-1];
9198 void CodecIdCheck(DIVA_CAPI_ADAPTER *a, PLCI *plci)
9203 if(a->AdvSignalPLCI == plci)
9302 splci = &a->plci[j-1];
9319 PLCI *plci;
9351 plci = &a->plci[j];
9352 if(plci->Id) /* if plci owns no application */
9354 if(plci->State==INC_CON_PENDING
9355 || plci->State==INC_CON_ALERT)
9357 if(test_c_ind_mask_bit (plci, (word)(Id-1)))
9359 clear_c_ind_mask_bit (plci, (word)(Id-1));
9360 if(c_ind_mask_empty (plci))
9362 sig_req(plci,HANGUP,0);
9363 send_req(plci);
9364 plci->State = OUTG_DIS_PENDING;
9368 if(test_c_ind_mask_bit (plci, (word)(Id-1)))
9370 clear_c_ind_mask_bit (plci, (word)(Id-1));
9371 if(c_ind_mask_empty (plci))
9373 if(!plci->appl)
9375 plci_remove(plci);
9376 plci->State = IDLE;
9380 if(plci->appl==this)
9382 plci->appl = NULL;
9383 plci_remove(plci);
9384 plci->State = IDLE;
9396 plci = &a->plci[j-1];
9397 plci->command = 0;
9398 add_p(plci,OAD,"\x01\xfd");
9399 add_p(plci,CAI,"\x01\x80");
9400 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
9401 add_p(plci,SHIFT|6,NULL);
9402 add_p(plci,SIN,"\x02\x00\x00");
9403 plci->internal_command = REM_L1_SIG_ASSIGN_PEND;
9404 sig_req(plci,ASSIGN,DSIG_ID);
9405 add_p(plci,FTY,"\x02\xff\x06"); /* l1 down */
9406 sig_req(plci,SIG_CTRL,0);
9407 send_req(plci);
9433 static word plci_remove_check(PLCI *plci)
9435 if(!plci) return true;
9436 if(!plci->NL.Id && c_ind_mask_empty (plci))
9438 if(plci->Sig.Id == 0xff)
9439 plci->Sig.Id = 0;
9440 if(!plci->Sig.Id)
9442 dbug(1,dprintf("plci_remove_complete(%x)",plci->Id));
9443 dbug(1,dprintf("tel=0x%x,Sig=0x%x",plci->tel,plci->Sig.Id));
9444 if (plci->Id)
9446 CodecIdCheck(plci->adapter, plci);
9447 clear_b1_config (plci);
9448 ncci_remove (plci, 0, false);
9449 plci_free_msg_in_queue (plci);
9450 channel_flow_control_remove (plci);
9451 plci->Id = 0;
9452 plci->State = IDLE;
9453 plci->channels = 0;
9454 plci->appl = NULL;
9455 plci->notifiedcall = 0;
9457 listen_check(plci->adapter);
9467 static byte plci_nl_busy (PLCI *plci)
9470 return (plci->nl_req
9471 || (plci->ncci_ring_list
9472 && plci->adapter->ncci_ch[plci->ncci_ring_list]
9473 && (plci->adapter->ch_flow_control[plci->adapter->ncci_ch[plci->ncci_ring_list]] & N_OK_FC_PENDING)));
9569 static void dtmf_enable_receiver (PLCI *plci, byte enable_mask)
9574 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9579 min_digit_duration = (plci->dtmf_rec_pulse_ms == 0) ? 40 : plci->dtmf_rec_pulse_ms;
9580 min_gap_duration = (plci->dtmf_rec_pause_ms == 0) ? 40 : plci->dtmf_rec_pause_ms;
9581 plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_ENABLE_RECEIVER;
9582 PUT_WORD (&plci->internal_req_buffer[1], min_digit_duration);
9583 PUT_WORD (&plci->internal_req_buffer[3], min_gap_duration);
9584 plci->NData[0].PLength = 5;
9586 PUT_WORD (&plci->internal_req_buffer[5], INTERNAL_IND_BUFFER_SIZE);
9587 plci->NData[0].PLength += 2;
9588 capidtmf_recv_enable (&(plci->capidtmf_state), min_digit_duration, min_gap_duration);
9593 plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_DISABLE_RECEIVER;
9594 plci->NData[0].PLength = 1;
9596 capidtmf_recv_disable (&(plci->capidtmf_state));
9599 plci->NData[0].P = plci->internal_req_buffer;
9600 plci->NL.X = plci->NData;
9601 plci->NL.ReqCh = 0;
9602 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
9603 plci->adapter->request (&plci->NL);
9607 static void dtmf_send_digits (PLCI *plci, byte *digit_buffer, word digit_count)
9612 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9615 plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_SEND_DIGITS;
9616 w = (plci->dtmf_send_pulse_ms == 0) ? 40 : plci->dtmf_send_pulse_ms;
9617 PUT_WORD (&plci->internal_req_buffer[1], w);
9618 w = (plci->dtmf_send_pause_ms == 0) ? 40 : plci->dtmf_send_pause_ms;
9619 PUT_WORD (&plci->internal_req_buffer[3], w);
9628 plci->internal_req_buffer[5+i] = (w < DTMF_DIGIT_MAP_ENTRIES) ?
9631 plci->NData[0].PLength = 5 + digit_count;
9632 plci->NData[0].P = plci->internal_req_buffer;
9633 plci->NL.X = plci->NData;
9634 plci->NL.ReqCh = 0;
9635 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
9636 plci->adapter->request (&plci->NL);
9640 static void dtmf_rec_clear_config (PLCI *plci)
9644 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9647 plci->dtmf_rec_active = 0;
9648 plci->dtmf_rec_pulse_ms = 0;
9649 plci->dtmf_rec_pause_ms = 0;
9651 capidtmf_init (&(plci->capidtmf_state), plci->adapter->u_law);
9656 static void dtmf_send_clear_config (PLCI *plci)
9660 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9663 plci->dtmf_send_requests = 0;
9664 plci->dtmf_send_pulse_ms = 0;
9665 plci->dtmf_send_pause_ms = 0;
9669 static void dtmf_prepare_switch (dword Id, PLCI *plci)
9675 while (plci->dtmf_send_requests != 0)
9676 dtmf_confirmation (Id, plci);
9680 static word dtmf_save_config (dword Id, PLCI *plci, byte Rc)
9684 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
9690 static word dtmf_restore_config (dword Id, PLCI *plci, byte Rc)
9695 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
9698 if (plci->B1_facilities & B1_FACILITY_DTMFR)
9700 switch (plci->adjust_b_state)
9703 plci->internal_command = plci->adjust_b_command;
9704 if (plci_nl_busy (plci))
9706 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
9709 dtmf_enable_receiver (plci, plci->dtmf_rec_active);
9710 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_2;
9727 static void dtmf_command (dword Id, PLCI *plci, byte Rc)
9734 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
9735 plci->dtmf_cmd, plci->dtmf_rec_pulse_ms, plci->dtmf_rec_pause_ms,
9736 plci->dtmf_send_pulse_ms, plci->dtmf_send_pause_ms));
9741 internal_command = plci->internal_command;
9742 plci->internal_command = 0;
9744 switch (plci->dtmf_cmd)
9756 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
9759 if (adjust_b_process (Id, plci, Rc) != GOOD)
9766 if (plci->internal_command)
9769 if (plci_nl_busy (plci))
9771 plci->internal_command = DTMF_COMMAND_2;
9774 plci->internal_command = DTMF_COMMAND_3;
9775 dtmf_enable_receiver (plci, (byte)(plci->dtmf_rec_active | mask));
9786 plci->tone_last_indication_code = DTMF_SIGNAL_NO_TONE;
9788 plci->dtmf_rec_active |= mask;
9803 plci->dtmf_rec_active &= ~mask;
9804 if (plci->dtmf_rec_active)
9808 if (plci->dtmf_rec_active)
9810 if (plci_nl_busy (plci))
9812 plci->internal_command = DTMF_COMMAND_1;
9815 plci->dtmf_rec_active &= ~mask;
9816 plci->internal_command = DTMF_COMMAND_2;
9817 dtmf_enable_receiver (plci, false);
9830 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
9833 if (adjust_b_process (Id, plci, Rc) != GOOD)
9840 if (plci->internal_command)
9856 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
9857 ((plci->dtmf_parameter_length != 0) ? B1_FACILITY_DTMFX | B1_FACILITY_DTMFR : B1_FACILITY_DTMFX)),
9860 if (adjust_b_process (Id, plci, Rc) != GOOD)
9867 if (plci->internal_command)
9870 if (plci_nl_busy (plci))
9872 plci->internal_command = DTMF_COMMAND_2;
9875 plci->dtmf_msg_number_queue[(plci->dtmf_send_requests)++] = plci->number;
9876 plci->internal_command = DTMF_COMMAND_3;
9877 dtmf_send_digits (plci, &plci->saved_msg.parms[3].info[1], plci->saved_msg.parms[3].length);
9884 if (plci->dtmf_send_requests != 0)
9885 (plci->dtmf_send_requests)--;
9893 sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
9898 static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg)
9960 else if (plci == NULL)
9968 if (!plci->State
9969 || !plci->NL.Id || plci->nl_remove_id)
9977 plci->command = 0;
9978 plci->dtmf_cmd = GET_WORD (dtmf_parms[0].info);
9980 switch (plci->dtmf_cmd)
9989 if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id-1])
10012 plci->dtmf_rec_pulse_ms = 0;
10013 plci->dtmf_rec_pause_ms = 0;
10017 plci->dtmf_rec_pulse_ms = GET_WORD (dtmf_parms[1].info);
10018 plci->dtmf_rec_pause_ms = GET_WORD (dtmf_parms[2].info);
10021 start_internal_command (Id, plci, dtmf_command);
10029 if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id-1])
10048 plci->dtmf_send_pulse_ms = GET_WORD (dtmf_parms[1].info);
10049 plci->dtmf_send_pause_ms = GET_WORD (dtmf_parms[2].info);
10071 if (plci->dtmf_send_requests >= ARRAY_SIZE(plci->dtmf_msg_number_queue))
10078 api_save_msg (dtmf_parms, "wwws", &plci->saved_msg);
10079 start_internal_command (Id, plci, dtmf_command);
10084 UnMapId (Id), (char *)(FILE_), __LINE__, plci->dtmf_cmd));
10095 static void dtmf_confirmation (dword Id, PLCI *plci)
10107 if (plci->dtmf_send_requests != 0)
10109 sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->dtmf_msg_number_queue[0],
10111 (plci->dtmf_send_requests)--;
10112 for (i = 0; i < plci->dtmf_send_requests; i++)
10113 plci->dtmf_msg_number_queue[i] = plci->dtmf_msg_number_queue[i+1];
10118 static void dtmf_indication (dword Id, PLCI *plci, byte *msg, word length)
10131 || ((dtmf_digit_map[j].listen_mask & plci->dtmf_rec_active) == 0)))
10139 && (plci->tone_last_indication_code == DTMF_SIGNAL_NO_TONE)
10151 plci->tone_last_indication_code = dtmf_digit_map[j].character;
10159 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "wS", SELECTOR_DTMF, msg);
10168 static void dtmf_parameter_write (PLCI *plci)
10174 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10177 parameter_buffer[0] = plci->dtmf_parameter_length + 1;
10179 for (i = 0; i < plci->dtmf_parameter_length; i++)
10180 parameter_buffer[2+i] = plci->dtmf_parameter_buffer[i];
10181 add_p (plci, FTY, parameter_buffer);
10182 sig_req (plci, TEL_CTRL, 0);
10183 send_req (plci);
10187 static void dtmf_parameter_clear_config (PLCI *plci)
10191 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10194 plci->dtmf_parameter_length = 0;
10198 static void dtmf_parameter_prepare_switch (dword Id, PLCI *plci)
10207 static word dtmf_parameter_save_config (dword Id, PLCI *plci, byte Rc)
10211 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
10217 static word dtmf_parameter_restore_config (dword Id, PLCI *plci, byte Rc)
10222 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
10225 if ((plci->B1_facilities & B1_FACILITY_DTMFR)
10226 && (plci->dtmf_parameter_length != 0))
10228 switch (plci->adjust_b_state)
10231 plci->internal_command = plci->adjust_b_command;
10232 if (plci->sig_req)
10234 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
10237 dtmf_parameter_write (plci);
10238 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_2;
10373 static void mixer_set_bchannel_id_esc (PLCI *plci, byte bchannel_id)
10379 a = plci->adapter;
10380 old_id = plci->li_bchannel_id;
10383 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10384 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10385 plci->li_bchannel_id = (bchannel_id & 0x1f) + 1;
10386 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10387 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10393 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10394 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10395 plci->li_bchannel_id = bchannel_id & 0x03;
10396 if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
10399 if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
10402 && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
10404 li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
10406 splci->li_bchannel_id = 3 - plci->li_bchannel_id;
10407 li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
10413 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10414 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10417 if ((old_id == 0) && (plci->li_bchannel_id != 0)
10418 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
10420 mixer_clear_config (plci);
10423 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10424 (char *)(FILE_), __LINE__, bchannel_id, plci->li_bchannel_id));
10428 static void mixer_set_bchannel_id (PLCI *plci, byte *chi)
10434 a = plci->adapter;
10435 old_id = plci->li_bchannel_id;
10441 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10442 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10443 plci->li_bchannel_id = (ch & 0x1f) + 1;
10444 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10445 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10451 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10452 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10453 plci->li_bchannel_id = ch & 0x1f;
10454 if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
10457 if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
10460 && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
10462 li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
10464 splci->li_bchannel_id = 3 - plci->li_bchannel_id;
10465 li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
10471 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10472 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10476 if ((old_id == 0) && (plci->li_bchannel_id != 0)
10477 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
10479 mixer_clear_config (plci);
10482 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10483 (char *)(FILE_), __LINE__, ch, plci->li_bchannel_id));
10850 static void xconnect_query_addresses (PLCI *plci)
10857 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10860 a = plci->adapter;
10861 if (a->li_pri && ((plci->li_bchannel_id == 0)
10862 || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci)))
10865 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10869 p = plci->internal_req_buffer;
10870 ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
10878 plci->NData[0].P = plci->internal_req_buffer;
10879 plci->NData[0].PLength = p - plci->internal_req_buffer;
10880 plci->NL.X = plci->NData;
10881 plci->NL.ReqCh = 0;
10882 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
10883 plci->adapter->request (&plci->NL);
10887 static void xconnect_write_coefs (PLCI *plci, word internal_command)
10891 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10894 plci->li_write_command = internal_command;
10895 plci->li_write_channel = 0;
10899 static byte xconnect_write_coefs_process (dword Id, PLCI *plci, byte Rc)
10909 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->li_write_channel));
10911 a = plci->adapter;
10912 if ((plci->li_bchannel_id == 0)
10913 || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
10919 i = a->li_base + (plci->li_bchannel_id - 1);
10920 j = plci->li_write_channel;
10921 p = plci->internal_req_buffer;
10968 plci->internal_command = plci->li_write_command;
10969 if (plci_nl_busy (plci))
10971 to_ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
11020 && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
11045 && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
11049 plci->internal_command = plci->li_write_command;
11050 if (plci_nl_busy (plci))
11067 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
11080 if (plci->li_bchannel_id == 2)
11111 w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
11126 plci->internal_command = plci->li_write_command;
11127 if (plci_nl_busy (plci))
11143 *(p++) = (byte)((plci->li_bchannel_id - 1) | mixer_write_prog_pri[n].line_flags);
11155 *(p++) = (byte)((plci->li_bchannel_id - 1) | MIXER_COEF_LINE_ROW_FLAG | mixer_write_prog_pri[n].line_flags);
11173 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
11186 if (plci->li_bchannel_id == 2)
11212 w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
11223 plci->li_write_channel = j;
11224 if (p != plci->internal_req_buffer)
11226 plci->NData[0].P = plci->internal_req_buffer;
11227 plci->NData[0].PLength = p - plci->internal_req_buffer;
11228 plci->NL.X = plci->NData;
11229 plci->NL.ReqCh = 0;
11230 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
11231 plci->adapter->request (&plci->NL);
11237 static void mixer_notify_update (PLCI *plci, byte others)
11245 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
11248 a = plci->adapter;
11252 plci->li_notify_update = true;
11259 while ((i < li_total_channels) && (li_config_table[i].plci == NULL))
11262 notify_plci = li_config_table[i++].plci;
11266 if ((plci->li_bchannel_id != 0)
11267 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11269 notify_plci = plci;
11284 ((CAPI_MSG *) msg)->header.plci = notify_plci->Id;
11296 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
11305 plci->li_notify_update = false;
11310 static void mixer_clear_config (PLCI *plci)
11316 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
11319 plci->li_notify_update = false;
11320 plci->li_plci_b_write_pos = 0;
11321 plci->li_plci_b_read_pos = 0;
11322 plci->li_plci_b_req_pos = 0;
11323 a = plci->adapter;
11324 if ((plci->li_bchannel_id != 0)
11325 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11327 i = a->li_base + (plci->li_bchannel_id - 1);
11341 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
11343 i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
11356 i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
11374 static void mixer_prepare_switch (dword Id, PLCI *plci)
11382 mixer_indication_coefs_set (Id, plci);
11383 } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
11387 static word mixer_save_config (dword Id, PLCI *plci, byte Rc)
11393 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
11395 a = plci->adapter;
11396 if ((plci->li_bchannel_id != 0)
11397 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11399 i = a->li_base + (plci->li_bchannel_id - 1);
11412 static word mixer_restore_config (dword Id, PLCI *plci, byte Rc)
11418 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
11421 a = plci->adapter;
11422 if ((plci->B1_facilities & B1_FACILITY_MIXER)
11423 && (plci->li_bchannel_id != 0)
11424 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11426 switch (plci->adjust_b_state)
11431 plci->internal_command = plci->adjust_b_command;
11432 if (plci_nl_busy (plci))
11434 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
11437 xconnect_query_addresses (plci);
11438 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_2;
11441 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
11455 if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
11456 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_3;
11457 else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)
11458 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
11462 if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
11463 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_4;
11464 else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
11465 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
11467 if (plci->adjust_b_state != ADJUST_B_RESTORE_MIXER_5)
11469 plci->internal_command = plci->adjust_b_command;
11473 xconnect_write_coefs (plci, plci->adjust_b_command);
11474 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_6;
11477 if (!xconnect_write_coefs_process (Id, plci, Rc))
11484 if (plci->internal_command)
11486 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_7;
11495 static void mixer_command (dword Id, PLCI *plci, byte Rc)
11501 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
11502 plci->li_cmd));
11505 a = plci->adapter;
11506 internal_command = plci->internal_command;
11507 plci->internal_command = 0;
11508 switch (plci->li_cmd)
11516 if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11518 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
11522 if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11524 if (adjust_b_process (Id, plci, Rc) != GOOD)
11531 if (plci->internal_command)
11534 plci->li_plci_b_req_pos = plci->li_plci_b_write_pos;
11535 if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11536 || ((get_b1_facilities (plci, plci->B1_resource) & B1_FACILITY_MIXER)
11537 && (add_b1_facilities (plci, plci->B1_resource, (word)(plci->B1_facilities &
11538 ~B1_FACILITY_MIXER)) == plci->B1_resource)))
11540 xconnect_write_coefs (plci, MIXER_COMMAND_2);
11546 mixer_indication_coefs_set (Id, plci);
11547 } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
11550 if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11551 || ((get_b1_facilities (plci, plci->B1_resource) & B1_FACILITY_MIXER)
11552 && (add_b1_facilities (plci, plci->B1_resource, (word)(plci->B1_facilities &
11553 ~B1_FACILITY_MIXER)) == plci->B1_resource)))
11555 if (!xconnect_write_coefs_process (Id, plci, Rc))
11559 if (plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
11563 plci->li_plci_b_write_pos = (plci->li_plci_b_write_pos == 0) ?
11564 LI_PLCI_B_QUEUE_ENTRIES-1 : plci->li_plci_b_write_pos - 1;
11565 i = (plci->li_plci_b_write_pos == 0) ?
11566 LI_PLCI_B_QUEUE_ENTRIES-1 : plci->li_plci_b_write_pos - 1;
11567 } while ((plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
11568 && !(plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG));
11573 if (plci->internal_command)
11576 if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
11578 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
11582 if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
11584 if (adjust_b_process (Id, plci, Rc) != GOOD)
11591 if (plci->internal_command)
11598 if ((plci->li_bchannel_id == 0)
11599 || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
11602 UnMapId (Id), (char *)(FILE_), __LINE__, (int)(plci->li_bchannel_id)));
11606 i = a->li_base + (plci->li_bchannel_id - 1);
11607 li_config_table[i].curchnl = plci->li_channel_bits;
11608 if (!a->li_pri && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
11610 i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
11611 li_config_table[i].curchnl = plci->li_channel_bits;
11614 i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
11615 li_config_table[i].curchnl = plci->li_channel_bits;
11622 static void li_update_connect (dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
11630 plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
11631 ch_a = a->li_base + (plci->li_bchannel_id - 1);
11632 if (!a->li_pri && (plci->tel == ADV_VOICE)
11633 && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
11637 a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
11765 static void li2_update_connect (dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
11773 plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
11774 ch_a = a->li_base + (plci->li_bchannel_id - 1);
11775 if (!a->li_pri && (plci->tel == ADV_VOICE)
11776 && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
11780 a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
11873 static word li_check_main_plci (dword Id, PLCI *plci)
11875 if (plci == NULL)
11881 if (!plci->State
11882 || !plci->NL.Id || plci->nl_remove_id
11883 || (plci->li_bchannel_id == 0))
11889 li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = plci;
11894 static PLCI *li_check_plci_b (dword Id, PLCI *plci,
11900 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
11901 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
11924 plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
11934 li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci = plci_b;
11936 ((byte)(UnMapController (plci->adapter->Id) & ~EXT_CONTROLLER))
11937 && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
11957 static PLCI *li2_check_plci_b (dword Id, PLCI *plci,
11963 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
11964 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
11987 plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
11991 || (li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci != plci_b))
11999 ((byte)(UnMapController (plci->adapter->Id) & ~EXT_CONTROLLER))
12000 && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
12020 static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg)
12146 Info = li_check_main_plci (Id, plci);
12153 result = plci->saved_msg.info;
12156 plci_b_write_pos = plci->li_plci_b_write_pos;
12157 plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
12160 li_update_connect (Id, a, plci, plci_b_id, true, li_flags);
12161 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_LAST_FLAG;
12163 plci->li_plci_b_write_pos = plci_b_write_pos;
12176 Info = li_check_main_plci (Id, plci);
12183 result = plci->saved_msg.info;
12186 plci_b_write_pos = plci->li_plci_b_write_pos;
12189 li2_update_connect (Id, a, plci, UnMapId (Id), true, li_flags);
12222 plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
12225 li2_update_connect (Id, a, plci, plci_b_id, true, li_flags);
12226 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id |
12238 if ((plci_b_write_pos == plci->li_plci_b_read_pos)
12239 || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
12241 plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
12245 plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
12246 plci->li_plci_b_write_pos = plci_b_write_pos;
12249 plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
12250 mixer_notify_update (plci, true);
12253 plci->command = 0;
12254 plci->li_cmd = GET_WORD (li_parms[0].info);
12255 start_internal_command (Id, plci, mixer_command);
12270 Info = li_check_main_plci (Id, plci);
12277 result = plci->saved_msg.info;
12280 plci_b_write_pos = plci->li_plci_b_write_pos;
12281 plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
12284 li_update_connect (Id, a, plci, plci_b_id, false, 0);
12285 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG | LI_PLCI_B_LAST_FLAG;
12287 plci->li_plci_b_write_pos = plci_b_write_pos;
12299 Info = li_check_main_plci (Id, plci);
12306 result = plci->saved_msg.info;
12309 plci_b_write_pos = plci->li_plci_b_write_pos;
12343 plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
12346 li2_update_connect (Id, a, plci, plci_b_id, false, 0);
12347 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
12357 if ((plci_b_write_pos == plci->li_plci_b_read_pos)
12358 || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
12360 plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
12364 plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
12365 plci->li_plci_b_write_pos = plci_b_write_pos;
12368 plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
12369 mixer_notify_update (plci, true);
12372 plci->command = 0;
12373 plci->li_cmd = GET_WORD (li_parms[0].info);
12374 start_internal_command (Id, plci, mixer_command);
12378 if (!plci || !plci->State
12379 || !plci->NL.Id || plci->nl_remove_id
12380 || (plci->li_bchannel_id == 0)
12381 || (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci != plci))
12387 plci_b_write_pos = plci->li_plci_b_write_pos;
12388 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
12389 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
12396 if ((plci_b_write_pos == plci->li_plci_b_read_pos)
12397 || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
12399 plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
12403 plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
12404 plci->li_plci_b_write_pos = plci_b_write_pos;
12405 plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
12406 plci->command = 0;
12407 plci->li_cmd = GET_WORD (li_parms[0].info);
12408 start_internal_command (Id, plci, mixer_command);
12423 static void mixer_indication_coefs_set (dword Id, PLCI *plci)
12432 a = plci->adapter;
12433 if (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos)
12437 d = plci->li_plci_b_queue[plci->li_plci_b_read_pos];
12440 if (plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
12475 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0,
12478 plci->li_plci_b_read_pos = (plci->li_plci_b_read_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ?
12479 0 : plci->li_plci_b_read_pos + 1;
12480 } while (!(d & LI_PLCI_B_LAST_FLAG) && (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos));
12485 static void mixer_indication_xconnect_from (dword Id, PLCI *plci, byte *msg, word length)
12494 a = plci->adapter;
12503 if (!a->li_pri && (plci->li_bchannel_id == 2))
12515 if (plci->internal_command_queue[0]
12516 && ((plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
12517 || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
12518 || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)))
12520 (*(plci->internal_command_queue[0]))(Id, plci, 0);
12521 if (!plci->internal_command)
12522 next_internal_command (Id, plci);
12524 mixer_notify_update (plci, true);
12528 static void mixer_indication_xconnect_to (dword Id, PLCI *plci, byte *msg, word length)
12537 static byte mixer_notify_source_removed (PLCI *plci, dword plci_b_id)
12541 plci_b_write_pos = plci->li_plci_b_write_pos;
12542 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
12543 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 1)
12546 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12550 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
12552 plci->li_plci_b_write_pos = plci_b_write_pos;
12557 static void mixer_remove (PLCI *plci)
12565 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12568 a = plci->adapter;
12569 plci_b_id = (plci->Id << 8) | UnMapController (plci->adapter->Id);
12572 if ((plci->li_bchannel_id != 0)
12573 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
12575 i = a->li_base + (plci->li_bchannel_id - 1);
12583 notify_plci = li_config_table[j].plci;
12585 && (notify_plci != plci)
12595 mixer_clear_config (plci);
12597 mixer_notify_update (plci, true);
12599 li_config_table[i].plci = NULL;
12600 plci->li_bchannel_id = 0;
12611 static void ec_write_parameters (PLCI *plci)
12617 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12622 PUT_WORD (&parameter_buffer[2], plci->ec_idi_options);
12623 plci->ec_idi_options &= ~LEC_RESET_COEFFICIENTS;
12624 w = (plci->ec_tail_length == 0) ? 128 : plci->ec_tail_length;
12626 add_p (plci, FTY, parameter_buffer);
12627 sig_req (plci, TEL_CTRL, 0);
12628 send_req (plci);
12632 static void ec_clear_config (PLCI *plci)
12636 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12639 plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
12641 plci->ec_tail_length = 0;
12645 static void ec_prepare_switch (dword Id, PLCI *plci)
12654 static word ec_save_config (dword Id, PLCI *plci, byte Rc)
12658 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
12664 static word ec_restore_config (dword Id, PLCI *plci, byte Rc)
12669 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
12672 if (plci->B1_facilities & B1_FACILITY_EC)
12674 switch (plci->adjust_b_state)
12677 plci->internal_command = plci->adjust_b_command;
12678 if (plci->sig_req)
12680 plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
12683 ec_write_parameters (plci);
12684 plci->adjust_b_state = ADJUST_B_RESTORE_EC_2;
12701 static void ec_command (dword Id, PLCI *plci, byte Rc)
12707 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
12708 plci->ec_cmd, plci->ec_idi_options, plci->ec_tail_length));
12711 if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
12719 PUT_WORD (&result[1], plci->ec_cmd);
12723 internal_command = plci->internal_command;
12724 plci->internal_command = 0;
12725 switch (plci->ec_cmd)
12734 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
12737 if (adjust_b_process (Id, plci, Rc) != GOOD)
12744 if (plci->internal_command)
12747 if (plci->sig_req)
12749 plci->internal_command = EC_COMMAND_2;
12752 plci->internal_command = EC_COMMAND_3;
12753 ec_write_parameters (plci);
12772 if (plci->B1_facilities & B1_FACILITY_EC)
12774 if (plci->sig_req)
12776 plci->internal_command = EC_COMMAND_1;
12779 plci->internal_command = EC_COMMAND_2;
12780 ec_write_parameters (plci);
12792 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
12795 if (adjust_b_process (Id, plci, Rc) != GOOD)
12802 if (plci->internal_command)
12808 sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
12809 "wws", Info, (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
12814 static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg)
12844 if (plci == NULL)
12850 else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
12858 plci->command = 0;
12859 plci->ec_cmd = GET_WORD (ec_parms[0].info);
12860 plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
12866 plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
12869 plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
12871 plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
12873 plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
12876 plci->ec_tail_length = GET_WORD (&ec_parms[0].info[4]);
12879 switch (plci->ec_cmd)
12882 plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
12883 start_internal_command (Id, plci, ec_command);
12887 plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
12890 start_internal_command (Id, plci, ec_command);
12894 plci->ec_idi_options |= LEC_FREEZE_COEFFICIENTS;
12895 start_internal_command (Id, plci, ec_command);
12899 plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
12900 start_internal_command (Id, plci, ec_command);
12904 plci->ec_idi_options |= LEC_RESET_COEFFICIENTS;
12905 start_internal_command (Id, plci, ec_command);
12910 UnMapId (Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
12936 else if (plci == NULL)
12942 else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
12950 plci->command = 0;
12951 plci->ec_cmd = GET_WORD (ec_parms[0].info);
12952 plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
12954 PUT_WORD (&result[1], plci->ec_cmd);
12957 plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
12959 plci->ec_tail_length = 0;
12964 plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
12966 plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
12968 plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
12971 plci->ec_tail_length = GET_WORD (&ec_parms[1].info[3]);
12974 switch (plci->ec_cmd)
12977 plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
12978 start_internal_command (Id, plci, ec_command);
12982 plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
12985 start_internal_command (Id, plci, ec_command);
12990 UnMapId (Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
13004 static void ec_indication (dword Id, PLCI *plci, byte *msg, word length)
13011 if (!(plci->ec_idi_options & LEC_MANUAL_DISABLE))
13013 if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
13049 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
13060 static void adv_voice_write_coefs (PLCI *plci, word write_command)
13072 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13075 a = plci->adapter;
13092 if (!a->li_pri && (plci->li_bchannel_id == 0))
13094 if ((li_config_table[a->li_base].plci == NULL) && (li_config_table[a->li_base + 1].plci != NULL))
13096 plci->li_bchannel_id = 1;
13097 li_config_table[a->li_base].plci = plci;
13099 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13100 (char *)(FILE_), __LINE__, plci->li_bchannel_id));
13102 else if ((li_config_table[a->li_base].plci != NULL) && (li_config_table[a->li_base + 1].plci == NULL))
13104 plci->li_bchannel_id = 2;
13105 li_config_table[a->li_base + 1].plci = plci;
13107 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13108 (char *)(FILE_), __LINE__, plci->li_bchannel_id));
13111 if (!a->li_pri && (plci->li_bchannel_id != 0)
13112 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
13114 i = a->li_base + (plci->li_bchannel_id - 1);
13118 j = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
13119 k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
13120 if (!(plci->B1_facilities & B1_FACILITY_MIXER))
13145 k = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
13153 k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
13163 if (plci->B1_facilities & B1_FACILITY_MIXER)
13176 ch_map[j] = (byte)(j + (plci->li_bchannel_id - 1));
13177 ch_map[j+1] = (byte)(j + (2 - plci->li_bchannel_id));
13209 add_p (plci, FTY, coef_buffer);
13210 sig_req (plci, TEL_CTRL, 0);
13211 send_req (plci);
13215 static void adv_voice_clear_config (PLCI *plci)
13223 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13226 a = plci->adapter;
13227 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
13231 if (!a->li_pri && (plci->li_bchannel_id != 0)
13232 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
13234 i = a->li_base + (plci->li_bchannel_id - 1);
13246 i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
13259 i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
13277 static void adv_voice_prepare_switch (dword Id, PLCI *plci)
13286 static word adv_voice_save_config (dword Id, PLCI *plci, byte Rc)
13290 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
13296 static word adv_voice_restore_config (dword Id, PLCI *plci, byte Rc)
13302 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
13305 a = plci->adapter;
13306 if ((plci->B1_facilities & B1_FACILITY_VOICE)
13307 && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
13309 switch (plci->adjust_b_state)
13312 plci->internal_command = plci->adjust_b_command;
13313 if (plci->sig_req)
13315 plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
13318 adv_voice_write_coefs (plci, ADV_VOICE_WRITE_UPDATE);
13319 plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_2;
13386 static word get_b1_facilities (PLCI * plci, byte b1_resource)
13394 if (!(((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
13395 || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id-1] & (1L << PRIVATE_DTMF_TONE)))))
13398 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND)
13400 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)
13406 if (plci->adapter->manufacturer_features & (MANUFACTURER_FEATURE_V18 | MANUFACTURER_FEATURE_VOWN))
13411 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13418 static byte add_b1_facilities (PLCI * plci, byte b1_resource, word b1_facilities)
13463 && (((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
13464 || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id-1] & (1L << PRIVATE_DTMF_TONE)))))
13474 else if (((plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
13475 && !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
13478 || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)))
13481 || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND))))
13516 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13518 b1_resource, b1_facilities, b, get_b1_facilities (plci, b)));
13523 static void adjust_b1_facilities (PLCI *plci, byte new_b1_resource, word new_b1_facilities)
13528 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13530 new_b1_facilities & get_b1_facilities (plci, new_b1_resource)));
13532 new_b1_facilities &= get_b1_facilities (plci, new_b1_resource);
13533 removed_facilities = plci->B1_facilities & ~new_b1_facilities;
13536 ec_clear_config (plci);
13541 dtmf_rec_clear_config (plci);
13542 dtmf_parameter_clear_config (plci);
13545 dtmf_send_clear_config (plci);
13549 mixer_clear_config (plci);
13552 adv_voice_clear_config (plci);
13553 plci->B1_facilities = new_b1_facilities;
13557 static void adjust_b_clear (PLCI *plci)
13561 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13564 plci->adjust_b_restore = false;
13568 static word adjust_b_process (dword Id, PLCI *plci, byte Rc)
13576 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
13579 switch (plci->adjust_b_state)
13582 if ((plci->adjust_b_parms_msg == NULL)
13583 && (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
13584 && ((plci->adjust_b_mode & ~(ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 |
13587 b1_resource = (plci->adjust_b_mode == ADJUST_B_MODE_NO_RESOURCE) ?
13588 0 : add_b1_facilities (plci, plci->B1_resource, plci->adjust_b_facilities);
13589 if (b1_resource == plci->B1_resource)
13591 adjust_b1_facilities (plci, b1_resource, plci->adjust_b_facilities);
13594 if (plci->adjust_b_facilities & ~get_b1_facilities (plci, b1_resource))
13598 plci->B1_resource, b1_resource, plci->adjust_b_facilities));
13603 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13606 mixer_prepare_switch (Id, plci);
13609 dtmf_prepare_switch (Id, plci);
13610 dtmf_parameter_prepare_switch (Id, plci);
13613 ec_prepare_switch (Id, plci);
13615 adv_voice_prepare_switch (Id, plci);
13617 plci->adjust_b_state = ADJUST_B_SAVE_MIXER_1;
13620 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13623 Info = mixer_save_config (Id, plci, Rc);
13624 if ((Info != GOOD) || plci->internal_command)
13628 plci->adjust_b_state = ADJUST_B_SAVE_DTMF_1;
13631 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13634 Info = dtmf_save_config (Id, plci, Rc);
13635 if ((Info != GOOD) || plci->internal_command)
13639 plci->adjust_b_state = ADJUST_B_REMOVE_L23_1;
13641 if ((plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
13642 && plci->NL.Id && !plci->nl_remove_id)
13644 plci->internal_command = plci->adjust_b_command;
13645 if (plci->adjust_b_ncci != 0)
13647 ncci_ptr = &(plci->adapter->ncci[plci->adjust_b_ncci]);
13650 plci->data_sent_ptr = ncci_ptr->DBuffer[ncci_ptr->data_out].P;
13651 data_rc (plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
13654 data_ack (plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
13656 nl_req_ncci (plci, REMOVE,
13657 (byte)((plci->adjust_b_mode & ADJUST_B_MODE_CONNECT) ? plci->adjust_b_ncci : 0));
13658 send_req (plci);
13659 plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
13662 plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
13672 if (plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
13674 if (plci_nl_busy (plci))
13676 plci->internal_command = plci->adjust_b_command;
13680 plci->adjust_b_state = ADJUST_B_SAVE_EC_1;
13683 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13686 Info = ec_save_config (Id, plci, Rc);
13687 if ((Info != GOOD) || plci->internal_command)
13691 plci->adjust_b_state = ADJUST_B_SAVE_DTMF_PARAMETER_1;
13694 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13697 Info = dtmf_parameter_save_config (Id, plci, Rc);
13698 if ((Info != GOOD) || plci->internal_command)
13702 plci->adjust_b_state = ADJUST_B_SAVE_VOICE_1;
13705 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13707 Info = adv_voice_save_config (Id, plci, Rc);
13708 if ((Info != GOOD) || plci->internal_command)
13711 plci->adjust_b_state = ADJUST_B_SWITCH_L1_1;
13713 if (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
13715 if (plci->sig_req)
13717 plci->internal_command = plci->adjust_b_command;
13720 if (plci->adjust_b_parms_msg != NULL)
13721 api_load_msg (plci->adjust_b_parms_msg, bp);
13723 api_load_msg (&plci->B_protocol, bp);
13724 Info = add_b1 (plci, bp,
13725 (word)((plci->adjust_b_mode & ADJUST_B_MODE_NO_RESOURCE) ? 2 : 0),
13726 plci->adjust_b_facilities);
13731 plci->B1_resource, plci->adjust_b_facilities));
13734 plci->internal_command = plci->adjust_b_command;
13735 sig_req (plci, RESOURCES, 0);
13736 send_req (plci);
13737 plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
13740 plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
13747 Rc, plci->B1_resource, plci->adjust_b_facilities));
13751 plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
13755 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13757 Info = adv_voice_restore_config (Id, plci, Rc);
13758 if ((Info != GOOD) || plci->internal_command)
13761 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
13765 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13768 Info = dtmf_parameter_restore_config (Id, plci, Rc);
13769 if ((Info != GOOD) || plci->internal_command)
13773 plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
13777 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13780 Info = ec_restore_config (Id, plci, Rc);
13781 if ((Info != GOOD) || plci->internal_command)
13785 plci->adjust_b_state = ADJUST_B_ASSIGN_L23_1;
13787 if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
13789 if (plci_nl_busy (plci))
13791 plci->internal_command = plci->adjust_b_command;
13794 if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
13795 plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
13796 if (plci->adjust_b_parms_msg != NULL)
13797 api_load_msg (plci->adjust_b_parms_msg, bp);
13799 api_load_msg (&plci->B_protocol, bp);
13800 Info = add_b23 (plci, bp);
13807 plci->internal_command = plci->adjust_b_command;
13808 nl_req_ncci (plci, ASSIGN, 0);
13809 send_req (plci);
13810 plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
13813 plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
13823 if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
13827 plci->internal_command = plci->adjust_b_command;
13831 if (plci->adjust_b_mode & ADJUST_B_MODE_USER_CONNECT)
13833 plci->adjust_b_restore = true;
13836 plci->adjust_b_state = ADJUST_B_CONNECT_1;
13838 if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
13840 plci->internal_command = plci->adjust_b_command;
13841 if (plci_nl_busy (plci))
13843 nl_req_ncci (plci, N_CONNECT, 0);
13844 send_req (plci);
13845 plci->adjust_b_state = ADJUST_B_CONNECT_2;
13848 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
13862 if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
13864 get_ncci (plci, (byte)(Id >> 16), plci->adjust_b_ncci);
13865 Id = (Id & 0xffff) | (((dword)(plci->adjust_b_ncci)) << 16);
13867 if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
13868 plci->adjust_b_state = ADJUST_B_CONNECT_3;
13869 else if (plci->adjust_b_state == ADJUST_B_CONNECT_4)
13870 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
13874 if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
13875 plci->adjust_b_state = ADJUST_B_CONNECT_4;
13876 else if (plci->adjust_b_state == ADJUST_B_CONNECT_3)
13877 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
13879 if (plci->adjust_b_state != ADJUST_B_RESTORE_DTMF_1)
13881 plci->internal_command = plci->adjust_b_command;
13887 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13890 Info = dtmf_restore_config (Id, plci, Rc);
13891 if ((Info != GOOD) || plci->internal_command)
13895 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
13904 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13907 Info = mixer_restore_config (Id, plci, Rc);
13908 if ((Info != GOOD) || plci->internal_command)
13912 plci->adjust_b_state = ADJUST_B_END;
13920 static void adjust_b1_resource (dword Id, PLCI *plci, API_SAVE *bp_msg, word b1_facilities, word internal_command)
13925 plci->B1_resource, b1_facilities));
13927 plci->adjust_b_parms_msg = bp_msg;
13928 plci->adjust_b_facilities = b1_facilities;
13929 plci->adjust_b_command = internal_command;
13930 plci->adjust_b_ncci = (word)(Id >> 16);
13931 if ((bp_msg == NULL) && (plci->B1_resource == 0))
13932 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_SWITCH_L1;
13934 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 | ADJUST_B_MODE_RESTORE;
13935 plci->adjust_b_state = ADJUST_B_START;
13938 plci->B1_resource, b1_facilities));
13942 static void adjust_b_restore (dword Id, PLCI *plci, byte Rc)
13947 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
13949 internal_command = plci->internal_command;
13950 plci->internal_command = 0;
13954 plci->command = 0;
13955 if (plci->req_in != 0)
13957 plci->internal_command = ADJUST_B_RESTORE_1;
13967 plci->adjust_b_parms_msg = NULL;
13968 plci->adjust_b_facilities = plci->B1_facilities;
13969 plci->adjust_b_command = ADJUST_B_RESTORE_2;
13970 plci->adjust_b_ncci = (word)(Id >> 16);
13971 plci->adjust_b_mode = ADJUST_B_MODE_RESTORE;
13972 plci->adjust_b_state = ADJUST_B_START;
13976 if (adjust_b_process (Id, plci, Rc) != GOOD)
13981 if (plci->internal_command)
13988 static void reset_b3_command (dword Id, PLCI *plci, byte Rc)
13994 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
13997 internal_command = plci->internal_command;
13998 plci->internal_command = 0;
14002 plci->command = 0;
14003 plci->adjust_b_parms_msg = NULL;
14004 plci->adjust_b_facilities = plci->B1_facilities;
14005 plci->adjust_b_command = RESET_B3_COMMAND_1;
14006 plci->adjust_b_ncci = (word)(Id >> 16);
14007 plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_CONNECT;
14008 plci->adjust_b_state = ADJUST_B_START;
14012 Info = adjust_b_process (Id, plci, Rc);
14019 if (plci->internal_command)
14023 /* sendf (plci->appl, _RESET_B3_R | CONFIRM, Id, plci->number, "w", Info);*/
14024 sendf(plci->appl,_RESET_B3_I,Id,0,"s","");
14028 static void select_b_command (dword Id, PLCI *plci, byte Rc)
14035 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14038 internal_command = plci->internal_command;
14039 plci->internal_command = 0;
14043 plci->command = 0;
14044 plci->adjust_b_parms_msg = &plci->saved_msg;
14045 if ((plci->tel == ADV_VOICE) && (plci == plci->adapter->AdvSignalPLCI))
14046 plci->adjust_b_facilities = plci->B1_facilities | B1_FACILITY_VOICE;
14048 plci->adjust_b_facilities = plci->B1_facilities & ~B1_FACILITY_VOICE;
14049 plci->adjust_b_command = SELECT_B_COMMAND_1;
14050 plci->adjust_b_ncci = (word)(Id >> 16);
14051 if (plci->saved_msg.parms[0].length == 0)
14053 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
14058 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
14061 plci->adjust_b_state = ADJUST_B_START;
14065 Info = adjust_b_process (Id, plci, Rc);
14072 if (plci->internal_command)
14074 if (plci->tel == ADV_VOICE)
14078 esc_chi[2] = plci->b_channel;
14079 SetVoiceChannel (plci->adapter->AdvCodecPLCI, esc_chi, plci->adapter);
14083 sendf (plci->appl, _SELECT_B_REQ | CONFIRM, Id, plci->number, "w", Info);
14087 static void fax_connect_ack_command (dword Id, PLCI *plci, byte Rc)
14093 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14096 internal_command = plci->internal_command;
14097 plci->internal_command = 0;
14101 plci->command = 0;
14103 if (plci_nl_busy (plci))
14105 plci->internal_command = FAX_CONNECT_ACK_COMMAND_1;
14108 plci->internal_command = FAX_CONNECT_ACK_COMMAND_2;
14109 plci->NData[0].P = plci->fax_connect_info_buffer;
14110 plci->NData[0].PLength = plci->fax_connect_info_length;
14111 plci->NL.X = plci->NData;
14112 plci->NL.ReqCh = 0;
14113 plci->NL.Req = plci->nl_req = (byte) N_CONNECT_ACK;
14114 plci->adapter->request (&plci->NL);
14124 if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
14125 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
14127 if (plci->B3_prot == 4)
14128 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
14130 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
14131 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
14136 static void fax_edata_ack_command (dword Id, PLCI *plci, byte Rc)
14142 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14145 internal_command = plci->internal_command;
14146 plci->internal_command = 0;
14150 plci->command = 0;
14152 if (plci_nl_busy (plci))
14154 plci->internal_command = FAX_EDATA_ACK_COMMAND_1;
14157 plci->internal_command = FAX_EDATA_ACK_COMMAND_2;
14158 plci->NData[0].P = plci->fax_connect_info_buffer;
14159 plci->NData[0].PLength = plci->fax_edata_ack_length;
14160 plci->NL.X = plci->NData;
14161 plci->NL.ReqCh = 0;
14162 plci->NL.Req = plci->nl_req = (byte) N_EDATA;
14163 plci->adapter->request (&plci->NL);
14176 static void fax_connect_info_command (dword Id, PLCI *plci, byte Rc)
14182 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14185 internal_command = plci->internal_command;
14186 plci->internal_command = 0;
14190 plci->command = 0;
14192 if (plci_nl_busy (plci))
14194 plci->internal_command = FAX_CONNECT_INFO_COMMAND_1;
14197 plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
14198 plci->NData[0].P = plci->fax_connect_info_buffer;
14199 plci->NData[0].PLength = plci->fax_connect_info_length;
14200 plci->NL.X = plci->NData;
14201 plci->NL.ReqCh = 0;
14202 plci->NL.Req = plci->nl_req = (byte) N_EDATA;
14203 plci->adapter->request (&plci->NL);
14213 if (plci_nl_busy (plci))
14215 plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
14218 plci->command = _CONNECT_B3_R;
14219 nl_req_ncci (plci, N_CONNECT, 0);
14220 send_req (plci);
14223 sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
14227 static void fax_adjust_b23_command (dword Id, PLCI *plci, byte Rc)
14233 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14236 internal_command = plci->internal_command;
14237 plci->internal_command = 0;
14241 plci->command = 0;
14242 plci->adjust_b_parms_msg = NULL;
14243 plci->adjust_b_facilities = plci->B1_facilities;
14244 plci->adjust_b_command = FAX_ADJUST_B23_COMMAND_1;
14245 plci->adjust_b_ncci = (word)(Id >> 16);
14246 plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23;
14247 plci->adjust_b_state = ADJUST_B_START;
14251 Info = adjust_b_process (Id, plci, Rc);
14258 if (plci->internal_command)
14261 if (plci_nl_busy (plci))
14263 plci->internal_command = FAX_ADJUST_B23_COMMAND_2;
14266 plci->command = _CONNECT_B3_R;
14267 nl_req_ncci (plci, N_CONNECT, 0);
14268 send_req (plci);
14271 sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
14275 static void fax_disconnect_command (dword Id, PLCI *plci, byte Rc)
14280 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14282 internal_command = plci->internal_command;
14283 plci->internal_command = 0;
14287 plci->command = 0;
14288 plci->internal_command = FAX_DISCONNECT_COMMAND_1;
14304 plci->internal_command = FAX_DISCONNECT_COMMAND_2;
14310 plci->internal_command = FAX_DISCONNECT_COMMAND_3;
14318 static void rtp_connect_b3_req_command (dword Id, PLCI *plci, byte Rc)
14324 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14327 internal_command = plci->internal_command;
14328 plci->internal_command = 0;
14332 plci->command = 0;
14334 if (plci_nl_busy (plci))
14336 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_1;
14339 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
14340 nl_req_ncci (plci, N_CONNECT, 0);
14341 send_req (plci);
14351 if (plci_nl_busy (plci))
14353 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
14356 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_3;
14357 plci->NData[0].PLength = plci->internal_req_buffer[0];
14358 plci->NData[0].P = plci->internal_req_buffer + 1;
14359 plci->NL.X = plci->NData;
14360 plci->NL.ReqCh = 0;
14361 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
14362 plci->adapter->request (&plci->NL);
14367 sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
14371 static void rtp_connect_b3_res_command (dword Id, PLCI *plci, byte Rc)
14377 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14380 internal_command = plci->internal_command;
14381 plci->internal_command = 0;
14385 plci->command = 0;
14387 if (plci_nl_busy (plci))
14389 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_1;
14392 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
14393 nl_req_ncci (plci, N_CONNECT_ACK, (byte)(Id >> 16));
14394 send_req (plci);
14404 if (plci_nl_busy (plci))
14406 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
14409 sendf (plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
14410 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_3;
14411 plci->NData[0].PLength = plci->internal_req_buffer[0];
14412 plci->NData[0].P = plci->internal_req_buffer + 1;
14413 plci->NL.X = plci->NData;
14414 plci->NL.ReqCh = 0;
14415 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
14416 plci->adapter->request (&plci->NL);
14425 static void hold_save_command (dword Id, PLCI *plci, byte Rc)
14432 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14435 internal_command = plci->internal_command;
14436 plci->internal_command = 0;
14440 if (!plci->NL.Id)
14442 plci->command = 0;
14443 plci->adjust_b_parms_msg = NULL;
14444 plci->adjust_b_facilities = plci->B1_facilities;
14445 plci->adjust_b_command = HOLD_SAVE_COMMAND_1;
14446 plci->adjust_b_ncci = (word)(Id >> 16);
14447 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23;
14448 plci->adjust_b_state = ADJUST_B_START;
14452 Info = adjust_b_process (Id, plci, Rc);
14459 if (plci->internal_command)
14462 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
14466 static void retrieve_restore_command (dword Id, PLCI *plci, byte Rc)
14473 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14476 internal_command = plci->internal_command;
14477 plci->internal_command = 0;
14481 plci->command = 0;
14482 plci->adjust_b_parms_msg = NULL;
14483 plci->adjust_b_facilities = plci->B1_facilities;
14484 plci->adjust_b_command = RETRIEVE_RESTORE_COMMAND_1;
14485 plci->adjust_b_ncci = (word)(Id >> 16);
14486 plci->adjust_b_mode = ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
14487 plci->adjust_b_state = ADJUST_B_START;
14491 Info = adjust_b_process (Id, plci, Rc);
14498 if (plci->internal_command)
14501 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
14505 static void init_b1_config (PLCI *plci)
14509 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
14512 plci->B1_resource = 0;
14513 plci->B1_facilities = 0;
14515 plci->li_bchannel_id = 0;
14516 mixer_clear_config (plci);
14519 ec_clear_config (plci);
14522 dtmf_rec_clear_config (plci);
14523 dtmf_send_clear_config (plci);
14524 dtmf_parameter_clear_config (plci);
14526 adv_voice_clear_config (plci);
14527 adjust_b_clear (plci);
14531 static void clear_b1_config (PLCI *plci)
14535 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
14538 adv_voice_clear_config (plci);
14539 adjust_b_clear (plci);
14541 ec_clear_config (plci);
14544 dtmf_rec_clear_config (plci);
14545 dtmf_send_clear_config (plci);
14546 dtmf_parameter_clear_config (plci);
14549 if ((plci->li_bchannel_id != 0)
14550 && (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci == plci))
14552 mixer_clear_config (plci);
14553 li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = NULL;
14554 plci->li_bchannel_id = 0;
14557 plci->B1_resource = 0;
14558 plci->B1_facilities = 0;
14565 static void channel_flow_control_remove (PLCI * plci) {
14566 DIVA_CAPI_ADAPTER * a = plci->adapter;
14569 if (a->ch_flow_plci[i] == plci->Id) {
14576 static void channel_x_on (PLCI * plci, byte ch) {
14577 DIVA_CAPI_ADAPTER * a = plci->adapter;
14583 static void channel_x_off (PLCI * plci, byte ch, byte flag) {
14584 DIVA_CAPI_ADAPTER * a = plci->adapter;
14587 a->ch_flow_plci[ch] = plci->Id;
14592 static void channel_request_xon (PLCI * plci, byte ch) {
14593 DIVA_CAPI_ADAPTER * a = plci->adapter;
14602 static void channel_xmit_extended_xon (PLCI * plci) {
14607 if ((!plci) || (!plci->Id) || ((a = plci->adapter) == 0)) {
14614 (plci->Id == a->ch_flow_plci[i])) {
14615 channel_request_xon (plci, (byte)i);
14621 channel_xmit_xon (plci);
14628 static int find_channel_with_pending_x_on (DIVA_CAPI_ADAPTER * a, PLCI * plci) {
14632 if (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)) {
14641 (plci->Id == a->ch_flow_plci[i])) {
14649 (plci->Id == a->ch_flow_plci[i])) {
14658 static void channel_xmit_xon (PLCI * plci) {
14659 DIVA_CAPI_ADAPTER * a = plci->adapter;
14662 if (plci->nl_req || !plci->NL.Id || plci->nl_remove_id) {
14665 if ((ch = (byte)find_channel_with_pending_x_on (a, plci)) == 0) {
14671 plci->NL.Req = plci->nl_req = (byte)N_XON;
14672 plci->NL.ReqCh = ch;
14673 plci->NL.X = plci->NData;
14674 plci->NL.XNum = 1;
14675 plci->NData[0].P = &plci->RBuffer[0];
14676 plci->NData[0].PLength = 0;
14678 plci->adapter->request(&plci->NL);
14681 static int channel_can_xon (PLCI * plci, byte ch) {
14689 APPLptr = plci->appl;
14690 a = plci->adapter;
14730 static void group_optimization(DIVA_CAPI_ADAPTER * a, PLCI * plci)
14738 set_group_ind_mask (plci); /* all APPLs within this inc. call are allowed to dial in */
14771 if(a->plci[k].Id)
14773 auxplci = &a->plci[k];
14829 clear_group_ind_mask_bit (plci, j); /* disable call on other group members */
14837 clear_group_ind_mask_bit (plci, i);
14850 PLCI *plci;
14873 plci = &a->plci[j-1];
14874 plci->command = 0;
14875 add_p(plci,OAD,"\x01\xfd");
14876 add_p(plci,CAI,"\x01\x80");
14877 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
14878 add_p(plci,SHIFT|6,NULL);
14879 add_p(plci,SIN,"\x02\x00\x00");
14880 plci->internal_command = START_L1_SIG_ASSIGN_PEND;
14881 sig_req(plci,ASSIGN,DSIG_ID);
14882 add_p(plci,FTY,"\x02\xff\x07"); /* l1 start */
14883 sig_req(plci,SIG_CTRL,0);
14884 send_req(plci);
14897 static void VSwitchReqInd(PLCI *plci, dword Id, byte **parms)
14909 if(!plci ||
14910 !plci->appl ||
14911 !plci->State ||
14912 plci->Sig.Ind==NCR_FACILITY
14928 if(!plci->relatedPTYPLCI ||
14929 (plci->ptyState!=S_ECT && plci->relatedPTYPLCI->ptyState!=S_ECT))
14940 plci->vswitchstate=parms[i][9];
14946 plci->vswitchstate=parms[i][9];
14954 plci->vsprot=parms[i][10]; /* protocol */
14955 plci->vsprotdialect=parms[i][11]; /* protocoldialect */
14960 plci->relatedPTYPLCI->command = 0;
14961 plci->relatedPTYPLCI->internal_command = VSWITCH_REQ_PEND;
14962 add_p(plci->relatedPTYPLCI,ESC,&parms[i][0]);
14963 sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
14964 send_req(plci->relatedPTYPLCI);
14968 if(plci->relatedPTYPLCI &&
14969 plci->vswitchstate==3 &&
14970 plci->relatedPTYPLCI->vswitchstate==3)
14972 add_p(plci->relatedPTYPLCI,ESC,&parms[i][0]);
14973 sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
14974 send_req(plci->relatedPTYPLCI);
14985 static int diva_get_dma_descriptor (PLCI *plci, dword *dma_magic) {
15001 e.user[0] = plci->adapter->Id - 1;
15002 plci->adapter->request((ENTITY*)pReq);
15009 plci->adapter->Id,
15019 static void diva_free_dma_descriptor (PLCI *plci, int nr) {
15035 e.user[0] = plci->adapter->Id - 1;
15036 plci->adapter->request((ENTITY*)pReq);