• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/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;
568 if(plci) plci->command = 0;
576 plci,
580 channel_xmit_extended_xon (plci);
582 if(c==1) send_req(plci);
583 if(c==2 && plci) plci->req_in = plci->req_in_start = plci->req_out = 0;
584 if(plci && !plci->req_in) plci->command = 0;
691 if(adapter[i].plci[j].Sig.Id) plci_remove(&adapter[i].plci[j]);
701 if(adapter[i].plci[j].Sig.Id) return 1;
715 static void init_internal_command_queue (PLCI *plci)
722 plci->internal_command = 0;
724 plci->internal_command_queue[i] = NULL;
728 static void start_internal_command (dword Id, PLCI *plci, t_std_internal_command command_function)
735 if (plci->internal_command == 0)
737 plci->internal_command_queue[0] = command_function;
738 (* command_function)(Id, plci, OK);
743 while (plci->internal_command_queue[i] != NULL)
745 plci->internal_command_queue[i] = command_function;
750 static void next_internal_command (dword Id, PLCI *plci)
757 plci->internal_command = 0;
758 plci->internal_command_queue[0] = NULL;
759 while (plci->internal_command_queue[1] != NULL)
762 plci->internal_command_queue[i] = plci->internal_command_queue[i+1];
763 plci->internal_command_queue[MAX_INTERNAL_COMMAND_LEVELS - 1] = NULL;
764 (*(plci->internal_command_queue[0]))(Id, plci, OK);
765 if (plci->internal_command != 0)
767 plci->internal_command_queue[0] = NULL;
778 static word get_ncci (PLCI *plci, byte ch, word force_ncci)
783 a = plci->adapter;
835 a->ncci_plci[ncci] = plci->Id;
837 if (!plci->ncci_ring_list)
838 plci->ncci_ring_list = ncci;
840 a->ncci_next[ncci] = a->ncci_next[plci->ncci_ring_list];
841 a->ncci_next[plci->ncci_ring_list] = (byte) ncci;
852 static void ncci_free_receive_buffers (PLCI *plci, word ncci)
859 a = plci->adapter;
860 Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
863 if (a->ncci_plci[ncci] == plci->Id)
865 if (!plci->appl)
873 appl = plci->appl;
878 && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
890 if (a->ncci_plci[ncci] == plci->Id)
892 if (!plci->appl)
900 appl = plci->appl;
905 && (((byte)(appl->DataFlags[i] >> 8)) == plci->Id))
917 static void cleanup_ncci_data (PLCI *plci, word ncci)
921 if (ncci && (plci->adapter->ncci_plci[ncci] == plci->Id))
923 ncci_ptr = &(plci->adapter->ncci[ncci]);
924 if (plci->appl)
928 if (!plci->data_sent || (ncci_ptr->DBuffer[ncci_ptr->data_out].P != plci->data_sent_ptr))
929 TransmitBufferFree (plci->appl, ncci_ptr->DBuffer[ncci_ptr->data_out].P);
944 static void ncci_remove (PLCI *plci, word ncci, byte preserve_ncci)
950 a = plci->adapter;
951 Id = (((dword) ncci) << 16) | (((word)(plci->Id)) << 8) | a->Id;
953 ncci_free_receive_buffers (plci, ncci);
956 if (a->ncci_plci[ncci] != plci->Id)
964 cleanup_ncci_data (plci, ncci);
973 i = plci->ncci_ring_list;
974 while ((i != 0) && (a->ncci_next[i] != plci->ncci_ring_list) && (a->ncci_next[i] != ncci))
979 plci->ncci_ring_list = 0;
980 else if (plci->ncci_ring_list == ncci)
981 plci->ncci_ring_list = i;
992 if (a->ncci_plci[ncci] == plci->Id)
994 cleanup_ncci_data (plci, ncci);
1008 plci->ncci_ring_list = 0;
1017 static void plci_free_msg_in_queue (PLCI *plci)
1021 if (plci->appl)
1023 i = plci->msg_in_read_pos;
1024 while (i != plci->msg_in_write_pos)
1026 if (i == plci->msg_in_wrap_pos)
1028 if (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.command == _DATA_B3_R)
1031 TransmitBufferFree (plci->appl,
1032 (byte *)(long)(((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->info.data_b3_req.Data));
1036 i += (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[i]))->header.length +
1041 plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
1042 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
1043 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
1047 static void plci_remove(PLCI * plci)
1050 if(!plci) {
1051 dbug(1,dprintf("plci_remove(no plci)"));
1054 init_internal_command_queue (plci);
1055 dbug(1,dprintf("plci_remove(%x,tel=%x)",plci->Id,plci->tel));
1056 if(plci_remove_check(plci))
1060 if (plci->Sig.Id == 0xff)
1062 dbug(1,dprintf("D-channel X.25 plci->NL.Id:%0x", plci->NL.Id));
1063 if (plci->NL.Id && !plci->nl_remove_id)
1065 nl_req_ncci(plci,REMOVE,0);
1066 send_req(plci);
1071 if (!plci->sig_remove_id
1072 && (plci->Sig.Id
1073 || (plci->req_in!=plci->req_out)
1074 || (plci->nl_req || plci->sig_req)))
1076 sig_req(plci,HANGUP,0);
1077 send_req(plci);
1080 ncci_remove (plci, 0, false);
1081 plci_free_msg_in_queue (plci);
1083 plci->channels = 0;
1084 plci->appl = NULL;
1085 if ((plci->State == INC_CON_PENDING) || (plci->State == INC_CON_ALERT))
1086 plci->State = OUTG_DIS_PENDING;
1093 static void set_group_ind_mask (PLCI *plci)
1098 plci->group_optimization_mask_table[i] = 0xffffffffL;
1101 static void clear_group_ind_mask_bit (PLCI *plci, word b)
1103 plci->group_optimization_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
1106 static byte test_group_ind_mask_bit (PLCI *plci, word b)
1108 return ((plci->group_optimization_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
1115 static void clear_c_ind_mask (PLCI *plci)
1120 plci->c_ind_mask_table[i] = 0;
1123 static byte c_ind_mask_empty (PLCI *plci)
1128 while ((i < C_IND_MASK_DWORDS) && (plci->c_ind_mask_table[i] == 0))
1133 static void set_c_ind_mask_bit (PLCI *plci, word b)
1135 plci->c_ind_mask_table[b >> 5] |= (1L << (b & 0x1f));
1138 static void clear_c_ind_mask_bit (PLCI *plci, word b)
1140 plci->c_ind_mask_table[b >> 5] &= ~(1L << (b & 0x1f));
1143 static byte test_c_ind_mask_bit (PLCI *plci, word b)
1145 return ((plci->c_ind_mask_table[b >> 5] & (1L << (b & 0x1f))) != 0);
1148 static void dump_c_ind_mask (PLCI *plci)
1165 d = plci->c_ind_mask_table[i+j];
1196 PLCI *plci, APPL *appl, API_PARSE *parms)
1233 plci = &a->plci[i-1];
1234 plci->appl = appl;
1235 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
1239 if(AdvCodecSupport(a, plci, appl, 0) )
1241 plci->Id = 0;
1315 plci->b_channel = (byte)channel; /* not correct for ETSI ch 17..31 */
1316 add_p(plci,LLI,lli);
1317 add_p(plci,ESC,esc_chi);
1318 plci->State = LOCAL_CONNECT;
1319 if(!dir) plci->call_dir |= CALL_DIR_FORCE_OUTG_NL; /* dir 0=DTE, 1=DCE */
1328 plci->command = _CONNECT_R;
1329 plci->number = Number;
1336 if(noCh) Info = add_b1(plci,&parms[5],2,0); /* no resource */
1337 else Info = add_b1(plci,&parms[5],ch,0);
1338 add_s(plci,OAD,&parms[2]);
1339 add_s(plci,OSA,&parms[4]);
1340 add_s(plci,BC,&parms[6]);
1341 add_s(plci,LLC,&parms[7]);
1342 add_s(plci,HLC,&parms[8]);
1347 add_p(plci,LLI,"\x01\x01");
1350 add_p(plci,BC,cip_bc[GET_WORD(parms[0].info)][a->u_law]);
1351 add_p(plci,HLC,cip_hlc[GET_WORD(parms[0].info)]);
1353 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
1354 sig_req(plci,ASSIGN,DSIG_ID);
1359 plci->Sig.Id = 0xff;
1364 Info = add_b23(plci,&parms[5]);
1366 if(!(plci->tel && !plci->adv_nl))nl_req_ncci(plci,ASSIGN,0);
1374 if(plci->spoofed_msg==SPOOFING_REQUIRED)
1376 api_save_msg(parms, "wsssssssss", &plci->saved_msg);
1377 plci->spoofed_msg = CALL_REQ;
1378 plci->internal_command = BLOCK_PLCI;
1379 plci->command = 0;
1381 send_req(plci);
1384 if(ch==4)add_p(plci,CHI,p_chi);
1385 add_s(plci,CPN,&parms[1]);
1386 add_s(plci,DSA,&parms[3]);
1387 if(noCh) add_p(plci,ESC,"\x02\x18\xfd"); /* D-channel, no B-L3 */
1388 add_ai(plci,&parms[9]);
1389 if(!dir)sig_req(plci,CALL_REQ,0);
1392 plci->command = PERM_LIST_REQ;
1393 plci->appl = appl;
1394 sig_req(plci,LISTEN_REQ,0);
1395 send_req(plci);
1399 send_req(plci);
1402 plci->Id = 0;
1414 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)) {
1571 PLCI *plci, APPL *appl, API_PARSE *msg)
1578 PLCI *plci, APPL *appl, API_PARSE *msg)
1587 if(plci)
1589 if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT)
1591 clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
1592 plci->appl = appl;
1595 if(test_c_ind_mask_bit (plci, i))
1598 plci->State = OUTG_DIS_PENDING;
1600 if(plci->Sig.Id && plci->appl)
1603 if(plci->Sig.Id!=0xff)
1605 if(plci->State!=INC_DIS_PENDING)
1607 add_ai(plci, &msg[0]);
1608 sig_req(plci,HANGUP,0);
1609 plci->State = OUTG_DIS_PENDING;
1615 if (plci->NL.Id && !plci->nl_remove_id)
1617 mixer_remove (plci);
1618 nl_req_ncci(plci,REMOVE,0);
1621 plci->State = INC_DIS_PENDING;
1634 PLCI *plci, APPL *appl, API_PARSE *msg)
1637 if(plci)
1641 clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
1642 ncci_free_receive_buffers (plci, 0);
1643 if(plci_remove_check(plci))
1647 if(plci->State==INC_DIS_PENDING
1648 || plci->State==SUSPENDING) {
1649 if(c_ind_mask_empty (plci)) {
1650 if(plci->State!=SUSPENDING)plci->State = IDLE;
1651 dbug(1,dprintf("chs=%d",plci->channels));
1652 if(!plci->channels) {
1653 plci_remove(plci);
1662 PLCI *plci, APPL *appl, API_PARSE *parms)
1712 PLCI *plci, APPL *appl, API_PARSE *msg)
1735 if(!Info && plci)
1737 rc_plci = plci;
1738 if(!ai_parms[3].length && plci->State && (msg[0].length || ai_parms[1].length) )
1742 add_s(plci,CPN,&msg[0]);
1743 add_s(plci,KEY,&ai_parms[1]);
1744 sig_req(plci,INFO_REQ,0);
1745 send_req(plci);
1749 if(plci->State && ai_parms[2].length)
1753 add_s(plci,UUI,&ai_parms[2]);
1754 sig_req(plci,USER_DATA,0);
1756 else if(plci->State && ai_parms[3].length)
1760 add_s(plci,CPN,&msg[0]);
1761 add_ai(plci, &msg[1]);
1762 sig_req(plci,FACILITY_REQ,0);
1775 rc_plci = &a->plci[i-1];
1822 PLCI *plci, APPL *appl, API_PARSE *msg)
1829 PLCI *plci, APPL *appl, API_PARSE *msg)
1838 if(plci) {
1840 if(plci->State!=INC_CON_ALERT) {
1842 if(plci->State==INC_CON_PENDING) {
1844 plci->State=INC_CON_ALERT;
1845 add_ai(plci, &msg[0]);
1846 sig_req(plci,CALL_ALERT,0);
1860 PLCI *plci, APPL *appl, API_PARSE *msg)
1897 Info = AdvCodecSupport(a, plci, appl, HOOK_SUPPORT);
1914 rplci = &a->plci[i-1];
1955 rplci = &a->plci[i-1];
1975 if(plci && plci->State && plci->SuppState==IDLE)
1977 plci->SuppState = HOLD_REQUEST;
1978 plci->command = C_HOLD_REQ;
1979 add_s(plci,CAI,&ss_parms[1]);
1980 sig_req(plci,CALL_HOLD,0);
1981 send_req(plci);
1987 if(plci && plci->State && plci->SuppState==CALL_HELD)
1991 if(AdvCodecSupport(a, plci, appl, 0))
1997 else plci->tel = 0;
1999 plci->SuppState = RETRIEVE_REQUEST;
2000 plci->command = C_RETRIEVE_REQ;
2001 if(plci->spoofed_msg==SPOOFING_REQUIRED)
2003 plci->spoofed_msg = CALL_RETRIEVE;
2004 plci->internal_command = BLOCK_PLCI;
2005 plci->command = 0;
2011 sig_req(plci,CALL_RETRIEVE,0);
2012 send_req(plci);
2028 if(plci && plci->State)
2030 add_s(plci,CAI,&ss_parms[2]);
2031 plci->command = SUSPEND_REQ;
2032 sig_req(plci,SUSPEND,0);
2033 plci->State = SUSPENDING;
2034 send_req(plci);
2045 rplci = &a->plci[i-1];
2098 if(plci && plci->State && ((plci->SuppState==IDLE)||(plci->SuppState==CALL_HELD)))
2107 plci->ptyState = (byte)SSreq;
2108 plci->command = 0;
2114 plci->internal_command = CONF_BEGIN_REQ_PEND;
2118 plci->internal_command = CONF_DROP_REQ_PEND;
2122 plci->internal_command = CONF_ISOLATE_REQ_PEND;
2126 plci->internal_command = CONF_REATTACH_REQ_PEND;
2130 add_p(plci,CAI,cai);
2131 sig_req(plci,S_SERVICE,0);
2132 send_req(plci);
2170 if (!plci)
2186 rplci = plci;
2201 if(relatedadapter->plci[i].Id == (byte)relatedPLCIvalue)
2203 rplci = &relatedadapter->plci[i];
2211 rplci = plci;
2222 dbug(1,dprintf("plci:%x",plci));
2224 dbug(1,dprintf("plci->ptyState:%x",plci->ptyState));
2233 plci->command = 0;
2234 rplci->relatedPTYPLCI = plci;
2235 plci->relatedPTYPLCI = rplci;
2245 plci->vswitchstate=0;
2246 plci->vsprot=0;
2247 plci->vsprotdialect=0;
2261 if(plci!=rplci) /* explicit invocation */
2264 cai[2] = plci->Sig.Id;
2292 if (!plci)
2299 plci->command = 0;
2300 plci->internal_command = CD_REQ_PEND;
2304 add_p(plci,CAI,cai);
2305 add_p(plci,CPN,ss_parms[3].info);
2306 sig_req(plci,S_SERVICE,0);
2307 send_req(plci);
2321 rplci = &a->plci[i-1];
2393 rplci = &a->plci[i-1];
2476 if(!plci)
2480 rplci = &a->plci[i-1];
2496 rplci = plci;
2528 if(!plci)
2532 rplci = &a->plci[i-1];
2548 rplci = plci;
2576 return (dtmf_request (Id, Number, a, plci, appl, msg));
2581 return (mixer_request (Id, Number, a, plci, appl, msg));
2587 return (ec_request (Id, Number, a, plci, appl, msg));
2591 return (ec_request (Id, Number, a, plci, appl, msg));
2611 PLCI *plci, APPL *appl, API_PARSE *msg)
2618 PLCI *plci, APPL *appl, API_PARSE *parms)
2633 if(plci)
2635 if ((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING)
2636 || (plci->State == INC_DIS_PENDING) || (plci->SuppState != IDLE))
2647 if (!plci->NL.Id
2648 || (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
2649 && ((plci->channels != 0)
2650 || (((plci->B2_prot != B2_SDLC) && (plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL))
2651 && ((plci->call_dir & CALL_DIR_ANSWER) && !(plci->call_dir & CALL_DIR_FORCE_OUTG_NL))))))
2654 plci->channels,plci->NL.Id,plci->call_dir,plci->SuppState));
2663 plci->requested_options_conn = 0;
2667 if(plci->B3_prot==2 || plci->B3_prot==3)
2676 add_d(plci,2,pvc);
2682 add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
2686 else if(plci->B3_prot==5)
2688 if (plci->NL.Id && !plci->nl_remove_id)
2690 fax_control_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low);
2691 fax_feature_bits = GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low);
2700 if ((w & 0x0001) != ((word)(((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & 0x0001)))
2702 ((T30_INFO *)(plci->fax_connect_info_buffer))->resolution =
2703 (byte)((((T30_INFO *)(plci->fax_connect_info_buffer))->resolution & ~T30_RESOLUTION_R8_0770_OR_200) |
2718 if (((byte) w) != ((T30_INFO *)(plci->fax_connect_info_buffer))->data_format)
2720 ((T30_INFO *)(plci->fax_connect_info_buffer))->data_format = (byte) w;
2727 plci->requested_options_conn |= (1L << PRIVATE_FAX_SUB_SEP_PWD);
2732 plci->requested_options_conn |= (1L << PRIVATE_FAX_NONSTANDARD);
2736 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
2743 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
2753 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = (byte) w;
2755 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i];
2756 ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
2761 plci->fax_connect_info_buffer[len++] = (byte) w;
2763 plci->fax_connect_info_buffer[len++] = fax_parms[5].info[1+i];
2767 plci->fax_connect_info_buffer[len++] = (byte) w;
2769 plci->fax_connect_info_buffer[len++] = fax_parms[6].info[1+i];
2770 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[appl->Id-1])
2776 plci->fax_connect_info_buffer[len++] = 0;
2781 plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
2782 plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
2784 plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
2796 if (fax_control_bits != GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low))
2798 PUT_WORD (&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low, fax_control_bits);
2804 plci->fax_connect_info_length = len;
2809 start_internal_command (Id, plci, fax_connect_info_command);
2814 start_internal_command (Id, plci, fax_adjust_b23_command);
2825 else if (plci->B3_prot == B3_RTP)
2827 plci->internal_req_buffer[0] = ncpi->length + 1;
2828 plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
2830 plci->internal_req_buffer[2+w] = ncpi->info[1+w];
2831 start_internal_command (Id, plci, rtp_connect_b3_req_command);
2837 nl_req_ncci(plci,req,0);
2853 PLCI *plci, APPL *appl, API_PARSE *parms)
2870 if(plci && ncci) {
2875 channel_request_xon (plci, a->ncci_ch[ncci]);
2876 channel_xmit_xon (plci);
2877 cleanup_ncci_data (plci, ncci);
2878 nl_req_ncci(plci,N_DISC,(byte)ncci);
2885 if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
2888 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
2891 if (((plci->B3_prot == 4) || (plci->B3_prot == 5))
2892 && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
2893 && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
2896 if (plci->fax_connect_info_length < len)
2898 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
2899 ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
2907 if (plci->fax_connect_info_length <= len)
2908 plci->fax_connect_info_buffer[len] = 0;
2909 len += 1 + plci->fax_connect_info_buffer[len];
2910 if (plci->fax_connect_info_length <= len)
2911 plci->fax_connect_info_buffer[len] = 0;
2912 len += 1 + plci->fax_connect_info_buffer[len];
2914 plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
2915 plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
2917 plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
2919 plci->fax_connect_info_length = len;
2920 ((T30_INFO *)(plci->fax_connect_info_buffer))->code = 0;
2921 start_internal_command (Id, plci, fax_connect_ack_command);
2926 nl_req_ncci(plci,req,(byte)ncci);
2927 if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
2928 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
2930 if (plci->B3_prot == 4)
2933 sendf(appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
2934 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
2938 else if (plci->B3_prot == B3_RTP)
2940 plci->internal_req_buffer[0] = ncpi->length + 1;
2941 plci->internal_req_buffer[1] = UDATA_REQUEST_RTP_RECONFIGURE;
2943 plci->internal_req_buffer[2+w] = ncpi->info[1+w];
2944 start_internal_command (Id, plci, rtp_connect_b3_res_command);
2952 add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
2954 nl_req_ncci(plci,req,(byte)ncci);
2956 if (plci->adjust_b_restore)
2958 plci->adjust_b_restore = false;
2959 start_internal_command (Id, plci, adjust_b_restore);
2969 PLCI *plci, APPL *appl, API_PARSE *parms)
2976 if (plci && ncci && (plci->State != IDLE) && (plci->State != INC_DIS_PENDING)
2977 && (plci->State != OUTG_DIS_PENDING))
2981 if(plci->State!=INC_CON_CONNECTED_ALERT) plci->State = CONNECTED;
2982 channel_request_xon (plci, a->ncci_ch[ncci]);
2983 channel_xmit_xon (plci);
2990 PLCI *plci, APPL *appl, API_PARSE *parms)
3000 if (plci && ncci)
3009 channel_request_xon (plci, a->ncci_ch[ncci]);
3010 channel_xmit_xon (plci);
3013 && ((plci->B3_prot == B3_TRANSPARENT)
3014 || (plci->B3_prot == B3_T30)
3015 || (plci->B3_prot == B3_T30_WITH_EXTENSIONS)))
3017 plci->send_disc = (byte)ncci;
3018 plci->command = 0;
3023 cleanup_ncci_data (plci, ncci);
3025 if(plci->B3_prot==2 || plci->B3_prot==3)
3030 add_d(plci, (word)(ncpi->length - 3) ,(byte *)&(ncpi->info[4]));
3033 nl_req_ncci(plci,N_DISC,(byte)ncci);
3047 PLCI *plci, APPL *appl, API_PARSE *parms)
3054 if(plci && ncci) {
3055 plci->requested_options_conn = 0;
3056 plci->fax_connect_info_length = 0;
3057 plci->ncpi_state = 0x00;
3058 if (((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE))
3059 && ((plci->B2_prot != B2_LAPD) && (plci->B2_prot != B2_LAPD_FREE_SAPI_SEL)))
3061 plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
3063 for(i=0; i<MAX_CHANNELS_PER_PLCI && plci->inc_dis_ncci_table[i]!=(byte)ncci; i++);
3065 if(plci->channels)plci->channels--;
3066 for(; i<MAX_CHANNELS_PER_PLCI-1; i++) plci->inc_dis_ncci_table[i] = plci->inc_dis_ncci_table[i+1];
3067 plci->inc_dis_ncci_table[MAX_CHANNELS_PER_PLCI-1] = 0;
3069 ncci_free_receive_buffers (plci, ncci);
3071 if((plci->State==IDLE || plci->State==SUSPENDING) && !plci->channels){
3072 if(plci->State == SUSPENDING){
3073 sendf(plci->appl,
3078 sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
3080 plci_remove(plci);
3081 plci->State=IDLE;
3087 && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
3090 ncci_free_receive_buffers (plci, ncci);
3092 nl_req_ncci(plci,N_EDATA,(byte)ncci);
3094 plci->adapter->ncci_state[ncci] = IDLE;
3095 start_internal_command (Id, plci, fax_disconnect_command);
3104 PLCI *plci, APPL *appl, API_PARSE *parms)
3116 dbug(1,dprintf("ncci=0x%x, plci=0x%x",ncci,plci));
3118 if (plci && ncci)
3131 if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
3132 && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
3156 send_data(plci);
3162 if (plci)
3164 if ((((byte *)(parms[0].info)) >= ((byte *)(plci->msg_in_queue)))
3165 && (((byte *)(parms[0].info)) < ((byte *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
3182 PLCI *plci, APPL *appl, API_PARSE *parms)
3191 if(plci && ncci) {
3197 (byte)(appl->DataFlags[n]>>8)==plci->Id) {
3201 if (channel_can_xon (plci, a->ncci_ch[ncci])) {
3202 channel_request_xon (plci, a->ncci_ch[ncci]);
3204 channel_xmit_xon (plci);
3207 nl_req_ncci(plci,N_DATA_ACK,(byte)ncci);
3216 PLCI *plci, APPL *appl, API_PARSE *parms)
3225 if(plci && ncci)
3228 switch (plci->B3_prot)
3234 nl_req_ncci(plci,N_RESET,(byte)ncci);
3235 send_req(plci);
3242 start_internal_command (Id, plci, reset_b3_command);
3258 PLCI *plci, APPL *appl, API_PARSE *parms)
3265 if(plci && ncci) {
3266 switch (plci->B3_prot)
3273 nl_req_ncci(plci,N_RESET_ACK,(byte)ncci);
3283 PLCI *plci, APPL *appl, API_PARSE *parms)
3292 if(plci && ncci) {
3306 add_d(plci,(word)(ncpi->length-3),&ncpi->info[4]);
3309 nl_req_ncci(plci,req,(byte)ncci);
3318 PLCI *plci, APPL *appl, API_PARSE *msg)
3325 if(!plci || !msg)
3332 msg->length,plci->Id,plci->tel,plci->NL.Id,plci->appl,plci->SuppState));
3333 dbug(1,dprintf("PlciState=0x%x",plci->State));
3337 if((plci->State == IDLE) || (plci->State == OUTG_DIS_PENDING) || (plci->State == INC_DIS_PENDING)
3338 || (plci->SuppState != IDLE) || plci->channels || plci->nl_remove_id)
3349 if((plci->State==INC_CON_PENDING) || (plci->State==INC_CON_ALERT)) /* send alert tone inband to the network, */
3356 plci->State=INC_CON_CONNECTED_ALERT;
3357 plci->appl = appl;
3358 clear_c_ind_mask_bit (plci, (word)(appl->Id-1));
3359 dump_c_ind_mask (plci);
3362 if(test_c_ind_mask_bit (plci, i))
3367 api_save_msg(msg, "s", &plci->saved_msg);
3368 tel = plci->tel;
3389 if(AdvCodecSupport(a, plci, appl, 0) )
3394 else if(plci->spoofed_msg==SPOOFING_REQUIRED) /* wait until codec is active */
3396 plci->spoofed_msg = AWAITING_SELECT_B;
3397 plci->internal_command = BLOCK_PLCI; /* lock other commands */
3398 plci->command = 0;
3411 CodecIdCheck(a, plci);
3412 plci->tel = 0;
3413 plci->adv_nl = 0;
3424 if (plci->call_dir & CALL_DIR_OUT)
3425 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
3426 else if (plci->call_dir & CALL_DIR_IN)
3427 plci->call_dir = CALL_DIR_IN | CALL_DIR_ANSWER;
3428 start_internal_command (Id, plci, select_b_command);
3438 PLCI *plci, APPL *appl, API_PARSE *parms)
3477 plci = &a->plci[i-1];
3478 plci->appl = appl;
3479 plci->command = _MANUFACTURER_R;
3480 plci->m_command = command;
3481 plci->number = Number;
3482 plci->State = LOCAL_CONNECT;
3483 Id = ( ((word)plci->Id<<8)|plci->adapter->Id|0x80);
3484 dbug(1,dprintf("ManCMD,plci=0x%x",Id));
3489 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
3493 Info = add_b1(plci,&m_parms[3],0,0);
3496 add_p(plci,CAI,codec_cai);
3499 /* first 'assign plci' with this function, then use */
3501 if(AdvCodecSupport(a, plci, appl, 0) ) {
3505 Info = add_b1(plci,&null_parms,0,B1_FACILITY_LOCAL);
3511 plci->State = LOCAL_CONNECT;
3512 plci->manufacturer = true;
3513 plci->command = _MANUFACTURER_R;
3514 plci->m_command = command;
3515 plci->number = Number;
3519 add_p(plci,LLI,lli);
3520 add_p(plci,CHI,chi);
3521 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
3522 sig_req(plci,ASSIGN,DSIG_ID);
3526 Info = add_b23(plci,&m_parms[3]);
3529 nl_req_ncci(plci,ASSIGN,0);
3530 send_req(plci);
3535 dbug(1,dprintf("dir=0x%x,spoof=0x%x",dir,plci->spoofed_msg));
3536 if (plci->spoofed_msg==SPOOFING_REQUIRED)
3538 api_save_msg (m_parms, "wbbs", &plci->saved_msg);
3539 plci->spoofed_msg = AWAITING_MANUF_CON;
3540 plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
3541 plci->command = 0;
3542 send_req(plci);
3546 sig_req(plci,CALL_REQ,0);
3549 sig_req(plci,LISTEN_REQ,0);
3551 send_req(plci);
3569 if(!plci)
3579 plci->command = _MANUFACTURER_R;
3580 plci->m_command = command;
3581 plci->number = Number;
3584 plci->b_channel = getChannel(&m_parms[1]);
3585 mixer_set_bchannel_id_esc (plci, plci->b_channel);
3586 if(plci->spoofed_msg==SPOOFING_REQUIRED)
3588 plci->spoofed_msg = CALL_REQ | AWAITING_MANUF_CON;
3589 plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
3590 plci->command = 0;
3596 plci->cr_enquiry = true;
3598 add_ss(plci,FTY,&m_parms[1]);
3599 sig_req(plci,req,0);
3600 send_req(plci);
3603 if (plci->NL.Id && !plci->nl_remove_id)
3605 if (plci->channels)
3609 if ((a->ncci_plci[ncci] == plci->Id) && (a->ncci_state[ncci] == CONNECTED))
3612 cleanup_ncci_data (plci, ncci);
3613 nl_req_ncci(plci,N_DISC,(byte)ncci);
3617 mixer_remove (plci);
3618 nl_req_ncci(plci,REMOVE,0);
3619 send_req(plci);
3626 if(!plci)
3632 plci->command = _MANUFACTURER_R;
3633 plci->number = Number;
3634 add_ss(plci,FTY,m);
3635 sig_req(plci,SIG_CTRL,0);
3636 send_req(plci);
3643 if(!plci)
3649 plci->command = _MANUFACTURER_R;
3650 plci->number = Number;
3651 add_ss(plci,FTY,m);
3652 sig_req(plci,DSP_CTRL,0);
3653 send_req(plci);
3675 if (plci
3682 if ((plci->tel != ADV_VOICE) || (plci != a->AdvSignalPLCI))
3694 if (plci->B1_facilities & B1_FACILITY_VOICE)
3695 adv_voice_write_coefs (plci, ADV_VOICE_WRITE_UPDATE);
3706 plci->dtmf_parameter_length = m->info[2] - 1;
3707 if (plci->dtmf_parameter_length > m->length - 3)
3708 plci->dtmf_parameter_length = (byte)(m->length - 3);
3709 if (plci->dtmf_parameter_length > DTMF_PARAMETER_BUFFER_SIZE)
3710 plci->dtmf_parameter_length = DTMF_PARAMETER_BUFFER_SIZE;
3711 for (i = 0; i < plci->dtmf_parameter_length; i++)
3712 plci->dtmf_parameter_buffer[i] = m->info[4+i];
3713 if (plci->B1_facilities & B1_FACILITY_DTMFR)
3714 dtmf_parameter_write (plci);
3719 v_plci = plci;
3767 PLCI *plci, APPL *appl, API_PARSE *msg)
3791 if(!plci)
3793 if (((plci->B3_prot != 4) && (plci->B3_prot != 5))
3794 || !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
3806 if (plci->fax_connect_info_length < len)
3808 ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0;
3809 ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0;
3817 if (plci->fax_connect_info_length <= len)
3818 plci->fax_connect_info_buffer[len] = 0;
3819 len += 1 + plci->fax_connect_info_buffer[len];
3820 if (plci->fax_connect_info_length <= len)
3821 plci->fax_connect_info_buffer[len] = 0;
3822 len += 1 + plci->fax_connect_info_buffer[len];
3824 plci->nsf_control_bits = GET_WORD(&fax_parms[7].info[2]);
3825 plci->fax_connect_info_buffer[len++] = (byte)(fax_parms[7].length);
3827 plci->fax_connect_info_buffer[len++] = fax_parms[7].info[1+i];
3829 plci->fax_connect_info_length = len;
3830 plci->fax_edata_ack_length = plci->fax_connect_info_length;
3831 start_internal_command (Id, plci, fax_edata_ack_command);
3846 PLCI * plci;
3859 plci = &(a->plci[e->user[1]]);
3888 channel_flow_control_remove (plci);
3891 if (a->FlowControlIdTable[i] == plci->nl_remove_id)
3894 plci->nl_remove_id = 0;
3895 if (plci->rx_dma_descriptor > 0) {
3896 diva_free_dma_descriptor (plci, plci->rx_dma_descriptor - 1);
3897 plci->rx_dma_descriptor = 0;
3906 a->ch_flow_plci[ch] = plci->Id;
3907 plci->nl_req = 0;
3926 plci->nl_req = 0;
3929 plci->nl_req = 0;
3931 if (plci->nl_req)
3932 control_rc (plci, 0, rc, ch, 0, true);
3937 channel_x_on (plci, ch);
3938 if (plci->internal_command)
3939 control_rc (plci, req, rc, ch, 0, true);
3943 if (plci->nl_global_req)
3945 global_req = plci->nl_global_req;
3946 plci->nl_global_req = 0;
3949 if (plci->rx_dma_descriptor > 0) {
3950 diva_free_dma_descriptor (plci, plci->rx_dma_descriptor - 1);
3951 plci->rx_dma_descriptor = 0;
3954 channel_xmit_xon (plci);
3955 control_rc (plci, 0, rc, ch, global_req, true);
3957 else if (plci->data_sent)
3959 channel_xmit_xon (plci);
3960 plci->data_sent = false;
3961 plci->NL.XNum = 1;
3962 data_rc (plci, ch);
3963 if (plci->internal_command)
3964 control_rc (plci, req, rc, ch, 0, true);
3968 channel_xmit_xon (plci);
3969 control_rc (plci, req, rc, ch, 0, true);
3988 plci->sig_remove_id = 0;
3990 plci->sig_req = 0;
3991 if (plci->sig_global_req)
3993 global_req = plci->sig_global_req;
3994 plci->sig_global_req = 0;
3997 channel_xmit_xon (plci);
3998 control_rc (plci, 0, rc, ch, global_req, false);
4002 channel_xmit_xon (plci);
4003 control_rc (plci, req, rc, ch, 0, false);
4012 channel_xmit_xon(plci);
4017 channel_xmit_xon(plci);
4024 (a->ch_flow_plci[Ch] == plci->Id)) {
4030 nl_ind(plci);
4032 (a->ch_flow_plci[Ch] == plci->Id) &&
4038 sig_ind(plci);
4045 while (!plci->req_in
4046 && !plci->internal_command
4047 && (plci->msg_in_write_pos != plci->msg_in_read_pos))
4049 j = (plci->msg_in_read_pos == plci->msg_in_wrap_pos) ? 0 : plci->msg_in_read_pos;
4051 i = (((CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]))->header.length + 3) & 0xfffc;
4053 m = (CAPI_MSG *)(&((byte *)(plci->msg_in_queue))[j]);
4054 appl = *((APPL * *)(&((byte *)(plci->msg_in_queue))[j+i]));
4056 m->header.command, plci->msg_in_write_pos, plci->msg_in_read_pos, plci->msg_in_wrap_pos));
4057 if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
4059 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
4060 plci->msg_in_read_pos = i + MSG_IN_OVERHEAD;
4064 plci->msg_in_read_pos = j + i + MSG_IN_OVERHEAD;
4066 if (plci->msg_in_read_pos == plci->msg_in_write_pos)
4068 plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
4069 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
4071 else if (plci->msg_in_read_pos == plci->msg_in_wrap_pos)
4073 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
4074 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
4087 if (plci->li_notify_update)
4089 plci->li_notify_update = false;
4090 mixer_notify_update (plci, false);
4094 send_data(plci);
4095 send_req(plci);
4099 static void control_rc(PLCI *plci, byte req, byte rc, byte ch, byte global_req,
4114 if (!plci) {
4115 dbug(0,dprintf("A: control_rc, no plci %02x:%02x:%02x:%02x:%02x", req, rc, ch, global_req, nl_rc));
4118 dbug(1,dprintf("req0_in/out=%d/%d",plci->req_in,plci->req_out));
4119 if(plci->req_in!=plci->req_out)
4128 plci->req_in = plci->req_in_start = plci->req_out = 0;
4131 appl = plci->appl;
4132 a = plci->adapter;
4136 Id = (((dword)(ncci ? ncci : ch)) << 16) | ((word)plci->Id << 8) | a->Id;
4137 if(plci->tel && plci->SuppState!=CALL_HELD) Id|=EXT_CONTROLLER;
4138 Number = plci->number;
4139 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));
4140 dbug(1,dprintf("channels=0x%x",plci->channels));
4141 if (plci_remove_check(plci))
4145 sig_req(plci,HANGUP,0);
4146 sig_req(plci,REMOVE,0);
4147 send_req(plci);
4149 if(plci->command)
4151 switch(plci->command)
4158 plci->SuppState = IDLE;
4169 plci->SuppState = CALL_HELD;
4183 if (plci->State == INC_DIS_PENDING)
4185 if(plci->Sig.Id!=0xff)
4192 plci_remove(plci);
4193 plci->State = IDLE;
4196 if(plci->State!=LOCAL_CONNECT)plci->State = OUTG_CON_PENDING;
4205 plci_remove(plci);
4206 plci->State = IDLE;
4210 sendf(plci->appl,_CONNECT_ACTIVE_I,Id,0,"sss","","","");
4211 plci->State = INC_ACT_PENDING;
4216 if (plci->State != INC_DIS_PENDING)
4217 plci->State = INC_CON_ACCEPT;
4221 if (plci->State == INC_DIS_PENDING)
4223 if(plci->Sig.Id!=0xff)
4225 plci->State = OUTG_DIS_PENDING;
4242 ncci = get_ncci (plci, ch, 0);
4244 plci->channels++;
4276 sendf(plci->appl,_CONNECT_R|CONFIRM,Id,Number,"w",Info);
4277 plci_remove(plci);
4280 sendf(plci->appl,_CONNECT_R|CONFIRM,Id,Number,"w",Info);
4286 plci->command = 0;
4288 else if (plci->internal_command)
4290 switch(plci->internal_command)
4300 plci_remove(plci);
4311 plci_remove(plci);
4321 switch(plci->internal_command)
4350 if(!plci->appl) break;
4359 sendf(plci->appl,_FACILITY_R|CONFIRM,Id&0x7,
4360 plci->number,"wws",Info,(word)3,SSparms);
4361 if(Info) plci_remove(plci);
4366 if(!plci->relatedPTYPLCI) break;
4367 rplci = plci->relatedPTYPLCI;
4368 SSparms[1] = plci->ptyState;
4374 plci->relatedPTYPLCI = NULL;
4375 plci->ptyState = 0;
4380 plci->number,
4387 if(!plci->relatedPTYPLCI) break;
4388 rplci = plci->relatedPTYPLCI;
4395 plci->relatedPTYPLCI = NULL;
4396 plci->ptyState = 0;
4401 plci->number,
4411 plci_remove(plci); /* after codec init, internal codec commands pending */
4421 plci_remove(plci); /* after codec init, internal codec commands pending */
4430 plci->internal_command = PERM_COD_CONN_PEND;
4436 sig_req(plci,CALL_REQ,0);
4437 send_req(plci);
4438 plci->internal_command = PERM_COD_CALL;
4454 plci_remove(plci);
4468 plci_remove(plci);
4473 if(plci->channels)
4478 cleanup_ncci_data (plci, ncci);
4479 nl_req_ncci(plci,N_DISC,(byte)ncci);
4486 if (plci->State == INC_DIS_PENDING)
4488 sig_req(plci,CALL_REQ,0);
4489 send_req(plci);
4490 plci->State=OUTG_CON_PENDING;
4517 if(plci->internal_command==MWI_ACTIVATE_REQ_PEND)
4523 if(plci->cr_enquiry)
4525 sendf(plci->appl,
4528 plci->number,
4530 if(rc!=OK) plci_remove(plci);
4534 sendf(plci->appl,
4537 plci->number,
4549 if((plci->internal_command==CONF_ADD_REQ_PEND)&&(!plci->relatedPTYPLCI)) break;
4550 rplci = plci;
4552 switch(plci->internal_command)
4559 rplci = plci->relatedPTYPLCI;
4579 plci->relatedPTYPLCI = NULL;
4580 plci->ptyState = 0;
4585 plci->number,
4592 if(plci->relatedPTYPLCI)
4594 plci->relatedPTYPLCI->vswitchstate=0;
4595 plci->relatedPTYPLCI->vsprot=0;
4596 plci->relatedPTYPLCI->vsprotdialect=0;
4598 plci->vswitchstate=0;
4599 plci->vsprot=0;
4600 plci->vsprotdialect=0;
4604 if(plci->relatedPTYPLCI &&
4605 plci->vswitchstate==1 &&
4606 plci->relatedPTYPLCI->vswitchstate==3) /* join complete */
4607 plci->vswitchstate=3;
4617 plci->appl->CDEnable = 0;
4619 sendf(plci->appl,_FACILITY_R|CONFIRM,Id,
4620 plci->number,"wws",Info,(word)3,SSparms);
4626 ncci = get_ncci (plci, ch, 0);
4628 plci->channels++;
4633 if (plci->internal_command_queue[0])
4635 (*(plci->internal_command_queue[0]))(Id, plci, rc);
4636 if (plci->internal_command)
4641 next_internal_command (Id, plci);
4646 Id = ((word)plci->Id<<8)|plci->adapter->Id;
4647 if(plci->tel) Id|=EXT_CONTROLLER;
4649 switch(plci->internal_command)
4663 plci->internal_command = 0;
4664 sig_req(plci,REMOVE,0);
4665 send_req(plci);
4684 plci->number,"wws",Info,(word)3,SSparms);
4689 plci->internal_command = 0;
4696 plci->internal_command = PERM_COD_CONN_PEND;
4702 plci->internal_command = 0;
4704 plci->internal_command = PERM_COD_CALL;
4705 sig_req(plci,CALL_REQ,0);
4706 send_req(plci);
4712 plci->internal_command = 0;
4713 dbug(1,dprintf("ListenCheck, new SIG_ID = 0x%x",plci->Sig.Id));
4714 add_p(plci,ESC,"\x02\x18\x00"); /* support call waiting */
4715 sig_req(plci,INDICATE_REQ,0);
4716 send_req(plci);
4722 plci_remove(plci);
4723 plci->State = IDLE;
4732 sig_req(plci,LAW_REQ,0);
4733 send_req(plci);
4740 plci->internal_command = 0;
4749 plci->internal_command = 0;
4755 plci->internal_command = 0;
4756 sig_req(plci,REMOVE,0);
4757 send_req(plci);
4762 plci_remove_check(plci);
4766 static void data_rc(PLCI *plci, byte ch)
4774 if (plci->appl)
4776 TransmitBufferFree (plci->appl, plci->data_sent_ptr);
4777 a = plci->adapter;
4779 if (ncci && (a->ncci_plci[ncci] == plci->Id))
4788 Id = (((dword)ncci)<<16)|((word)plci->Id<<8)|a->Id;
4789 if(plci->tel) Id|=EXT_CONTROLLER;
4790 sendf(plci->appl,_DATA_B3_R|CONFIRM,Id,data->Number,
4802 static void data_ack(PLCI *plci, byte ch)
4809 a = plci->adapter;
4814 if (a->ncci_state[ncci] && (a->ncci_plci[ncci] == plci->Id))
4816 Id = (((dword)ncci)<<16)|((word)plci->Id<<8)|a->Id;
4817 if(plci->tel) Id|=EXT_CONTROLLER;
4818 sendf(plci->appl,_DATA_B3_R|CONFIRM,Id,ncci_ptr->DataAck[ncci_ptr->data_ack_out].Number,
4828 static void sig_ind(PLCI *plci)
4892 a = plci->adapter;
4893 Id = ((word)plci->Id<<8)|a->Id;
4896 if (plci->sig_remove_id)
4898 plci->Sig.RNR = 2; /* discard */
4902 if(plci->tel && plci->SuppState!=CALL_HELD) Id|=EXT_CONTROLLER;
4903 dbug(1,dprintf("SigInd-Id=%08lx,plci=%x,tel=%x,state=0x%x,channels=%d,Discflowcl=%d",
4904 Id,plci->Id,plci->tel,plci->State,plci->channels,plci->hangup_flow_ctrl_timer));
4905 if(plci->Sig.Ind==CALL_HOLD_ACK && plci->channels)
4907 plci->Sig.RNR = 1;
4910 if(plci->Sig.Ind==HANGUP && plci->channels)
4912 plci->Sig.RNR = 1;
4913 plci->hangup_flow_ctrl_timer++;
4915 if(plci->hangup_flow_ctrl_timer==100)
4918 plci->Sig.RNR = 0;
4919 plci->hangup_flow_ctrl_timer = 0;
4922 if (a->ncci_plci[ncci] == plci->Id)
4924 cleanup_ncci_data (plci, ncci);
4925 if(plci->channels)plci->channels--;
4926 if (plci->appl)
4927 sendf(plci->appl,_DISCONNECT_B3_I, (((dword) ncci) << 16) | Id,0,"ws",0,"");
4930 if (plci->appl)
4931 sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
4932 plci_remove(plci);
4933 plci->State=IDLE;
4941 IndParse(plci,multi_fac_id,multi_fac_parms,MAX_MULTI_IE);
4942 IndParse(plci,multi_pi_id,multi_pi_parms,MAX_MULTI_IE);
4943 IndParse(plci,multi_ssext_id,multi_ssext_parms,MAX_MULTI_IE);
4945 IndParse(plci,multi_vswitch_id,multi_vswitch_parms,MAX_MULTI_IE);
4947 IndParse(plci,parms_id,parms,0);
4948 IndParse(plci,multi_CiPN_id,multi_CiPN_parms,MAX_MULTI_IE);
4954 if(esc_cr[0] && plci)
4956 if(plci->cr_enquiry && plci->appl)
4958 plci->cr_enquiry = false;
4968 sendf(plci->appl,
4972 "dwbbbbSbS",_DI_MANU_ID,plci->m_command,
4973 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);
4996 if(plci==a->automatic_lawPLCI) {
4997 plci->internal_command = 0;
4998 sig_req(plci,REMOVE,0);
4999 send_req(plci);
5087 /* codec plci for the handset/hook state support is just an internal id */
5088 if(plci!=a->AdvCodecPLCI)
5090 force_mt_info = SendMultiIE(plci,Id,multi_fac_parms, FTY, 0x20, 0);
5091 force_mt_info |= SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, 0);
5092 SendSSExtInd(NULL,plci,Id,multi_ssext_parms);
5093 SendInfo(plci,Id, parms, force_mt_info);
5095 VSwitchReqInd(plci,Id,multi_vswitch_parms);
5100 if(esc_chi[0] && plci && !plci->SuppState){
5101 plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
5102 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5103 dbug(1,dprintf("storeChannel=0x%x",plci->b_channel));
5104 if(plci->tel==ADV_VOICE && plci->appl) {
5109 if(plci->appl) Number = plci->appl->Number++;
5111 switch(plci->Sig.Ind) {
5115 if(!plci->appl) break;
5126 sendf(plci->appl,_FACILITY_R|CONFIRM,Id&0x7,plci->number, "wws",0,3,CF_Ind);
5127 plci_remove(plci);
5139 if(!plci->relatedPTYPLCI) break;
5140 tplci = plci->relatedPTYPLCI;
5147 plci->vswitchstate=0;
5148 plci->relatedPTYPLCI->vswitchstate=0;
5163 plci->relatedPTYPLCI = NULL;
5164 plci->ptyState = 0;
5197 if(!plci->appl) break;
5253 PUT_DWORD(&Interr_Err_Ind[6],plci->appl->S_Handle);
5254 sendf(plci->appl,_FACILITY_I,Id&0x7,0,"ws",3, Interr_Err_Ind);
5255 plci_remove(plci);
5274 if(plci->cr_enquiry)
5276 sendf(plci->appl,_FACILITY_I,Id&0xf,0,"ws",3, SS_Ind);
5277 plci_remove(plci);
5281 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5295 plci->ptyState = 0;
5301 plci->ptyState = CONNECTED;
5307 plci->ptyState = CONNECTED;
5313 plci->ptyState = CONNECTED;
5317 plci->relatedPTYPLCI = NULL;
5318 tplci=plci->relatedPTYPLCI;
5320 plci->ptyState = CONNECTED;
5335 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
5349 if(!plci->relatedPTYPLCI) break;
5350 tplci = plci->relatedPTYPLCI;
5357 if(plci->vswitchstate!=3)
5360 plci->ptyState = IDLE;
5361 plci->relatedPTYPLCI = NULL;
5362 plci->ptyState = 0;
5374 switch (plci->ptyState)
5377 plci->ptyState = CONNECTED;
5382 plci->ptyState = IDLE;
5383 plci->relatedPTYPLCI = NULL;
5384 plci->ptyState = 0;
5407 if(!plci->appl) break;
5409 PUT_DWORD(&CF_Ind[6],plci->appl->S_Handle);
5410 sendf(plci->appl,_FACILITY_I,Id&0x7,0,"ws",3, CF_Ind);
5411 plci_remove(plci);
5421 if(!plci->appl) break;
5453 PUT_DWORD(&pty_cai[6],plci->appl->S_Handle);
5454 sendf(plci->appl,_FACILITY_I,Id&0x7,0,"wS",3, pty_cai);
5455 plci_remove(plci);
5465 if(plci->cr_enquiry)
5467 sendf(plci->appl,_FACILITY_I,Id&0xf,0,"ws",3, SS_Ind);
5468 plci_remove(plci);
5472 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5481 if(plci->appl && (a->Notification_Mask[plci->appl->Id-1]&SMASK_MWI))
5483 if(plci->internal_command==GET_MWI_STATE) /* result on Message Waiting Listen */
5485 sendf(plci->appl,_FACILITY_I,Id&0xf,0,"wS",3, &pty_cai[2]);
5486 plci_remove(plci);
5489 else sendf(plci->appl,_FACILITY_I,Id,0,"wS",3, &pty_cai[2]);
5517 add_p(plci,CAI,facility);
5518 add_p(plci,ESC,multi_ssext_parms[0]); /* remembered parameter -> only one possible */
5519 sig_req(plci,S_SERVICE,0);
5520 send_req(plci);
5521 plci->command = 0;
5522 next_internal_command (Id, plci);
5565 tplci=plci->relatedPTYPLCI;
5576 plci->ptyState = CONNECTED;
5577 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
5603 if(plci->appl && (a->Notification_Mask[plci->appl->Id-1]&SMASK_CCBS))
5605 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, CONF_Ind);
5629 if(plci->SuppState == HOLD_REQUEST)
5631 plci->SuppState = IDLE;
5632 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5637 if(plci->SuppState == HOLD_REQUEST)
5639 plci->SuppState = CALL_HELD;
5640 CodecIdCheck(a, plci);
5641 start_internal_command (Id, plci, hold_save_command);
5658 if(plci->SuppState == RETRIEVE_REQUEST)
5660 plci->SuppState = CALL_HELD;
5661 CodecIdCheck(a, plci);
5662 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5668 if(plci->SuppState == RETRIEVE_REQUEST)
5670 plci->SuppState = IDLE;
5671 plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
5672 plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
5673 if(plci->tel)
5675 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5676 dbug(1,dprintf("RetrChannel=0x%x",plci->b_channel));
5678 if(plci->B2_prot==B2_TRANSPARENT && plci->B3_prot==B3_TRANSPARENT)
5681 start_internal_command (Id, plci, retrieve_restore_command);
5684 sendf(plci->appl,_FACILITY_I,Id,0,"ws",3, SS_Ind);
5687 start_internal_command (Id, plci, retrieve_restore_command);
5692 if(plci->State != LISTENING) {
5693 sig_req(plci,HANGUP,0);
5694 send_req(plci);
5700 clear_c_ind_mask (plci);
5703 set_c_ind_mask_bit (plci, MAX_APPL);
5704 group_optimization(a, plci);
5709 && test_group_ind_mask_bit (plci, i) ) {
5711 set_c_ind_mask_bit (plci, i);
5712 dump_c_ind_mask (plci);
5713 plci->State = INC_CON_PENDING;
5714 plci->call_dir = (plci->call_dir & ~(CALL_DIR_OUT | CALL_DIR_ORIGINATE)) |
5717 plci->b_channel = esc_chi[esc_chi[0]]&0x1f;
5718 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5724 plci->tel = ADV_VOICE;
5726 plci->tel = CODEC;
5727 if(plci->tel) Id|=EXT_CONTROLLER;
5728 a->codec_listen[i] = plci;
5748 plci,
5752 plci,
5755 SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, true));
5758 clear_c_ind_mask_bit (plci, MAX_APPL);
5759 dump_c_ind_mask (plci);
5761 if(c_ind_mask_empty (plci)) {
5762 sig_req(plci,HANGUP,0);
5763 send_req(plci);
5764 plci->State = IDLE;
5766 plci->notifiedcall = 0;
5772 plci->notifiedcall = 1;
5778 if(plci->State==ADVANCED_VOICE_SIG || plci->State==ADVANCED_VOICE_NOSIG)
5780 if(plci->internal_command==PERM_COD_CONN_PEND)
5782 if(plci->State==ADVANCED_VOICE_NOSIG)
5872 next_internal_command (Id, plci);
5876 plci->internal_command = PERM_COD_HOOK;
5877 add_p(plci,FTY,"\x01\x09"); /* Get Hook State*/
5878 sig_req(plci,TEL_CTRL,0);
5879 send_req(plci);
5882 else if(plci->command != _MANUFACTURER_R /* old style permanent connect */
5883 && plci->State!=INC_ACT_PENDING)
5885 mixer_set_bchannel_id_esc (plci, plci->b_channel);
5886 if(plci->tel == ADV_VOICE && plci->SuppState == IDLE) /* with permanent codec switch on immediately */
5888 chi[2] = plci->b_channel;
5891 sendf(plci->appl,_CONNECT_ACTIVE_I,Id,0,"Sss",parms[21],"","");
5892 plci->State = INC_ACT_PENDING;
5899 if(plci->State==ADVANCED_VOICE_SIG && ie[0]){
5903 if(plci->internal_command==PERM_COD_HOOK)
5906 plci->hook_state = ie[1];
5907 next_internal_command (Id, plci);
5912 if( ((plci->hook_state)&0xf0)==0x80)
5917 plci->hook_state = ie[1]&0x91;
5935 a->AdvSignalPLCI = &a->plci[i-1];
5971 if(plci->internal_command==PERM_COD_HOOK)
5974 plci->hook_state = ie[1]&0x91;
5975 next_internal_command (Id, plci);
5980 if( ((plci->hook_state)&0xf0)==0x90) break;
5981 plci->hook_state = ie[1]&0x91;
5986 if(plci->tel) Id|=EXT_CONTROLLER;
6003 clear_c_ind_mask_bit (plci, (word)(plci->appl->Id-1));
6005 sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, resume_cau);
6009 clear_c_ind_mask (plci);
6011 if (plci->NL.Id && !plci->nl_remove_id) {
6012 mixer_remove (plci);
6013 nl_req_ncci(plci,REMOVE,0);
6015 if (!plci->sig_remove_id) {
6016 plci->internal_command = 0;
6017 sig_req(plci,REMOVE,0);
6019 send_req(plci);
6020 if(!plci->channels) {
6021 sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, "\x05\x04\x00\x02\x00\x00");
6022 sendf(plci->appl, _DISCONNECT_I, Id, 0, "w", 0);
6030 plci->hangup_flow_ctrl_timer=0;
6031 if(plci->manufacturer && plci->State==LOCAL_CONNECT) break;
6044 if(plci->State==INC_CON_PENDING || plci->State==INC_CON_ALERT)
6048 if(test_c_ind_mask_bit (plci, i))
6054 clear_c_ind_mask (plci);
6056 if(!plci->appl)
6058 if (plci->State == LISTENING)
6060 plci->notifiedcall=0;
6063 plci->State = INC_DIS_PENDING;
6064 if(c_ind_mask_empty (plci))
6066 plci->State = IDLE;
6067 if (plci->NL.Id && !plci->nl_remove_id)
6069 mixer_remove (plci);
6070 nl_req_ncci(plci,REMOVE,0);
6072 if (!plci->sig_remove_id)
6074 plci->internal_command = 0;
6075 sig_req(plci,REMOVE,0);
6077 send_req(plci);
6085 if(plci->State!=IDLE && plci->State!=INC_DIS_PENDING)
6087 if(plci->State==RESUMING)
6090 sendf(plci->appl,_FACILITY_I,Id,0,"ws", (word)3, resume_cau);
6092 plci->State = INC_DIS_PENDING;
6093 sendf(plci->appl,_DISCONNECT_I,Id,0,"w",i);
6099 SendSSExtInd(NULL,plci,Id,multi_ssext_parms);
6103 VSwitchReqInd(plci,Id,multi_vswitch_parms);
6106 if(plci->relatedPTYPLCI &&
6107 plci->vswitchstate==3 &&
6108 plci->relatedPTYPLCI->vswitchstate==3 &&
6111 add_p(plci->relatedPTYPLCI,SMSG,parms[MAXPARMSIDS-1]);
6112 sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
6113 send_req(plci->relatedPTYPLCI);
6115 else VSwitchReqInd(plci,Id,multi_vswitch_parms);
6122 static void SendSetupInfo(APPL * appl, PLCI * plci, dword Id, byte * * parms, byte Info_Sent_Flag)
6155 mixer_set_bchannel_id (plci, Info_Element);
6188 if(plci->adapter->Info_Mask[appl->Id-1] & Info_Mask) {
6196 static void SendInfo(PLCI *plci, dword Id, byte **parms, byte iesent)
6212 !plci->appl
6213 && !plci->State
6214 && plci->Sig.Ind!=NCR_FACILITY
6283 mixer_set_bchannel_id (plci, Info_Element);
6327 if(plci->Sig.Ind==NCR_FACILITY) /* check controller broadcast */
6334 && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
6342 else if(!plci->appl)
6352 if(test_c_ind_mask_bit (plci, j))
6362 && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
6366 sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
6372 static byte SendMultiIE(PLCI *plci, dword Id, byte **parms, byte ie_type,
6385 !plci->appl
6386 && !plci->State
6387 && plci->Sig.Ind!=NCR_FACILITY
6403 dbug(1,dprintf("[Ind0x%x]:IE=0x%x",plci->Sig.Ind,ie_type));
6408 if(plci->Sig.Ind==NCR_FACILITY) /* check controller broadcast */
6415 && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
6423 else if(!plci->appl && Info_Number)
6427 if(test_c_ind_mask_bit (plci, j))
6436 && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
6440 sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
6446 static void SendSSExtInd(APPL * appl, PLCI * plci, dword Id, byte * * parms)
6458 plci
6459 && plci->State
6460 && plci->Sig.Ind!=NCR_FACILITY
6478 else if(plci->appl)
6481 sendf(plci->appl,_MANUFACTURER_I,
6492 static void nl_ind(PLCI *plci)
6573 ch = plci->NL.IndCh;
6574 a = plci->adapter;
6576 Id = (((dword)(ncci ? ncci : ch)) << 16) | (((word) plci->Id) << 8) | a->Id;
6577 if(plci->tel) Id|=EXT_CONTROLLER;
6578 APPLptr = plci->appl;
6579 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",
6580 plci->NL.Id,Id,plci->Id,plci->tel,plci->State,ch,plci->channels,plci->NL.Ind &0x0f));
6584 if (plci->nl_remove_id)
6586 plci->NL.RNR = 2; /* discard */
6590 if((plci->NL.Ind &0x0f)==N_CONNECT)
6592 if(plci->State==INC_DIS_PENDING
6593 || plci->State==OUTG_DIS_PENDING
6594 || plci->State==IDLE)
6596 plci->NL.RNR = 2; /* discard */
6600 if(plci->State < INC_ACT_PENDING)
6602 plci->NL.RNR = 1; /* flow control */
6603 channel_x_off (plci, ch, N_XON_CONNECT_IND);
6611 plci->NL.RNR = 2;
6615 if (((plci->NL.Ind &0x0f) == N_UDATA)
6616 && (((plci->B2_prot != B2_SDLC) && ((plci->B1_resource == 17) || (plci->B1_resource == 18)))
6617 || (plci->B2_prot == 7)
6618 || (plci->B3_prot == 7)) )
6620 plci->ncpi_buffer[0] = 0;
6622 ncpi_state = plci->ncpi_state;
6623 if (plci->NL.complete == 1)
6625 byte * data = &plci->NL.RBuffer->P[0];
6627 if ((plci->NL.RBuffer->length >= 12)
6632 /* HexDump ("MDM N_UDATA:", plci->NL.RBuffer->length, data); */
6635 plci->ncpi_state |= NCPI_MDM_DCD_ON_RECEIVED;
6637 plci->ncpi_state |= NCPI_MDM_CTS_ON_RECEIVED;
6647 PUT_WORD (&(plci->ncpi_buffer[1]), (word)(GET_DWORD(data) & 0x0000FFFF));
6665 PUT_WORD (&(plci->ncpi_buffer[3]), ncpi_opt);
6666 plci->ncpi_buffer[0] = 4;
6668 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND | NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
6671 if (plci->B3_prot == 7)
6674 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6675 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6678 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6679 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6683 if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
6689 plci->NL.RNR = 2;
6694 if(plci->NL.complete == 2)
6696 if (((plci->NL.Ind &0x0f) == N_UDATA)
6697 && !(udata_forwarding_table[plci->RData[0].P[0] >> 5] & (1L << (plci->RData[0].P[0] & 0x1f))))
6699 switch(plci->RData[0].P[0])
6703 if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
6704 sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,"ws", SELECTOR_DTMF, "\x01X");
6707 if (plci->dtmf_rec_active & DTMF_LISTEN_ACTIVE_FLAG)
6708 sendf(plci->appl, _FACILITY_I, Id & 0xffffL, 0,"ws", SELECTOR_DTMF, "\x01Y");
6711 dtmf_indication (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6714 dtmf_confirmation (Id, plci);
6719 capidtmf_recv_process_block (&(plci->capidtmf_state), plci->RData[0].P + 1, (word)(plci->RData[0].PLength - 1));
6720 i = capidtmf_indication (&(plci->capidtmf_state), dtmf_code_buffer + 1);
6724 dtmf_indication (Id, plci, dtmf_code_buffer, (word)(i + 1));
6730 mixer_indication_coefs_set (Id, plci);
6733 mixer_indication_xconnect_from (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6736 mixer_indication_xconnect_to (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6741 ec_indication (Id, plci, plci->RData[0].P, plci->RData[0].PLength);
6752 if ((plci->RData[0].PLength != 0)
6753 && ((plci->B2_prot == B2_V120_ASYNC)
6754 || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
6755 || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
6758 sendf(plci->appl,_DATA_B3_I,Id,0,
6760 plci->RData[1].P,
6761 (plci->NL.RNum < 2) ? 0 : plci->RData[1].PLength,
6762 plci->RNum,
6763 plci->RFlags);
6769 sendf(plci->appl,_DATA_B3_I,Id,0,
6771 plci->RData[0].P,
6772 plci->RData[0].PLength,
6773 plci->RNum,
6774 plci->RFlags);
6782 if((plci->NL.Ind &0x0f)==N_CONNECT ||
6783 (plci->NL.Ind &0x0f)==N_CONNECT_ACK ||
6784 (plci->NL.Ind &0x0f)==N_DISC ||
6785 (plci->NL.Ind &0x0f)==N_EDATA ||
6786 (plci->NL.Ind &0x0f)==N_DISC_ACK)
6789 plci->ncpi_buffer[0] = 0;
6790 switch (plci->B3_prot) {
6796 for(i=0; i<plci->NL.RLength; i++) plci->ncpi_buffer[4+i] = plci->NL.RBuffer->P[i];
6797 plci->ncpi_buffer[0] = (byte)(i+3);
6798 plci->ncpi_buffer[1] = (byte)(plci->NL.Ind &N_D_BIT? 1:0);
6799 plci->ncpi_buffer[2] = 0;
6800 plci->ncpi_buffer[3] = 0;
6804 if(plci->NL.RLength>=sizeof(T30_INFO))
6806 dbug(1,dprintf("FaxStatus %04x", ((T30_INFO *)plci->NL.RBuffer->P)->code));
6808 PUT_WORD(&(plci->ncpi_buffer[1]),((T30_INFO *)plci->NL.RBuffer->P)->rate_div_2400 * 2400);
6809 fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
6810 i = (((T30_INFO *)plci->NL.RBuffer->P)->resolution & T30_RESOLUTION_R8_0770_OR_200) ? 0x0001 : 0x0000;
6811 if (plci->B3_prot == 5)
6825 PUT_WORD(&(plci->ncpi_buffer[3]),i);
6826 PUT_WORD(&(plci->ncpi_buffer[5]),((T30_INFO *)plci->NL.RBuffer->P)->data_format);
6827 plci->ncpi_buffer[7] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_low;
6828 plci->ncpi_buffer[8] = ((T30_INFO *)plci->NL.RBuffer->P)->pages_high;
6829 plci->ncpi_buffer[len] = 0;
6830 if(((T30_INFO *)plci->NL.RBuffer->P)->station_id_len)
6832 plci->ncpi_buffer[len] = 20;
6834 plci->ncpi_buffer[++len] = ((T30_INFO *)plci->NL.RBuffer->P)->station_id[i];
6836 if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
6838 if (((T30_INFO *)plci->NL.RBuffer->P)->code < ARRAY_SIZE(fax_info))
6839 info = fax_info[((T30_INFO *)plci->NL.RBuffer->P)->code];
6844 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
6847 i = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len;
6848 while (i < plci->NL.RBuffer->length)
6849 plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++];
6852 plci->ncpi_buffer[0] = len;
6853 fax_feature_bits = GET_WORD(&((T30_INFO *)plci->NL.RBuffer->P)->feature_bits_low);
6854 PUT_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->feature_bits_low, fax_feature_bits);
6856 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_IND;
6857 if (((plci->NL.Ind &0x0f) == N_CONNECT_ACK)
6858 || (((plci->NL.Ind &0x0f) == N_CONNECT)
6860 || (((plci->NL.Ind &0x0f) == N_EDATA)
6861 && ((((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_TRAIN_OK)
6862 || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
6863 || (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DTC))))
6865 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT;
6867 if (((plci->NL.Ind &0x0f) == N_DISC)
6868 || ((plci->NL.Ind &0x0f) == N_DISC_ACK)
6869 || (((plci->NL.Ind &0x0f) == N_EDATA)
6870 && (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_EOP_CAPI)))
6872 plci->ncpi_state |= NCPI_VALID_CONNECT_B3_ACT | NCPI_VALID_DISC_B3_IND;
6878 if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
6880 if (plci->NL.RLength != 0)
6882 info = rtp_info[plci->NL.RBuffer->P[0]];
6883 plci->ncpi_buffer[0] = plci->NL.RLength - 1;
6884 for (i = 1; i < plci->NL.RLength; i++)
6885 plci->ncpi_buffer[i] = plci->NL.RBuffer->P[i];
6891 plci->NL.RNR = 2;
6893 switch(plci->NL.Ind &0x0f) {
6895 if ((plci->B3_prot == 4) || (plci->B3_prot == 5))
6898 ((T30_INFO *)plci->NL.RBuffer->P)->code));
6899 fax_send_edata_ack = (((T30_INFO *)(plci->fax_connect_info_buffer))->operating_mode == T30_OPERATING_MODE_CAPI_NEG);
6901 if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
6902 && (plci->nsf_control_bits & (T30_NSF_CONTROL_BIT_NEGOTIATE_IND | T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
6903 && (((T30_INFO *)plci->NL.RBuffer->P)->code == EDATA_T30_DIS)
6905 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6906 && !(plci->ncpi_state & NCPI_NEGOTIATE_B3_SENT))
6908 ((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
6909 sendf(plci->appl,_MANUFACTURER_I,Id,0,"dwbS",_DI_MANU_ID,_DI_NEGOTIATE_B3,
6910 (byte)(plci->ncpi_buffer[0] + 1), plci->ncpi_buffer);
6911 plci->ncpi_state |= NCPI_NEGOTIATE_B3_SENT;
6912 if (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)
6918 switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
6922 && !(GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) & T30_CONTROL_BIT_REQUEST_POLLING)
6923 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6924 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6927 if (plci->B3_prot == 4)
6928 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
6930 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6931 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6937 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6938 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6940 if (plci->B3_prot == 4)
6941 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
6943 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6944 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6951 sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",GOOD,plci->ncpi_buffer);
6953 plci->ncpi_state = 0;
6961 switch (((T30_INFO *)plci->NL.RBuffer->P)->code)
6965 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
6966 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
6968 if (plci->B3_prot == 4)
6969 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
6971 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
6972 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
6979 ((T30_INFO *)(plci->fax_connect_info_buffer))->code = ((T30_INFO *)plci->NL.RBuffer->P)->code;
6980 plci->fax_edata_ack_length = 1;
6981 start_internal_command (Id, plci, fax_edata_ack_command);
6992 ncci = get_ncci (plci, ch, 0);
6995 dbug(1,dprintf("N_CONNECT: ch=%d state=%d plci=%lx plci_Id=%lx plci_State=%d",
6996 ch, a->ncci_state[ncci], a->ncci_plci[ncci], plci->Id, plci->State));
7000 plci->channels++;
7001 else if (plci->B3_prot == 1)
7005 if(plci->B3_prot == 4)
7006 sendf(plci->appl,msg,Id,0,"s","");
7008 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
7012 if (plci->internal_command_queue[0]
7013 && ((plci->adjust_b_state == ADJUST_B_CONNECT_2)
7014 || (plci->adjust_b_state == ADJUST_B_CONNECT_3)
7015 || (plci->adjust_b_state == ADJUST_B_CONNECT_4)))
7017 (*(plci->internal_command_queue[0]))(Id, plci, 0);
7018 if (!plci->internal_command)
7019 next_internal_command (Id, plci);
7023 if (plci->B3_prot == 1)
7028 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
7030 else if ((plci->B3_prot == 4) || (plci->B3_prot == 5) || (plci->B3_prot == 7))
7033 && (plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
7034 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
7037 if (plci->B3_prot == 4)
7038 sendf(plci->appl,msg,Id,0,"s","");
7040 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
7041 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
7047 sendf(plci->appl,msg,Id,0,"S",plci->ncpi_buffer);
7049 if (plci->adjust_b_restore)
7051 plci->adjust_b_restore = false;
7052 start_internal_command (Id, plci, adjust_b_restore);
7057 if (plci->internal_command_queue[0]
7058 && ((plci->internal_command == FAX_DISCONNECT_COMMAND_1)
7059 || (plci->internal_command == FAX_DISCONNECT_COMMAND_2)
7060 || (plci->internal_command == FAX_DISCONNECT_COMMAND_3)))
7062 (*(plci->internal_command_queue[0]))(Id, plci, 0);
7063 if (!plci->internal_command)
7064 next_internal_command (Id, plci);
7067 ncci_remove (plci, ncci, false);
7073 for(i=0; plci->inc_dis_ncci_table[i]; i++);
7074 plci->inc_dis_ncci_table[i] = (byte) ncci;
7077 if (!plci->channels
7078 && (plci->B1_resource == 16)
7079 && (plci->State <= CONNECTED))
7082 i = ((T30_INFO *)plci->fax_connect_info_buffer)->rate_div_2400 * 2400;
7083 PUT_WORD (&plci->ncpi_buffer[1], i);
7084 PUT_WORD (&plci->ncpi_buffer[3], 0);
7085 i = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
7086 PUT_WORD (&plci->ncpi_buffer[5], i);
7087 PUT_WORD (&plci->ncpi_buffer[7], 0);
7088 plci->ncpi_buffer[len] = 0;
7089 plci->ncpi_buffer[0] = len;
7090 if(plci->B3_prot == 4)
7091 sendf(plci->appl,_CONNECT_B3_I,Id,0,"s","");
7095 if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1])
7098 plci->ncpi_buffer[++len] = 0;
7099 plci->ncpi_buffer[++len] = 0;
7100 plci->ncpi_buffer[++len] = 0;
7101 plci->ncpi_buffer[0] = len;
7104 sendf(plci->appl,_CONNECT_B3_I,Id,0,"S",plci->ncpi_buffer);
7106 sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",info,plci->ncpi_buffer);
7107 plci->ncpi_state = 0;
7108 sig_req(plci,HANGUP,0);
7109 send_req(plci);
7110 plci->State = OUTG_DIS_PENDING;
7114 && ((plci->B3_prot == 4) || (plci->B3_prot == 5))
7119 if (plci->channels)
7120 plci->channels--;
7121 if((plci->State==IDLE || plci->State==SUSPENDING) && !plci->channels){
7122 if(plci->State == SUSPENDING){
7123 sendf(plci->appl,
7128 sendf(plci->appl, _DISCONNECT_I, Id & 0xffffL, 0, "w", 0);
7130 plci_remove(plci);
7131 plci->State=IDLE;
7135 else if (plci->channels)
7137 sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",info,plci->ncpi_buffer);
7138 plci->ncpi_state = 0;
7140 && ((plci->B3_prot != B3_T90NL) && (plci->B3_prot != B3_ISO8208) && (plci->B3_prot != B3_X25_DCE)))
7142 sig_req(plci,HANGUP,0);
7143 send_req(plci);
7144 plci->State = OUTG_DIS_PENDING;
7150 sendf(plci->appl,_RESET_B3_I,Id,0,"S",plci->ncpi_buffer);
7154 sendf(plci->appl,_RESET_B3_I,Id,0,"S",plci->ncpi_buffer);
7158 if (!(udata_forwarding_table[plci->NL.RBuffer->P[0] >> 5] & (1L << (plci->NL.RBuffer->P[0] & 0x1f))))
7160 plci->RData[0].P = plci->internal_ind_buffer + (-((int)(long)(plci->internal_ind_buffer)) & 3);
7161 plci->RData[0].PLength = INTERNAL_IND_BUFFER_SIZE;
7162 plci->NL.R = plci->RData;
7163 plci->NL.RNum = 1;
7168 if (((a->ncci_state[ncci] != CONNECTED) && (plci->B2_prot == 1)) /* transparent */
7172 plci->NL.RNR = 2;
7180 plci->NL.RNR = 1; /* flow control */
7181 channel_x_off (plci, ch, 0);
7201 plci->NL.RNR = 1;
7205 plci->NL.RNR = 2;
7208 channel_x_off (plci, ch, 0);
7217 plci->RData[0].P = ReceiveBufferGet(APPLptr,Num);
7218 if(!plci->RData[0].P) {
7219 plci->NL.RNR = 1;
7220 channel_x_off (plci, ch, 0);
7225 APPLptr->DataFlags[Num] = (plci->Id<<8) | (plci->NL.Ind>>4);
7228 plci->RNum = Num;
7229 plci->RFlags = plci->NL.Ind>>4;
7230 plci->RData[0].PLength = APPLptr->MaxDataLength;
7231 plci->NL.R = plci->RData;
7232 if ((plci->NL.RLength != 0)
7233 && ((plci->B2_prot == B2_V120_ASYNC)
7234 || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
7235 || (plci->B2_prot == B2_V120_BIT_TRANSPARENT)))
7237 plci->RData[1].P = plci->RData[0].P;
7238 plci->RData[1].PLength = plci->RData[0].PLength;
7239 plci->RData[0].P = v120_header_buffer + (-((unsigned long)v120_header_buffer) & 3);
7240 if ((plci->NL.RBuffer->P[0] & V120_HEADER_EXTEND_BIT) || (plci->NL.RLength == 1))
7241 plci->RData[0].PLength = 1;
7243 plci->RData[0].PLength = 2;
7244 if (plci->NL.RBuffer->P[0] & V120_HEADER_BREAK_BIT)
7245 plci->RFlags |= 0x0010;
7246 if (plci->NL.RBuffer->P[0] & (V120_HEADER_C1_BIT | V120_HEADER_C2_BIT))
7247 plci->RFlags |= 0x8000;
7248 plci->NL.RNum = 2;
7252 if((plci->NL.Ind &0x0f)==N_UDATA)
7253 plci->RFlags |= 0x0010;
7255 else if ((plci->B3_prot == B3_RTP) && ((plci->NL.Ind & 0x0f) == N_BDATA))
7256 plci->RFlags |= 0x0001;
7258 plci->NL.RNum = 1;
7262 data_ack (plci, ch);
7265 plci->NL.RNR = 2;
7277 PLCI * plci;
7280 for(i=0;i<a->max_plci && a->plci[i].Id;i++);
7285 plci = &a->plci[i];
7286 plci->Id = (byte)(i+1);
7288 plci->Sig.Id = 0;
7289 plci->NL.Id = 0;
7290 plci->sig_req = 0;
7291 plci->nl_req = 0;
7293 plci->appl = NULL;
7294 plci->relatedPTYPLCI = NULL;
7295 plci->State = IDLE;
7296 plci->SuppState = IDLE;
7297 plci->channels = 0;
7298 plci->tel = 0;
7299 plci->B1_resource = 0;
7300 plci->B2_prot = 0;
7301 plci->B3_prot = 0;
7303 plci->command = 0;
7304 plci->m_command = 0;
7305 init_internal_command_queue (plci);
7306 plci->number = 0;
7307 plci->req_in_start = 0;
7308 plci->req_in = 0;
7309 plci->req_out = 0;
7310 plci->msg_in_write_pos = MSG_IN_QUEUE_SIZE;
7311 plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
7312 plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
7314 plci->data_sent = false;
7315 plci->send_disc = 0;
7316 plci->sig_global_req = 0;
7317 plci->sig_remove_id = 0;
7318 plci->nl_global_req = 0;
7319 plci->nl_remove_id = 0;
7320 plci->adv_nl = 0;
7321 plci->manufacturer = false;
7322 plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
7323 plci->spoofed_msg = 0;
7324 plci->ptyState = 0;
7325 plci->cr_enquiry = false;
7326 plci->hangup_flow_ctrl_timer = 0;
7328 plci->ncci_ring_list = 0;
7329 for(j=0;j<MAX_CHANNELS_PER_PLCI;j++) plci->inc_dis_ncci_table[j] = 0;
7330 clear_c_ind_mask (plci);
7331 set_group_ind_mask (plci);
7332 plci->fax_connect_info_length = 0;
7333 plci->nsf_control_bits = 0;
7334 plci->ncpi_state = 0x00;
7335 plci->ncpi_buffer[0] = 0;
7337 plci->requested_options_conn = 0;
7338 plci->requested_options = 0;
7339 plci->notifiedcall = 0;
7340 plci->vswitchstate = 0;
7341 plci->vsprot = 0;
7342 plci->vsprotdialect = 0;
7343 init_b1_config (plci);
7344 dbug(1,dprintf("get_plci(%x)",plci->Id));
7352 static void add_p(PLCI * plci, byte code, byte * p)
7358 add_ie(plci, code, p, p_length);
7364 static void add_s(PLCI * plci, byte code, API_PARSE * p)
7366 if(p) add_ie(plci, code, p->info, (word)p->length);
7372 static void add_ss(PLCI * plci, byte code, API_PARSE * p)
7380 add_ie(plci, p->info[i-1], (byte *)&(p->info[i]), (word)p->info[i]);
7407 static void add_ie(PLCI * plci, byte code, byte * p, word p_length)
7413 if(plci->req_in==plci->req_in_start) {
7414 plci->req_in +=2;
7417 plci->req_in--;
7419 plci->RBuffer[plci->req_in++] = code;
7422 plci->RBuffer[plci->req_in++] = (byte)p_length;
7423 for(i=0;i<p_length;i++) plci->RBuffer[plci->req_in++] = p[1+i];
7426 plci->RBuffer[plci->req_in++] = 0;
7433 static void add_d(PLCI *plci, word length, byte *p)
7437 if(plci->req_in==plci->req_in_start) {
7438 plci->req_in +=2;
7441 plci->req_in--;
7443 for(i=0;i<length;i++) plci->RBuffer[plci->req_in++] = p[i];
7451 static void add_ai(PLCI *plci, API_PARSE *ai)
7463 add_s (plci,KEY,&ai_parms[1]);
7464 add_s (plci,UUI,&ai_parms[2]);
7465 add_ss(plci,FTY,&ai_parms[3]);
7472 static word add_b1(PLCI *plci, API_PARSE *bp, word b_channel_info,
7492 api_save_msg(bp, "s", &plci->B_protocol);
7495 plci->B1_resource = 0;
7496 adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
7497 add_p(plci, CAI, "\x01\x00");
7502 if(plci->tel == CODEC_PERMANENT) return 0;
7503 else if(plci->tel == CODEC){
7504 plci->B1_resource = 1;
7505 adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
7506 add_p(plci, CAI, "\x01\x01");
7510 else if(plci->tel == ADV_VOICE){
7511 plci->B1_resource = add_b1_facilities (plci, 9, (word)(b1_facilities | B1_FACILITY_VOICE));
7512 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities | B1_FACILITY_VOICE));
7513 voice_cai[1] = plci->B1_resource;
7514 PUT_WORD (&voice_cai[5], plci->appl->MaxDataLength);
7515 add_p(plci, CAI, voice_cai);
7519 plci->call_dir &= ~(CALL_DIR_ORIGINATE | CALL_DIR_ANSWER);
7520 if (plci->call_dir & CALL_DIR_OUT)
7521 plci->call_dir |= CALL_DIR_ORIGINATE;
7522 else if (plci->call_dir & CALL_DIR_IN)
7523 plci->call_dir |= CALL_DIR_ANSWER;
7526 plci->B1_resource = 0x5;
7527 adjust_b1_facilities (plci, plci->B1_resource, b1_facilities);
7528 add_p(plci, CAI, "\x01\x05");
7558 plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
7561 plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
7565 dbug(1,dprintf("call_dir=%04x", plci->call_dir));
7569 && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
7571 plci->B1_resource = add_b1_facilities (plci, 31, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7572 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7573 cai[1] = plci->B1_resource;
7577 PUT_WORD(&cai[5],plci->appl->MaxDataLength);
7581 add_p(plci, CAI, cai);
7587 && (plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))
7589 plci->B1_resource = add_b1_facilities (plci, 35/* PIAFS HARDWARE FACILITY */, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7590 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7591 cai[1] = plci->B1_resource;
7595 PUT_WORD(&cai[5],plci->appl->MaxDataLength);
7597 add_p(plci, CAI, cai);
7603 || (!((1L << GET_WORD(bp_parms[0].info)) & plci->adapter->profile.B1_Protocols)
7605 || !((1L << B1_HDLC) & plci->adapter->profile.B1_Protocols)
7610 plci->B1_resource = add_b1_facilities (plci, resource[GET_WORD(bp_parms[0].info)],
7612 adjust_b1_facilities (plci, plci->B1_resource, (word)(b1_facilities & ~B1_FACILITY_VOICE));
7614 cai[1] = plci->B1_resource;
7695 if (((plci->call_dir & CALL_DIR_ORIGINATE) != 0) ^ ((plci->call_dir & CALL_DIR_OUT) != 0))
7741 if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_V18))
7744 plci->requested_options |= 1L << PRIVATE_V18;
7747 plci->requested_options |= 1L << PRIVATE_VOWN;
7749 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
7925 PUT_WORD(&cai[5],plci->appl->MaxDataLength);
7929 add_p(plci, CAI, cai);
7937 static word add_b23(PLCI *plci, API_PARSE *bp)
7967 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
7969 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
7974 if (plci->rx_dma_descriptor <= 0) {
7975 plci->rx_dma_descriptor=diva_get_dma_descriptor(plci,&plci->rx_dma_magic);
7976 if (plci->rx_dma_descriptor >= 0)
7977 plci->rx_dma_descriptor++;
7979 if (plci->rx_dma_descriptor > 0) {
7982 lli[2] = (byte)(plci->rx_dma_descriptor - 1);
7983 lli[3] = (byte)plci->rx_dma_magic;
7984 lli[4] = (byte)(plci->rx_dma_magic >> 8);
7985 lli[5] = (byte)(plci->rx_dma_magic >> 16);
7986 lli[6] = (byte)(plci->rx_dma_magic >> 24);
7990 if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
7995 api_save_msg(bp, "s", &plci->B_protocol);
7997 if(!bp->length && plci->tel)
7999 plci->adv_nl = true;
8001 add_p(plci,LLI,lli);
8002 plci->B2_prot = 1 /*XPARENT*/;
8003 plci->B3_prot = 0 /*XPARENT*/;
8006 add_p(plci, LLC, llc);
8008 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
8009 add_p(plci, DLC, dlc);
8016 add_p(plci,LLI,lli);
8017 plci->B2_prot = 0 /*X.75 */;
8018 plci->B3_prot = 0 /*XPARENT*/;
8021 add_p(plci, LLC, llc);
8023 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
8024 add_p(plci, DLC, dlc);
8045 if(plci->tel==ADV_VOICE) /* transparent B on advanced voice */
8049 plci->adv_nl = true;
8051 else if(plci->tel) return _B2_NOT_SUPPORTED;
8056 && (plci->adapter->man_profile.private_options & (1L << PRIVATE_RTP)))
8058 add_p(plci,LLI,lli);
8059 plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
8060 plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
8061 llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ? 14 : 13;
8063 add_p(plci, LLC, llc);
8065 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
8075 add_p(plci, DLC, dlc);
8079 add_p(plci, NLC, nlc);
8086 || (!((1L << GET_WORD(bp_parms[1].info)) & plci->adapter->profile.B2_Protocols)
8088 || !(plci->adapter->man_profile.private_options & (1L << PRIVATE_PIAFS)))))
8094 || !((1L << GET_WORD(bp_parms[2].info)) & plci->adapter->profile.B3_Protocols))
8103 return (add_modem_b23 (plci, bp_parms));
8106 add_p(plci,LLI,lli);
8108 plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
8109 plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
8110 if(plci->B2_prot==12) SAPI = 0; /* default SAPI D-channel */
8121 plci->call_dir = (plci->call_dir & ~CALL_DIR_ANSWER) | CALL_DIR_ORIGINATE;
8124 plci->call_dir = (plci->call_dir & ~CALL_DIR_ORIGINATE) | CALL_DIR_ANSWER;
8128 dbug(1,dprintf("call_dir=%04x", plci->call_dir));
8131 if (plci->B2_prot == B2_PIAFS)
8136 llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
8141 add_p(plci, LLC, llc);
8144 PUT_WORD(&dlc[1], plci->appl->MaxDataLength +
8149 if(plci->B3_prot == 4
8150 || plci->B3_prot == 5)
8154 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
8167 if (plci->B3_prot != B3_TRANSPARENT)
8174 PUT_WORD(&dlc[1],plci->appl->MaxDataLength);
8211 add_p(plci, DLC, dlc);
8217 if (plci->B3_prot != B3_TRANSPARENT)
8284 if( (b2_config->length>=2) && (plci->B2_prot==12) )
8348 add_p(plci, DLC, dlc);
8353 if(plci->B3_prot == 4
8354 || plci->B3_prot == 5)
8362 ((plci->B3_prot == 4) && (((byte)(GET_WORD((byte *)b3_config_parms[1].info))) != 5))) ? T30_RESOLUTION_R8_0770_OR_200 : 0);
8367 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
8370 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8383 if(plci->B3_prot == 5)
8393 if (plci->fax_connect_info_length != 0)
8395 ((T30_INFO *)&nlc[1])->resolution = ((T30_INFO *)plci->fax_connect_info_buffer)->resolution;
8396 ((T30_INFO *)&nlc[1])->data_format = ((T30_INFO *)plci->fax_connect_info_buffer)->data_format;
8397 ((T30_INFO *)&nlc[1])->recording_properties = ((T30_INFO *)plci->fax_connect_info_buffer)->recording_properties;
8398 fax_control_bits |= GET_WORD(&((T30_INFO *)plci->fax_connect_info_buffer)->control_bits_low) &
8451 plci->nsf_control_bits = 0;
8452 if(plci->B3_prot == 5)
8454 if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
8457 plci->requested_options |= 1L << PRIVATE_FAX_SUB_SEP_PWD;
8459 if ((plci->adapter->man_profile.private_options & (1L << PRIVATE_FAX_NONSTANDARD))
8462 plci->requested_options |= 1L << PRIVATE_FAX_NONSTANDARD;
8464 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8467 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8476 if (pos < plci->fax_connect_info_length)
8478 for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
8479 nlc[++len] = plci->fax_connect_info_buffer[pos++];
8483 if (pos < plci->fax_connect_info_length)
8485 for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
8486 nlc[++len] = plci->fax_connect_info_buffer[pos++];
8490 if ((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[plci->appl->Id-1])
8493 if ((pos < plci->fax_connect_info_length) && (plci->fax_connect_info_buffer[pos] != 0))
8495 if ((plci->fax_connect_info_buffer[pos] >= 3) && (plci->fax_connect_info_buffer[pos+1] >= 2))
8496 plci->nsf_control_bits = GET_WORD(&plci->fax_connect_info_buffer[pos+2]);
8497 for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--)
8498 nlc[++len] = plci->fax_connect_info_buffer[pos++];
8510 plci->nsf_control_bits = GET_WORD(&b3_config_parms[4].info[2]);
8518 if ((plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF)
8519 && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP))
8529 plci->fax_connect_info_buffer[i] = nlc[1+i];
8530 ((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0;
8533 plci->fax_connect_info_buffer[len++] = nlc[++i];
8534 plci->fax_connect_info_length = len;
8552 if (plci->B3_prot == 4
8553 || plci->B3_prot == 5 /*T.30 - FAX*/ ) return _B3_PARM_NOT_SUPPORTED;
8555 add_p(plci, NLC, nlc);
8574 static word add_modem_b23 (PLCI * plci, API_PARSE* bp_parms)
8599 plci->B2_prot = (byte) GET_WORD(bp_parms[1].info);
8600 plci->B3_prot = (byte) GET_WORD(bp_parms[2].info);
8617 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)
8619 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_OOB_CHANNEL)
8624 if (plci->rx_dma_descriptor <= 0) {
8625 plci->rx_dma_descriptor=diva_get_dma_descriptor(plci,&plci->rx_dma_magic);
8626 if (plci->rx_dma_descriptor >= 0)
8627 plci->rx_dma_descriptor++;
8629 if (plci->rx_dma_descriptor > 0) {
8632 lli[2] = (byte)(plci->rx_dma_descriptor - 1);
8633 lli[3] = (byte)plci->rx_dma_magic;
8634 lli[4] = (byte)(plci->rx_dma_magic >> 8);
8635 lli[5] = (byte)(plci->rx_dma_magic >> 16);
8636 lli[6] = (byte)(plci->rx_dma_magic >> 24);
8640 if (DIVA_CAPI_SUPPORTS_NO_CANCEL(plci->adapter)) {
8644 llc[1] = (plci->call_dir & (CALL_DIR_ORIGINATE | CALL_DIR_FORCE_OUTG_NL)) ?
8647 add_p(plci, LLI, lli);
8648 add_p(plci, LLC, llc);
8650 PUT_WORD (&dlc[i], plci->appl->MaxDataLength);
8702 add_p(plci, DLC, dlc);
8711 static void sig_req(PLCI *plci, byte req, byte Id)
8713 if(!plci) return;
8714 if(plci->adapter->adapter_disabled) return;
8717 plci->sig_remove_id = plci->Sig.Id;
8718 if(plci->req_in==plci->req_in_start) {
8719 plci->req_in +=2;
8720 plci->RBuffer[plci->req_in++] = 0;
8722 PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start-2);
8723 plci->RBuffer[plci->req_in++] = Id; /* sig/nl flag */
8724 plci->RBuffer[plci->req_in++] = req; /* request */
8725 plci->RBuffer[plci->req_in++] = 0; /* channel */
8726 plci->req_in_start = plci->req_in;
8733 static void nl_req_ncci(PLCI *plci, byte req, byte ncci)
8735 if(!plci) return;
8736 if(plci->adapter->adapter_disabled) return;
8737 dbug(1,dprintf("nl_req %02x %02x %02x", plci->Id, req, ncci));
8740 plci->nl_remove_id = plci->NL.Id;
8741 ncci_remove (plci, 0, (byte)(ncci != 0));
8744 if(plci->req_in==plci->req_in_start) {
8745 plci->req_in +=2;
8746 plci->RBuffer[plci->req_in++] = 0;
8748 PUT_WORD(&plci->RBuffer[plci->req_in_start], plci->req_in-plci->req_in_start-2);
8749 plci->RBuffer[plci->req_in++] = 1; /* sig/nl flag */
8750 plci->RBuffer[plci->req_in++] = req; /* request */
8751 plci->RBuffer[plci->req_in++] = plci->adapter->ncci_ch[ncci]; /* channel */
8752 plci->req_in_start = plci->req_in;
8755 static void send_req(PLCI *plci)
8761 if(!plci) return;
8762 if(plci->adapter->adapter_disabled) return;
8763 channel_xmit_xon (plci);
8766 if(plci->req_in==plci->req_out) return;
8767 dbug(1,dprintf("send_req(in=%d,out=%d)",plci->req_in,plci->req_out));
8769 if(plci->nl_req || plci->sig_req) return;
8771 l = GET_WORD(&plci->RBuffer[plci->req_out]);
8772 plci->req_out += 2;
8773 plci->XData[0].P = &plci->RBuffer[plci->req_out];
8774 plci->req_out += l;
8775 if(plci->RBuffer[plci->req_out]==1)
8777 e = &plci->NL;
8778 plci->req_out++;
8779 e->Req = plci->nl_req = plci->RBuffer[plci->req_out++];
8780 e->ReqCh = plci->RBuffer[plci->req_out++];
8784 plci->RBuffer[plci->req_out-4] = CAI;
8785 plci->RBuffer[plci->req_out-3] = 1;
8786 plci->RBuffer[plci->req_out-2] = (plci->Sig.Id==0xff) ? 0 : plci->Sig.Id;
8787 plci->RBuffer[plci->req_out-1] = 0;
8789 plci->nl_global_req = plci->nl_req;
8791 dbug(1,dprintf("%x:NLREQ(%x:%x:%x)",plci->adapter->Id,e->Id,e->Req,e->ReqCh));
8795 e = &plci->Sig;
8796 if(plci->RBuffer[plci->req_out])
8797 e->Id = plci->RBuffer[plci->req_out];
8798 plci->req_out++;
8799 e->Req = plci->sig_req = plci->RBuffer[plci->req_out++];
8800 e->ReqCh = plci->RBuffer[plci->req_out++];
8802 plci->sig_global_req = plci->sig_req;
8803 dbug(1,dprintf("%x:SIGREQ(%x:%x:%x)",plci->adapter->Id,e->Id,e->Req,e->ReqCh));
8805 plci->XData[0].PLength = l;
8806 e->X = plci->XData;
8807 plci->adapter->request(e);
8811 static void send_data(PLCI *plci)
8818 if (!plci->nl_req && plci->ncci_ring_list)
8820 a = plci->adapter;
8821 ncci = plci->ncci_ring_list;
8833 || (plci->send_disc == ncci))
8836 if ((plci->B2_prot == B2_V120_ASYNC)
8837 || (plci->B2_prot == B2_V120_ASYNC_V42BIS)
8838 || (plci->B2_prot == B2_V120_BIT_TRANSPARENT))
8840 plci->NData[1].P = TransmitBufferGet (plci->appl, data->P);
8841 plci->NData[1].PLength = data->Length;
8843 plci->NData[0].P = v120_break_header;
8845 plci->NData[0].P = v120_default_header;
8846 plci->NData[0].PLength = 1 ;
8847 plci->NL.XNum = 2;
8848 plci->NL.Req = plci->nl_req = (byte)((data->Flags&0x07)<<4 |N_DATA);
8852 plci->NData[0].P = TransmitBufferGet (plci->appl, data->P);
8853 plci->NData[0].PLength = data->Length;
8855 plci->NL.Req = plci->nl_req = (byte)N_UDATA;
8857 else if ((plci->B3_prot == B3_RTP) && (data->Flags & 0x01))
8858 plci->NL.Req = plci->nl_req = (byte)N_BDATA;
8861 plci->NL.Req = plci->nl_req = (byte)((data->Flags&0x07)<<4 |N_DATA);
8863 plci->NL.X = plci->NData;
8864 plci->NL.ReqCh = a->ncci_ch[ncci];
8865 dbug(1,dprintf("%x:DREQ(%x:%x)",a->Id,plci->NL.Id,plci->NL.Req));
8866 plci->data_sent = true;
8867 plci->data_sent_ptr = data->P;
8868 a->request(&plci->NL);
8871 cleanup_ncci_data (plci, ncci);
8874 else if (plci->send_disc == ncci)
8877 plci->NData[0].PLength = 0;
8878 plci->NL.ReqCh = a->ncci_ch[ncci];
8879 plci->NL.Req = plci->nl_req = N_DISC;
8880 a->request(&plci->NL);
8881 plci->command = _DISCONNECT_B3_R;
8882 plci->send_disc = 0;
8885 } while (!plci->nl_req && (ncci != plci->ncci_ring_list));
8886 plci->ncci_ring_list = ncci;
8893 PLCI * plci;
8901 plci = &(a->plci[i]);
8902 if(plci->notifiedcall) activnotifiedcalls++;
8909 plci = &a->plci[j-1];
8910 plci->State = LISTENING;
8912 add_p(plci,OAD,"\x01\xfd");
8914 add_p(plci,KEY,"\x04\x43\x41\x32\x30");
8916 add_p(plci,CAI,"\x01\xc0");
8917 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
8918 add_p(plci,LLI,"\x01\xc4"); /* support Dummy CR FAC + MWI + SpoofNotify */
8919 add_p(plci,SHIFT|6,NULL);
8920 add_p(plci,SIN,"\x02\x00\x00");
8921 plci->internal_command = LISTEN_SIG_ASSIGN_PEND; /* do indicate_req if OK */
8922 sig_req(plci,ASSIGN,DSIG_ID);
8923 send_req(plci);
8933 static void IndParse(PLCI *plci, word *parms_id, byte **parms, byte multiIEsize)
8947 in = plci->Sig.RBuffer->P;
8957 while(ploc<plci->Sig.RBuffer->length-1) {
9095 static void SetVoiceChannel(PLCI *plci, byte *chi, DIVA_CAPI_ADAPTER *a)
9103 add_p(plci,FTY,"\x02\x01\x07"); /* B On, default on 1 */
9104 add_p(plci,ESC,voice_chi); /* Channel */
9105 sig_req(plci,TEL_CTRL,0);
9106 send_req(plci);
9113 static void VoiceChannelOff(PLCI *plci)
9116 add_p(plci,FTY,"\x02\x01\x08"); /* B Off */
9117 sig_req(plci,TEL_CTRL,0);
9118 send_req(plci);
9119 if(plci->adapter->AdvSignalPLCI)
9121 adv_voice_clear_config (plci->adapter->AdvSignalPLCI);
9126 static word AdvCodecSupport(DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl,
9134 /* the advanced codec plci is just for internal use */
9147 if(plci!=NULL)
9149 a->AdvSignalPLCI = plci;
9150 plci->tel=ADV_VOICE;
9156 splci = &a->plci[j-1];
9166 if(plci)
9168 plci->spoofed_msg = SPOOFING_REQUIRED;
9172 if(plci!=NULL)
9174 a->AdvSignalPLCI = plci;
9175 plci->tel=ADV_VOICE;
9198 if(plci!=NULL) plci->tel = CODEC;
9205 splci = &a->plci[j-1];
9223 static void CodecIdCheck(DIVA_CAPI_ADAPTER *a, PLCI *plci)
9228 if(a->AdvSignalPLCI == plci)
9327 splci = &a->plci[j-1];
9344 PLCI *plci;
9376 plci = &a->plci[j];
9377 if(plci->Id) /* if plci owns no application */
9379 if(plci->State==INC_CON_PENDING
9380 || plci->State==INC_CON_ALERT)
9382 if(test_c_ind_mask_bit (plci, (word)(Id-1)))
9384 clear_c_ind_mask_bit (plci, (word)(Id-1));
9385 if(c_ind_mask_empty (plci))
9387 sig_req(plci,HANGUP,0);
9388 send_req(plci);
9389 plci->State = OUTG_DIS_PENDING;
9393 if(test_c_ind_mask_bit (plci, (word)(Id-1)))
9395 clear_c_ind_mask_bit (plci, (word)(Id-1));
9396 if(c_ind_mask_empty (plci))
9398 if(!plci->appl)
9400 plci_remove(plci);
9401 plci->State = IDLE;
9405 if(plci->appl==this)
9407 plci->appl = NULL;
9408 plci_remove(plci);
9409 plci->State = IDLE;
9421 plci = &a->plci[j-1];
9422 plci->command = 0;
9423 add_p(plci,OAD,"\x01\xfd");
9424 add_p(plci,CAI,"\x01\x80");
9425 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
9426 add_p(plci,SHIFT|6,NULL);
9427 add_p(plci,SIN,"\x02\x00\x00");
9428 plci->internal_command = REM_L1_SIG_ASSIGN_PEND;
9429 sig_req(plci,ASSIGN,DSIG_ID);
9430 add_p(plci,FTY,"\x02\xff\x06"); /* l1 down */
9431 sig_req(plci,SIG_CTRL,0);
9432 send_req(plci);
9458 static word plci_remove_check(PLCI *plci)
9460 if(!plci) return true;
9461 if(!plci->NL.Id && c_ind_mask_empty (plci))
9463 if(plci->Sig.Id == 0xff)
9464 plci->Sig.Id = 0;
9465 if(!plci->Sig.Id)
9467 dbug(1,dprintf("plci_remove_complete(%x)",plci->Id));
9468 dbug(1,dprintf("tel=0x%x,Sig=0x%x",plci->tel,plci->Sig.Id));
9469 if (plci->Id)
9471 CodecIdCheck(plci->adapter, plci);
9472 clear_b1_config (plci);
9473 ncci_remove (plci, 0, false);
9474 plci_free_msg_in_queue (plci);
9475 channel_flow_control_remove (plci);
9476 plci->Id = 0;
9477 plci->State = IDLE;
9478 plci->channels = 0;
9479 plci->appl = NULL;
9480 plci->notifiedcall = 0;
9482 listen_check(plci->adapter);
9492 static byte plci_nl_busy (PLCI *plci)
9495 return (plci->nl_req
9496 || (plci->ncci_ring_list
9497 && plci->adapter->ncci_ch[plci->ncci_ring_list]
9498 && (plci->adapter->ch_flow_control[plci->adapter->ncci_ch[plci->ncci_ring_list]] & N_OK_FC_PENDING)));
9594 static void dtmf_enable_receiver (PLCI *plci, byte enable_mask)
9599 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9604 min_digit_duration = (plci->dtmf_rec_pulse_ms == 0) ? 40 : plci->dtmf_rec_pulse_ms;
9605 min_gap_duration = (plci->dtmf_rec_pause_ms == 0) ? 40 : plci->dtmf_rec_pause_ms;
9606 plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_ENABLE_RECEIVER;
9607 PUT_WORD (&plci->internal_req_buffer[1], min_digit_duration);
9608 PUT_WORD (&plci->internal_req_buffer[3], min_gap_duration);
9609 plci->NData[0].PLength = 5;
9611 PUT_WORD (&plci->internal_req_buffer[5], INTERNAL_IND_BUFFER_SIZE);
9612 plci->NData[0].PLength += 2;
9613 capidtmf_recv_enable (&(plci->capidtmf_state), min_digit_duration, min_gap_duration);
9618 plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_DISABLE_RECEIVER;
9619 plci->NData[0].PLength = 1;
9621 capidtmf_recv_disable (&(plci->capidtmf_state));
9624 plci->NData[0].P = plci->internal_req_buffer;
9625 plci->NL.X = plci->NData;
9626 plci->NL.ReqCh = 0;
9627 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
9628 plci->adapter->request (&plci->NL);
9632 static void dtmf_send_digits (PLCI *plci, byte *digit_buffer, word digit_count)
9637 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9640 plci->internal_req_buffer[0] = DTMF_UDATA_REQUEST_SEND_DIGITS;
9641 w = (plci->dtmf_send_pulse_ms == 0) ? 40 : plci->dtmf_send_pulse_ms;
9642 PUT_WORD (&plci->internal_req_buffer[1], w);
9643 w = (plci->dtmf_send_pause_ms == 0) ? 40 : plci->dtmf_send_pause_ms;
9644 PUT_WORD (&plci->internal_req_buffer[3], w);
9653 plci->internal_req_buffer[5+i] = (w < DTMF_DIGIT_MAP_ENTRIES) ?
9656 plci->NData[0].PLength = 5 + digit_count;
9657 plci->NData[0].P = plci->internal_req_buffer;
9658 plci->NL.X = plci->NData;
9659 plci->NL.ReqCh = 0;
9660 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
9661 plci->adapter->request (&plci->NL);
9665 static void dtmf_rec_clear_config (PLCI *plci)
9669 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9672 plci->dtmf_rec_active = 0;
9673 plci->dtmf_rec_pulse_ms = 0;
9674 plci->dtmf_rec_pause_ms = 0;
9676 capidtmf_init (&(plci->capidtmf_state), plci->adapter->u_law);
9681 static void dtmf_send_clear_config (PLCI *plci)
9685 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
9688 plci->dtmf_send_requests = 0;
9689 plci->dtmf_send_pulse_ms = 0;
9690 plci->dtmf_send_pause_ms = 0;
9694 static void dtmf_prepare_switch (dword Id, PLCI *plci)
9700 while (plci->dtmf_send_requests != 0)
9701 dtmf_confirmation (Id, plci);
9705 static word dtmf_save_config (dword Id, PLCI *plci, byte Rc)
9709 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
9715 static word dtmf_restore_config (dword Id, PLCI *plci, byte Rc)
9720 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
9723 if (plci->B1_facilities & B1_FACILITY_DTMFR)
9725 switch (plci->adjust_b_state)
9728 plci->internal_command = plci->adjust_b_command;
9729 if (plci_nl_busy (plci))
9731 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
9734 dtmf_enable_receiver (plci, plci->dtmf_rec_active);
9735 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_2;
9752 static void dtmf_command (dword Id, PLCI *plci, byte Rc)
9759 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
9760 plci->dtmf_cmd, plci->dtmf_rec_pulse_ms, plci->dtmf_rec_pause_ms,
9761 plci->dtmf_send_pulse_ms, plci->dtmf_send_pause_ms));
9766 internal_command = plci->internal_command;
9767 plci->internal_command = 0;
9769 switch (plci->dtmf_cmd)
9781 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
9784 if (adjust_b_process (Id, plci, Rc) != GOOD)
9791 if (plci->internal_command)
9794 if (plci_nl_busy (plci))
9796 plci->internal_command = DTMF_COMMAND_2;
9799 plci->internal_command = DTMF_COMMAND_3;
9800 dtmf_enable_receiver (plci, (byte)(plci->dtmf_rec_active | mask));
9811 plci->tone_last_indication_code = DTMF_SIGNAL_NO_TONE;
9813 plci->dtmf_rec_active |= mask;
9828 plci->dtmf_rec_active &= ~mask;
9829 if (plci->dtmf_rec_active)
9833 if (plci->dtmf_rec_active)
9835 if (plci_nl_busy (plci))
9837 plci->internal_command = DTMF_COMMAND_1;
9840 plci->dtmf_rec_active &= ~mask;
9841 plci->internal_command = DTMF_COMMAND_2;
9842 dtmf_enable_receiver (plci, false);
9855 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
9858 if (adjust_b_process (Id, plci, Rc) != GOOD)
9865 if (plci->internal_command)
9881 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
9882 ((plci->dtmf_parameter_length != 0) ? B1_FACILITY_DTMFX | B1_FACILITY_DTMFR : B1_FACILITY_DTMFX)),
9885 if (adjust_b_process (Id, plci, Rc) != GOOD)
9892 if (plci->internal_command)
9895 if (plci_nl_busy (plci))
9897 plci->internal_command = DTMF_COMMAND_2;
9900 plci->dtmf_msg_number_queue[(plci->dtmf_send_requests)++] = plci->number;
9901 plci->internal_command = DTMF_COMMAND_3;
9902 dtmf_send_digits (plci, &plci->saved_msg.parms[3].info[1], plci->saved_msg.parms[3].length);
9909 if (plci->dtmf_send_requests != 0)
9910 (plci->dtmf_send_requests)--;
9918 sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
9923 static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg)
9985 else if (plci == NULL)
9993 if (!plci->State
9994 || !plci->NL.Id || plci->nl_remove_id)
10002 plci->command = 0;
10003 plci->dtmf_cmd = GET_WORD (dtmf_parms[0].info);
10005 switch (plci->dtmf_cmd)
10014 if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id-1])
10037 plci->dtmf_rec_pulse_ms = 0;
10038 plci->dtmf_rec_pause_ms = 0;
10042 plci->dtmf_rec_pulse_ms = GET_WORD (dtmf_parms[1].info);
10043 plci->dtmf_rec_pause_ms = GET_WORD (dtmf_parms[2].info);
10046 start_internal_command (Id, plci, dtmf_command);
10054 if (!((plci->requested_options_conn | plci->requested_options | plci->adapter->requested_options_table[appl->Id-1])
10073 plci->dtmf_send_pulse_ms = GET_WORD (dtmf_parms[1].info);
10074 plci->dtmf_send_pause_ms = GET_WORD (dtmf_parms[2].info);
10096 if (plci->dtmf_send_requests >= ARRAY_SIZE(plci->dtmf_msg_number_queue))
10103 api_save_msg (dtmf_parms, "wwws", &plci->saved_msg);
10104 start_internal_command (Id, plci, dtmf_command);
10109 UnMapId (Id), (char *)(FILE_), __LINE__, plci->dtmf_cmd));
10120 static void dtmf_confirmation (dword Id, PLCI *plci)
10132 if (plci->dtmf_send_requests != 0)
10134 sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->dtmf_msg_number_queue[0],
10136 (plci->dtmf_send_requests)--;
10137 for (i = 0; i < plci->dtmf_send_requests; i++)
10138 plci->dtmf_msg_number_queue[i] = plci->dtmf_msg_number_queue[i+1];
10143 static void dtmf_indication (dword Id, PLCI *plci, byte *msg, word length)
10156 || ((dtmf_digit_map[j].listen_mask & plci->dtmf_rec_active) == 0)))
10164 && (plci->tone_last_indication_code == DTMF_SIGNAL_NO_TONE)
10176 plci->tone_last_indication_code = dtmf_digit_map[j].character;
10184 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "wS", SELECTOR_DTMF, msg);
10193 static void dtmf_parameter_write (PLCI *plci)
10199 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10202 parameter_buffer[0] = plci->dtmf_parameter_length + 1;
10204 for (i = 0; i < plci->dtmf_parameter_length; i++)
10205 parameter_buffer[2+i] = plci->dtmf_parameter_buffer[i];
10206 add_p (plci, FTY, parameter_buffer);
10207 sig_req (plci, TEL_CTRL, 0);
10208 send_req (plci);
10212 static void dtmf_parameter_clear_config (PLCI *plci)
10216 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10219 plci->dtmf_parameter_length = 0;
10223 static void dtmf_parameter_prepare_switch (dword Id, PLCI *plci)
10232 static word dtmf_parameter_save_config (dword Id, PLCI *plci, byte Rc)
10236 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
10242 static word dtmf_parameter_restore_config (dword Id, PLCI *plci, byte Rc)
10247 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
10250 if ((plci->B1_facilities & B1_FACILITY_DTMFR)
10251 && (plci->dtmf_parameter_length != 0))
10253 switch (plci->adjust_b_state)
10256 plci->internal_command = plci->adjust_b_command;
10257 if (plci->sig_req)
10259 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
10262 dtmf_parameter_write (plci);
10263 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_2;
10398 static void mixer_set_bchannel_id_esc (PLCI *plci, byte bchannel_id)
10404 a = plci->adapter;
10405 old_id = plci->li_bchannel_id;
10408 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10409 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10410 plci->li_bchannel_id = (bchannel_id & 0x1f) + 1;
10411 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10412 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10418 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10419 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10420 plci->li_bchannel_id = bchannel_id & 0x03;
10421 if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
10424 if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
10427 && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
10429 li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
10431 splci->li_bchannel_id = 3 - plci->li_bchannel_id;
10432 li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
10438 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10439 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10442 if ((old_id == 0) && (plci->li_bchannel_id != 0)
10443 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
10445 mixer_clear_config (plci);
10448 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10449 (char *)(FILE_), __LINE__, bchannel_id, plci->li_bchannel_id));
10453 static void mixer_set_bchannel_id (PLCI *plci, byte *chi)
10459 a = plci->adapter;
10460 old_id = plci->li_bchannel_id;
10466 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10467 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10468 plci->li_bchannel_id = (ch & 0x1f) + 1;
10469 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10470 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10476 if ((old_id != 0) && (li_config_table[a->li_base + (old_id - 1)].plci == plci))
10477 li_config_table[a->li_base + (old_id - 1)].plci = NULL;
10478 plci->li_bchannel_id = ch & 0x1f;
10479 if ((a->AdvSignalPLCI != NULL) && (a->AdvSignalPLCI != plci) && (a->AdvSignalPLCI->tel == ADV_VOICE))
10482 if (li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci == NULL)
10485 && (li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci == splci))
10487 li_config_table[a->li_base + (splci->li_bchannel_id - 1)].plci = NULL;
10489 splci->li_bchannel_id = 3 - plci->li_bchannel_id;
10490 li_config_table[a->li_base + (2 - plci->li_bchannel_id)].plci = splci;
10496 if (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == NULL)
10497 li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci = plci;
10501 if ((old_id == 0) && (plci->li_bchannel_id != 0)
10502 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
10504 mixer_clear_config (plci);
10507 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10508 (char *)(FILE_), __LINE__, ch, plci->li_bchannel_id));
10875 static void xconnect_query_addresses (PLCI *plci)
10882 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10885 a = plci->adapter;
10886 if (a->li_pri && ((plci->li_bchannel_id == 0)
10887 || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci)))
10890 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10894 p = plci->internal_req_buffer;
10895 ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
10903 plci->NData[0].P = plci->internal_req_buffer;
10904 plci->NData[0].PLength = p - plci->internal_req_buffer;
10905 plci->NL.X = plci->NData;
10906 plci->NL.ReqCh = 0;
10907 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
10908 plci->adapter->request (&plci->NL);
10912 static void xconnect_write_coefs (PLCI *plci, word internal_command)
10916 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
10919 plci->li_write_command = internal_command;
10920 plci->li_write_channel = 0;
10924 static byte xconnect_write_coefs_process (dword Id, PLCI *plci, byte Rc)
10934 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->li_write_channel));
10936 a = plci->adapter;
10937 if ((plci->li_bchannel_id == 0)
10938 || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
10944 i = a->li_base + (plci->li_bchannel_id - 1);
10945 j = plci->li_write_channel;
10946 p = plci->internal_req_buffer;
10993 plci->internal_command = plci->li_write_command;
10994 if (plci_nl_busy (plci))
10996 to_ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
11045 && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
11070 && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
11074 plci->internal_command = plci->li_write_command;
11075 if (plci_nl_busy (plci))
11092 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
11105 if (plci->li_bchannel_id == 2)
11136 w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
11151 plci->internal_command = plci->li_write_command;
11152 if (plci_nl_busy (plci))
11168 *(p++) = (byte)((plci->li_bchannel_id - 1) | mixer_write_prog_pri[n].line_flags);
11180 *(p++) = (byte)((plci->li_bchannel_id - 1) | MIXER_COEF_LINE_ROW_FLAG | mixer_write_prog_pri[n].line_flags);
11198 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI)
11211 if (plci->li_bchannel_id == 2)
11237 w = (plci == a->AdvSignalPLCI) ? n : mixer_swapped_index_bri[n];
11248 plci->li_write_channel = j;
11249 if (p != plci->internal_req_buffer)
11251 plci->NData[0].P = plci->internal_req_buffer;
11252 plci->NData[0].PLength = p - plci->internal_req_buffer;
11253 plci->NL.X = plci->NData;
11254 plci->NL.ReqCh = 0;
11255 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
11256 plci->adapter->request (&plci->NL);
11262 static void mixer_notify_update (PLCI *plci, byte others)
11270 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
11273 a = plci->adapter;
11277 plci->li_notify_update = true;
11284 while ((i < li_total_channels) && (li_config_table[i].plci == NULL))
11287 notify_plci = li_config_table[i++].plci;
11291 if ((plci->li_bchannel_id != 0)
11292 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11294 notify_plci = plci;
11309 ((CAPI_MSG *) msg)->header.plci = notify_plci->Id;
11321 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
11330 plci->li_notify_update = false;
11335 static void mixer_clear_config (PLCI *plci)
11341 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
11344 plci->li_notify_update = false;
11345 plci->li_plci_b_write_pos = 0;
11346 plci->li_plci_b_read_pos = 0;
11347 plci->li_plci_b_req_pos = 0;
11348 a = plci->adapter;
11349 if ((plci->li_bchannel_id != 0)
11350 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11352 i = a->li_base + (plci->li_bchannel_id - 1);
11366 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
11368 i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
11381 i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
11399 static void mixer_prepare_switch (dword Id, PLCI *plci)
11407 mixer_indication_coefs_set (Id, plci);
11408 } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
11412 static word mixer_save_config (dword Id, PLCI *plci, byte Rc)
11418 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
11420 a = plci->adapter;
11421 if ((plci->li_bchannel_id != 0)
11422 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11424 i = a->li_base + (plci->li_bchannel_id - 1);
11437 static word mixer_restore_config (dword Id, PLCI *plci, byte Rc)
11443 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
11446 a = plci->adapter;
11447 if ((plci->B1_facilities & B1_FACILITY_MIXER)
11448 && (plci->li_bchannel_id != 0)
11449 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
11451 switch (plci->adjust_b_state)
11456 plci->internal_command = plci->adjust_b_command;
11457 if (plci_nl_busy (plci))
11459 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
11462 xconnect_query_addresses (plci);
11463 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_2;
11466 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
11480 if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
11481 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_3;
11482 else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)
11483 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
11487 if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
11488 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_4;
11489 else if (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
11490 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_5;
11492 if (plci->adjust_b_state != ADJUST_B_RESTORE_MIXER_5)
11494 plci->internal_command = plci->adjust_b_command;
11498 xconnect_write_coefs (plci, plci->adjust_b_command);
11499 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_6;
11502 if (!xconnect_write_coefs_process (Id, plci, Rc))
11509 if (plci->internal_command)
11511 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_7;
11520 static void mixer_command (dword Id, PLCI *plci, byte Rc)
11526 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
11527 plci->li_cmd));
11530 a = plci->adapter;
11531 internal_command = plci->internal_command;
11532 plci->internal_command = 0;
11533 switch (plci->li_cmd)
11541 if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11543 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
11547 if (plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11549 if (adjust_b_process (Id, plci, Rc) != GOOD)
11556 if (plci->internal_command)
11559 plci->li_plci_b_req_pos = plci->li_plci_b_write_pos;
11560 if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11561 || ((get_b1_facilities (plci, plci->B1_resource) & B1_FACILITY_MIXER)
11562 && (add_b1_facilities (plci, plci->B1_resource, (word)(plci->B1_facilities &
11563 ~B1_FACILITY_MIXER)) == plci->B1_resource)))
11565 xconnect_write_coefs (plci, MIXER_COMMAND_2);
11571 mixer_indication_coefs_set (Id, plci);
11572 } while (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos);
11575 if ((plci->li_channel_bits & LI_CHANNEL_INVOLVED)
11576 || ((get_b1_facilities (plci, plci->B1_resource) & B1_FACILITY_MIXER)
11577 && (add_b1_facilities (plci, plci->B1_resource, (word)(plci->B1_facilities &
11578 ~B1_FACILITY_MIXER)) == plci->B1_resource)))
11580 if (!xconnect_write_coefs_process (Id, plci, Rc))
11584 if (plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
11588 plci->li_plci_b_write_pos = (plci->li_plci_b_write_pos == 0) ?
11589 LI_PLCI_B_QUEUE_ENTRIES-1 : plci->li_plci_b_write_pos - 1;
11590 i = (plci->li_plci_b_write_pos == 0) ?
11591 LI_PLCI_B_QUEUE_ENTRIES-1 : plci->li_plci_b_write_pos - 1;
11592 } while ((plci->li_plci_b_write_pos != plci->li_plci_b_req_pos)
11593 && !(plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG));
11598 if (plci->internal_command)
11601 if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
11603 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
11607 if (!(plci->li_channel_bits & LI_CHANNEL_INVOLVED))
11609 if (adjust_b_process (Id, plci, Rc) != GOOD)
11616 if (plci->internal_command)
11623 if ((plci->li_bchannel_id == 0)
11624 || (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci != plci))
11627 UnMapId (Id), (char *)(FILE_), __LINE__, (int)(plci->li_bchannel_id)));
11631 i = a->li_base + (plci->li_bchannel_id - 1);
11632 li_config_table[i].curchnl = plci->li_channel_bits;
11633 if (!a->li_pri && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
11635 i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
11636 li_config_table[i].curchnl = plci->li_channel_bits;
11639 i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
11640 li_config_table[i].curchnl = plci->li_channel_bits;
11647 static void li_update_connect (dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
11655 plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
11656 ch_a = a->li_base + (plci->li_bchannel_id - 1);
11657 if (!a->li_pri && (plci->tel == ADV_VOICE)
11658 && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
11662 a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
11790 static void li2_update_connect (dword Id, DIVA_CAPI_ADAPTER *a, PLCI *plci,
11798 plci_b = &(a_b->plci[((plci_b_id >> 8) & 0xff) - 1]);
11799 ch_a = a->li_base + (plci->li_bchannel_id - 1);
11800 if (!a->li_pri && (plci->tel == ADV_VOICE)
11801 && (plci == a->AdvSignalPLCI) && (Id & EXT_CONTROLLER))
11805 a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id) : ch_a_v;
11898 static word li_check_main_plci (dword Id, PLCI *plci)
11900 if (plci == NULL)
11906 if (!plci->State
11907 || !plci->NL.Id || plci->nl_remove_id
11908 || (plci->li_bchannel_id == 0))
11914 li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = plci;
11919 static PLCI *li_check_plci_b (dword Id, PLCI *plci,
11925 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
11926 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
11949 plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
11959 li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci = plci_b;
11961 ((byte)(UnMapController (plci->adapter->Id) & ~EXT_CONTROLLER))
11962 && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
11982 static PLCI *li2_check_plci_b (dword Id, PLCI *plci,
11988 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
11989 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
12012 plci_b = &(adapter[ctlr_b - 1].plci[((plci_b_id >> 8) & 0xff) - 1]);
12016 || (li_config_table[plci_b->adapter->li_base + (plci_b->li_bchannel_id - 1)].plci != plci_b))
12024 ((byte)(UnMapController (plci->adapter->Id) & ~EXT_CONTROLLER))
12025 && (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
12045 static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg)
12171 Info = li_check_main_plci (Id, plci);
12178 result = plci->saved_msg.info;
12181 plci_b_write_pos = plci->li_plci_b_write_pos;
12182 plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
12185 li_update_connect (Id, a, plci, plci_b_id, true, li_flags);
12186 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_LAST_FLAG;
12188 plci->li_plci_b_write_pos = plci_b_write_pos;
12201 Info = li_check_main_plci (Id, plci);
12208 result = plci->saved_msg.info;
12211 plci_b_write_pos = plci->li_plci_b_write_pos;
12214 li2_update_connect (Id, a, plci, UnMapId (Id), true, li_flags);
12247 plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
12250 li2_update_connect (Id, a, plci, plci_b_id, true, li_flags);
12251 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id |
12263 if ((plci_b_write_pos == plci->li_plci_b_read_pos)
12264 || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
12266 plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
12270 plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
12271 plci->li_plci_b_write_pos = plci_b_write_pos;
12274 plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
12275 mixer_notify_update (plci, true);
12278 plci->command = 0;
12279 plci->li_cmd = GET_WORD (li_parms[0].info);
12280 start_internal_command (Id, plci, mixer_command);
12295 Info = li_check_main_plci (Id, plci);
12302 result = plci->saved_msg.info;
12305 plci_b_write_pos = plci->li_plci_b_write_pos;
12306 plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
12309 li_update_connect (Id, a, plci, plci_b_id, false, 0);
12310 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG | LI_PLCI_B_LAST_FLAG;
12312 plci->li_plci_b_write_pos = plci_b_write_pos;
12324 Info = li_check_main_plci (Id, plci);
12331 result = plci->saved_msg.info;
12334 plci_b_write_pos = plci->li_plci_b_write_pos;
12368 plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
12371 li2_update_connect (Id, a, plci, plci_b_id, false, 0);
12372 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
12382 if ((plci_b_write_pos == plci->li_plci_b_read_pos)
12383 || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
12385 plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
12389 plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
12390 plci->li_plci_b_write_pos = plci_b_write_pos;
12393 plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
12394 mixer_notify_update (plci, true);
12397 plci->command = 0;
12398 plci->li_cmd = GET_WORD (li_parms[0].info);
12399 start_internal_command (Id, plci, mixer_command);
12403 if (!plci || !plci->State
12404 || !plci->NL.Id || plci->nl_remove_id
12405 || (plci->li_bchannel_id == 0)
12406 || (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci != plci))
12412 plci_b_write_pos = plci->li_plci_b_write_pos;
12413 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
12414 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 2)
12421 if ((plci_b_write_pos == plci->li_plci_b_read_pos)
12422 || (plci->li_plci_b_queue[i] & LI_PLCI_B_LAST_FLAG))
12424 plci->li_plci_b_queue[plci_b_write_pos] = LI_PLCI_B_SKIP_FLAG | LI_PLCI_B_LAST_FLAG;
12428 plci->li_plci_b_queue[i] |= LI_PLCI_B_LAST_FLAG;
12429 plci->li_plci_b_write_pos = plci_b_write_pos;
12430 plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
12431 plci->command = 0;
12432 plci->li_cmd = GET_WORD (li_parms[0].info);
12433 start_internal_command (Id, plci, mixer_command);
12448 static void mixer_indication_coefs_set (dword Id, PLCI *plci)
12457 a = plci->adapter;
12458 if (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos)
12462 d = plci->li_plci_b_queue[plci->li_plci_b_read_pos];
12465 if (plci->appl->appl_flags & APPL_FLAG_OLD_LI_SPEC)
12500 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0,
12503 plci->li_plci_b_read_pos = (plci->li_plci_b_read_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ?
12504 0 : plci->li_plci_b_read_pos + 1;
12505 } while (!(d & LI_PLCI_B_LAST_FLAG) && (plci->li_plci_b_read_pos != plci->li_plci_b_req_pos));
12510 static void mixer_indication_xconnect_from (dword Id, PLCI *plci, byte *msg, word length)
12519 a = plci->adapter;
12528 if (!a->li_pri && (plci->li_bchannel_id == 2))
12540 if (plci->internal_command_queue[0]
12541 && ((plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_2)
12542 || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_3)
12543 || (plci->adjust_b_state == ADJUST_B_RESTORE_MIXER_4)))
12545 (*(plci->internal_command_queue[0]))(Id, plci, 0);
12546 if (!plci->internal_command)
12547 next_internal_command (Id, plci);
12549 mixer_notify_update (plci, true);
12553 static void mixer_indication_xconnect_to (dword Id, PLCI *plci, byte *msg, word length)
12562 static byte mixer_notify_source_removed (PLCI *plci, dword plci_b_id)
12566 plci_b_write_pos = plci->li_plci_b_write_pos;
12567 if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
12568 LI_PLCI_B_QUEUE_ENTRIES + plci->li_plci_b_read_pos) - plci_b_write_pos - 1 < 1)
12571 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12575 plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
12577 plci->li_plci_b_write_pos = plci_b_write_pos;
12582 static void mixer_remove (PLCI *plci)
12590 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12593 a = plci->adapter;
12594 plci_b_id = (plci->Id << 8) | UnMapController (plci->adapter->Id);
12597 if ((plci->li_bchannel_id != 0)
12598 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
12600 i = a->li_base + (plci->li_bchannel_id - 1);
12608 notify_plci = li_config_table[j].plci;
12610 && (notify_plci != plci)
12620 mixer_clear_config (plci);
12622 mixer_notify_update (plci, true);
12624 li_config_table[i].plci = NULL;
12625 plci->li_bchannel_id = 0;
12636 static void ec_write_parameters (PLCI *plci)
12642 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12647 PUT_WORD (&parameter_buffer[2], plci->ec_idi_options);
12648 plci->ec_idi_options &= ~LEC_RESET_COEFFICIENTS;
12649 w = (plci->ec_tail_length == 0) ? 128 : plci->ec_tail_length;
12651 add_p (plci, FTY, parameter_buffer);
12652 sig_req (plci, TEL_CTRL, 0);
12653 send_req (plci);
12657 static void ec_clear_config (PLCI *plci)
12661 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
12664 plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
12666 plci->ec_tail_length = 0;
12670 static void ec_prepare_switch (dword Id, PLCI *plci)
12679 static word ec_save_config (dword Id, PLCI *plci, byte Rc)
12683 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
12689 static word ec_restore_config (dword Id, PLCI *plci, byte Rc)
12694 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
12697 if (plci->B1_facilities & B1_FACILITY_EC)
12699 switch (plci->adjust_b_state)
12702 plci->internal_command = plci->adjust_b_command;
12703 if (plci->sig_req)
12705 plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
12708 ec_write_parameters (plci);
12709 plci->adjust_b_state = ADJUST_B_RESTORE_EC_2;
12726 static void ec_command (dword Id, PLCI *plci, byte Rc)
12732 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command,
12733 plci->ec_cmd, plci->ec_idi_options, plci->ec_tail_length));
12736 if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
12744 PUT_WORD (&result[1], plci->ec_cmd);
12748 internal_command = plci->internal_command;
12749 plci->internal_command = 0;
12750 switch (plci->ec_cmd)
12759 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities |
12762 if (adjust_b_process (Id, plci, Rc) != GOOD)
12769 if (plci->internal_command)
12772 if (plci->sig_req)
12774 plci->internal_command = EC_COMMAND_2;
12777 plci->internal_command = EC_COMMAND_3;
12778 ec_write_parameters (plci);
12797 if (plci->B1_facilities & B1_FACILITY_EC)
12799 if (plci->sig_req)
12801 plci->internal_command = EC_COMMAND_1;
12804 plci->internal_command = EC_COMMAND_2;
12805 ec_write_parameters (plci);
12817 adjust_b1_resource (Id, plci, NULL, (word)(plci->B1_facilities &
12820 if (adjust_b_process (Id, plci, Rc) != GOOD)
12827 if (plci->internal_command)
12833 sendf (plci->appl, _FACILITY_R | CONFIRM, Id & 0xffffL, plci->number,
12834 "wws", Info, (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
12839 static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER *a, PLCI *plci, APPL *appl, API_PARSE *msg)
12869 if (plci == NULL)
12875 else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
12883 plci->command = 0;
12884 plci->ec_cmd = GET_WORD (ec_parms[0].info);
12885 plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
12891 plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
12894 plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
12896 plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
12898 plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
12901 plci->ec_tail_length = GET_WORD (&ec_parms[0].info[4]);
12904 switch (plci->ec_cmd)
12907 plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
12908 start_internal_command (Id, plci, ec_command);
12912 plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
12915 start_internal_command (Id, plci, ec_command);
12919 plci->ec_idi_options |= LEC_FREEZE_COEFFICIENTS;
12920 start_internal_command (Id, plci, ec_command);
12924 plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
12925 start_internal_command (Id, plci, ec_command);
12929 plci->ec_idi_options |= LEC_RESET_COEFFICIENTS;
12930 start_internal_command (Id, plci, ec_command);
12935 UnMapId (Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
12961 else if (plci == NULL)
12967 else if (!plci->State || !plci->NL.Id || plci->nl_remove_id)
12975 plci->command = 0;
12976 plci->ec_cmd = GET_WORD (ec_parms[0].info);
12977 plci->ec_idi_options &= ~(LEC_MANUAL_DISABLE | LEC_RESET_COEFFICIENTS);
12979 PUT_WORD (&result[1], plci->ec_cmd);
12982 plci->ec_idi_options &= ~(LEC_ENABLE_NONLINEAR_PROCESSING |
12984 plci->ec_tail_length = 0;
12989 plci->ec_idi_options |= LEC_ENABLE_NONLINEAR_PROCESSING;
12991 plci->ec_idi_options |= LEC_ENABLE_2100HZ_DETECTOR;
12993 plci->ec_idi_options |= LEC_REQUIRE_2100HZ_REVERSALS;
12996 plci->ec_tail_length = GET_WORD (&ec_parms[1].info[3]);
12999 switch (plci->ec_cmd)
13002 plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
13003 start_internal_command (Id, plci, ec_command);
13007 plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
13010 start_internal_command (Id, plci, ec_command);
13015 UnMapId (Id), (char *)(FILE_), __LINE__, plci->ec_cmd));
13029 static void ec_indication (dword Id, PLCI *plci, byte *msg, word length)
13036 if (!(plci->ec_idi_options & LEC_MANUAL_DISABLE))
13038 if (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC)
13074 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", (plci->appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
13085 static void adv_voice_write_coefs (PLCI *plci, word write_command)
13097 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13100 a = plci->adapter;
13117 if (!a->li_pri && (plci->li_bchannel_id == 0))
13119 if ((li_config_table[a->li_base].plci == NULL) && (li_config_table[a->li_base + 1].plci != NULL))
13121 plci->li_bchannel_id = 1;
13122 li_config_table[a->li_base].plci = plci;
13124 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13125 (char *)(FILE_), __LINE__, plci->li_bchannel_id));
13127 else if ((li_config_table[a->li_base].plci != NULL) && (li_config_table[a->li_base + 1].plci == NULL))
13129 plci->li_bchannel_id = 2;
13130 li_config_table[a->li_base + 1].plci = plci;
13132 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13133 (char *)(FILE_), __LINE__, plci->li_bchannel_id));
13136 if (!a->li_pri && (plci->li_bchannel_id != 0)
13137 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
13139 i = a->li_base + (plci->li_bchannel_id - 1);
13143 j = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
13144 k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
13145 if (!(plci->B1_facilities & B1_FACILITY_MIXER))
13170 k = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
13178 k = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
13188 if (plci->B1_facilities & B1_FACILITY_MIXER)
13201 ch_map[j] = (byte)(j + (plci->li_bchannel_id - 1));
13202 ch_map[j+1] = (byte)(j + (2 - plci->li_bchannel_id));
13234 add_p (plci, FTY, coef_buffer);
13235 sig_req (plci, TEL_CTRL, 0);
13236 send_req (plci);
13240 static void adv_voice_clear_config (PLCI *plci)
13248 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13251 a = plci->adapter;
13252 if ((plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
13256 if (!a->li_pri && (plci->li_bchannel_id != 0)
13257 && (li_config_table[a->li_base + (plci->li_bchannel_id - 1)].plci == plci))
13259 i = a->li_base + (plci->li_bchannel_id - 1);
13271 i = a->li_base + MIXER_IC_CHANNEL_BASE + (plci->li_bchannel_id - 1);
13284 i = a->li_base + MIXER_IC_CHANNEL_BASE + (2 - plci->li_bchannel_id);
13302 static void adv_voice_prepare_switch (dword Id, PLCI *plci)
13311 static word adv_voice_save_config (dword Id, PLCI *plci, byte Rc)
13315 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
13321 static word adv_voice_restore_config (dword Id, PLCI *plci, byte Rc)
13327 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
13330 a = plci->adapter;
13331 if ((plci->B1_facilities & B1_FACILITY_VOICE)
13332 && (plci->tel == ADV_VOICE) && (plci == a->AdvSignalPLCI))
13334 switch (plci->adjust_b_state)
13337 plci->internal_command = plci->adjust_b_command;
13338 if (plci->sig_req)
13340 plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
13343 adv_voice_write_coefs (plci, ADV_VOICE_WRITE_UPDATE);
13344 plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_2;
13411 static word get_b1_facilities (PLCI * plci, byte b1_resource)
13419 if (!(((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
13420 || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id-1] & (1L << PRIVATE_DTMF_TONE)))))
13423 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND)
13425 if (plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)
13431 if (plci->adapter->manufacturer_features & (MANUFACTURER_FEATURE_V18 | MANUFACTURER_FEATURE_VOWN))
13436 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13443 static byte add_b1_facilities (PLCI * plci, byte b1_resource, word b1_facilities)
13488 && (((plci->requested_options_conn | plci->requested_options) & (1L << PRIVATE_DTMF_TONE))
13489 || (plci->appl && (plci->adapter->requested_options_table[plci->appl->Id-1] & (1L << PRIVATE_DTMF_TONE)))))
13499 else if (((plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_HARDDTMF)
13500 && !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE))
13503 || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_RECEIVE)))
13506 || !(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_SOFTDTMF_SEND))))
13541 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13543 b1_resource, b1_facilities, b, get_b1_facilities (plci, b)));
13548 static void adjust_b1_facilities (PLCI *plci, byte new_b1_resource, word new_b1_facilities)
13553 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13555 new_b1_facilities & get_b1_facilities (plci, new_b1_resource)));
13557 new_b1_facilities &= get_b1_facilities (plci, new_b1_resource);
13558 removed_facilities = plci->B1_facilities & ~new_b1_facilities;
13561 ec_clear_config (plci);
13566 dtmf_rec_clear_config (plci);
13567 dtmf_parameter_clear_config (plci);
13570 dtmf_send_clear_config (plci);
13574 mixer_clear_config (plci);
13577 adv_voice_clear_config (plci);
13578 plci->B1_facilities = new_b1_facilities;
13582 static void adjust_b_clear (PLCI *plci)
13586 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
13589 plci->adjust_b_restore = false;
13593 static word adjust_b_process (dword Id, PLCI *plci, byte Rc)
13601 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->adjust_b_state));
13604 switch (plci->adjust_b_state)
13607 if ((plci->adjust_b_parms_msg == NULL)
13608 && (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
13609 && ((plci->adjust_b_mode & ~(ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 |
13612 b1_resource = (plci->adjust_b_mode == ADJUST_B_MODE_NO_RESOURCE) ?
13613 0 : add_b1_facilities (plci, plci->B1_resource, plci->adjust_b_facilities);
13614 if (b1_resource == plci->B1_resource)
13616 adjust_b1_facilities (plci, b1_resource, plci->adjust_b_facilities);
13619 if (plci->adjust_b_facilities & ~get_b1_facilities (plci, b1_resource))
13623 plci->B1_resource, b1_resource, plci->adjust_b_facilities));
13628 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13631 mixer_prepare_switch (Id, plci);
13634 dtmf_prepare_switch (Id, plci);
13635 dtmf_parameter_prepare_switch (Id, plci);
13638 ec_prepare_switch (Id, plci);
13640 adv_voice_prepare_switch (Id, plci);
13642 plci->adjust_b_state = ADJUST_B_SAVE_MIXER_1;
13645 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13648 Info = mixer_save_config (Id, plci, Rc);
13649 if ((Info != GOOD) || plci->internal_command)
13653 plci->adjust_b_state = ADJUST_B_SAVE_DTMF_1;
13656 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13659 Info = dtmf_save_config (Id, plci, Rc);
13660 if ((Info != GOOD) || plci->internal_command)
13664 plci->adjust_b_state = ADJUST_B_REMOVE_L23_1;
13666 if ((plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
13667 && plci->NL.Id && !plci->nl_remove_id)
13669 plci->internal_command = plci->adjust_b_command;
13670 if (plci->adjust_b_ncci != 0)
13672 ncci_ptr = &(plci->adapter->ncci[plci->adjust_b_ncci]);
13675 plci->data_sent_ptr = ncci_ptr->DBuffer[ncci_ptr->data_out].P;
13676 data_rc (plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
13679 data_ack (plci, plci->adapter->ncci_ch[plci->adjust_b_ncci]);
13681 nl_req_ncci (plci, REMOVE,
13682 (byte)((plci->adjust_b_mode & ADJUST_B_MODE_CONNECT) ? plci->adjust_b_ncci : 0));
13683 send_req (plci);
13684 plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
13687 plci->adjust_b_state = ADJUST_B_REMOVE_L23_2;
13697 if (plci->adjust_b_mode & ADJUST_B_MODE_REMOVE_L23)
13699 if (plci_nl_busy (plci))
13701 plci->internal_command = plci->adjust_b_command;
13705 plci->adjust_b_state = ADJUST_B_SAVE_EC_1;
13708 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13711 Info = ec_save_config (Id, plci, Rc);
13712 if ((Info != GOOD) || plci->internal_command)
13716 plci->adjust_b_state = ADJUST_B_SAVE_DTMF_PARAMETER_1;
13719 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13722 Info = dtmf_parameter_save_config (Id, plci, Rc);
13723 if ((Info != GOOD) || plci->internal_command)
13727 plci->adjust_b_state = ADJUST_B_SAVE_VOICE_1;
13730 if (plci->adjust_b_mode & ADJUST_B_MODE_SAVE)
13732 Info = adv_voice_save_config (Id, plci, Rc);
13733 if ((Info != GOOD) || plci->internal_command)
13736 plci->adjust_b_state = ADJUST_B_SWITCH_L1_1;
13738 if (plci->adjust_b_mode & ADJUST_B_MODE_SWITCH_L1)
13740 if (plci->sig_req)
13742 plci->internal_command = plci->adjust_b_command;
13745 if (plci->adjust_b_parms_msg != NULL)
13746 api_load_msg (plci->adjust_b_parms_msg, bp);
13748 api_load_msg (&plci->B_protocol, bp);
13749 Info = add_b1 (plci, bp,
13750 (word)((plci->adjust_b_mode & ADJUST_B_MODE_NO_RESOURCE) ? 2 : 0),
13751 plci->adjust_b_facilities);
13756 plci->B1_resource, plci->adjust_b_facilities));
13759 plci->internal_command = plci->adjust_b_command;
13760 sig_req (plci, RESOURCES, 0);
13761 send_req (plci);
13762 plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
13765 plci->adjust_b_state = ADJUST_B_SWITCH_L1_2;
13772 Rc, plci->B1_resource, plci->adjust_b_facilities));
13776 plci->adjust_b_state = ADJUST_B_RESTORE_VOICE_1;
13780 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13782 Info = adv_voice_restore_config (Id, plci, Rc);
13783 if ((Info != GOOD) || plci->internal_command)
13786 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_PARAMETER_1;
13790 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13793 Info = dtmf_parameter_restore_config (Id, plci, Rc);
13794 if ((Info != GOOD) || plci->internal_command)
13798 plci->adjust_b_state = ADJUST_B_RESTORE_EC_1;
13802 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13805 Info = ec_restore_config (Id, plci, Rc);
13806 if ((Info != GOOD) || plci->internal_command)
13810 plci->adjust_b_state = ADJUST_B_ASSIGN_L23_1;
13812 if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
13814 if (plci_nl_busy (plci))
13816 plci->internal_command = plci->adjust_b_command;
13819 if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
13820 plci->call_dir |= CALL_DIR_FORCE_OUTG_NL;
13821 if (plci->adjust_b_parms_msg != NULL)
13822 api_load_msg (plci->adjust_b_parms_msg, bp);
13824 api_load_msg (&plci->B_protocol, bp);
13825 Info = add_b23 (plci, bp);
13832 plci->internal_command = plci->adjust_b_command;
13833 nl_req_ncci (plci, ASSIGN, 0);
13834 send_req (plci);
13835 plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
13838 plci->adjust_b_state = ADJUST_B_ASSIGN_L23_2;
13848 if (plci->adjust_b_mode & ADJUST_B_MODE_ASSIGN_L23)
13852 plci->internal_command = plci->adjust_b_command;
13856 if (plci->adjust_b_mode & ADJUST_B_MODE_USER_CONNECT)
13858 plci->adjust_b_restore = true;
13861 plci->adjust_b_state = ADJUST_B_CONNECT_1;
13863 if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
13865 plci->internal_command = plci->adjust_b_command;
13866 if (plci_nl_busy (plci))
13868 nl_req_ncci (plci, N_CONNECT, 0);
13869 send_req (plci);
13870 plci->adjust_b_state = ADJUST_B_CONNECT_2;
13873 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
13887 if (plci->adjust_b_mode & ADJUST_B_MODE_CONNECT)
13889 get_ncci (plci, (byte)(Id >> 16), plci->adjust_b_ncci);
13890 Id = (Id & 0xffff) | (((dword)(plci->adjust_b_ncci)) << 16);
13892 if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
13893 plci->adjust_b_state = ADJUST_B_CONNECT_3;
13894 else if (plci->adjust_b_state == ADJUST_B_CONNECT_4)
13895 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
13899 if (plci->adjust_b_state == ADJUST_B_CONNECT_2)
13900 plci->adjust_b_state = ADJUST_B_CONNECT_4;
13901 else if (plci->adjust_b_state == ADJUST_B_CONNECT_3)
13902 plci->adjust_b_state = ADJUST_B_RESTORE_DTMF_1;
13904 if (plci->adjust_b_state != ADJUST_B_RESTORE_DTMF_1)
13906 plci->internal_command = plci->adjust_b_command;
13912 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13915 Info = dtmf_restore_config (Id, plci, Rc);
13916 if ((Info != GOOD) || plci->internal_command)
13920 plci->adjust_b_state = ADJUST_B_RESTORE_MIXER_1;
13929 if (plci->adjust_b_mode & ADJUST_B_MODE_RESTORE)
13932 Info = mixer_restore_config (Id, plci, Rc);
13933 if ((Info != GOOD) || plci->internal_command)
13937 plci->adjust_b_state = ADJUST_B_END;
13945 static void adjust_b1_resource (dword Id, PLCI *plci, API_SAVE *bp_msg, word b1_facilities, word internal_command)
13950 plci->B1_resource, b1_facilities));
13952 plci->adjust_b_parms_msg = bp_msg;
13953 plci->adjust_b_facilities = b1_facilities;
13954 plci->adjust_b_command = internal_command;
13955 plci->adjust_b_ncci = (word)(Id >> 16);
13956 if ((bp_msg == NULL) && (plci->B1_resource == 0))
13957 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_NO_RESOURCE | ADJUST_B_MODE_SWITCH_L1;
13959 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_SWITCH_L1 | ADJUST_B_MODE_RESTORE;
13960 plci->adjust_b_state = ADJUST_B_START;
13963 plci->B1_resource, b1_facilities));
13967 static void adjust_b_restore (dword Id, PLCI *plci, byte Rc)
13972 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
13974 internal_command = plci->internal_command;
13975 plci->internal_command = 0;
13979 plci->command = 0;
13980 if (plci->req_in != 0)
13982 plci->internal_command = ADJUST_B_RESTORE_1;
13992 plci->adjust_b_parms_msg = NULL;
13993 plci->adjust_b_facilities = plci->B1_facilities;
13994 plci->adjust_b_command = ADJUST_B_RESTORE_2;
13995 plci->adjust_b_ncci = (word)(Id >> 16);
13996 plci->adjust_b_mode = ADJUST_B_MODE_RESTORE;
13997 plci->adjust_b_state = ADJUST_B_START;
14001 if (adjust_b_process (Id, plci, Rc) != GOOD)
14006 if (plci->internal_command)
14013 static void reset_b3_command (dword Id, PLCI *plci, byte Rc)
14019 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14022 internal_command = plci->internal_command;
14023 plci->internal_command = 0;
14027 plci->command = 0;
14028 plci->adjust_b_parms_msg = NULL;
14029 plci->adjust_b_facilities = plci->B1_facilities;
14030 plci->adjust_b_command = RESET_B3_COMMAND_1;
14031 plci->adjust_b_ncci = (word)(Id >> 16);
14032 plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_CONNECT;
14033 plci->adjust_b_state = ADJUST_B_START;
14037 Info = adjust_b_process (Id, plci, Rc);
14044 if (plci->internal_command)
14048 /* sendf (plci->appl, _RESET_B3_R | CONFIRM, Id, plci->number, "w", Info);*/
14049 sendf(plci->appl,_RESET_B3_I,Id,0,"s","");
14053 static void select_b_command (dword Id, PLCI *plci, byte Rc)
14060 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14063 internal_command = plci->internal_command;
14064 plci->internal_command = 0;
14068 plci->command = 0;
14069 plci->adjust_b_parms_msg = &plci->saved_msg;
14070 if ((plci->tel == ADV_VOICE) && (plci == plci->adapter->AdvSignalPLCI))
14071 plci->adjust_b_facilities = plci->B1_facilities | B1_FACILITY_VOICE;
14073 plci->adjust_b_facilities = plci->B1_facilities & ~B1_FACILITY_VOICE;
14074 plci->adjust_b_command = SELECT_B_COMMAND_1;
14075 plci->adjust_b_ncci = (word)(Id >> 16);
14076 if (plci->saved_msg.parms[0].length == 0)
14078 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
14083 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_SWITCH_L1 |
14086 plci->adjust_b_state = ADJUST_B_START;
14090 Info = adjust_b_process (Id, plci, Rc);
14097 if (plci->internal_command)
14099 if (plci->tel == ADV_VOICE)
14103 esc_chi[2] = plci->b_channel;
14104 SetVoiceChannel (plci->adapter->AdvCodecPLCI, esc_chi, plci->adapter);
14108 sendf (plci->appl, _SELECT_B_REQ | CONFIRM, Id, plci->number, "w", Info);
14112 static void fax_connect_ack_command (dword Id, PLCI *plci, byte Rc)
14118 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14121 internal_command = plci->internal_command;
14122 plci->internal_command = 0;
14126 plci->command = 0;
14128 if (plci_nl_busy (plci))
14130 plci->internal_command = FAX_CONNECT_ACK_COMMAND_1;
14133 plci->internal_command = FAX_CONNECT_ACK_COMMAND_2;
14134 plci->NData[0].P = plci->fax_connect_info_buffer;
14135 plci->NData[0].PLength = plci->fax_connect_info_length;
14136 plci->NL.X = plci->NData;
14137 plci->NL.ReqCh = 0;
14138 plci->NL.Req = plci->nl_req = (byte) N_CONNECT_ACK;
14139 plci->adapter->request (&plci->NL);
14149 if ((plci->ncpi_state & NCPI_VALID_CONNECT_B3_ACT)
14150 && !(plci->ncpi_state & NCPI_CONNECT_B3_ACT_SENT))
14152 if (plci->B3_prot == 4)
14153 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
14155 sendf(plci->appl,_CONNECT_B3_ACTIVE_I,Id,0,"S",plci->ncpi_buffer);
14156 plci->ncpi_state |= NCPI_CONNECT_B3_ACT_SENT;
14161 static void fax_edata_ack_command (dword Id, PLCI *plci, byte Rc)
14167 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14170 internal_command = plci->internal_command;
14171 plci->internal_command = 0;
14175 plci->command = 0;
14177 if (plci_nl_busy (plci))
14179 plci->internal_command = FAX_EDATA_ACK_COMMAND_1;
14182 plci->internal_command = FAX_EDATA_ACK_COMMAND_2;
14183 plci->NData[0].P = plci->fax_connect_info_buffer;
14184 plci->NData[0].PLength = plci->fax_edata_ack_length;
14185 plci->NL.X = plci->NData;
14186 plci->NL.ReqCh = 0;
14187 plci->NL.Req = plci->nl_req = (byte) N_EDATA;
14188 plci->adapter->request (&plci->NL);
14201 static void fax_connect_info_command (dword Id, PLCI *plci, byte Rc)
14207 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14210 internal_command = plci->internal_command;
14211 plci->internal_command = 0;
14215 plci->command = 0;
14217 if (plci_nl_busy (plci))
14219 plci->internal_command = FAX_CONNECT_INFO_COMMAND_1;
14222 plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
14223 plci->NData[0].P = plci->fax_connect_info_buffer;
14224 plci->NData[0].PLength = plci->fax_connect_info_length;
14225 plci->NL.X = plci->NData;
14226 plci->NL.ReqCh = 0;
14227 plci->NL.Req = plci->nl_req = (byte) N_EDATA;
14228 plci->adapter->request (&plci->NL);
14238 if (plci_nl_busy (plci))
14240 plci->internal_command = FAX_CONNECT_INFO_COMMAND_2;
14243 plci->command = _CONNECT_B3_R;
14244 nl_req_ncci (plci, N_CONNECT, 0);
14245 send_req (plci);
14248 sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
14252 static void fax_adjust_b23_command (dword Id, PLCI *plci, byte Rc)
14258 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14261 internal_command = plci->internal_command;
14262 plci->internal_command = 0;
14266 plci->command = 0;
14267 plci->adjust_b_parms_msg = NULL;
14268 plci->adjust_b_facilities = plci->B1_facilities;
14269 plci->adjust_b_command = FAX_ADJUST_B23_COMMAND_1;
14270 plci->adjust_b_ncci = (word)(Id >> 16);
14271 plci->adjust_b_mode = ADJUST_B_MODE_REMOVE_L23 | ADJUST_B_MODE_ASSIGN_L23;
14272 plci->adjust_b_state = ADJUST_B_START;
14276 Info = adjust_b_process (Id, plci, Rc);
14283 if (plci->internal_command)
14286 if (plci_nl_busy (plci))
14288 plci->internal_command = FAX_ADJUST_B23_COMMAND_2;
14291 plci->command = _CONNECT_B3_R;
14292 nl_req_ncci (plci, N_CONNECT, 0);
14293 send_req (plci);
14296 sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
14300 static void fax_disconnect_command (dword Id, PLCI *plci, byte Rc)
14305 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14307 internal_command = plci->internal_command;
14308 plci->internal_command = 0;
14312 plci->command = 0;
14313 plci->internal_command = FAX_DISCONNECT_COMMAND_1;
14329 plci->internal_command = FAX_DISCONNECT_COMMAND_2;
14335 plci->internal_command = FAX_DISCONNECT_COMMAND_3;
14343 static void rtp_connect_b3_req_command (dword Id, PLCI *plci, byte Rc)
14349 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14352 internal_command = plci->internal_command;
14353 plci->internal_command = 0;
14357 plci->command = 0;
14359 if (plci_nl_busy (plci))
14361 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_1;
14364 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
14365 nl_req_ncci (plci, N_CONNECT, 0);
14366 send_req (plci);
14376 if (plci_nl_busy (plci))
14378 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_2;
14381 plci->internal_command = RTP_CONNECT_B3_REQ_COMMAND_3;
14382 plci->NData[0].PLength = plci->internal_req_buffer[0];
14383 plci->NData[0].P = plci->internal_req_buffer + 1;
14384 plci->NL.X = plci->NData;
14385 plci->NL.ReqCh = 0;
14386 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
14387 plci->adapter->request (&plci->NL);
14392 sendf (plci->appl, _CONNECT_B3_R | CONFIRM, Id, plci->number, "w", Info);
14396 static void rtp_connect_b3_res_command (dword Id, PLCI *plci, byte Rc)
14402 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14405 internal_command = plci->internal_command;
14406 plci->internal_command = 0;
14410 plci->command = 0;
14412 if (plci_nl_busy (plci))
14414 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_1;
14417 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
14418 nl_req_ncci (plci, N_CONNECT_ACK, (byte)(Id >> 16));
14419 send_req (plci);
14429 if (plci_nl_busy (plci))
14431 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_2;
14434 sendf (plci->appl, _CONNECT_B3_ACTIVE_I, Id, 0, "s", "");
14435 plci->internal_command = RTP_CONNECT_B3_RES_COMMAND_3;
14436 plci->NData[0].PLength = plci->internal_req_buffer[0];
14437 plci->NData[0].P = plci->internal_req_buffer + 1;
14438 plci->NL.X = plci->NData;
14439 plci->NL.ReqCh = 0;
14440 plci->NL.Req = plci->nl_req = (byte) N_UDATA;
14441 plci->adapter->request (&plci->NL);
14450 static void hold_save_command (dword Id, PLCI *plci, byte Rc)
14457 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14460 internal_command = plci->internal_command;
14461 plci->internal_command = 0;
14465 if (!plci->NL.Id)
14467 plci->command = 0;
14468 plci->adjust_b_parms_msg = NULL;
14469 plci->adjust_b_facilities = plci->B1_facilities;
14470 plci->adjust_b_command = HOLD_SAVE_COMMAND_1;
14471 plci->adjust_b_ncci = (word)(Id >> 16);
14472 plci->adjust_b_mode = ADJUST_B_MODE_SAVE | ADJUST_B_MODE_REMOVE_L23;
14473 plci->adjust_b_state = ADJUST_B_START;
14477 Info = adjust_b_process (Id, plci, Rc);
14484 if (plci->internal_command)
14487 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
14491 static void retrieve_restore_command (dword Id, PLCI *plci, byte Rc)
14498 UnMapId (Id), (char *)(FILE_), __LINE__, Rc, plci->internal_command));
14501 internal_command = plci->internal_command;
14502 plci->internal_command = 0;
14506 plci->command = 0;
14507 plci->adjust_b_parms_msg = NULL;
14508 plci->adjust_b_facilities = plci->B1_facilities;
14509 plci->adjust_b_command = RETRIEVE_RESTORE_COMMAND_1;
14510 plci->adjust_b_ncci = (word)(Id >> 16);
14511 plci->adjust_b_mode = ADJUST_B_MODE_ASSIGN_L23 | ADJUST_B_MODE_USER_CONNECT | ADJUST_B_MODE_RESTORE;
14512 plci->adjust_b_state = ADJUST_B_START;
14516 Info = adjust_b_process (Id, plci, Rc);
14523 if (plci->internal_command)
14526 sendf (plci->appl, _FACILITY_I, Id & 0xffffL, 0, "ws", 3, SS_Ind);
14530 static void init_b1_config (PLCI *plci)
14534 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
14537 plci->B1_resource = 0;
14538 plci->B1_facilities = 0;
14540 plci->li_bchannel_id = 0;
14541 mixer_clear_config (plci);
14544 ec_clear_config (plci);
14547 dtmf_rec_clear_config (plci);
14548 dtmf_send_clear_config (plci);
14549 dtmf_parameter_clear_config (plci);
14551 adv_voice_clear_config (plci);
14552 adjust_b_clear (plci);
14556 static void clear_b1_config (PLCI *plci)
14560 (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
14563 adv_voice_clear_config (plci);
14564 adjust_b_clear (plci);
14566 ec_clear_config (plci);
14569 dtmf_rec_clear_config (plci);
14570 dtmf_send_clear_config (plci);
14571 dtmf_parameter_clear_config (plci);
14574 if ((plci->li_bchannel_id != 0)
14575 && (li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci == plci))
14577 mixer_clear_config (plci);
14578 li_config_table[plci->adapter->li_base + (plci->li_bchannel_id - 1)].plci = NULL;
14579 plci->li_bchannel_id = 0;
14582 plci->B1_resource = 0;
14583 plci->B1_facilities = 0;
14590 static void channel_flow_control_remove (PLCI * plci) {
14591 DIVA_CAPI_ADAPTER * a = plci->adapter;
14594 if (a->ch_flow_plci[i] == plci->Id) {
14601 static void channel_x_on (PLCI * plci, byte ch) {
14602 DIVA_CAPI_ADAPTER * a = plci->adapter;
14608 static void channel_x_off (PLCI * plci, byte ch, byte flag) {
14609 DIVA_CAPI_ADAPTER * a = plci->adapter;
14612 a->ch_flow_plci[ch] = plci->Id;
14617 static void channel_request_xon (PLCI * plci, byte ch) {
14618 DIVA_CAPI_ADAPTER * a = plci->adapter;
14627 static void channel_xmit_extended_xon (PLCI * plci) {
14632 if ((!plci) || (!plci->Id) || ((a = plci->adapter) == NULL)) {
14639 (plci->Id == a->ch_flow_plci[i])) {
14640 channel_request_xon (plci, (byte)i);
14646 channel_xmit_xon (plci);
14653 static int find_channel_with_pending_x_on (DIVA_CAPI_ADAPTER * a, PLCI * plci) {
14657 if (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)) {
14666 (plci->Id == a->ch_flow_plci[i])) {
14674 (plci->Id == a->ch_flow_plci[i])) {
14683 static void channel_xmit_xon (PLCI * plci) {
14684 DIVA_CAPI_ADAPTER * a = plci->adapter;
14687 if (plci->nl_req || !plci->NL.Id || plci->nl_remove_id) {
14690 if ((ch = (byte)find_channel_with_pending_x_on (a, plci)) == 0) {
14696 plci->NL.Req = plci->nl_req = (byte)N_XON;
14697 plci->NL.ReqCh = ch;
14698 plci->NL.X = plci->NData;
14699 plci->NL.XNum = 1;
14700 plci->NData[0].P = &plci->RBuffer[0];
14701 plci->NData[0].PLength = 0;
14703 plci->adapter->request(&plci->NL);
14706 static int channel_can_xon (PLCI * plci, byte ch) {
14714 APPLptr = plci->appl;
14715 a = plci->adapter;
14755 static void group_optimization(DIVA_CAPI_ADAPTER * a, PLCI * plci)
14763 set_group_ind_mask (plci); /* all APPLs within this inc. call are allowed to dial in */
14796 if(a->plci[k].Id)
14798 auxplci = &a->plci[k];
14854 clear_group_ind_mask_bit (plci, j); /* disable call on other group members */
14862 clear_group_ind_mask_bit (plci, i);
14875 PLCI *plci;
14898 plci = &a->plci[j-1];
14899 plci->command = 0;
14900 add_p(plci,OAD,"\x01\xfd");
14901 add_p(plci,CAI,"\x01\x80");
14902 add_p(plci,UID,"\x06\x43\x61\x70\x69\x32\x30");
14903 add_p(plci,SHIFT|6,NULL);
14904 add_p(plci,SIN,"\x02\x00\x00");
14905 plci->internal_command = START_L1_SIG_ASSIGN_PEND;
14906 sig_req(plci,ASSIGN,DSIG_ID);
14907 add_p(plci,FTY,"\x02\xff\x07"); /* l1 start */
14908 sig_req(plci,SIG_CTRL,0);
14909 send_req(plci);
14922 static void VSwitchReqInd(PLCI *plci, dword Id, byte **parms)
14934 if(!plci ||
14935 !plci->appl ||
14936 !plci->State ||
14937 plci->Sig.Ind==NCR_FACILITY
14953 if(!plci->relatedPTYPLCI ||
14954 (plci->ptyState!=S_ECT && plci->relatedPTYPLCI->ptyState!=S_ECT))
14965 plci->vswitchstate=parms[i][9];
14971 plci->vswitchstate=parms[i][9];
14979 plci->vsprot=parms[i][10]; /* protocol */
14980 plci->vsprotdialect=parms[i][11]; /* protocoldialect */
14985 plci->relatedPTYPLCI->command = 0;
14986 plci->relatedPTYPLCI->internal_command = VSWITCH_REQ_PEND;
14987 add_p(plci->relatedPTYPLCI,ESC,&parms[i][0]);
14988 sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
14989 send_req(plci->relatedPTYPLCI);
14993 if(plci->relatedPTYPLCI &&
14994 plci->vswitchstate==3 &&
14995 plci->relatedPTYPLCI->vswitchstate==3)
14997 add_p(plci->relatedPTYPLCI,ESC,&parms[i][0]);
14998 sig_req(plci->relatedPTYPLCI,VSWITCH_REQ,0);
14999 send_req(plci->relatedPTYPLCI);
15010 static int diva_get_dma_descriptor (PLCI *plci, dword *dma_magic) {
15026 e.user[0] = plci->adapter->Id - 1;
15027 plci->adapter->request((ENTITY*)pReq);
15034 plci->adapter->Id,
15044 static void diva_free_dma_descriptor (PLCI *plci, int nr) {
15060 e.user[0] = plci->adapter->Id - 1;
15061 plci->adapter->request((ENTITY*)pReq);