From fb28ed9ed847fa846b539db8a37e6e99d06bf0a7 Mon Sep 17 00:00:00 2001 From: sruffell Date: Mon, 5 Jan 2009 19:21:16 +0000 Subject: Print more information to the kernel log when the transcoder sends us a diagnostic message. git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.4@4605 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- kernel/wctc4xxp/base.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/kernel/wctc4xxp/base.c b/kernel/wctc4xxp/base.c index 4ba40e6..8946940 100644 --- a/kernel/wctc4xxp/base.c +++ b/kernel/wctc4xxp/base.c @@ -258,6 +258,7 @@ struct csm_create_channel_cmd { /* Supervisor function codes */ #define SUPVSR_CREATE_CHANNEL 0x0010 +#define MONITOR_LIVE_INDICATION_TYPE 0x75 #define CONFIG_CHANGE_TYPE 0x00 #define CONFIG_DEVICE_CLASS 0x06 @@ -1875,6 +1876,38 @@ is_response(const struct csm_encaps_hdr *hdr) return ((0x02 == hdr->type) || (0x04 == hdr->type)) ? 1 : 0; } +static void +print_command(struct wcdte *wc, const struct tcb *cmd) +{ + int i, curlength; + const struct csm_encaps_hdr *hdr = cmd->data; + char *buffer; + const int BUFFER_SIZE = 1024; + int parameters = ((hdr->length - 8)/sizeof(__le16)); + + buffer = kzalloc(BUFFER_SIZE + 1, GFP_ATOMIC); + if (!buffer) { + DTE_PRINTK(DEBUG, "Failed print_command\n"); + return; + } + curlength = snprintf(buffer, BUFFER_SIZE, + "opcode: %04x seq: %02x control: %02x " + "channel: %04x ", be16_to_cpu(hdr->op_code), + hdr->seq_num, hdr->control, be16_to_cpu(hdr->channel)); + curlength += snprintf(buffer + curlength, BUFFER_SIZE - curlength, + "length: %02x index: %02x type: %02x " + "class: %02x function: %04x", + hdr->length, hdr->index, hdr->type, hdr->class, + le16_to_cpu(hdr->function)); + for (i = 0; i < parameters; ++i) { + curlength += snprintf(buffer + curlength, + BUFFER_SIZE - curlength, " %04x", + le16_to_cpu(hdr->params[i])); + } + DTE_PRINTK(DEBUG, "%s\n", buffer); + kfree(buffer); +} + static void receive_csm_encaps_packet(struct wcdte *wc, struct tcb *cmd) { @@ -1911,6 +1944,10 @@ receive_csm_encaps_packet(struct wcdte *wc, struct tcb *cmd) wake_up(&wc->waitq); } free_cmd(cmd); + } else if (MONITOR_LIVE_INDICATION_TYPE == hdr->type) { + DTE_PRINTK(WARNING, "Received diagnostic message:\n"); + print_command(wc, cmd); + free_cmd(cmd); } else { DTE_PRINTK(WARNING, "Unknown command type received. %02x\n", hdr->type); free_cmd(cmd); -- cgit v1.2.3