static void handle_data(capiconn_context *ctx, _cmsg * cmsg) { capi_contr *card = findcontrbynumber(ctx,cmsg->adr.adrController&0x7f); capiconn_callbacks *cb = ctx->cb; capi_ncci *nccip; unsigned char *data; if (!card) { (*cb->errmsg)("capiconn: %s from unknown controller 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController & 0x7f); return; } if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) { (*cb->errmsg)("%s: ncci 0x%x not found", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); return; } data = (unsigned char *)cmsg->Data; if (cb->received) (*cb->received)(nccip->plcip, data, cmsg->DataLength); capi_cmsg_answer(cmsg); send_message(card, cmsg); }
void B1_send_message(unsigned short port, struct sk_buff *skb) { unsigned long flags; __u16 len = CAPIMSG_LEN(skb->data); __u8 cmd = CAPIMSG_COMMAND(skb->data); __u8 subcmd = CAPIMSG_SUBCOMMAND(skb->data); __u32 contr = CAPIMSG_CONTROL(skb->data); if (CAPICMD(cmd, subcmd) == CAPI_DATA_B3_REQ) { __u16 dlen = CAPIMSG_DATALEN(skb->data); if (showcapimsgs > 2) { if (showcapimsgs & 1) { printk(KERN_DEBUG "b1lli: Put [0x%lx] id#%d %s len=%u\n", (unsigned long) contr, CAPIMSG_APPID(skb->data), capi_cmd2str(cmd, subcmd), len); } else { printk(KERN_DEBUG "b1lli: Put [0x%lx] %s\n", (unsigned long) contr, capi_message2str(skb->data)); } } save_flags(flags); cli(); B1_put_byte(port, SEND_DATA_B3_REQ); B1_put_slice(port, skb->data, len); B1_put_slice(port, skb->data + len, dlen); restore_flags(flags); } else { if (showcapimsgs) { if (showcapimsgs & 1) { printk(KERN_DEBUG "b1lli: Put [0x%lx] id#%d %s len=%u\n", (unsigned long) contr, CAPIMSG_APPID(skb->data), capi_cmd2str(cmd, subcmd), len); } else { printk(KERN_DEBUG "b1lli: Put [0x%lx] %s\n", (unsigned long)contr, capi_message2str(skb->data)); } } save_flags(flags); cli(); B1_put_byte(port, SEND_MESSAGE); B1_put_slice(port, skb->data, len); restore_flags(flags); } dev_kfree_skb(skb, FREE_WRITE); }
static __u16 capi_put_message(__u16 applid, struct sk_buff *skb) { struct capi_ncci *np; __u32 contr; int showctl = 0; __u8 cmd, subcmd; if (ncards == 0) return CAPI_REGNOTINSTALLED; if (!VALID_APPLID(applid)) return CAPI_ILLAPPNR; if (skb->len < 12 || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data)) || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb->data))) return CAPI_ILLCMDORSUBCMDORMSGTOSMALL; contr = CAPIMSG_CONTROLLER(skb->data); if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING) { contr = 1; if (CARD(contr)->cardstate != CARD_RUNNING) return CAPI_REGNOTINSTALLED; } if (CARD(contr)->blocked) return CAPI_SENDQUEUEFULL; cmd = CAPIMSG_COMMAND(skb->data); subcmd = CAPIMSG_SUBCOMMAND(skb->data); if (cmd == CAPI_DATA_B3 && subcmd== CAPI_REQ) { if ((np = find_ncci(APPL(applid), CAPIMSG_NCCI(skb->data))) != 0 && mq_enqueue(np, CAPIMSG_MSGID(skb->data)) == 0) return CAPI_SENDQUEUEFULL; CARD(contr)->nsentdatapkt++; APPL(applid)->nsentdatapkt++; if (CARD(contr)->traceflag > 2) showctl |= 2; } else { CARD(contr)->nsentctlpkt++; APPL(applid)->nsentctlpkt++; if (CARD(contr)->traceflag) showctl |= 2; } showctl |= (CARD(contr)->traceflag & 1); if (showctl & 2) { if (showctl & 1) { printk(KERN_DEBUG "kcapi: put [0x%lx] id#%d %s len=%u\n", (unsigned long) contr, CAPIMSG_APPID(skb->data), capi_cmd2str(cmd, subcmd), CAPIMSG_LEN(skb->data)); } else { printk(KERN_DEBUG "kcapi: put [0x%lx] %s\n", (unsigned long) contr, capi_message2str(skb->data)); } } CARD(contr)->driver->send_message(CARD(contr), skb); return CAPI_NOERROR; }
u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb) { struct capi_ctr *card; int showctl = 0; u8 cmd, subcmd; DBG("applid %#x", ap->applid); if (ncards == 0) return CAPI_REGNOTINSTALLED; if (ap->applid == 0) return CAPI_ILLAPPNR; if (skb->len < 12 || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data)) || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb->data))) return CAPI_ILLCMDORSUBCMDORMSGTOSMALL; card = get_capi_ctr_by_nr(CAPIMSG_CONTROLLER(skb->data)); if (!card || card->cardstate != CARD_RUNNING) { card = get_capi_ctr_by_nr(1); // XXX why? if (!card || card->cardstate != CARD_RUNNING) return CAPI_REGNOTINSTALLED; } if (card->blocked) return CAPI_SENDQUEUEFULL; cmd = CAPIMSG_COMMAND(skb->data); subcmd = CAPIMSG_SUBCOMMAND(skb->data); if (cmd == CAPI_DATA_B3 && subcmd== CAPI_REQ) { card->nsentdatapkt++; ap->nsentdatapkt++; if (card->traceflag > 2) showctl |= 2; } else { card->nsentctlpkt++; ap->nsentctlpkt++; if (card->traceflag) showctl |= 2; } showctl |= (card->traceflag & 1); if (showctl & 2) { if (showctl & 1) { printk(KERN_DEBUG "kcapi: put [%#x] id#%d %s len=%u\n", CAPIMSG_CONTROLLER(skb->data), CAPIMSG_APPID(skb->data), capi_cmd2str(cmd, subcmd), CAPIMSG_LEN(skb->data)); } else { printk(KERN_DEBUG "kcapi: put [%#x] %s\n", CAPIMSG_CONTROLLER(skb->data), capi_message2str(skb->data)); } } return card->send_message(card, skb); }
static void controllercb_handle_capimsg(struct capi_ctr * card, __u16 appl, struct sk_buff *skb) { int showctl = 0; __u8 cmd, subcmd; if (card->cardstate != CARD_RUNNING) { printk(KERN_INFO "kcapi: controller %d not active, got: %s", card->cnr, capi_message2str(skb->data)); goto error; } cmd = CAPIMSG_COMMAND(skb->data); subcmd = CAPIMSG_SUBCOMMAND(skb->data); if (cmd == CAPI_DATA_B3 && subcmd == CAPI_IND) { card->nrecvdatapkt++; if (card->traceflag > 2) showctl |= 2; } else { card->nrecvctlpkt++; if (card->traceflag) showctl |= 2; } showctl |= (card->traceflag & 1); if (showctl & 2) { if (showctl & 1) { printk(KERN_DEBUG "kcapi: got [0x%lx] id#%d %s len=%u\n", (unsigned long) card->cnr, CAPIMSG_APPID(skb->data), capi_cmd2str(cmd, subcmd), CAPIMSG_LEN(skb->data)); } else { printk(KERN_DEBUG "kcapi: got [0x%lx] %s\n", (unsigned long) card->cnr, capi_message2str(skb->data)); } } skb_queue_tail(&recv_queue, skb); queue_task(&tq_recv_notify, &tq_immediate); mark_bh(IMMEDIATE_BH); return; error: kfree_skb(skb); }
static void handle_controller(capiconn_context *ctx, _cmsg * cmsg) { capi_contr *card = findcontrbynumber(ctx, cmsg->adr.adrController&0x7f); capiconn_callbacks *cb = ctx->cb; if (!card) { (*cb->errmsg)("capiconn: %s from unknown controller 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController & 0x7f); return; } switch (CAPICMD(cmsg->Command, cmsg->Subcommand)) { case CAPI_LISTEN_CONF: /* Controller */ (*cb->debugmsg)("contr %d: listenconf Info=0x%04x (%s) infomask=0x%x cipmask=0x%x capimask2=0x%x", card->contrnr, cmsg->Info, capi_info2str(cmsg->Info), card->infomask, card->cipmask, card->cipmask2); if (cmsg->Info) { listen_change_state(card, EV_LISTEN_CONF_ERROR); } else if (card->cipmask == 0) { listen_change_state(card, EV_LISTEN_CONF_EMPTY); } else { listen_change_state(card, EV_LISTEN_CONF_OK); } break; case CAPI_MANUFACTURER_IND: /* Controller */ #if 0 if ( cmsg->ManuID == 0x214D5641 && cmsg->Class == 0 && cmsg->Function == 1) { _cbyte *data = cmsg->ManuData+3; _cword len = cmsg->ManuData[0]; _cword layer; int direction; if (len == 255) { len = (cmsg->ManuData[1] | (cmsg->ManuData[2] << 8)); data += 2; } len -= 2; layer = ((*(data-1)) << 8) | *(data-2); if (layer & 0x300) direction = (layer & 0x200) ? 0 : 1; else direction = (layer & 0x800) ? 0 : 1; if (layer & 0x0C00) { if ((layer & 0xff) == 0x80) { handle_dtrace_data(card, direction, 1, data, len); break; } } else if ((layer & 0xff) < 0x80) { handle_dtrace_data(card, direction, 0, data, len); break; } (*cb->infomsg)("%s from controller %d layer 0x%x, ignored", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController, layer); break; } #endif goto ignored; case CAPI_MANUFACTURER_CONF: /* Controller */ if (cmsg->ManuID == 0x214D5641) { char *s = 0; switch (cmsg->Class) { case 0: break; case 1: s = "unknown class"; break; case 2: s = "unknown function"; break; default: s = "unkown error"; break; } if (s) (*cb->infomsg)("%s from controller 0x%x function %d: %s", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController, cmsg->Function, s); break; } goto ignored; case CAPI_FACILITY_IND: /* Controller/plci/ncci */ goto ignored; case CAPI_FACILITY_CONF: /* Controller/plci/ncci */ goto ignored; case CAPI_INFO_IND: /* Controller/plci */ goto ignored; case CAPI_INFO_CONF: /* Controller/plci */ goto ignored; default: (*cb->errmsg)("got %s from controller 0x%x ???", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController); } return; ignored: (*cb->infomsg)("%s from controller 0x%x ignored", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController); }
static void handle_ncci(capiconn_context *ctx, _cmsg * cmsg) { capi_contr *card = findcontrbynumber(ctx, cmsg->adr.adrController&0x7f); capiconn_callbacks *cb = ctx->cb; capi_connection *plcip; capi_ncci *nccip; unsigned char *data; if (!card) { (*cb->errmsg)("capidrv: %s from unknown controller 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController & 0x7f); return; } switch (CAPICMD(cmsg->Command, cmsg->Subcommand)) { case CAPI_CONNECT_B3_ACTIVE_IND: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; capi_cmsg_answer(cmsg); send_message(card, cmsg); ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_ACTIVE_IND); (*cb->debugmsg)("ncci 0x%x up", nccip->ncci); (*cb->connected)(nccip->plcip, cmsg->NCPI); break; case CAPI_CONNECT_B3_ACTIVE_CONF: /* ncci */ goto ignored; case CAPI_CONNECT_B3_IND: /* ncci */ plcip = find_plci_by_ncci(card, cmsg->adr.adrNCCI); if (plcip) { nccip = new_ncci(card, plcip, cmsg->adr.adrNCCI); if (nccip) { ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_IND); capi_fill_CONNECT_B3_RESP(cmsg, ctx->appid, card->msgid++, nccip->ncci, /* adr */ 0, /* Reject */ 0 /* NCPI */ ); send_message(card, cmsg); ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_RESP); break; } (*cb->errmsg)("capidrv-%d: no mem for ncci, sorry", card->contrnr); } else { (*cb->errmsg)("capidrv-%d: %s: plci for ncci 0x%x not found", card->contrnr, capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); } capi_fill_CONNECT_B3_RESP(cmsg, ctx->appid, card->msgid++, cmsg->adr.adrNCCI, 2, /* Reject */ plcip->conninfo.ncpi); send_message(card, cmsg); break; case CAPI_CONNECT_B3_CONF: /* ncci */ if (!(nccip = find_ncci_by_msgid(card, cmsg->adr.adrNCCI, cmsg->Messagenumber))) goto notfound; nccip->ncci = cmsg->adr.adrNCCI; nccip->plcip->ncci = cmsg->adr.adrNCCI; if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for ncci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrNCCI); } if (cmsg->Info) ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_CONF_ERROR); else ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_CONF_OK); break; case CAPI_CONNECT_B3_T90_ACTIVE_IND: /* ncci */ capi_cmsg_answer(cmsg); send_message(card, cmsg); break; case CAPI_DATA_B3_IND: /* ncci */ /* handled in handle_data() */ goto ignored; case CAPI_DATA_B3_CONF: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; data = capi_del_ack(nccip, cmsg->DataHandle); if (data == 0) break; if (cb->datasent) (*cb->datasent)(nccip->plcip, data); break; case CAPI_DISCONNECT_B3_IND: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; nccip->plcip->disconnectreason_b3 = cmsg->Reason_B3; nccip->plcip->disconnecting = 1; ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_IND); capi_cmsg_answer(cmsg); send_message(card, cmsg); ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_RESP); break; case CAPI_DISCONNECT_B3_CONF: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for ncci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrNCCI); ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_CONF_ERROR); } break; case CAPI_RESET_B3_IND: /* ncci */ if (!(nccip = find_ncci(card, cmsg->adr.adrNCCI))) goto notfound; ncci_change_state(card, nccip, EV_NCCI_RESET_B3_IND); capi_cmsg_answer(cmsg); send_message(card, cmsg); break; case CAPI_RESET_B3_CONF: /* ncci */ goto ignored; /* $$$$ */ case CAPI_FACILITY_IND: /* Controller/plci/ncci */ goto ignored; case CAPI_FACILITY_CONF: /* Controller/plci/ncci */ goto ignored; default: (*cb->errmsg)("capidrv-%d: got %s for ncci 0x%x ???", card->contrnr, capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); } return; ignored: (*cb->infomsg)("%s for ncci 0x%x ignored", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); return; notfound: (*cb->errmsg)("%s: ncci 0x%x not found", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrNCCI); }
static void handle_plci(capiconn_context *ctx, _cmsg * cmsg) { capi_contr *card = findcontrbynumber(ctx, cmsg->adr.adrController&0x7f); capiconn_callbacks *cb = ctx->cb; capi_connection *plcip; if (!card) { (*cb->errmsg)("capiconn: %s from unknown controller 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrController & 0x7f); return; } switch (CAPICMD(cmsg->Command, cmsg->Subcommand)) { case CAPI_DISCONNECT_IND: /* plci */ if (cmsg->Reason) { (*cb->debugmsg)("%s reason 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Reason, capi_info2str(cmsg->Reason), cmsg->adr.adrPLCI); } if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) { capi_cmsg_answer(cmsg); send_message(card, cmsg); goto notfound; } plcip->disconnectreason = cmsg->Reason; plcip->disconnecting = 1; plci_change_state(card, plcip, EV_PLCI_DISCONNECT_IND); capi_cmsg_answer(cmsg); send_message(card, cmsg); plci_change_state(card, plcip, EV_PLCI_DISCONNECT_RESP); break; case CAPI_DISCONNECT_CONF: /* plci */ if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrPLCI); } if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) goto notfound; plcip->disconnecting = 1; break; case CAPI_ALERT_CONF: /* plci */ if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrPLCI); } break; case CAPI_CONNECT_IND: /* plci */ handle_incoming_call(card, cmsg); break; case CAPI_CONNECT_CONF: /* plci */ if (cmsg->Info) { (*cb->infomsg)("%s info 0x%x (%s) for plci 0x%x", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->Info, capi_info2str(cmsg->Info), cmsg->adr.adrPLCI); } if (!(plcip = find_plci_by_msgid(card, cmsg->Messagenumber))) goto notfound; plcip->plci = cmsg->adr.adrPLCI; if (cmsg->Info) { plci_change_state(card, plcip, EV_PLCI_CONNECT_CONF_ERROR); } else { plci_change_state(card, plcip, EV_PLCI_CONNECT_CONF_OK); } break; case CAPI_CONNECT_ACTIVE_IND: /* plci */ if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) goto notfound; if (plcip->incoming) { capi_cmsg_answer(cmsg); send_message(card, cmsg); plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND); } else { capi_ncci *nccip; capi_cmsg_answer(cmsg); send_message(card, cmsg); nccip = new_ncci(card, plcip, cmsg->adr.adrPLCI); if (!nccip) { (*cb->errmsg)("no mem for ncci on contr %d, sorry", card->contrnr); break; /* $$$$ */ } capi_fill_CONNECT_B3_REQ(cmsg, ctx->appid, card->msgid++, plcip->plci, /* adr */ plcip->conninfo.ncpi); nccip->msgid = cmsg->Messagenumber; send_message(card, cmsg); plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND); ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_REQ); } break; case CAPI_INFO_IND: /* Controller/plci */ if (!(plcip = find_plci_by_plci(card, cmsg->adr.adrPLCI))) goto notfound; if (handle_charge_info(plcip, cmsg)) { capi_cmsg_answer(cmsg); send_message(card, cmsg); } else if (handle_callednumber_info(plcip, cmsg)) { capi_cmsg_answer(cmsg); send_message(card, cmsg); } else { capi_cmsg_answer(cmsg); send_message(card, cmsg); } break; case CAPI_CONNECT_ACTIVE_CONF: /* plci */ goto ignored; case CAPI_SELECT_B_PROTOCOL_CONF: /* plci */ goto ignored; case CAPI_FACILITY_IND: /* Controller/plci/ncci */ goto ignored; case CAPI_FACILITY_CONF: /* Controller/plci/ncci */ goto ignored; case CAPI_INFO_CONF: /* Controller/plci */ goto ignored; default: (*cb->errmsg)("got %s for plci 0x%x ???", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrPLCI); } return; ignored: (*cb->infomsg)("%s for plci 0x%x ignored", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrPLCI); return; notfound: (*cb->errmsg)("%s: plci 0x%x not found", capi_cmd2str(cmsg->Command, cmsg->Subcommand), cmsg->adr.adrPLCI); return; }
void B1_handle_interrupt(avmb1_card * card) { unsigned char b1cmd; struct sk_buff *skb; unsigned ApplId; unsigned MsgLen; unsigned DataB3Len; unsigned NCCI; unsigned WindowSize; if (!B1_rx_full(card->port)) return; b1cmd = B1_get_byte(card->port); switch (b1cmd) { case RECEIVE_DATA_B3_IND: ApplId = (unsigned) B1_get_word(card->port); MsgLen = B1_get_slice(card->port, card->msgbuf); DataB3Len = B1_get_slice(card->port, card->databuf); if (showcapimsgs > 2) { __u8 cmd = CAPIMSG_COMMAND(card->msgbuf); __u8 subcmd = CAPIMSG_SUBCOMMAND(card->msgbuf); __u32 contr = CAPIMSG_CONTROL(card->msgbuf); CAPIMSG_SETDATA(card->msgbuf, card->databuf); if (showcapimsgs & 1) { printk(KERN_DEBUG "b1lli: Got [0x%lx] id#%d %s len=%u/%u\n", (unsigned long) contr, CAPIMSG_APPID(card->msgbuf), capi_cmd2str(cmd, subcmd), MsgLen, DataB3Len); } else { printk(KERN_DEBUG "b1lli: Got [0x%lx] %s\n", (unsigned long)contr, capi_message2str(card->msgbuf)); } } if (!(skb = dev_alloc_skb(DataB3Len + MsgLen))) { printk(KERN_ERR "b1lli: incoming packet dropped\n"); } else { SET_SKB_FREE(skb); memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen); memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len); CAPIMSG_SETDATA(skb->data, skb->data + MsgLen); avmb1_handle_capimsg(card, ApplId, skb); } break; case RECEIVE_MESSAGE: ApplId = (unsigned) B1_get_word(card->port); MsgLen = B1_get_slice(card->port, card->msgbuf); if (showcapimsgs) { __u8 cmd = CAPIMSG_COMMAND(card->msgbuf); __u8 subcmd = CAPIMSG_SUBCOMMAND(card->msgbuf); __u32 contr = CAPIMSG_CONTROL(card->msgbuf); if (showcapimsgs & 1) { printk(KERN_DEBUG "b1lli: Got [0x%lx] id#%d %s len=%u\n", (unsigned long) contr, CAPIMSG_APPID(card->msgbuf), capi_cmd2str(cmd, subcmd), MsgLen); } else { printk(KERN_DEBUG "b1lli: Got [0x%lx] %s\n", (unsigned long) contr, capi_message2str(card->msgbuf)); } } if (!(skb = dev_alloc_skb(MsgLen))) { printk(KERN_ERR "b1lli: incoming packet dropped\n"); } else { SET_SKB_FREE(skb); memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen); avmb1_handle_capimsg(card, ApplId, skb); } break; case RECEIVE_NEW_NCCI: ApplId = B1_get_word(card->port); NCCI = B1_get_word(card->port); WindowSize = B1_get_word(card->port); if (showcapimsgs) printk(KERN_DEBUG "b1lli: NEW_NCCI app %u ncci 0x%x\n", ApplId, NCCI); avmb1_handle_new_ncci(card, ApplId, NCCI, WindowSize); break; case RECEIVE_FREE_NCCI: ApplId = B1_get_word(card->port); NCCI = B1_get_word(card->port); if (showcapimsgs) printk(KERN_DEBUG "b1lli: FREE_NCCI app %u ncci 0x%x\n", ApplId, NCCI); avmb1_handle_free_ncci(card, ApplId, NCCI); break; case RECEIVE_START: if (card->blocked) printk(KERN_DEBUG "b1lli: RESTART\n"); card->blocked = 0; break; case RECEIVE_STOP: printk(KERN_DEBUG "b1lli: STOP\n"); card->blocked = 1; break; case RECEIVE_INIT: card->versionlen = B1_get_slice(card->port, card->versionbuf); card->cardstate = CARD_ACTIVE; parse_version(card); printk(KERN_INFO "b1lli: %s-card (%s) with %s now active\n", card->version[VER_CARDTYPE], card->version[VER_DRIVER], card->version[VER_PROTO]); avmb1_card_ready(card); break; default: printk(KERN_ERR "b1lli: B1_handle_interrupt: 0x%x ???\n", b1cmd); break; } }