Lines Matching +full:cs +full:- +full:3
30 #define CAPI_CONNECT_ACTIVE_IND_BASELEN (CAPI_MSG_BASELEN+4+3*1)
71 #define MAX_HLC_OCTETS 3
75 /* values for bcs->apconnstate */
102 u8 cgpty_buf[MAX_NUMBER_DIGITS+3];
112 /* Speech (A-law) */
115 [3] = { "8990", NULL },
118 /* 3,1 kHz audio (A-law) */
132 /* Group 2/3 facsimile */
166 static inline void ignore_cstruct_param(struct cardstate *cs, _cstruct param, in ignore_cstruct_param() argument
170 dev_warn(cs->dev, "%s: ignoring unsupported parameter: %s\n", in ignore_cstruct_param()
177 * return value: result length, -1 on error
184 return -1; in encode_ie()
199 while (i-- > 0) { in decode_ie()
214 list_for_each_entry(ap, &iif->appls, ctrlist) in get_appl()
215 if (ap->id == appl) in get_appl()
233 gig_dbg(level, "%s: [%d] %s", tag, p->ApplId, cdb->buf); in dump_cmsg()
236 gig_dbg(level, "%s: [%d] %s", tag, p->ApplId, in dump_cmsg()
237 capi_cmd2str(p->Command, p->Subcommand)); in dump_cmsg()
261 l -= 12; in dump_rawmsg()
262 dbgline = kmalloc(3*l, GFP_ATOMIC); in dump_rawmsg()
266 dbgline[3*i] = hex_asc_hi(data[12+i]); in dump_rawmsg()
267 dbgline[3*i+1] = hex_asc_lo(data[12+i]); in dump_rawmsg()
268 dbgline[3*i+2] = ' '; in dump_rawmsg()
270 dbgline[3*l-1] = '\0'; in dump_rawmsg()
282 dbgline = kmalloc(3*l, GFP_ATOMIC); in dump_rawmsg()
287 dbgline[3*i] = hex_asc_hi(data[i]); in dump_rawmsg()
288 dbgline[3*i+1] = hex_asc_lo(data[i]); in dump_rawmsg()
289 dbgline[3*i+2] = ' '; in dump_rawmsg()
291 dbgline[3*l-1] = '\0'; in dump_rawmsg()
304 static char result[3*MAX_FMT_IE_LEN]; in format_ie()
313 count = MAX_FMT_IE_LEN-1; in format_ie()
314 while (count--) { in format_ie()
324 *--pout = 0; in format_ie()
331 static void send_data_b3_conf(struct cardstate *cs, struct capi_ctr *ctr, in send_data_b3_conf() argument
340 dev_err(cs->dev, "%s: out of memory\n", __func__); in send_data_b3_conf()
350 CAPIMSG_SETCONTROLLER(msg, ctr->cnr); in send_data_b3_conf()
368 * gigaset_skb_sent() - acknowledge transmission of outgoing skb
377 struct cardstate *cs = bcs->cs; in gigaset_skb_sent() local
378 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_skb_sent()
379 struct gigaset_capi_appl *ap = bcs->ap; in gigaset_skb_sent()
384 ++bcs->trans_up; in gigaset_skb_sent()
392 if (bcs->apconnstate < APCONN_ACTIVE) { in gigaset_skb_sent()
403 send_data_b3_conf(cs, &iif->ctr, ap->id, CAPIMSG_MSGID(req), in gigaset_skb_sent()
404 bcs->channel + 1, CAPIMSG_HANDLE_REQ(req), in gigaset_skb_sent()
412 * gigaset_skb_rcvd() - pass received skb to LL
422 struct cardstate *cs = bcs->cs; in gigaset_skb_rcvd() local
423 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_skb_rcvd()
424 struct gigaset_capi_appl *ap = bcs->ap; in gigaset_skb_rcvd()
425 int len = skb->len; in gigaset_skb_rcvd()
428 bcs->trans_down++; in gigaset_skb_rcvd()
437 if (bcs->apconnstate < APCONN_ACTIVE) { in gigaset_skb_rcvd()
449 CAPIMSG_SETLEN(skb->data, CAPI_DATA_B3_REQ_LEN); in gigaset_skb_rcvd()
450 CAPIMSG_SETAPPID(skb->data, ap->id); in gigaset_skb_rcvd()
451 CAPIMSG_SETCOMMAND(skb->data, CAPI_DATA_B3); in gigaset_skb_rcvd()
452 CAPIMSG_SETSUBCOMMAND(skb->data, CAPI_IND); in gigaset_skb_rcvd()
453 CAPIMSG_SETMSGID(skb->data, ap->nextMessageNumber++); in gigaset_skb_rcvd()
454 CAPIMSG_SETCONTROLLER(skb->data, iif->ctr.cnr); in gigaset_skb_rcvd()
455 CAPIMSG_SETPLCI_PART(skb->data, bcs->channel + 1); in gigaset_skb_rcvd()
456 CAPIMSG_SETNCCI_PART(skb->data, 1); in gigaset_skb_rcvd()
458 CAPIMSG_SETDATALEN(skb->data, len); in gigaset_skb_rcvd()
460 CAPIMSG_SETFLAGS(skb->data, 0); in gigaset_skb_rcvd()
464 dump_rawmsg(DEBUG_MCMD, __func__, skb->data); in gigaset_skb_rcvd()
465 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_skb_rcvd()
470 * gigaset_isdn_rcv_err() - signal receive error
479 if (bcs->ignore) { in gigaset_isdn_rcv_err()
480 bcs->ignore--; in gigaset_isdn_rcv_err()
485 bcs->corrupted++; in gigaset_isdn_rcv_err()
487 /* ToDo: signal error -> LL */ in gigaset_isdn_rcv_err()
492 * gigaset_isdn_icall() - signal incoming call
502 struct cardstate *cs = at_state->cs; in gigaset_isdn_icall() local
503 struct bc_state *bcs = at_state->bcs; in gigaset_isdn_icall()
504 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_icall()
522 capi_cmsg_header(&iif->hcmsg, 0, CAPI_CONNECT, CAPI_IND, 0, in gigaset_isdn_icall()
523 iif->ctr.cnr | ((bcs->channel + 1) << 8)); in gigaset_isdn_icall()
529 if (at_state->str_var[STR_ZBC]) { in gigaset_isdn_icall()
531 if (encode_ie(at_state->str_var[STR_ZBC], iif->bc_buf, in gigaset_isdn_icall()
533 dev_warn(cs->dev, "RING ignored - bad BC %s\n", in gigaset_isdn_icall()
534 at_state->str_var[STR_ZBC]); in gigaset_isdn_icall()
539 iif->hcmsg.CIPValue = 0; /* default if nothing found */ in gigaset_isdn_icall()
544 at_state->str_var[STR_ZBC])) { in gigaset_isdn_icall()
545 iif->hcmsg.CIPValue = i; in gigaset_isdn_icall()
549 /* no BC (internal call): assume CIP 1 (speech, A-law) */ in gigaset_isdn_icall()
550 iif->hcmsg.CIPValue = 1; in gigaset_isdn_icall()
551 encode_ie(cip2bchlc[1].bc, iif->bc_buf, MAX_BC_OCTETS); in gigaset_isdn_icall()
553 iif->hcmsg.BC = iif->bc_buf; in gigaset_isdn_icall()
554 msgsize += iif->hcmsg.BC[0]; in gigaset_isdn_icall()
557 if (at_state->str_var[STR_ZHLC]) { in gigaset_isdn_icall()
559 if (encode_ie(at_state->str_var[STR_ZHLC], iif->hlc_buf, in gigaset_isdn_icall()
561 dev_warn(cs->dev, "RING ignored - bad HLC %s\n", in gigaset_isdn_icall()
562 at_state->str_var[STR_ZHLC]); in gigaset_isdn_icall()
565 iif->hcmsg.HLC = iif->hlc_buf; in gigaset_isdn_icall()
566 msgsize += iif->hcmsg.HLC[0]; in gigaset_isdn_icall()
570 if (at_state->str_var[STR_ZBC]) in gigaset_isdn_icall()
574 at_state->str_var[STR_ZHLC]) && in gigaset_isdn_icall()
576 at_state->str_var[STR_ZBC])) { in gigaset_isdn_icall()
577 iif->hcmsg.CIPValue = i; in gigaset_isdn_icall()
583 if (at_state->str_var[STR_ZCPN]) { in gigaset_isdn_icall()
584 i = strlen(at_state->str_var[STR_ZCPN]); in gigaset_isdn_icall()
586 dev_warn(cs->dev, "RING ignored - bad number %s\n", in gigaset_isdn_icall()
587 at_state->str_var[STR_ZBC]); in gigaset_isdn_icall()
590 iif->cdpty_buf[0] = i + 1; in gigaset_isdn_icall()
591 iif->cdpty_buf[1] = 0x80; /* type / numbering plan unknown */ in gigaset_isdn_icall()
592 memcpy(iif->cdpty_buf+2, at_state->str_var[STR_ZCPN], i); in gigaset_isdn_icall()
593 iif->hcmsg.CalledPartyNumber = iif->cdpty_buf; in gigaset_isdn_icall()
594 msgsize += iif->hcmsg.CalledPartyNumber[0]; in gigaset_isdn_icall()
598 if (at_state->str_var[STR_NMBR]) { in gigaset_isdn_icall()
599 i = strlen(at_state->str_var[STR_NMBR]); in gigaset_isdn_icall()
601 dev_warn(cs->dev, "RING ignored - bad number %s\n", in gigaset_isdn_icall()
602 at_state->str_var[STR_ZBC]); in gigaset_isdn_icall()
605 iif->cgpty_buf[0] = i + 2; in gigaset_isdn_icall()
606 iif->cgpty_buf[1] = 0x00; /* type / numbering plan unknown */ in gigaset_isdn_icall()
607 iif->cgpty_buf[2] = 0x80; /* pres. allowed, not screened */ in gigaset_isdn_icall()
608 memcpy(iif->cgpty_buf+3, at_state->str_var[STR_NMBR], i); in gigaset_isdn_icall()
609 iif->hcmsg.CallingPartyNumber = iif->cgpty_buf; in gigaset_isdn_icall()
610 msgsize += iif->hcmsg.CallingPartyNumber[0]; in gigaset_isdn_icall()
614 * - CalledPartySubaddress in gigaset_isdn_icall()
615 * - CallingPartySubaddress in gigaset_isdn_icall()
616 * - AdditionalInfo in gigaset_isdn_icall()
617 * - BChannelinformation in gigaset_isdn_icall()
618 * - Keypadfacility in gigaset_isdn_icall()
619 * - Useruserdata in gigaset_isdn_icall()
620 * - Facilitydataarray in gigaset_isdn_icall()
624 iif->hcmsg.adr.adrPLCI, iif->hcmsg.CIPValue, in gigaset_isdn_icall()
625 format_ie(iif->hcmsg.BC)); in gigaset_isdn_icall()
627 format_ie(iif->hcmsg.HLC)); in gigaset_isdn_icall()
629 format_ie(iif->hcmsg.CallingPartyNumber)); in gigaset_isdn_icall()
631 format_ie(iif->hcmsg.CalledPartyNumber)); in gigaset_isdn_icall()
634 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_icall()
635 if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) { in gigaset_isdn_icall()
636 dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", in gigaset_isdn_icall()
637 __func__, bcs->ap, bcs->apconnstate); in gigaset_isdn_icall()
638 bcs->ap = NULL; in gigaset_isdn_icall()
639 bcs->apconnstate = APCONN_NONE; in gigaset_isdn_icall()
641 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_icall()
642 actCIPmask = 1 | (1 << iif->hcmsg.CIPValue); in gigaset_isdn_icall()
643 list_for_each_entry(ap, &iif->appls, ctrlist) in gigaset_isdn_icall()
644 if (actCIPmask & ap->listenCIPmask) { in gigaset_isdn_icall()
646 iif->hcmsg.ApplId = ap->id; in gigaset_isdn_icall()
647 iif->hcmsg.Messagenumber = ap->nextMessageNumber++; in gigaset_isdn_icall()
651 dev_err(cs->dev, "%s: out of memory\n", in gigaset_isdn_icall()
655 capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize)); in gigaset_isdn_icall()
656 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in gigaset_isdn_icall()
659 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_icall()
660 ap->bcnext = bcs->ap; in gigaset_isdn_icall()
661 bcs->ap = ap; in gigaset_isdn_icall()
662 bcs->chstate |= CHS_NOTIFY_LL; in gigaset_isdn_icall()
663 bcs->apconnstate = APCONN_SETUP; in gigaset_isdn_icall()
664 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_icall()
667 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_isdn_icall()
675 return bcs->ap ? ICALL_ACCEPT : ICALL_IGNORE; in gigaset_isdn_icall()
685 struct cardstate *cs = bcs->cs; in send_disconnect_ind() local
686 struct gigaset_capi_ctr *iif = cs->iif; in send_disconnect_ind()
689 if (bcs->apconnstate == APCONN_NONE) in send_disconnect_ind()
692 capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT, CAPI_IND, in send_disconnect_ind()
693 ap->nextMessageNumber++, in send_disconnect_ind()
694 iif->ctr.cnr | ((bcs->channel + 1) << 8)); in send_disconnect_ind()
695 iif->hcmsg.Reason = reason; in send_disconnect_ind()
698 dev_err(cs->dev, "%s: out of memory\n", __func__); in send_disconnect_ind()
701 capi_cmsg2message(&iif->hcmsg, __skb_put(skb, CAPI_DISCONNECT_IND_LEN)); in send_disconnect_ind()
702 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in send_disconnect_ind()
703 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in send_disconnect_ind()
714 struct cardstate *cs = bcs->cs; in send_disconnect_b3_ind() local
715 struct gigaset_capi_ctr *iif = cs->iif; in send_disconnect_b3_ind()
719 if (bcs->apconnstate < APCONN_ACTIVE) in send_disconnect_b3_ind()
721 bcs->apconnstate = APCONN_SETUP; in send_disconnect_b3_ind()
723 capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, in send_disconnect_b3_ind()
724 ap->nextMessageNumber++, in send_disconnect_b3_ind()
725 iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); in send_disconnect_b3_ind()
728 dev_err(cs->dev, "%s: out of memory\n", __func__); in send_disconnect_b3_ind()
731 capi_cmsg2message(&iif->hcmsg, in send_disconnect_b3_ind()
733 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in send_disconnect_b3_ind()
734 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in send_disconnect_b3_ind()
738 * gigaset_isdn_connD() - signal D channel connect
746 struct cardstate *cs = bcs->cs; in gigaset_isdn_connD() local
747 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_connD()
753 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_connD()
754 ap = bcs->ap; in gigaset_isdn_connD()
756 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connD()
760 if (bcs->apconnstate == APCONN_NONE) { in gigaset_isdn_connD()
761 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connD()
762 dev_warn(cs->dev, "%s: application %u not connected\n", in gigaset_isdn_connD()
763 __func__, ap->id); in gigaset_isdn_connD()
766 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connD()
767 while (ap->bcnext) { in gigaset_isdn_connD()
769 dev_warn(cs->dev, "%s: dropping extra application %u\n", in gigaset_isdn_connD()
770 __func__, ap->bcnext->id); in gigaset_isdn_connD()
771 send_disconnect_ind(bcs, ap->bcnext, in gigaset_isdn_connD()
773 ap->bcnext = ap->bcnext->bcnext; in gigaset_isdn_connD()
779 capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_CONNECT_ACTIVE, CAPI_IND, in gigaset_isdn_connD()
780 ap->nextMessageNumber++, in gigaset_isdn_connD()
781 iif->ctr.cnr | ((bcs->channel + 1) << 8)); in gigaset_isdn_connD()
787 * (requires ev-layer state machine extension to collect in gigaset_isdn_connD()
794 dev_err(cs->dev, "%s: out of memory\n", __func__); in gigaset_isdn_connD()
797 capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize)); in gigaset_isdn_connD()
798 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in gigaset_isdn_connD()
799 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_isdn_connD()
803 * gigaset_isdn_hupD() - signal D channel hangup
816 * (requires ev-layer state machine extension to collect in gigaset_isdn_hupD()
819 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_hupD()
820 while (bcs->ap != NULL) { in gigaset_isdn_hupD()
821 ap = bcs->ap; in gigaset_isdn_hupD()
822 bcs->ap = ap->bcnext; in gigaset_isdn_hupD()
823 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_hupD()
826 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_hupD()
828 bcs->apconnstate = APCONN_NONE; in gigaset_isdn_hupD()
829 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_hupD()
833 * gigaset_isdn_connB() - signal B channel connect
841 struct cardstate *cs = bcs->cs; in gigaset_isdn_connB() local
842 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_connB()
849 spin_lock_irqsave(&bcs->aplock, flags); in gigaset_isdn_connB()
850 ap = bcs->ap; in gigaset_isdn_connB()
852 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connB()
856 if (!bcs->apconnstate) { in gigaset_isdn_connB()
857 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connB()
858 dev_warn(cs->dev, "%s: application %u not connected\n", in gigaset_isdn_connB()
859 __func__, ap->id); in gigaset_isdn_connB()
869 if (bcs->apconnstate >= APCONN_ACTIVE) { in gigaset_isdn_connB()
876 bcs->apconnstate = APCONN_ACTIVE; in gigaset_isdn_connB()
878 spin_unlock_irqrestore(&bcs->aplock, flags); in gigaset_isdn_connB()
880 while (ap->bcnext) { in gigaset_isdn_connB()
882 dev_warn(cs->dev, "%s: dropping extra application %u\n", in gigaset_isdn_connB()
883 __func__, ap->bcnext->id); in gigaset_isdn_connB()
884 send_disconnect_ind(bcs, ap->bcnext, in gigaset_isdn_connB()
886 ap->bcnext = ap->bcnext->bcnext; in gigaset_isdn_connB()
889 capi_cmsg_header(&iif->hcmsg, ap->id, command, CAPI_IND, in gigaset_isdn_connB()
890 ap->nextMessageNumber++, in gigaset_isdn_connB()
891 iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); in gigaset_isdn_connB()
894 dev_err(cs->dev, "%s: out of memory\n", __func__); in gigaset_isdn_connB()
897 capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize)); in gigaset_isdn_connB()
898 dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); in gigaset_isdn_connB()
899 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in gigaset_isdn_connB()
903 * gigaset_isdn_hupB() - signal B channel hangup
911 struct gigaset_capi_appl *ap = bcs->ap; in gigaset_isdn_hupB()
924 * gigaset_isdn_start() - signal device availability
925 * @cs: device descriptor structure.
930 void gigaset_isdn_start(struct cardstate *cs) in gigaset_isdn_start() argument
932 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_start()
935 strcpy(iif->ctr.manu, "Siemens"); in gigaset_isdn_start()
937 iif->ctr.version.majorversion = 2; /* CAPI 2.0 */ in gigaset_isdn_start()
938 iif->ctr.version.minorversion = 0; in gigaset_isdn_start()
939 /* ToDo: check/assert cs->gotfwver? */ in gigaset_isdn_start()
940 iif->ctr.version.majormanuversion = cs->fwver[0]; in gigaset_isdn_start()
941 iif->ctr.version.minormanuversion = cs->fwver[1]; in gigaset_isdn_start()
943 iif->ctr.profile.nbchannel = cs->channels; in gigaset_isdn_start()
945 iif->ctr.profile.goptions = 0x11; in gigaset_isdn_start()
947 iif->ctr.profile.support1 = 0x03; in gigaset_isdn_start()
950 iif->ctr.profile.support2 = 0x02; in gigaset_isdn_start()
952 iif->ctr.profile.support3 = 0x01; in gigaset_isdn_start()
954 strcpy(iif->ctr.serial, "0"); in gigaset_isdn_start()
955 capi_ctr_ready(&iif->ctr); in gigaset_isdn_start()
959 * gigaset_isdn_stop() - signal device unavailability
960 * @cs: device descriptor structure.
965 void gigaset_isdn_stop(struct cardstate *cs) in gigaset_isdn_stop() argument
967 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_stop()
968 capi_ctr_down(&iif->ctr); in gigaset_isdn_stop()
984 struct cardstate *cs = ctr->driverdata; in gigaset_register_appl() local
988 __func__, appl, rp->level3cnt, rp->datablkcnt, rp->datablklen); in gigaset_register_appl()
990 list_for_each_entry(ap, &iif->appls, ctrlist) in gigaset_register_appl()
991 if (ap->id == appl) { in gigaset_register_appl()
992 dev_notice(cs->dev, in gigaset_register_appl()
999 dev_err(cs->dev, "%s: out of memory\n", __func__); in gigaset_register_appl()
1002 ap->id = appl; in gigaset_register_appl()
1003 ap->rp = *rp; in gigaset_register_appl()
1005 list_add(&ap->ctrlist, &iif->appls); in gigaset_register_appl()
1006 dev_info(cs->dev, "application %u registered\n", ap->id); in gigaset_register_appl()
1017 struct cardstate *cs = bcs->cs; in remove_appl_from_channel() local
1022 spin_lock_irqsave(&bcs->aplock, flags); in remove_appl_from_channel()
1023 bcap = bcs->ap; in remove_appl_from_channel()
1025 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1031 bcs->ap = ap->bcnext; in remove_appl_from_channel()
1032 if (bcs->ap != NULL) { in remove_appl_from_channel()
1033 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1038 prevconnstate = bcs->apconnstate; in remove_appl_from_channel()
1039 bcs->apconnstate = APCONN_NONE; in remove_appl_from_channel()
1040 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1043 dev_notice(cs->dev, "%s: hanging up channel %u\n", in remove_appl_from_channel()
1044 __func__, bcs->channel); in remove_appl_from_channel()
1045 gigaset_add_event(cs, &bcs->at_state, in remove_appl_from_channel()
1047 gigaset_schedule_event(cs); in remove_appl_from_channel()
1054 if (bcap->bcnext == ap) { in remove_appl_from_channel()
1055 bcap->bcnext = bcap->bcnext->bcnext; in remove_appl_from_channel()
1056 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1059 bcap = bcap->bcnext; in remove_appl_from_channel()
1061 spin_unlock_irqrestore(&bcs->aplock, flags); in remove_appl_from_channel()
1071 struct cardstate *cs = iif->ctr.driverdata; in gigaset_release_appl() local
1077 list_for_each_entry_safe(ap, tmp, &iif->appls, ctrlist) in gigaset_release_appl()
1078 if (ap->id == appl) { in gigaset_release_appl()
1080 for (ch = 0; ch < cs->channels; ch++) in gigaset_release_appl()
1081 remove_appl_from_channel(&cs->bcs[ch], ap); in gigaset_release_appl()
1084 list_del(&ap->ctrlist); in gigaset_release_appl()
1086 dev_info(cs->dev, "application %u released\n", appl); in gigaset_release_appl()
1108 capi_cmsg_answer(&iif->acmsg); in send_conf()
1109 iif->acmsg.Info = info; in send_conf()
1110 capi_cmsg2message(&iif->acmsg, skb->data); in send_conf()
1112 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in send_conf()
1113 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in send_conf()
1123 struct cardstate *cs = iif->ctr.driverdata; in do_facility_req() local
1124 _cmsg *cmsg = &iif->acmsg; in do_facility_req()
1132 capi_message2cmsg(cmsg, skb->data); in do_facility_req()
1139 switch (cmsg->FacilitySelector) { in do_facility_req()
1156 pparam = cmsg->FacilityRequestParameter; in do_facility_req()
1158 dev_notice(cs->dev, "%s: %s missing\n", "FACILITY_REQ", in do_facility_req()
1168 confparam[3] = 6; /* length */ in do_facility_req()
1175 if (pparam[0] < 7 || pparam[3] < 4) { in do_facility_req()
1176 dev_notice(cs->dev, "%s: %s missing\n", in do_facility_req()
1183 dev_notice(cs->dev, in do_facility_req()
1187 confparam[3] = 2; /* length */ in do_facility_req()
1192 confparam[3] = 2; /* length */ in do_facility_req()
1197 dev_notice(cs->dev, in do_facility_req()
1202 confparam[3] = 2; /* length */ in do_facility_req()
1209 confparam[0] = confparam[3] + 3; /* total length */ in do_facility_req()
1229 cmsg->Info = info; in do_facility_req()
1230 cmsg->FacilityConfirmationParameter = confparam; in do_facility_req()
1234 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_facility_req()
1239 capi_ctr_handle_message(&iif->ctr, ap->id, cskb); in do_facility_req()
1252 capi_message2cmsg(&iif->acmsg, skb->data); in do_listen_req()
1253 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_listen_req()
1256 ap->listenInfoMask = iif->acmsg.InfoMask; in do_listen_req()
1257 ap->listenCIPmask = iif->acmsg.CIPmask; in do_listen_req()
1270 capi_message2cmsg(&iif->acmsg, skb->data); in do_alert_req()
1271 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_alert_req()
1284 struct cardstate *cs = iif->ctr.driverdata; in do_connect_req() local
1285 _cmsg *cmsg = &iif->acmsg; in do_connect_req()
1295 capi_message2cmsg(cmsg, skb->data); in do_connect_req()
1299 bcs = gigaset_get_free_channel(cs); in do_connect_req()
1301 dev_notice(cs->dev, "%s: no B channel available\n", in do_connect_req()
1306 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_req()
1307 if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) in do_connect_req()
1308 dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", in do_connect_req()
1309 __func__, bcs->ap, bcs->apconnstate); in do_connect_req()
1310 ap->bcnext = NULL; in do_connect_req()
1311 bcs->ap = ap; in do_connect_req()
1312 bcs->apconnstate = APCONN_SETUP; in do_connect_req()
1313 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_req()
1315 bcs->rx_bufsize = ap->rp.datablklen; in do_connect_req()
1316 dev_kfree_skb(bcs->rx_skb); in do_connect_req()
1318 cmsg->adr.adrPLCI |= (bcs->channel + 1) << 8; in do_connect_req()
1326 pp = cmsg->CalledPartyNumber; in do_connect_req()
1328 dev_notice(cs->dev, "%s: %s missing\n", in do_connect_req()
1340 dev_notice(cs->dev, "%s: %s type/plan 0x%02x unsupported\n", in do_connect_req()
1344 l--; in do_connect_req()
1349 l -= 2; in do_connect_req()
1356 commands[AT_DIAL] = kmalloc(l+3, GFP_KERNEL); in do_connect_req()
1359 snprintf(commands[AT_DIAL], l+3, "D%.*s\r", l, pp); in do_connect_req()
1362 pp = cmsg->CallingPartyNumber; in do_connect_req()
1373 dev_notice(cs->dev, in do_connect_req()
1378 l--; in do_connect_req()
1382 dev_notice(cs->dev, "%s: %s IE truncated\n", in do_connect_req()
1395 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_req()
1405 l--; in do_connect_req()
1417 if (cmsg->CIPValue >= ARRAY_SIZE(cip2bchlc) || in do_connect_req()
1418 (cmsg->CIPValue > 0 && cip2bchlc[cmsg->CIPValue].bc == NULL)) { in do_connect_req()
1419 dev_notice(cs->dev, "%s: unknown CIP value %d\n", in do_connect_req()
1420 "CONNECT_REQ", cmsg->CIPValue); in do_connect_req()
1432 if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ in do_connect_req()
1433 lbc = 2*cmsg->BC[0]; in do_connect_req()
1434 else if (cip2bchlc[cmsg->CIPValue].bc) /* BC derived from CIP */ in do_connect_req()
1435 lbc = strlen(cip2bchlc[cmsg->CIPValue].bc); in do_connect_req()
1438 if (cmsg->HLC && cmsg->HLC[0]) /* HLC specified explicitly */ in do_connect_req()
1439 lhlc = 2*cmsg->HLC[0]; in do_connect_req()
1440 else if (cip2bchlc[cmsg->CIPValue].hlc) /* HLC derived from CIP */ in do_connect_req()
1441 lhlc = strlen(cip2bchlc[cmsg->CIPValue].hlc); in do_connect_req()
1454 if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ in do_connect_req()
1455 decode_ie(cmsg->BC, commands[AT_BC] + 5); in do_connect_req()
1458 cip2bchlc[cmsg->CIPValue].bc); in do_connect_req()
1461 if (cmsg->HLC && cmsg->HLC[0]) in do_connect_req()
1463 decode_ie(cmsg->HLC, in do_connect_req()
1467 cip2bchlc[cmsg->CIPValue].hlc); in do_connect_req()
1469 strcpy(commands[AT_BC] + l - 2, "\r"); in do_connect_req()
1473 dev_notice(cs->dev, "%s: cannot set HLC without BC\n", in do_connect_req()
1481 if (cmsg->BProtocol == CAPI_DEFAULT) { in do_connect_req()
1482 bcs->proto2 = L2_HDLC; in do_connect_req()
1483 dev_warn(cs->dev, in do_connect_req()
1486 switch (cmsg->B1protocol) { in do_connect_req()
1488 bcs->proto2 = L2_HDLC; in do_connect_req()
1491 bcs->proto2 = L2_VOICE; in do_connect_req()
1494 dev_warn(cs->dev, in do_connect_req()
1496 cmsg->B1protocol); in do_connect_req()
1497 bcs->proto2 = L2_VOICE; in do_connect_req()
1499 if (cmsg->B2protocol != 1) in do_connect_req()
1500 dev_warn(cs->dev, in do_connect_req()
1502 cmsg->B2protocol); in do_connect_req()
1503 if (cmsg->B3protocol != 0) in do_connect_req()
1504 dev_warn(cs->dev, in do_connect_req()
1506 cmsg->B3protocol); in do_connect_req()
1507 ignore_cstruct_param(cs, cmsg->B1configuration, in do_connect_req()
1509 ignore_cstruct_param(cs, cmsg->B2configuration, in do_connect_req()
1511 ignore_cstruct_param(cs, cmsg->B3configuration, in do_connect_req()
1517 snprintf(commands[AT_PROTO], 9, "^SBPR=%u\r", bcs->proto2); in do_connect_req()
1520 ignore_cstruct_param(cs, cmsg->CalledPartySubaddress, in do_connect_req()
1522 ignore_cstruct_param(cs, cmsg->CallingPartySubaddress, in do_connect_req()
1524 ignore_cstruct_param(cs, cmsg->LLC, in do_connect_req()
1526 if (cmsg->AdditionalInfo != CAPI_DEFAULT) { in do_connect_req()
1527 ignore_cstruct_param(cs, cmsg->BChannelinformation, in do_connect_req()
1529 ignore_cstruct_param(cs, cmsg->Keypadfacility, in do_connect_req()
1531 ignore_cstruct_param(cs, cmsg->Useruserdata, in do_connect_req()
1532 "CONNECT_REQ", "User-User Data"); in do_connect_req()
1533 ignore_cstruct_param(cs, cmsg->Facilitydataarray, in do_connect_req()
1542 (unsigned) bcs->channel + 1); in do_connect_req()
1545 if (!gigaset_add_event(cs, &bcs->at_state, EV_DIAL, commands, in do_connect_req()
1546 bcs->at_state.seq_index, NULL)) { in do_connect_req()
1550 gigaset_schedule_event(cs); in do_connect_req()
1555 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_connect_req()
1574 struct cardstate *cs = iif->ctr.driverdata; in do_connect_resp() local
1575 _cmsg *cmsg = &iif->acmsg; in do_connect_resp()
1582 capi_message2cmsg(cmsg, skb->data); in do_connect_resp()
1587 channel = (cmsg->adr.adrPLCI >> 8) & 0xff; in do_connect_resp()
1588 if (!channel || channel > cs->channels) { in do_connect_resp()
1589 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_resp()
1590 "CONNECT_RESP", "PLCI", cmsg->adr.adrPLCI); in do_connect_resp()
1593 bcs = cs->bcs + channel - 1; in do_connect_resp()
1595 switch (cmsg->Reject) { in do_connect_resp()
1598 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1599 while (bcs->ap != NULL) { in do_connect_resp()
1600 oap = bcs->ap; in do_connect_resp()
1601 bcs->ap = oap->bcnext; in do_connect_resp()
1603 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1606 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1609 ap->bcnext = NULL; in do_connect_resp()
1610 bcs->ap = ap; in do_connect_resp()
1611 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1613 bcs->rx_bufsize = ap->rp.datablklen; in do_connect_resp()
1614 dev_kfree_skb(bcs->rx_skb); in do_connect_resp()
1616 bcs->chstate |= CHS_NOTIFY_LL; in do_connect_resp()
1619 if (cmsg->BProtocol == CAPI_DEFAULT) { in do_connect_resp()
1620 bcs->proto2 = L2_HDLC; in do_connect_resp()
1621 dev_warn(cs->dev, in do_connect_resp()
1624 switch (cmsg->B1protocol) { in do_connect_resp()
1626 bcs->proto2 = L2_HDLC; in do_connect_resp()
1629 bcs->proto2 = L2_VOICE; in do_connect_resp()
1632 dev_warn(cs->dev, in do_connect_resp()
1634 cmsg->B1protocol); in do_connect_resp()
1635 bcs->proto2 = L2_VOICE; in do_connect_resp()
1637 if (cmsg->B2protocol != 1) in do_connect_resp()
1638 dev_warn(cs->dev, in do_connect_resp()
1640 cmsg->B2protocol); in do_connect_resp()
1641 if (cmsg->B3protocol != 0) in do_connect_resp()
1642 dev_warn(cs->dev, in do_connect_resp()
1644 cmsg->B3protocol); in do_connect_resp()
1645 ignore_cstruct_param(cs, cmsg->B1configuration, in do_connect_resp()
1647 ignore_cstruct_param(cs, cmsg->B2configuration, in do_connect_resp()
1649 ignore_cstruct_param(cs, cmsg->B3configuration, in do_connect_resp()
1654 ignore_cstruct_param(cs, cmsg->ConnectedNumber, in do_connect_resp()
1656 ignore_cstruct_param(cs, cmsg->ConnectedSubaddress, in do_connect_resp()
1658 ignore_cstruct_param(cs, cmsg->LLC, in do_connect_resp()
1660 if (cmsg->AdditionalInfo != CAPI_DEFAULT) { in do_connect_resp()
1661 ignore_cstruct_param(cs, cmsg->BChannelinformation, in do_connect_resp()
1663 ignore_cstruct_param(cs, cmsg->Keypadfacility, in do_connect_resp()
1665 ignore_cstruct_param(cs, cmsg->Useruserdata, in do_connect_resp()
1666 "CONNECT_RESP", "User-User Data"); in do_connect_resp()
1667 ignore_cstruct_param(cs, cmsg->Facilitydataarray, in do_connect_resp()
1672 if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state, in do_connect_resp()
1675 gigaset_schedule_event(cs); in do_connect_resp()
1683 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1684 if (bcs->ap == ap) { in do_connect_resp()
1685 bcs->ap = ap->bcnext; in do_connect_resp()
1686 if (bcs->ap == NULL) { in do_connect_resp()
1687 /* last one: stop ev-layer hupD notifications */ in do_connect_resp()
1688 bcs->apconnstate = APCONN_NONE; in do_connect_resp()
1689 bcs->chstate &= ~CHS_NOTIFY_LL; in do_connect_resp()
1691 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1694 for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) { in do_connect_resp()
1695 if (oap->bcnext == ap) { in do_connect_resp()
1696 oap->bcnext = oap->bcnext->bcnext; in do_connect_resp()
1697 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1701 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1702 dev_err(cs->dev, "%s: application %u not found\n", in do_connect_resp()
1703 __func__, ap->id); in do_connect_resp()
1708 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1709 while (bcs->ap != NULL) { in do_connect_resp()
1710 oap = bcs->ap; in do_connect_resp()
1711 bcs->ap = oap->bcnext; in do_connect_resp()
1713 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1716 spin_lock_irqsave(&bcs->aplock, flags); in do_connect_resp()
1719 ap->bcnext = NULL; in do_connect_resp()
1720 bcs->ap = ap; in do_connect_resp()
1721 spin_unlock_irqrestore(&bcs->aplock, flags); in do_connect_resp()
1723 /* reject call - will trigger DISCONNECT_IND for this app */ in do_connect_resp()
1724 dev_info(cs->dev, "%s: Reject=%x\n", in do_connect_resp()
1725 "CONNECT_RESP", cmsg->Reject); in do_connect_resp()
1726 if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state, in do_connect_resp()
1729 gigaset_schedule_event(cs); in do_connect_resp()
1742 struct cardstate *cs = iif->ctr.driverdata; in do_connect_b3_req() local
1743 _cmsg *cmsg = &iif->acmsg; in do_connect_b3_req()
1748 capi_message2cmsg(cmsg, skb->data); in do_connect_b3_req()
1752 channel = (cmsg->adr.adrPLCI >> 8) & 0xff; in do_connect_b3_req()
1753 if (!channel || channel > cs->channels) { in do_connect_b3_req()
1754 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_b3_req()
1755 "CONNECT_B3_REQ", "PLCI", cmsg->adr.adrPLCI); in do_connect_b3_req()
1759 bcs = &cs->bcs[channel-1]; in do_connect_b3_req()
1762 bcs->apconnstate = APCONN_ACTIVE; in do_connect_b3_req()
1765 cmsg->adr.adrNCCI |= 1 << 16; in do_connect_b3_req()
1768 ignore_cstruct_param(cs, cmsg->NCPI, "CONNECT_B3_REQ", "NCPI"); in do_connect_b3_req()
1769 send_conf(iif, ap, skb, (cmsg->NCPI && cmsg->NCPI[0]) ? in do_connect_b3_req()
1784 struct cardstate *cs = iif->ctr.driverdata; in do_connect_b3_resp() local
1785 _cmsg *cmsg = &iif->acmsg; in do_connect_b3_resp()
1792 capi_message2cmsg(cmsg, skb->data); in do_connect_b3_resp()
1796 channel = (cmsg->adr.adrNCCI >> 8) & 0xff; in do_connect_b3_resp()
1797 if (!channel || channel > cs->channels || in do_connect_b3_resp()
1798 ((cmsg->adr.adrNCCI >> 16) & 0xffff) != 1) { in do_connect_b3_resp()
1799 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_connect_b3_resp()
1800 "CONNECT_B3_RESP", "NCCI", cmsg->adr.adrNCCI); in do_connect_b3_resp()
1804 bcs = &cs->bcs[channel-1]; in do_connect_b3_resp()
1806 if (cmsg->Reject) { in do_connect_b3_resp()
1808 bcs->apconnstate = APCONN_SETUP; in do_connect_b3_resp()
1811 if (!gigaset_add_event(cs, &bcs->at_state, in do_connect_b3_resp()
1816 gigaset_schedule_event(cs); in do_connect_b3_resp()
1829 capi_cmsg_header(cmsg, ap->id, command, CAPI_IND, in do_connect_b3_resp()
1830 ap->nextMessageNumber++, cmsg->adr.adrNCCI); in do_connect_b3_resp()
1832 capi_cmsg2message(cmsg, skb->data); in do_connect_b3_resp()
1834 capi_ctr_handle_message(&iif->ctr, ap->id, skb); in do_connect_b3_resp()
1846 struct cardstate *cs = iif->ctr.driverdata; in do_disconnect_req() local
1847 _cmsg *cmsg = &iif->acmsg; in do_disconnect_req()
1854 capi_message2cmsg(cmsg, skb->data); in do_disconnect_req()
1858 channel = (cmsg->adr.adrPLCI >> 8) & 0xff; in do_disconnect_req()
1859 if (!channel || channel > cs->channels) { in do_disconnect_req()
1860 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_disconnect_req()
1861 "DISCONNECT_REQ", "PLCI", cmsg->adr.adrPLCI); in do_disconnect_req()
1865 bcs = cs->bcs + channel - 1; in do_disconnect_req()
1868 if (cmsg->AdditionalInfo != CAPI_DEFAULT) { in do_disconnect_req()
1869 ignore_cstruct_param(cs, cmsg->BChannelinformation, in do_disconnect_req()
1871 ignore_cstruct_param(cs, cmsg->Keypadfacility, in do_disconnect_req()
1873 ignore_cstruct_param(cs, cmsg->Useruserdata, in do_disconnect_req()
1874 "DISCONNECT_REQ", "User-User Data"); in do_disconnect_req()
1875 ignore_cstruct_param(cs, cmsg->Facilitydataarray, in do_disconnect_req()
1880 if (!bcs->apconnstate) in do_disconnect_req()
1884 if (bcs->apconnstate >= APCONN_ACTIVE) { in do_disconnect_req()
1887 * use separate cmsg structure, as the content of iif->acmsg in do_disconnect_req()
1892 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_disconnect_req()
1896 capi_cmsg_header(b3cmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, in do_disconnect_req()
1897 ap->nextMessageNumber++, in do_disconnect_req()
1898 cmsg->adr.adrPLCI | (1 << 16)); in do_disconnect_req()
1899 b3cmsg->Reason_B3 = CapiProtocolErrorLayer1; in do_disconnect_req()
1902 dev_err(cs->dev, "%s: out of memory\n", __func__); in do_disconnect_req()
1910 capi_ctr_handle_message(&iif->ctr, ap->id, b3skb); in do_disconnect_req()
1914 if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL)) { in do_disconnect_req()
1918 gigaset_schedule_event(cs); in do_disconnect_req()
1932 struct cardstate *cs = iif->ctr.driverdata; in do_disconnect_b3_req() local
1933 _cmsg *cmsg = &iif->acmsg; in do_disconnect_b3_req()
1938 capi_message2cmsg(cmsg, skb->data); in do_disconnect_b3_req()
1942 channel = (cmsg->adr.adrNCCI >> 8) & 0xff; in do_disconnect_b3_req()
1943 if (!channel || channel > cs->channels || in do_disconnect_b3_req()
1944 ((cmsg->adr.adrNCCI >> 16) & 0xffff) != 1) { in do_disconnect_b3_req()
1945 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_disconnect_b3_req()
1946 "DISCONNECT_B3_REQ", "NCCI", cmsg->adr.adrNCCI); in do_disconnect_b3_req()
1950 bcs = &cs->bcs[channel-1]; in do_disconnect_b3_req()
1953 if (bcs->apconnstate < APCONN_ACTIVE) { in do_disconnect_b3_req()
1960 if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL)) { in do_disconnect_b3_req()
1964 gigaset_schedule_event(cs); in do_disconnect_b3_req()
1967 ignore_cstruct_param(cs, cmsg->NCPI, in do_disconnect_b3_req()
1969 send_conf(iif, ap, skb, (cmsg->NCPI && cmsg->NCPI[0]) ? in do_disconnect_b3_req()
1980 struct cardstate *cs = iif->ctr.driverdata; in do_data_b3_req() local
1982 int channel = CAPIMSG_PLCI_PART(skb->data); in do_data_b3_req()
1983 u16 ncci = CAPIMSG_NCCI_PART(skb->data); in do_data_b3_req()
1984 u16 msglen = CAPIMSG_LEN(skb->data); in do_data_b3_req()
1985 u16 datalen = CAPIMSG_DATALEN(skb->data); in do_data_b3_req()
1986 u16 flags = CAPIMSG_FLAGS(skb->data); in do_data_b3_req()
1987 u16 msgid = CAPIMSG_MSGID(skb->data); in do_data_b3_req()
1988 u16 handle = CAPIMSG_HANDLE_REQ(skb->data); in do_data_b3_req()
1991 dump_rawmsg(DEBUG_MCMD, __func__, skb->data); in do_data_b3_req()
1994 if (channel == 0 || channel > cs->channels || ncci != 1) { in do_data_b3_req()
1995 dev_notice(cs->dev, "%s: invalid %s 0x%02x\n", in do_data_b3_req()
1996 "DATA_B3_REQ", "NCCI", CAPIMSG_NCCI(skb->data)); in do_data_b3_req()
2000 bcs = &cs->bcs[channel-1]; in do_data_b3_req()
2002 dev_notice(cs->dev, "%s: unexpected length %d\n", in do_data_b3_req()
2004 if (msglen + datalen != skb->len) in do_data_b3_req()
2005 dev_notice(cs->dev, "%s: length mismatch (%d+%d!=%d)\n", in do_data_b3_req()
2006 "DATA_B3_REQ", msglen, datalen, skb->len); in do_data_b3_req()
2007 if (msglen + datalen > skb->len) { in do_data_b3_req()
2013 dev_notice(cs->dev, "%s: reserved flags set (%x)\n", in do_data_b3_req()
2020 if (bcs->apconnstate < APCONN_ACTIVE) { in do_data_b3_req()
2027 skb->mac_len = msglen; in do_data_b3_req()
2030 /* pass to device-specific module */ in do_data_b3_req()
2031 if (cs->ops->send_skb(bcs, skb) < 0) { in do_data_b3_req()
2041 send_data_b3_conf(cs, &iif->ctr, ap->id, msgid, channel, handle, in do_data_b3_req()
2055 capi_message2cmsg(&iif->acmsg, skb->data); in do_reset_b3_req()
2056 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_reset_b3_req()
2075 capi_message2cmsg(&iif->acmsg, skb->data); in do_unsupported()
2077 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_unsupported()
2082 * CAPI message handler: no-op
2090 capi_message2cmsg(&iif->acmsg, skb->data); in do_nothing()
2091 dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg); in do_nothing()
2100 dump_rawmsg(DEBUG_MCMD, __func__, skb->data); in do_data_b3_resp()
2137 * ToDo: support overlap sending (requires ev-layer state
2163 * gigaset_send_message() - accept a CAPI message from an application
2175 struct cardstate *cs = ctr->driverdata; in gigaset_send_message() local
2181 dev_warn(cs->dev, "%s: skb_linearize failed\n", __func__); in gigaset_send_message()
2186 ap = get_appl(iif, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2188 dev_notice(cs->dev, "%s: application %u not registered\n", in gigaset_send_message()
2189 __func__, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2194 handler = lookup_capi_send_handler(CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2198 dev_notice(cs->dev, "%s: unsupported message %u\n", in gigaset_send_message()
2199 __func__, CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2204 if (atomic_add_return(1, &iif->sendqlen) > 1) { in gigaset_send_message()
2206 skb_queue_tail(&iif->sendqueue, skb); in gigaset_send_message()
2214 while (atomic_sub_return(1, &iif->sendqlen) > 0) { in gigaset_send_message()
2215 skb = skb_dequeue(&iif->sendqueue); in gigaset_send_message()
2218 dev_err(cs->dev, "%s: send queue empty\n", __func__); in gigaset_send_message()
2221 ap = get_appl(iif, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2224 dev_warn(cs->dev, "%s: application %u vanished\n", in gigaset_send_message()
2225 __func__, CAPIMSG_APPID(skb->data)); in gigaset_send_message()
2228 handler = lookup_capi_send_handler(CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2231 dev_err(cs->dev, "%s: handler %x vanished\n", in gigaset_send_message()
2232 __func__, CAPIMSG_CMD(skb->data)); in gigaset_send_message()
2242 * gigaset_procinfo() - build single line description for controller
2249 return ctr->name; /* ToDo: more? */ in gigaset_procinfo()
2254 struct capi_ctr *ctr = m->private; in gigaset_proc_show()
2255 struct cardstate *cs = ctr->driverdata; in gigaset_proc_show() local
2259 seq_printf(m, "%-16s %s\n", "name", ctr->name); in gigaset_proc_show()
2260 seq_printf(m, "%-16s %s %s\n", "dev", in gigaset_proc_show()
2261 dev_driver_string(cs->dev), dev_name(cs->dev)); in gigaset_proc_show()
2262 seq_printf(m, "%-16s %d\n", "id", cs->myid); in gigaset_proc_show()
2263 if (cs->gotfwver) in gigaset_proc_show()
2264 seq_printf(m, "%-16s %d.%d.%d.%d\n", "firmware", in gigaset_proc_show()
2265 cs->fwver[0], cs->fwver[1], cs->fwver[2], cs->fwver[3]); in gigaset_proc_show()
2266 seq_printf(m, "%-16s %d\n", "channels", cs->channels); in gigaset_proc_show()
2267 seq_printf(m, "%-16s %s\n", "onechannel", cs->onechannel ? "yes" : "no"); in gigaset_proc_show()
2269 switch (cs->mode) { in gigaset_proc_show()
2285 seq_printf(m, "%-16s %s\n", "mode", s); in gigaset_proc_show()
2287 switch (cs->mstate) { in gigaset_proc_show()
2309 seq_printf(m, "%-16s %s\n", "mstate", s); in gigaset_proc_show()
2311 seq_printf(m, "%-16s %s\n", "running", cs->running ? "yes" : "no"); in gigaset_proc_show()
2312 seq_printf(m, "%-16s %s\n", "connected", cs->connected ? "yes" : "no"); in gigaset_proc_show()
2313 seq_printf(m, "%-16s %s\n", "isdn_up", cs->isdn_up ? "yes" : "no"); in gigaset_proc_show()
2314 seq_printf(m, "%-16s %s\n", "cidmode", cs->cidmode ? "yes" : "no"); in gigaset_proc_show()
2316 for (i = 0; i < cs->channels; i++) { in gigaset_proc_show()
2317 seq_printf(m, "[%d]%-13s %d\n", i, "corrupted", in gigaset_proc_show()
2318 cs->bcs[i].corrupted); in gigaset_proc_show()
2319 seq_printf(m, "[%d]%-13s %d\n", i, "trans_down", in gigaset_proc_show()
2320 cs->bcs[i].trans_down); in gigaset_proc_show()
2321 seq_printf(m, "[%d]%-13s %d\n", i, "trans_up", in gigaset_proc_show()
2322 cs->bcs[i].trans_up); in gigaset_proc_show()
2323 seq_printf(m, "[%d]%-13s %d\n", i, "chstate", in gigaset_proc_show()
2324 cs->bcs[i].chstate); in gigaset_proc_show()
2325 switch (cs->bcs[i].proto2) { in gigaset_proc_show()
2338 seq_printf(m, "[%d]%-13s %s\n", i, "proto2", s); in gigaset_proc_show()
2345 return single_open(file, gigaset_proc_show, PDE(inode)->data); in gigaset_proc_open()
2357 * gigaset_isdn_regdev() - register device to LL
2358 * @cs: device descriptor structure.
2363 int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) in gigaset_isdn_regdev() argument
2375 iif->ctr.owner = THIS_MODULE; in gigaset_isdn_regdev()
2376 iif->ctr.driverdata = cs; in gigaset_isdn_regdev()
2377 strncpy(iif->ctr.name, isdnid, sizeof(iif->ctr.name)); in gigaset_isdn_regdev()
2378 iif->ctr.driver_name = "gigaset"; in gigaset_isdn_regdev()
2379 iif->ctr.load_firmware = NULL; in gigaset_isdn_regdev()
2380 iif->ctr.reset_ctr = NULL; in gigaset_isdn_regdev()
2381 iif->ctr.register_appl = gigaset_register_appl; in gigaset_isdn_regdev()
2382 iif->ctr.release_appl = gigaset_release_appl; in gigaset_isdn_regdev()
2383 iif->ctr.send_message = gigaset_send_message; in gigaset_isdn_regdev()
2384 iif->ctr.procinfo = gigaset_procinfo; in gigaset_isdn_regdev()
2385 iif->ctr.proc_fops = &gigaset_proc_fops; in gigaset_isdn_regdev()
2386 INIT_LIST_HEAD(&iif->appls); in gigaset_isdn_regdev()
2387 skb_queue_head_init(&iif->sendqueue); in gigaset_isdn_regdev()
2388 atomic_set(&iif->sendqlen, 0); in gigaset_isdn_regdev()
2391 rc = attach_capi_ctr(&iif->ctr); in gigaset_isdn_regdev()
2398 cs->iif = iif; in gigaset_isdn_regdev()
2399 cs->hw_hdr_len = CAPI_DATA_B3_REQ_LEN; in gigaset_isdn_regdev()
2404 * gigaset_isdn_unregdev() - unregister device from LL
2405 * @cs: device descriptor structure.
2407 void gigaset_isdn_unregdev(struct cardstate *cs) in gigaset_isdn_unregdev() argument
2409 struct gigaset_capi_ctr *iif = cs->iif; in gigaset_isdn_unregdev()
2411 detach_capi_ctr(&iif->ctr); in gigaset_isdn_unregdev()
2413 cs->iif = NULL; in gigaset_isdn_unregdev()
2422 * gigaset_isdn_regdrv() - register driver to LL
2431 * gigaset_isdn_unregdrv() - unregister driver from LL