Lines Matching +full:cs +full:- +full:out
76 /* values for bcs->apconnstate */
112 [1] = { "8090A3", NULL }, /* Speech (A-law) */
115 [4] = { "9090A3", NULL }, /* 3,1 kHz audio (A-law) */
151 static inline void ignore_cstruct_param(struct cardstate *cs, _cstruct param, in ignore_cstruct_param() argument
155 dev_warn(cs->dev, "%s: ignoring unsupported parameter: %s\n", in ignore_cstruct_param()
162 * return value: result length, -1 on error
164 static int encode_ie(char *in, u8 *out, int maxlen) in encode_ie() argument
169 return -1; in encode_ie()
170 out[++l] = (hex_to_bin(in[0]) << 4) + hex_to_bin(in[1]); in encode_ie()
173 out[0] = l; in encode_ie()
181 static void decode_ie(u8 *in, char *out) in decode_ie() argument
184 while (i-- > 0) { in decode_ie()
186 *out++ = toupper(hex_asc_hi(*++in)); in decode_ie()
187 *out++ = toupper(hex_asc_lo(*in)); in decode_ie()
199 list_for_each_entry(ap, &iif->appls, ctrlist) in get_appl()
200 if (ap->id == appl) in get_appl()
222 gig_dbg(level, "%s: [%d] %s", tag, p->ApplId, cdb->buf); in dump_cmsg()
225 gig_dbg(level, "%s: [%d] %s", tag, p->ApplId, in dump_cmsg()
226 capi_cmd2str(p->Command, p->Subcommand)); in dump_cmsg()
250 l -= 12; in dump_rawmsg()
263 dbgline[3 * l - 1] = '\0'; in dump_rawmsg()
284 dbgline[3 * l - 1] = '\0'; in dump_rawmsg()
307 count = MAX_FMT_IE_LEN - 1; in format_ie()
308 while (count--) { in format_ie()
318 *--pout = 0; in format_ie()
326 static void send_data_b3_conf(struct cardstate *cs, struct capi_ctr *ctr, in send_data_b3_conf() argument
335 dev_err(cs->dev, "%s: out of memory\n", __func__); in send_data_b3_conf()
345 CAPIMSG_SETCONTROLLER(msg, ctr->cnr); in send_data_b3_conf()
363 * gigaset_skb_sent() - acknowledge transmission of outgoing skb
372 struct cardstate *cs = bcs->cs; in gigaset_skb_sent() local
373 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_skb_sent()
374 struct gigaset_capi_appl *ap = bcs->ap; in gigaset_skb_sent()
379 ++bcs->trans_up; in gigaset_skb_sent()
387 if (bcs->apconnstate < APCONN_ACTIVE) { in gigaset_skb_sent()
398 send_data_b3_conf(cs, &iif->ctr, ap->id, CAPIMSG_MSGID(req), in gigaset_skb_sent()
399 bcs->channel + 1, CAPIMSG_HANDLE_REQ(req), in gigaset_skb_sent()
407 * gigaset_skb_rcvd() - pass received skb to LL
417 struct cardstate *cs = bcs->cs; in gigaset_skb_rcvd() local
418 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_skb_rcvd()
419 struct gigaset_capi_appl *ap = bcs->ap; in gigaset_skb_rcvd()
420 int len = skb->len; in gigaset_skb_rcvd()
423 bcs->trans_down++; in gigaset_skb_rcvd()
432 if (bcs->apconnstate < APCONN_ACTIVE) { in gigaset_skb_rcvd()
444 CAPIMSG_SETLEN(skb->data, CAPI_DATA_B3_REQ_LEN); in gigaset_skb_rcvd()
445 CAPIMSG_SETAPPID(skb->data, ap->id); in gigaset_skb_rcvd()
446 CAPIMSG_SETCOMMAND(skb->data, CAPI_DATA_B3); in gigaset_skb_rcvd()
447 CAPIMSG_SETSUBCOMMAND(skb->data, CAPI_IND); in gigaset_skb_rcvd()
448 CAPIMSG_SETMSGID(skb->data, ap->nextMessageNumber++); in gigaset_skb_rcvd()
449 CAPIMSG_SETCONTROLLER(skb->data, iif->ctr.cnr); in gigaset_skb_rcvd()
450 CAPIMSG_SETPLCI_PART(skb->data, bcs->channel + 1); in gigaset_skb_rcvd()
451 CAPIMSG_SETNCCI_PART(skb->data, 1); in gigaset_skb_rcvd()
453 CAPIMSG_SETDATALEN(skb->data, len); in gigaset_skb_rcvd()
455 CAPIMSG_SETFLAGS(skb->data, 0); in gigaset_skb_rcvd()
459 dump_rawmsg(DEBUG_MCMD, __func__, skb->data); in gigaset_skb_rcvd()
460 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_skb_rcvd()
465 * gigaset_isdn_rcv_err() - signal receive error
474 if (bcs->ignore) { in gigaset_isdn_rcv_err()
475 bcs->ignore--; in gigaset_isdn_rcv_err()
480 bcs->corrupted++; in gigaset_isdn_rcv_err()
482 /* ToDo: signal error -> LL */ in gigaset_isdn_rcv_err()
487 * gigaset_isdn_icall() - signal incoming call
497 struct cardstate *cs = at_state->cs; in gigaset_isdn_icall() local
498 struct bc_state *bcs = at_state->bcs; in gigaset_isdn_icall()
499 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_icall()
517 capi_cmsg_header(&iif->hcmsg, 0, CAPI_CONNECT, CAPI_IND, 0, in gigaset_isdn_icall()
518 iif->ctr.cnr | ((bcs->channel + 1) << 8)); in gigaset_isdn_icall()
524 if (at_state->str_var[STR_ZBC]) { in gigaset_isdn_icall()
526 if (encode_ie(at_state->str_var[STR_ZBC], iif->bc_buf, in gigaset_isdn_icall()
528 dev_warn(cs->dev, "RING ignored - bad BC %s\n", in gigaset_isdn_icall()
529 at_state->str_var[STR_ZBC]); in gigaset_isdn_icall()
534 iif->hcmsg.CIPValue = 0; /* default if nothing found */ in gigaset_isdn_icall()
539 at_state->str_var[STR_ZBC])) { in gigaset_isdn_icall()
540 iif->hcmsg.CIPValue = i; in gigaset_isdn_icall()
544 /* no BC (internal call): assume CIP 1 (speech, A-law) */ in gigaset_isdn_icall()
545 iif->hcmsg.CIPValue = 1; in gigaset_isdn_icall()
546 encode_ie(cip2bchlc[1].bc, iif->bc_buf, MAX_BC_OCTETS); in gigaset_isdn_icall()
548 iif->hcmsg.BC = iif->bc_buf; in gigaset_isdn_icall()
549 msgsize += iif->hcmsg.BC[0]; in gigaset_isdn_icall()
552 if (at_state->str_var[STR_ZHLC]) { in gigaset_isdn_icall()
554 if (encode_ie(at_state->str_var[STR_ZHLC], iif->hlc_buf, in gigaset_isdn_icall()
556 dev_warn(cs->dev, "RING ignored - bad HLC %s\n", in gigaset_isdn_icall()
557 at_state->str_var[STR_ZHLC]); in gigaset_isdn_icall()
560 iif->hcmsg.HLC = iif->hlc_buf; in gigaset_isdn_icall()
561 msgsize += iif->hcmsg.HLC[0]; in gigaset_isdn_icall()
565 if (at_state->str_var[STR_ZBC]) in gigaset_isdn_icall()
569 at_state->str_var[STR_ZHLC]) && in gigaset_isdn_icall()
571 at_state->str_var[STR_ZBC])) { in gigaset_isdn_icall()
572 iif->hcmsg.CIPValue = i; in gigaset_isdn_icall()
578 if (at_state->str_var[STR_ZCPN]) { in gigaset_isdn_icall()
579 i = strlen(at_state->str_var[STR_ZCPN]); in gigaset_isdn_icall()
581 dev_warn(cs->dev, "RING ignored - bad number %s\n", in gigaset_isdn_icall()
582 at_state->str_var[STR_ZBC]); in gigaset_isdn_icall()
585 iif->cdpty_buf[0] = i + 1; in gigaset_isdn_icall()
586 iif->cdpty_buf[1] = 0x80; /* type / numbering plan unknown */ in gigaset_isdn_icall()
587 memcpy(iif->cdpty_buf + 2, at_state->str_var[STR_ZCPN], i); in gigaset_isdn_icall()
588 iif->hcmsg.CalledPartyNumber = iif->cdpty_buf; in gigaset_isdn_icall()
589 msgsize += iif->hcmsg.CalledPartyNumber[0]; in gigaset_isdn_icall()
593 if (at_state->str_var[STR_NMBR]) { in gigaset_isdn_icall()
594 i = strlen(at_state->str_var[STR_NMBR]); in gigaset_isdn_icall()
596 dev_warn(cs->dev, "RING ignored - bad number %s\n", in gigaset_isdn_icall()
597 at_state->str_var[STR_ZBC]); in gigaset_isdn_icall()
600 iif->cgpty_buf[0] = i + 2; in gigaset_isdn_icall()
601 iif->cgpty_buf[1] = 0x00; /* type / numbering plan unknown */ in gigaset_isdn_icall()
602 iif->cgpty_buf[2] = 0x80; /* pres. allowed, not screened */ in gigaset_isdn_icall()
603 memcpy(iif->cgpty_buf + 3, at_state->str_var[STR_NMBR], i); in gigaset_isdn_icall()
604 iif->hcmsg.CallingPartyNumber = iif->cgpty_buf; in gigaset_isdn_icall()
605 msgsize += iif->hcmsg.CallingPartyNumber[0]; in gigaset_isdn_icall()
609 * - CalledPartySubaddress in gigaset_isdn_icall()
610 * - CallingPartySubaddress in gigaset_isdn_icall()
611 * - AdditionalInfo in gigaset_isdn_icall()
612 * - BChannelinformation in gigaset_isdn_icall()
613 * - Keypadfacility in gigaset_isdn_icall()
614 * - Useruserdata in gigaset_isdn_icall()
615 * - Facilitydataarray in gigaset_isdn_icall()
619 iif->hcmsg.adr.adrPLCI, iif->hcmsg.CIPValue, in gigaset_isdn_icall()
620 format_ie(iif->hcmsg.BC)); in gigaset_isdn_icall()
622 format_ie(iif->hcmsg.HLC)); in gigaset_isdn_icall()
624 format_ie(iif->hcmsg.CallingPartyNumber)); in gigaset_isdn_icall()
626 format_ie(iif->hcmsg.CalledPartyNumber)); in gigaset_isdn_icall()
629 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_icall()
630 if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) { in gigaset_isdn_icall()
631 dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", in gigaset_isdn_icall()
632 __func__, bcs->ap, bcs->apconnstate); in gigaset_isdn_icall()
633 bcs->ap = NULL; in gigaset_isdn_icall()
634 bcs->apconnstate = APCONN_NONE; in gigaset_isdn_icall()
636 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_icall()
637 actCIPmask = 1 | (1 << iif->hcmsg.CIPValue); in gigaset_isdn_icall()
638 list_for_each_entry(ap, &iif->appls, ctrlist) in gigaset_isdn_icall()
639 if (actCIPmask & ap->listenCIPmask) { in gigaset_isdn_icall()
641 iif->hcmsg.ApplId = ap->id; in gigaset_isdn_icall()
642 iif->hcmsg.Messagenumber = ap->nextMessageNumber++; in gigaset_isdn_icall()
646 dev_err(cs->dev, "%s: out of memory\n", in gigaset_isdn_icall()
650 if (capi_cmsg2message(&iif->hcmsg, in gigaset_isdn_icall()
652 dev_err(cs->dev, "%s: message parser failure\n", in gigaset_isdn_icall()
657 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in gigaset_isdn_icall()
660 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_icall()
661 ap->bcnext = bcs->ap; in gigaset_isdn_icall()
662 bcs->ap = ap; in gigaset_isdn_icall()
663 bcs->chstate |= CHS_NOTIFY_LL; in gigaset_isdn_icall()
664 bcs->apconnstate = APCONN_SETUP; in gigaset_isdn_icall()
665 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_icall()
668 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_isdn_icall()
676 return bcs->ap ? ICALL_ACCEPT : ICALL_IGNORE; in gigaset_isdn_icall()
686 struct cardstate *cs = bcs->cs; in send_disconnect_ind() local
687 struct gigaset_capi_ctr *iif = cs->iif; in send_disconnect_ind()
690 if (bcs->apconnstate == APCONN_NONE) in send_disconnect_ind()
693 capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT, CAPI_IND, in send_disconnect_ind()
694 ap->nextMessageNumber++, in send_disconnect_ind()
695 iif->ctr.cnr | ((bcs->channel + 1) << 8)); in send_disconnect_ind()
696 iif->hcmsg.Reason = reason; in send_disconnect_ind()
699 dev_err(cs->dev, "%s: out of memory\n", __func__); in send_disconnect_ind()
702 if (capi_cmsg2message(&iif->hcmsg, in send_disconnect_ind()
704 dev_err(cs->dev, "%s: message parser failure\n", __func__); in send_disconnect_ind()
708 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in send_disconnect_ind()
709 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in send_disconnect_ind()
720 struct cardstate *cs = bcs->cs; in send_disconnect_b3_ind() local
721 struct gigaset_capi_ctr *iif = cs->iif; in send_disconnect_b3_ind()
725 if (bcs->apconnstate < APCONN_ACTIVE) in send_disconnect_b3_ind()
727 bcs->apconnstate = APCONN_SETUP; in send_disconnect_b3_ind()
729 capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, in send_disconnect_b3_ind()
730 ap->nextMessageNumber++, in send_disconnect_b3_ind()
731 iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); in send_disconnect_b3_ind()
734 dev_err(cs->dev, "%s: out of memory\n", __func__); in send_disconnect_b3_ind()
737 if (capi_cmsg2message(&iif->hcmsg, in send_disconnect_b3_ind()
739 dev_err(cs->dev, "%s: message parser failure\n", __func__); in send_disconnect_b3_ind()
743 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in send_disconnect_b3_ind()
744 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in send_disconnect_b3_ind()
748 * gigaset_isdn_connD() - signal D channel connect
756 struct cardstate *cs = bcs->cs; in gigaset_isdn_connD() local
757 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_connD()
763 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_connD()
764 ap = bcs->ap; in gigaset_isdn_connD()
766 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connD()
770 if (bcs->apconnstate == APCONN_NONE) { in gigaset_isdn_connD()
771 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connD()
772 dev_warn(cs->dev, "%s: application %u not connected\n", in gigaset_isdn_connD()
773 __func__, ap->id); in gigaset_isdn_connD()
776 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connD()
777 while (ap->bcnext) { in gigaset_isdn_connD()
779 dev_warn(cs->dev, "%s: dropping extra application %u\n", in gigaset_isdn_connD()
780 __func__, ap->bcnext->id); in gigaset_isdn_connD()
781 send_disconnect_ind(bcs, ap->bcnext, in gigaset_isdn_connD()
783 ap->bcnext = ap->bcnext->bcnext; in gigaset_isdn_connD()
789 capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_CONNECT_ACTIVE, CAPI_IND, in gigaset_isdn_connD()
790 ap->nextMessageNumber++, in gigaset_isdn_connD()
791 iif->ctr.cnr | ((bcs->channel + 1) << 8)); in gigaset_isdn_connD()
797 * (requires ev-layer state machine extension to collect in gigaset_isdn_connD()
804 dev_err(cs->dev, "%s: out of memory\n", __func__); in gigaset_isdn_connD()
807 if (capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize))) { in gigaset_isdn_connD()
808 dev_err(cs->dev, "%s: message parser failure\n", __func__); in gigaset_isdn_connD()
812 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in gigaset_isdn_connD()
813 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_isdn_connD()
817 * gigaset_isdn_hupD() - signal D channel hangup
830 * (requires ev-layer state machine extension to collect in gigaset_isdn_hupD()
833 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_hupD()
834 while (bcs->ap != NULL) { in gigaset_isdn_hupD()
835 ap = bcs->ap; in gigaset_isdn_hupD()
836 bcs->ap = ap->bcnext; in gigaset_isdn_hupD()
837 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_hupD()
840 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_hupD()
842 bcs->apconnstate = APCONN_NONE; in gigaset_isdn_hupD()
843 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_hupD()
847 * gigaset_isdn_connB() - signal B channel connect
855 struct cardstate *cs = bcs->cs; in gigaset_isdn_connB() local
856 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_connB()
863 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_connB()
864 ap = bcs->ap; in gigaset_isdn_connB()
866 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connB()
870 if (!bcs->apconnstate) { in gigaset_isdn_connB()
871 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connB()
872 dev_warn(cs->dev, "%s: application %u not connected\n", in gigaset_isdn_connB()
873 __func__, ap->id); in gigaset_isdn_connB()
883 if (bcs->apconnstate >= APCONN_ACTIVE) { in gigaset_isdn_connB()
890 bcs->apconnstate = APCONN_ACTIVE; in gigaset_isdn_connB()
892 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connB()
894 while (ap->bcnext) { in gigaset_isdn_connB()
896 dev_warn(cs->dev, "%s: dropping extra application %u\n", in gigaset_isdn_connB()
897 __func__, ap->bcnext->id); in gigaset_isdn_connB()
898 send_disconnect_ind(bcs, ap->bcnext, in gigaset_isdn_connB()
900 ap->bcnext = ap->bcnext->bcnext; in gigaset_isdn_connB()
903 capi_cmsg_header(&iif->hcmsg, ap->id, command, CAPI_IND, in gigaset_isdn_connB()
904 ap->nextMessageNumber++, in gigaset_isdn_connB()
905 iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); in gigaset_isdn_connB()
908 dev_err(cs->dev, "%s: out of memory\n", __func__); in gigaset_isdn_connB()
911 if (capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize))) { in gigaset_isdn_connB()
912 dev_err(cs->dev, "%s: message parser failure\n", __func__); in gigaset_isdn_connB()
916 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in gigaset_isdn_connB()
917 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_isdn_connB()
921 * gigaset_isdn_hupB() - signal B channel hangup
929 struct gigaset_capi_appl *ap = bcs->ap; in gigaset_isdn_hupB()
942 * gigaset_isdn_start() - signal device availability
943 * @cs: device descriptor structure.
948 void gigaset_isdn_start(struct cardstate *cs) in gigaset_isdn_start() argument
950 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_start()
953 strcpy(iif->ctr.manu, "Siemens"); in gigaset_isdn_start()
955 iif->ctr.version.majorversion = 2; /* CAPI 2.0 */ in gigaset_isdn_start()
956 iif->ctr.version.minorversion = 0; in gigaset_isdn_start()
957 /* ToDo: check/assert cs->gotfwver? */ in gigaset_isdn_start()
958 iif->ctr.version.majormanuversion = cs->fwver[0]; in gigaset_isdn_start()
959 iif->ctr.version.minormanuversion = cs->fwver[1]; in gigaset_isdn_start()
961 iif->ctr.profile.nbchannel = cs->channels; in gigaset_isdn_start()
963 iif->ctr.profile.goptions = 0x11; in gigaset_isdn_start()
965 iif->ctr.profile.support1 = 0x03; in gigaset_isdn_start()
968 iif->ctr.profile.support2 = 0x02; in gigaset_isdn_start()
970 iif->ctr.profile.support3 = 0x01; in gigaset_isdn_start()
972 strcpy(iif->ctr.serial, "0"); in gigaset_isdn_start()
973 capi_ctr_ready(&iif->ctr); in gigaset_isdn_start()
977 * gigaset_isdn_stop() - signal device unavailability
978 * @cs: device descriptor structure.
983 void gigaset_isdn_stop(struct cardstate *cs) in gigaset_isdn_stop() argument
985 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_stop()
986 capi_ctr_down(&iif->ctr); in gigaset_isdn_stop()
1002 struct cardstate *cs = ctr->driverdata; in gigaset_register_appl() local
1006 __func__, appl, rp->level3cnt, rp->datablkcnt, rp->datablklen); in gigaset_register_appl()
1008 list_for_each_entry(ap, &iif->appls, ctrlist) in gigaset_register_appl()
1009 if (ap->id == appl) { in gigaset_register_appl()
1010 dev_notice(cs->dev, in gigaset_register_appl()
1017 dev_err(cs->dev, "%s: out of memory\n", __func__); in gigaset_register_appl()
1020 ap->id = appl; in gigaset_register_appl()
1021 ap->rp = *rp; in gigaset_register_appl()
1023 list_add(&ap->ctrlist, &iif->appls); in gigaset_register_appl()
1024 dev_info(cs->dev, "application %u registered\n", ap->id); in gigaset_register_appl()
1035 struct cardstate *cs = bcs->cs; in remove_appl_from_channel() local
1040 spin_lock_irqsave(&bcs->aplock, flags); in remove_appl_from_channel()
1041 bcap = bcs->ap; in remove_appl_from_channel()
1043 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1049 bcs->ap = ap->bcnext; in remove_appl_from_channel()
1050 if (bcs->ap != NULL) { in remove_appl_from_channel()
1051 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1056 prevconnstate = bcs->apconnstate; in remove_appl_from_channel()
1057 bcs->apconnstate = APCONN_NONE; in remove_appl_from_channel()
1058 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1061 dev_notice(cs->dev, "%s: hanging up channel %u\n", in remove_appl_from_channel()
1062 __func__, bcs->channel); in remove_appl_from_channel()
1063 gigaset_add_event(cs, &bcs->at_state, in remove_appl_from_channel()
1065 gigaset_schedule_event(cs); in remove_appl_from_channel()
1072 if (bcap->bcnext == ap) { in remove_appl_from_channel()
1073 bcap->bcnext = bcap->bcnext->bcnext; in remove_appl_from_channel()
1074 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1077 bcap = bcap->bcnext; in remove_appl_from_channel()
1079 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1089 struct cardstate *cs = iif->ctr.driverdata; in gigaset_release_appl() local
1095 list_for_each_entry_safe(ap, tmp, &iif->appls, ctrlist) in gigaset_release_appl()
1096 if (ap->id == appl) { in gigaset_release_appl()
1098 for (ch = 0; ch < cs->channels; ch++) in gigaset_release_appl()
1099 remove_appl_from_channel(&cs->bcs[ch], ap); in gigaset_release_appl()
1102 list_del(&ap->ctrlist); in gigaset_release_appl()
1104 dev_info(cs->dev, "application %u released\n", appl); in gigaset_release_appl()
1122 struct cardstate *cs = iif->ctr.driverdata; in send_conf() local
1128 capi_cmsg_answer(&iif->acmsg); in send_conf()
1129 iif->acmsg.Info = info; in send_conf()
1130 if (capi_cmsg2message(&iif->acmsg, skb->data)) { in send_conf()
1131 dev_err(cs->dev, "%s: message parser failure\n", __func__); in send_conf()
1136 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in send_conf()
1137 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in send_conf()
1147 struct cardstate *cs = iif->ctr.driverdata; in do_facility_req() local
1148 _cmsg *cmsg = &iif->acmsg; in do_facility_req()
1156 if (capi_message2cmsg(cmsg, skb->data)) { in do_facility_req()
1157 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_facility_req()
1167 switch (cmsg->FacilitySelector) { in do_facility_req()
1184 pparam = cmsg->FacilityRequestParameter; in do_facility_req()
1186 dev_notice(cs->dev, "%s: %s missing\n", "FACILITY_REQ", in do_facility_req()
1204 dev_notice(cs->dev, "%s: %s missing\n", in do_facility_req()
1211 dev_notice(cs->dev, in do_facility_req()
1228 dev_notice(cs->dev, in do_facility_req()
1261 cmsg->Info = info; in do_facility_req()
1262 cmsg->FacilityConfirmationParameter = confparam; in do_facility_req()
1266 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_facility_req()
1270 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_facility_req()
1275 capi_ctr_handle_message(&iif->ctr, ap->id, cskb); in do_facility_req()
1287 struct cardstate *cs = iif->ctr.driverdata; in do_listen_req() local
1290 if (capi_message2cmsg(&iif->acmsg, skb->data)) { in do_listen_req()
1291 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_listen_req()
1295 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_listen_req()
1298 ap->listenInfoMask = iif->acmsg.InfoMask; in do_listen_req()
1299 ap->listenCIPmask = iif->acmsg.CIPmask; in do_listen_req()
1311 struct cardstate *cs = iif->ctr.driverdata; in do_alert_req() local
1314 if (capi_message2cmsg(&iif->acmsg, skb->data)) { in do_alert_req()
1315 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_alert_req()
1319 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_alert_req()
1332 struct cardstate *cs = iif->ctr.driverdata; in do_connect_req() local
1333 _cmsg *cmsg = &iif->acmsg; in do_connect_req()
1343 if (capi_message2cmsg(cmsg, skb->data)) { in do_connect_req()
1344 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_connect_req()
1351 bcs = gigaset_get_free_channel(cs); in do_connect_req()
1353 dev_notice(cs->dev, "%s: no B channel available\n", in do_connect_req()
1358 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_req()
1359 if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) in do_connect_req()
1360 dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", in do_connect_req()
1361 __func__, bcs->ap, bcs->apconnstate); in do_connect_req()
1362 ap->bcnext = NULL; in do_connect_req()
1363 bcs->ap = ap; in do_connect_req()
1364 bcs->apconnstate = APCONN_SETUP; in do_connect_req()
1365 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_req()
1367 bcs->rx_bufsize = ap->rp.datablklen; in do_connect_req()
1368 dev_kfree_skb(bcs->rx_skb); in do_connect_req()
1370 cmsg->adr.adrPLCI |= (bcs->channel + 1) << 8; in do_connect_req()
1378 pp = cmsg->CalledPartyNumber; in do_connect_req()
1380 dev_notice(cs->dev, "%s: %s missing\n", in do_connect_req()
1392 dev_notice(cs->dev, "%s: %s type/plan 0x%02x unsupported\n", in do_connect_req()
1396 l--; in do_connect_req()
1401 l -= 2; in do_connect_req()
1414 pp = cmsg->CallingPartyNumber; in do_connect_req()
1425 dev_notice(cs->dev, in do_connect_req()
1430 l--; in do_connect_req()
1434 dev_notice(cs->dev, "%s: %s IE truncated\n", in do_connect_req()
1447 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_req()
1457 l--; in do_connect_req()
1469 if (cmsg->CIPValue >= ARRAY_SIZE(cip2bchlc) || in do_connect_req()
1470 (cmsg->CIPValue > 0 && cip2bchlc[cmsg->CIPValue].bc == NULL)) { in do_connect_req()
1471 dev_notice(cs->dev, "%s: unknown CIP value %d\n", in do_connect_req()
1472 "CONNECT_REQ", cmsg->CIPValue); in do_connect_req()
1484 if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ in do_connect_req()
1485 lbc = 2 * cmsg->BC[0]; in do_connect_req()
1486 else if (cip2bchlc[cmsg->CIPValue].bc) /* BC derived from CIP */ in do_connect_req()
1487 lbc = strlen(cip2bchlc[cmsg->CIPValue].bc); in do_connect_req()
1490 if (cmsg->HLC && cmsg->HLC[0]) /* HLC specified explicitly */ in do_connect_req()
1491 lhlc = 2 * cmsg->HLC[0]; in do_connect_req()
1492 else if (cip2bchlc[cmsg->CIPValue].hlc) /* HLC derived from CIP */ in do_connect_req()
1493 lhlc = strlen(cip2bchlc[cmsg->CIPValue].hlc); in do_connect_req()
1506 if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ in do_connect_req()
1507 decode_ie(cmsg->BC, commands[AT_BC] + 5); in do_connect_req()
1510 cip2bchlc[cmsg->CIPValue].bc); in do_connect_req()
1513 if (cmsg->HLC && cmsg->HLC[0]) in do_connect_req()
1515 decode_ie(cmsg->HLC, in do_connect_req()
1519 cip2bchlc[cmsg->CIPValue].hlc); in do_connect_req()
1521 strcpy(commands[AT_BC] + l - 2, "\r"); in do_connect_req()
1525 dev_notice(cs->dev, "%s: cannot set HLC without BC\n", in do_connect_req()
1533 if (cmsg->BProtocol == CAPI_DEFAULT) { in do_connect_req()
1534 bcs->proto2 = L2_HDLC; in do_connect_req()
1535 dev_warn(cs->dev, in do_connect_req()
1538 switch (cmsg->B1protocol) { in do_connect_req()
1540 bcs->proto2 = L2_HDLC; in do_connect_req()
1543 bcs->proto2 = L2_VOICE; in do_connect_req()
1546 dev_warn(cs->dev, in do_connect_req()
1548 cmsg->B1protocol); in do_connect_req()
1549 bcs->proto2 = L2_VOICE; in do_connect_req()
1551 if (cmsg->B2protocol != 1) in do_connect_req()
1552 dev_warn(cs->dev, in do_connect_req()
1554 cmsg->B2protocol); in do_connect_req()
1555 if (cmsg->B3protocol != 0) in do_connect_req()
1556 dev_warn(cs->dev, in do_connect_req()
1558 cmsg->B3protocol); in do_connect_req()
1559 ignore_cstruct_param(cs, cmsg->B1configuration, in do_connect_req()
1561 ignore_cstruct_param(cs, cmsg->B2configuration, in do_connect_req()
1563 ignore_cstruct_param(cs, cmsg->B3configuration, in do_connect_req()
1569 snprintf(commands[AT_PROTO], 9, "^SBPR=%u\r", bcs->proto2); in do_connect_req()
1572 ignore_cstruct_param(cs, cmsg->CalledPartySubaddress, in do_connect_req()
1574 ignore_cstruct_param(cs, cmsg->CallingPartySubaddress, in do_connect_req()
1576 ignore_cstruct_param(cs, cmsg->LLC, in do_connect_req()
1578 if (cmsg->AdditionalInfo != CAPI_DEFAULT) { in do_connect_req()
1579 ignore_cstruct_param(cs, cmsg->BChannelinformation, in do_connect_req()
1581 ignore_cstruct_param(cs, cmsg->Keypadfacility, in do_connect_req()
1583 ignore_cstruct_param(cs, cmsg->Useruserdata, in do_connect_req()
1584 "CONNECT_REQ", "User-User Data"); in do_connect_req()
1585 ignore_cstruct_param(cs, cmsg->Facilitydataarray, in do_connect_req()
1594 (unsigned) bcs->channel + 1); in do_connect_req()
1597 if (!gigaset_add_event(cs, &bcs->at_state, EV_DIAL, commands, in do_connect_req()
1598 bcs->at_state.seq_index, NULL)) { in do_connect_req()
1602 gigaset_schedule_event(cs); in do_connect_req()
1607 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_connect_req()
1626 struct cardstate *cs = iif->ctr.driverdata; in do_connect_resp() local
1627 _cmsg *cmsg = &iif->acmsg; in do_connect_resp()
1634 if (capi_message2cmsg(cmsg, skb->data)) { in do_connect_resp()
1635 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_connect_resp()
1643 channel = (cmsg->adr.adrPLCI >> 8) & 0xff; in do_connect_resp()
1644 if (!channel || channel > cs->channels) { in do_connect_resp()
1645 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_resp()
1646 "CONNECT_RESP", "PLCI", cmsg->adr.adrPLCI); in do_connect_resp()
1649 bcs = cs->bcs + channel - 1; in do_connect_resp()
1651 switch (cmsg->Reject) { in do_connect_resp()
1654 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1655 while (bcs->ap != NULL) { in do_connect_resp()
1656 oap = bcs->ap; in do_connect_resp()
1657 bcs->ap = oap->bcnext; in do_connect_resp()
1659 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1662 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1665 ap->bcnext = NULL; in do_connect_resp()
1666 bcs->ap = ap; in do_connect_resp()
1667 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1669 bcs->rx_bufsize = ap->rp.datablklen; in do_connect_resp()
1670 dev_kfree_skb(bcs->rx_skb); in do_connect_resp()
1672 bcs->chstate |= CHS_NOTIFY_LL; in do_connect_resp()
1675 if (cmsg->BProtocol == CAPI_DEFAULT) { in do_connect_resp()
1676 bcs->proto2 = L2_HDLC; in do_connect_resp()
1677 dev_warn(cs->dev, in do_connect_resp()
1680 switch (cmsg->B1protocol) { in do_connect_resp()
1682 bcs->proto2 = L2_HDLC; in do_connect_resp()
1685 bcs->proto2 = L2_VOICE; in do_connect_resp()
1688 dev_warn(cs->dev, in do_connect_resp()
1690 cmsg->B1protocol); in do_connect_resp()
1691 bcs->proto2 = L2_VOICE; in do_connect_resp()
1693 if (cmsg->B2protocol != 1) in do_connect_resp()
1694 dev_warn(cs->dev, in do_connect_resp()
1696 cmsg->B2protocol); in do_connect_resp()
1697 if (cmsg->B3protocol != 0) in do_connect_resp()
1698 dev_warn(cs->dev, in do_connect_resp()
1700 cmsg->B3protocol); in do_connect_resp()
1701 ignore_cstruct_param(cs, cmsg->B1configuration, in do_connect_resp()
1703 ignore_cstruct_param(cs, cmsg->B2configuration, in do_connect_resp()
1705 ignore_cstruct_param(cs, cmsg->B3configuration, in do_connect_resp()
1710 ignore_cstruct_param(cs, cmsg->ConnectedNumber, in do_connect_resp()
1712 ignore_cstruct_param(cs, cmsg->ConnectedSubaddress, in do_connect_resp()
1714 ignore_cstruct_param(cs, cmsg->LLC, in do_connect_resp()
1716 if (cmsg->AdditionalInfo != CAPI_DEFAULT) { in do_connect_resp()
1717 ignore_cstruct_param(cs, cmsg->BChannelinformation, in do_connect_resp()
1719 ignore_cstruct_param(cs, cmsg->Keypadfacility, in do_connect_resp()
1721 ignore_cstruct_param(cs, cmsg->Useruserdata, in do_connect_resp()
1722 "CONNECT_RESP", "User-User Data"); in do_connect_resp()
1723 ignore_cstruct_param(cs, cmsg->Facilitydataarray, in do_connect_resp()
1728 if (!gigaset_add_event(cs, &cs->bcs[channel - 1].at_state, in do_connect_resp()
1731 gigaset_schedule_event(cs); in do_connect_resp()
1739 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1740 if (bcs->ap == ap) { in do_connect_resp()
1741 bcs->ap = ap->bcnext; in do_connect_resp()
1742 if (bcs->ap == NULL) { in do_connect_resp()
1743 /* last one: stop ev-layer hupD notifications */ in do_connect_resp()
1744 bcs->apconnstate = APCONN_NONE; in do_connect_resp()
1745 bcs->chstate &= ~CHS_NOTIFY_LL; in do_connect_resp()
1747 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1750 for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) { in do_connect_resp()
1751 if (oap->bcnext == ap) { in do_connect_resp()
1752 oap->bcnext = oap->bcnext->bcnext; in do_connect_resp()
1753 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1757 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1758 dev_err(cs->dev, "%s: application %u not found\n", in do_connect_resp()
1759 __func__, ap->id); in do_connect_resp()
1764 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1765 while (bcs->ap != NULL) { in do_connect_resp()
1766 oap = bcs->ap; in do_connect_resp()
1767 bcs->ap = oap->bcnext; in do_connect_resp()
1769 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1772 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1775 ap->bcnext = NULL; in do_connect_resp()
1776 bcs->ap = ap; in do_connect_resp()
1777 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1779 /* reject call - will trigger DISCONNECT_IND for this app */ in do_connect_resp()
1780 dev_info(cs->dev, "%s: Reject=%x\n", in do_connect_resp()
1781 "CONNECT_RESP", cmsg->Reject); in do_connect_resp()
1782 if (!gigaset_add_event(cs, &cs->bcs[channel - 1].at_state, in do_connect_resp()
1785 gigaset_schedule_event(cs); in do_connect_resp()
1798 struct cardstate *cs = iif->ctr.driverdata; in do_connect_b3_req() local
1799 _cmsg *cmsg = &iif->acmsg; in do_connect_b3_req()
1804 if (capi_message2cmsg(cmsg, skb->data)) { in do_connect_b3_req()
1805 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_connect_b3_req()
1812 channel = (cmsg->adr.adrPLCI >> 8) & 0xff; in do_connect_b3_req()
1813 if (!channel || channel > cs->channels) { in do_connect_b3_req()
1814 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_b3_req()
1815 "CONNECT_B3_REQ", "PLCI", cmsg->adr.adrPLCI); in do_connect_b3_req()
1819 bcs = &cs->bcs[channel - 1]; in do_connect_b3_req()
1822 bcs->apconnstate = APCONN_ACTIVE; in do_connect_b3_req()
1825 cmsg->adr.adrNCCI |= 1 << 16; in do_connect_b3_req()
1828 ignore_cstruct_param(cs, cmsg->NCPI, "CONNECT_B3_REQ", "NCPI"); in do_connect_b3_req()
1830 (cmsg->NCPI && cmsg->NCPI[0]) ? in do_connect_b3_req()
1845 struct cardstate *cs = iif->ctr.driverdata; in do_connect_b3_resp() local
1846 _cmsg *cmsg = &iif->acmsg; in do_connect_b3_resp()
1853 if (capi_message2cmsg(cmsg, skb->data)) { in do_connect_b3_resp()
1854 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_connect_b3_resp()
1861 channel = (cmsg->adr.adrNCCI >> 8) & 0xff; in do_connect_b3_resp()
1862 if (!channel || channel > cs->channels || in do_connect_b3_resp()
1863 ((cmsg->adr.adrNCCI >> 16) & 0xffff) != 1) { in do_connect_b3_resp()
1864 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_b3_resp()
1865 "CONNECT_B3_RESP", "NCCI", cmsg->adr.adrNCCI); in do_connect_b3_resp()
1869 bcs = &cs->bcs[channel - 1]; in do_connect_b3_resp()
1871 if (cmsg->Reject) { in do_connect_b3_resp()
1873 bcs->apconnstate = APCONN_SETUP; in do_connect_b3_resp()
1876 if (!gigaset_add_event(cs, &bcs->at_state, in do_connect_b3_resp()
1881 gigaset_schedule_event(cs); in do_connect_b3_resp()
1894 capi_cmsg_header(cmsg, ap->id, command, CAPI_IND, in do_connect_b3_resp()
1895 ap->nextMessageNumber++, cmsg->adr.adrNCCI); in do_connect_b3_resp()
1897 if (capi_cmsg2message(cmsg, skb->data)) { in do_connect_b3_resp()
1898 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_connect_b3_resp()
1903 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in do_connect_b3_resp()
1915 struct cardstate *cs = iif->ctr.driverdata; in do_disconnect_req() local
1916 _cmsg *cmsg = &iif->acmsg; in do_disconnect_req()
1923 if (capi_message2cmsg(cmsg, skb->data)) { in do_disconnect_req()
1924 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_disconnect_req()
1931 channel = (cmsg->adr.adrPLCI >> 8) & 0xff; in do_disconnect_req()
1932 if (!channel || channel > cs->channels) { in do_disconnect_req()
1933 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_disconnect_req()
1934 "DISCONNECT_REQ", "PLCI", cmsg->adr.adrPLCI); in do_disconnect_req()
1938 bcs = cs->bcs + channel - 1; in do_disconnect_req()
1941 if (cmsg->AdditionalInfo != CAPI_DEFAULT) { in do_disconnect_req()
1942 ignore_cstruct_param(cs, cmsg->BChannelinformation, in do_disconnect_req()
1944 ignore_cstruct_param(cs, cmsg->Keypadfacility, in do_disconnect_req()
1946 ignore_cstruct_param(cs, cmsg->Useruserdata, in do_disconnect_req()
1947 "DISCONNECT_REQ", "User-User Data"); in do_disconnect_req()
1948 ignore_cstruct_param(cs, cmsg->Facilitydataarray, in do_disconnect_req()
1953 if (!bcs->apconnstate) in do_disconnect_req()
1957 if (bcs->apconnstate >= APCONN_ACTIVE) { in do_disconnect_req()
1959 bcs->apconnstate = APCONN_SETUP; in do_disconnect_req()
1963 * use separate cmsg structure, as the content of iif->acmsg in do_disconnect_req()
1968 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_disconnect_req()
1972 capi_cmsg_header(b3cmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, in do_disconnect_req()
1973 ap->nextMessageNumber++, in do_disconnect_req()
1974 cmsg->adr.adrPLCI | (1 << 16)); in do_disconnect_req()
1975 b3cmsg->Reason_B3 = CapiProtocolErrorLayer1; in do_disconnect_req()
1978 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_disconnect_req()
1985 dev_err(cs->dev, "%s: message parser failure\n", in do_disconnect_req()
1993 capi_ctr_handle_message(&iif->ctr, ap->id, b3skb); in do_disconnect_req()
1997 if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL)) { in do_disconnect_req()
2001 gigaset_schedule_event(cs); in do_disconnect_req()
2015 struct cardstate *cs = iif->ctr.driverdata; in do_disconnect_b3_req() local
2016 _cmsg *cmsg = &iif->acmsg; in do_disconnect_b3_req()
2021 if (capi_message2cmsg(cmsg, skb->data)) { in do_disconnect_b3_req()
2022 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_disconnect_b3_req()
2029 channel = (cmsg->adr.adrNCCI >> 8) & 0xff; in do_disconnect_b3_req()
2030 if (!channel || channel > cs->channels || in do_disconnect_b3_req()
2031 ((cmsg->adr.adrNCCI >> 16) & 0xffff) != 1) { in do_disconnect_b3_req()
2032 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_disconnect_b3_req()
2033 "DISCONNECT_B3_REQ", "NCCI", cmsg->adr.adrNCCI); in do_disconnect_b3_req()
2037 bcs = &cs->bcs[channel - 1]; in do_disconnect_b3_req()
2040 if (bcs->apconnstate < APCONN_ACTIVE) { in do_disconnect_b3_req()
2047 if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL)) { in do_disconnect_b3_req()
2051 gigaset_schedule_event(cs); in do_disconnect_b3_req()
2054 ignore_cstruct_param(cs, cmsg->NCPI, in do_disconnect_b3_req()
2057 (cmsg->NCPI && cmsg->NCPI[0]) ? in do_disconnect_b3_req()
2068 struct cardstate *cs = iif->ctr.driverdata; in do_data_b3_req() local
2070 int channel = CAPIMSG_PLCI_PART(skb->data); in do_data_b3_req()
2071 u16 ncci = CAPIMSG_NCCI_PART(skb->data); in do_data_b3_req()
2072 u16 msglen = CAPIMSG_LEN(skb->data); in do_data_b3_req()
2073 u16 datalen = CAPIMSG_DATALEN(skb->data); in do_data_b3_req()
2074 u16 flags = CAPIMSG_FLAGS(skb->data); in do_data_b3_req()
2075 u16 msgid = CAPIMSG_MSGID(skb->data); in do_data_b3_req()
2076 u16 handle = CAPIMSG_HANDLE_REQ(skb->data); in do_data_b3_req()
2079 dump_rawmsg(DEBUG_MCMD, __func__, skb->data); in do_data_b3_req()
2082 if (channel == 0 || channel > cs->channels || ncci != 1) { in do_data_b3_req()
2083 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_data_b3_req()
2084 "DATA_B3_REQ", "NCCI", CAPIMSG_NCCI(skb->data)); in do_data_b3_req()
2088 bcs = &cs->bcs[channel - 1]; in do_data_b3_req()
2090 dev_notice(cs->dev, "%s: unexpected length %d\n", in do_data_b3_req()
2092 if (msglen + datalen != skb->len) in do_data_b3_req()
2093 dev_notice(cs->dev, "%s: length mismatch (%d+%d!=%d)\n", in do_data_b3_req()
2094 "DATA_B3_REQ", msglen, datalen, skb->len); in do_data_b3_req()
2095 if (msglen + datalen > skb->len) { in do_data_b3_req()
2101 dev_notice(cs->dev, "%s: reserved flags set (%x)\n", in do_data_b3_req()
2108 if (bcs->apconnstate < APCONN_ACTIVE) { in do_data_b3_req()
2115 skb->mac_len = msglen; in do_data_b3_req()
2118 /* pass to device-specific module */ in do_data_b3_req()
2119 if (cs->ops->send_skb(bcs, skb) < 0) { in do_data_b3_req()
2129 send_data_b3_conf(cs, &iif->ctr, ap->id, msgid, channel, handle, in do_data_b3_req()
2142 struct cardstate *cs = iif->ctr.driverdata; in do_reset_b3_req() local
2145 if (capi_message2cmsg(&iif->acmsg, skb->data)) { in do_reset_b3_req()
2146 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_reset_b3_req()
2150 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_reset_b3_req()
2162 struct cardstate *cs = iif->ctr.driverdata; in do_unsupported() local
2165 if (capi_message2cmsg(&iif->acmsg, skb->data)) { in do_unsupported()
2166 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_unsupported()
2170 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_unsupported()
2175 * CAPI message handler: no-op
2181 struct cardstate *cs = iif->ctr.driverdata; in do_nothing() local
2184 if (capi_message2cmsg(&iif->acmsg, skb->data)) { in do_nothing()
2185 dev_err(cs->dev, "%s: message parser failure\n", __func__); in do_nothing()
2189 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_nothing()
2197 dump_rawmsg(DEBUG_MCMD, __func__, skb->data); in do_data_b3_resp()
2234 * ToDo: support overlap sending (requires ev-layer state
2260 * gigaset_send_message() - accept a CAPI message from an application
2272 struct cardstate *cs = ctr->driverdata; in gigaset_send_message() local
2278 dev_warn(cs->dev, "%s: skb_linearize failed\n", __func__); in gigaset_send_message()
2283 ap = get_appl(iif, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2285 dev_notice(cs->dev, "%s: application %u not registered\n", in gigaset_send_message()
2286 __func__, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2291 handler = lookup_capi_send_handler(CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2295 dev_notice(cs->dev, "%s: unsupported message %u\n", in gigaset_send_message()
2296 __func__, CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2301 if (atomic_add_return(1, &iif->sendqlen) > 1) { in gigaset_send_message()
2303 skb_queue_tail(&iif->sendqueue, skb); in gigaset_send_message()
2311 while (atomic_sub_return(1, &iif->sendqlen) > 0) { in gigaset_send_message()
2312 skb = skb_dequeue(&iif->sendqueue); in gigaset_send_message()
2315 dev_err(cs->dev, "%s: send queue empty\n", __func__); in gigaset_send_message()
2318 ap = get_appl(iif, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2321 dev_warn(cs->dev, "%s: application %u vanished\n", in gigaset_send_message()
2322 __func__, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2325 handler = lookup_capi_send_handler(CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2328 dev_err(cs->dev, "%s: handler %x vanished\n", in gigaset_send_message()
2329 __func__, CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2339 * gigaset_procinfo() - build single line description for controller
2346 return ctr->name; /* ToDo: more? */ in gigaset_procinfo()
2351 struct capi_ctr *ctr = m->private; in gigaset_proc_show()
2352 struct cardstate *cs = ctr->driverdata; in gigaset_proc_show() local
2356 seq_printf(m, "%-16s %s\n", "name", ctr->name); in gigaset_proc_show()
2357 seq_printf(m, "%-16s %s %s\n", "dev", in gigaset_proc_show()
2358 dev_driver_string(cs->dev), dev_name(cs->dev)); in gigaset_proc_show()
2359 seq_printf(m, "%-16s %d\n", "id", cs->myid); in gigaset_proc_show()
2360 if (cs->gotfwver) in gigaset_proc_show()
2361 seq_printf(m, "%-16s %d.%d.%d.%d\n", "firmware", in gigaset_proc_show()
2362 cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]); in gigaset_proc_show()
2363 seq_printf(m, "%-16s %d\n", "channels", cs->channels); in gigaset_proc_show()
2364 seq_printf(m, "%-16s %s\n", "onechannel", cs->onechannel ? "yes" : "no"); in gigaset_proc_show()
2366 switch (cs->mode) { in gigaset_proc_show()
2382 seq_printf(m, "%-16s %s\n", "mode", s); in gigaset_proc_show()
2384 switch (cs->mstate) { in gigaset_proc_show()
2406 seq_printf(m, "%-16s %s\n", "mstate", s); in gigaset_proc_show()
2408 seq_printf(m, "%-16s %s\n", "running", cs->running ? "yes" : "no"); in gigaset_proc_show()
2409 seq_printf(m, "%-16s %s\n", "connected", cs->connected ? "yes" : "no"); in gigaset_proc_show()
2410 seq_printf(m, "%-16s %s\n", "isdn_up", cs->isdn_up ? "yes" : "no"); in gigaset_proc_show()
2411 seq_printf(m, "%-16s %s\n", "cidmode", cs->cidmode ? "yes" : "no"); in gigaset_proc_show()
2413 for (i = 0; i < cs->channels; i++) { in gigaset_proc_show()
2414 seq_printf(m, "[%d]%-13s %d\n", i, "corrupted", in gigaset_proc_show()
2415 cs->bcs[i].corrupted); in gigaset_proc_show()
2416 seq_printf(m, "[%d]%-13s %d\n", i, "trans_down", in gigaset_proc_show()
2417 cs->bcs[i].trans_down); in gigaset_proc_show()
2418 seq_printf(m, "[%d]%-13s %d\n", i, "trans_up", in gigaset_proc_show()
2419 cs->bcs[i].trans_up); in gigaset_proc_show()
2420 seq_printf(m, "[%d]%-13s %d\n", i, "chstate", in gigaset_proc_show()
2421 cs->bcs[i].chstate); in gigaset_proc_show()
2422 switch (cs->bcs[i].proto2) { in gigaset_proc_show()
2435 seq_printf(m, "[%d]%-13s %s\n", i, "proto2", s); in gigaset_proc_show()
2441 * gigaset_isdn_regdev() - register device to LL
2442 * @cs: device descriptor structure.
2447 int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) in gigaset_isdn_regdev() argument
2454 pr_err("%s: out of memory\n", __func__); in gigaset_isdn_regdev()
2455 return -ENOMEM; in gigaset_isdn_regdev()
2459 iif->ctr.owner = THIS_MODULE; in gigaset_isdn_regdev()
2460 iif->ctr.driverdata = cs; in gigaset_isdn_regdev()
2461 strncpy(iif->ctr.name, isdnid, sizeof(iif->ctr.name) - 1); in gigaset_isdn_regdev()
2462 iif->ctr.driver_name = "gigaset"; in gigaset_isdn_regdev()
2463 iif->ctr.load_firmware = NULL; in gigaset_isdn_regdev()
2464 iif->ctr.reset_ctr = NULL; in gigaset_isdn_regdev()
2465 iif->ctr.register_appl = gigaset_register_appl; in gigaset_isdn_regdev()
2466 iif->ctr.release_appl = gigaset_release_appl; in gigaset_isdn_regdev()
2467 iif->ctr.send_message = gigaset_send_message; in gigaset_isdn_regdev()
2468 iif->ctr.procinfo = gigaset_procinfo; in gigaset_isdn_regdev()
2469 iif->ctr.proc_show = gigaset_proc_show, in gigaset_isdn_regdev()
2470 INIT_LIST_HEAD(&iif->appls); in gigaset_isdn_regdev()
2471 skb_queue_head_init(&iif->sendqueue); in gigaset_isdn_regdev()
2472 atomic_set(&iif->sendqlen, 0); in gigaset_isdn_regdev()
2475 rc = attach_capi_ctr(&iif->ctr); in gigaset_isdn_regdev()
2482 cs->iif = iif; in gigaset_isdn_regdev()
2483 cs->hw_hdr_len = CAPI_DATA_B3_REQ_LEN; in gigaset_isdn_regdev()
2488 * gigaset_isdn_unregdev() - unregister device from LL
2489 * @cs: device descriptor structure.
2491 void gigaset_isdn_unregdev(struct cardstate *cs) in gigaset_isdn_unregdev() argument
2493 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_unregdev()
2495 detach_capi_ctr(&iif->ctr); in gigaset_isdn_unregdev()
2497 cs->iif = NULL; in gigaset_isdn_unregdev()
2506 * gigaset_isdn_regdrv() - register driver to LL
2515 * gigaset_isdn_unregdrv() - unregister driver from LL