//
// Copyright (c) 2006 Atheros Communications Inc.
// All rights reserved.
// 
//
// 
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//
//
// 
//

/* This tool parses the recevent logs stored in the binary format 
   by the wince athsrc */
#define WAPI_ENABLE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <a_config.h>
#include <a_osapi.h>
#include <a_types.h>
#include <athdefs.h>
#include <ieee80211.h>
#include <wmi.h>
#include <athdrv_linux.h>
#include <dbglog_api.h>
#include <dbglog_id.h>

#include "dbg_cmd_evt.h"

typedef int (*DbgCmdFormatter)(char *output, size_t len, const A_UINT8 *);
typedef int (*DbgLogFormatter)(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer);

struct dbglog_desc {
    A_INT32 oid;
    const char *desc;
    DbgLogFormatter formatter;
};

struct module_desc {
    int module;
    const char *name;
    struct dbglog_desc *descs;
    size_t len;
    int bsearch;
};

struct wmi_id_desc {
    A_INT32 oid;
    const char *desc;
    DbgCmdFormatter formatter;
    size_t cmdSize;
};

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
#define CASE_STR_CONST(_s, _n, _val) case _n: (_val) = #_s; break
#define CASE_STR(_x, _val) case _x: (_val) = #_x; break
#define CASE_DEF_STR(_val) default: (_val) = "Unknown"; break
#define BIT_STR(_b, _l, _r, _s, _c, _v) if (((_v) & (_c)) == (_c)) (_r) += snprintf((_b)+(_r), (_l)-(_r), _s)

#define DBG_DESC(_x) { _x, #_x, NULL }
#define DBG_DESC_FMT(_x) { _x, #_x, _x ## _fmt }

#define WM_ID_DESC(_x) { _x, #_x, NULL, 0 }
#define WM_ID_DESC_FMT(_x, s) { _x, #_x, _x ## _fmt, s }

#define MODULE_DESC(_x, _d) { DBGLOG_MODULEID_ ## _x, #_x, _d, ARRAY_SIZE(_d),0}

extern A_CHAR dbglog_id_tag[DBGLOG_MODULEID_NUM_MAX][DBGLOG_DBGID_NUM_MAX][DBGLOG_DBGID_DEFINITION_LEN_MAX];
static int check_ids;

static const char *pmmode2text(A_INT32 mode)
{
    const char *pm;
    switch (mode) {
    case 1: pm = "sleep"; break;
    case 2: pm = "awake"; break;
    case 3: pm = "fake_sleep"; break;
    default: pm = "unknown"; break;
    }
    return pm;
}

#if 0
static const char *module2text(A_INT32 moduleid)
{
    const char *msg;
    switch (moduleid) {
    CASE_STR_CONST(INF, DBGLOG_MODULEID_INF, msg);
    CASE_STR_CONST(WMI, DBGLOG_MODULEID_WMI, msg);
    CASE_STR_CONST(MISC, DBGLOG_MODULEID_MISC, msg);
    CASE_STR_CONST(PM, DBGLOG_MODULEID_PM, msg);
    CASE_STR_CONST(MGMTBUF, DBGLOG_MODULEID_TXRX_MGMTBUF, msg);
    CASE_STR_CONST(TXBUF, DBGLOG_MODULEID_TXRX_TXBUF, msg);
    CASE_STR_CONST(RXBUF, DBGLOG_MODULEID_TXRX_RXBUF, msg);
    CASE_STR_CONST(WOW, DBGLOG_MODULEID_WOW, msg);
    CASE_STR_CONST(WHAL, DBGLOG_MODULEID_WHAL, msg);
    CASE_STR_CONST(DC, DBGLOG_MODULEID_DC, msg);
    CASE_STR_CONST(CO, DBGLOG_MODULEID_CO, msg);
    CASE_STR_CONST(RO, DBGLOG_MODULEID_RO, msg);
    CASE_STR_CONST(CM, DBGLOG_MODULEID_CM, msg);
    CASE_STR_CONST(MGMT, DBGLOG_MODULEID_MGMT, msg);
    CASE_STR_CONST(TMR, DBGLOG_MODULEID_TMR, msg);
    CASE_STR_CONST(BTCOEX, DBGLOG_MODULEID_BTCOEX, msg);
    CASE_DEF_STR(msg);
    }
    return msg;
}
#endif

static const char *pmmodule2text(A_INT32 moduleid)
{
    const char *msg;
    switch (moduleid) {
    CASE_STR_CONST(CSERV, 1, msg);
    CASE_STR_CONST(MLME   , 2, msg);
    CASE_STR_CONST(TXRX   , 3, msg);
    CASE_STR_CONST(PM     , 4, msg);
    CASE_STR_CONST(BT_COEX, 5, msg);
    CASE_STR_CONST(CO     , 6, msg);
    CASE_STR_CONST(DC     , 7, msg);
    CASE_STR_CONST(RO     , 8, msg);
    CASE_STR_CONST(CM     , 9, msg);
    CASE_STR_CONST(RRM    , 10, msg);
    CASE_STR_CONST(AP     , 11, msg);
    CASE_STR_CONST(KEYMGMT, 12, msg);
    CASE_STR_CONST(CCX    , 13, msg);
    CASE_STR_CONST(MISC   , 14, msg);
    CASE_STR_CONST(DFS    , 15, msg);
    CASE_STR_CONST(TIMER  , 16, msg);
    CASE_DEF_STR(msg);
    }
    return msg;
}

static const char *status2text(A_STATUS status)
{
    const char *msg;
    switch (status) {
    CASE_STR(A_ERROR, msg);
    CASE_STR(A_OK, msg);                   /* success */
                                /* Following values start at 1 */
    CASE_STR(A_DEVICE_NOT_FOUND, msg);         /* not able to find PCI device */
    CASE_STR(A_NO_MEMORY, msg);                /* not able to allocate memory, msg); not available */
    CASE_STR(A_MEMORY_NOT_AVAIL, msg);         /* memory region is not free for mapping */
    CASE_STR(A_NO_FREE_DESC, msg);             /* no free descriptors available */
    CASE_STR(A_BAD_ADDRESS, msg);              /* address does not match descriptor */
    CASE_STR(A_WIN_DRIVER_ERROR, msg);         /* used in NT_HW version, msg); if problem at init */
    CASE_STR(A_REGS_NOT_MAPPED, msg);          /* registers not correctly mapped */
    CASE_STR(A_EPERM, msg);                    /* Not superuser */
    CASE_STR(A_EACCES, msg);                   /* Access denied */
    CASE_STR(A_ENOENT, msg);                   /* No such entry, msg); search failed, msg); etc. */
    CASE_STR(A_EEXIST, msg);                   /* The object already exists (can't create) */
    CASE_STR(A_EFAULT, msg);                   /* Bad address fault */
    CASE_STR(A_EBUSY, msg);                    /* Object is busy */
    CASE_STR(A_EINVAL, msg);                   /* Invalid parameter */
    CASE_STR(A_EMSGSIZE, msg);                 /* Inappropriate message buffer length */
    CASE_STR(A_ECANCELED, msg);                /* Operation canceled */
    CASE_STR(A_ENOTSUP, msg);                  /* Operation not supported */
    CASE_STR(A_ECOMM, msg);                    /* Communication error on send */
    CASE_STR(A_EPROTO, msg);                   /* Protocol error */
    CASE_STR(A_ENODEV, msg);                   /* No such device */
    CASE_STR(A_EDEVNOTUP, msg);                /* device is not UP */
    CASE_STR(A_NO_RESOURCE, msg);              /* No resources for requested operation */
    CASE_STR(A_HARDWARE, msg);                 /* Hardware failure */
    CASE_STR(A_PENDING, msg);                  /* Asynchronous routine; will send up results la
ter (typically in callback) */
    CASE_STR(A_EBADCHANNEL, msg);              /* The channel cannot be used */
    CASE_STR(A_DECRYPT_ERROR, msg);            /* Decryption error */
    CASE_STR(A_PHY_ERROR, msg);                /* RX PHY error */
    CASE_STR(A_CONSUMED, msg);                    /* Object was consumed */
    CASE_DEF_STR(msg);
    }
    return msg;
}

static const char *btStatus2text(A_INT32 status)
{
    const char *btState;
    switch (status) {
    CASE_STR_CONST(BT_UNDEF, 1, btState);
    CASE_STR_CONST(BT_ON, 2, btState);
    CASE_STR_CONST(BT_OFF, 3, btState); 
    CASE_STR_CONST(BT_IGNORE, 4, btState);    
    CASE_DEF_STR(btState);
    }
    return btState;
}

static int cipher2text(char *buf, size_t len, A_UINT8 cipher)
{
    int ret = 0;
    BIT_STR(buf, len, ret, "none ", NONE_CRYPT, cipher);
    BIT_STR(buf, len, ret, "wep ", WEP_CRYPT, cipher);
    BIT_STR(buf, len, ret, "tkip ", TKIP_CRYPT, cipher);
    BIT_STR(buf, len, ret, "aes ", AES_CRYPT, cipher);
    buf[(ret>0) ? --ret : ret] = 0;
    return ret;
}

static const char* enable2text(A_INT32 enable)
{
    return enable ? "ENABLE" : "DISABLE";
}

static const char* txrxstatus2text(A_INT32 status)
{
    const char *txstatus;
    switch (status) {
    CASE_STR_CONST(TXRX_ERROR, -1, txstatus);
    CASE_STR_CONST(TXRX_OK                 ,  0, txstatus);
    CASE_STR_CONST(TXRX_FAILED             ,  1, txstatus);
    CASE_STR_CONST(TXRX_Q_IS_EMPTY         ,  2, txstatus);
    CASE_STR_CONST(TXRX_Q_NOT_DRAINED      ,  3, txstatus);
    CASE_STR_CONST(TXRX_Q_DRAINED_ALL      ,  4, txstatus);
    CASE_STR_CONST(TXRX_Q_DRAIN_PENDING    ,  5, txstatus);
    CASE_STR_CONST(TXRX_IS_MGMT_PKT        ,  6, txstatus);
    CASE_STR_CONST(TXRX_IS_DATA_PKT        ,  7, txstatus);
    CASE_STR_CONST(TXRX_SAVED_AS_FRAG      ,  8, txstatus);
    CASE_STR_CONST(TXRX_Q_IS_PAUSED        ,  9, txstatus);
    CASE_STR_CONST(TXRX_RX_SEND_TO_HOST    , 10, txstatus);
    CASE_STR_CONST(TXRX_ERROR_PKT_DRAINED  , 11, txstatus);
    CASE_STR_CONST(TXRX_EOL_EXPIRED        , 12, txstatus);
    CASE_STR_CONST(TXRX_PS_FILTERED        , 13,  txstatus);
    CASE_STR_CONST(TXRX_RX_SEND_TO_TX      , 14,  txstatus);
    CASE_DEF_STR(txstatus);
    }
    return txstatus;
}

static int rxfilter2text(char *buf, size_t blen, A_INT32 rxfilter)
{
    int ret = 0;  
    BIT_STR(buf, blen, ret, "UCAST "    , 0x00000001, rxfilter);
    BIT_STR(buf, blen, ret, "MCAST "    , 0x00000002, rxfilter);
    BIT_STR(buf, blen, ret, "BCAST "   , 0x00000004, rxfilter);
    BIT_STR(buf, blen, ret, "CONTROL "  , 0x00000008, rxfilter);
    BIT_STR(buf, blen, ret, "BEACON "  , 0x00000010, rxfilter);
    BIT_STR(buf, blen, ret, "PROM "    , 0x00000020, rxfilter);
    BIT_STR(buf, blen, ret, "PROBEREQ ", 0x00000080, rxfilter);
    BIT_STR(buf, blen, ret, "MYBEACON ", 0x00000200, rxfilter);
    BIT_STR(buf, blen, ret, "COMP_BAR ", 0x00000400, rxfilter);
    BIT_STR(buf, blen, ret, "COMP_BA " , 0x00000800, rxfilter);
    BIT_STR(buf, blen, ret, "UNCOMP_BA_BAR " , 0x00001000, rxfilter);
    BIT_STR(buf, blen, ret, "PS_POLL " , 0x00004000, rxfilter);
    BIT_STR(buf, blen, ret, "MCAST_BCAST_ALL " , 0x00008000, rxfilter);
    BIT_STR(buf, blen, ret, "FROM_TO_DS "      , 0x00020000, rxfilter);
    buf[(ret>0) ? --ret : ret] = 0;
    return ret;
}

static int btState2text(char *buf, size_t blen, A_INT32 btState)
{
    int bret = 0;
    BIT_STR(buf, blen, bret, "SCO ", (1<<1), btState);
    BIT_STR(buf, blen, bret, "A2DP ", (1<<2), btState);
    BIT_STR(buf, blen, bret, "SCAN ", (1<<3), btState);
    BIT_STR(buf, blen, bret, "ESCO ", (1<<4), btState);
    buf[(bret>0) ? --bret : bret] = 0;
    return bret;
}

static int btcoexFlags2text(char *buf, size_t blen, A_INT32 btCoexFlags)
{
    int bret = 0;
    BIT_STR(buf, blen, bret, "SCO_ON ", 0x0001, btCoexFlags);
    BIT_STR(buf, blen, bret, "A2DP_ON ", 0x0002, btCoexFlags);
    BIT_STR(buf, blen, bret, "ACL_ON ", 0x0004, btCoexFlags);
    BIT_STR(buf, blen, bret, "INQUIRY_ON ", 0x0008, btCoexFlags);
    BIT_STR(buf, blen, bret, "VOIP ", 0x0010, btCoexFlags);
    BIT_STR(buf, blen, bret, "RXDATA_PENDING ", 0x0020, btCoexFlags);
    BIT_STR(buf, blen, bret, "SLEEP_PENDING ", 0x0040, btCoexFlags);
    BIT_STR(buf, blen, bret, "FAKESLEEP_ON ", 0x0080, btCoexFlags);
    BIT_STR(buf, blen, bret, "ADD_BA_PENDING ", 0x0100, btCoexFlags);
    BIT_STR(buf, blen, bret, "WAKEUP_TIM_INTR ", 0x0200, btCoexFlags);
    BIT_STR(buf, blen, bret, "OPT_MODE ", 0x0400, btCoexFlags);
    BIT_STR(buf, blen, bret, "FIRST_BMISS ", 0x0800, btCoexFlags);
    BIT_STR(buf, blen, bret, "BEACON_PROTECION_ON ", 0x1000, btCoexFlags);
    BIT_STR(buf, blen, bret, "WAIT_FOR_NULL_COMP ", 0x4000, btCoexFlags);
    BIT_STR(buf, blen, bret, "PROTECT_POST_INQUIRY ", 0x8000, btCoexFlags);
    BIT_STR(buf, blen, bret, "DUAL_ANT_ACTIVE ", 0x10000, btCoexFlags);
    BIT_STR(buf, blen, bret, "DUAL_ANT_WAKEUP_TIM ", 0x20000, btCoexFlags);
    BIT_STR(buf, blen, bret, "STOMP_FOR_DTIM_RECV ", 0x40000, btCoexFlags);
    BIT_STR(buf, blen, bret, "ENABLE_COEX_ON_BCN_RECV ", 0x80000, btCoexFlags);
    buf[(bret>0) ? --bret : bret] = 0;
    return bret;
}

static int WMI_SET_MCAST_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_SET_MCAST_FILTER_CMD *cmd = (WMI_SET_MCAST_FILTER_CMD*)cmdbuf;
    return snprintf(output, len, "%02X:%02X:%02X:%02X:%02X:%02X",
                    cmd->multicast_mac[0], cmd->multicast_mac[1], cmd->multicast_mac[2], 
                    cmd->multicast_mac[3], cmd->multicast_mac[4], cmd->multicast_mac[5]);
}

static int WMI_DEL_MCAST_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    return WMI_SET_MCAST_FILTER_CMDID_fmt(output, len, cmdbuf);
}

static int WMI_MCAST_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_MCAST_FILTER_CMD *cmd = (WMI_MCAST_FILTER_CMD*)cmdbuf;
    return snprintf(output, len, "%s", enable2text(cmd->enable));
}

static int WMI_START_SCAN_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    int i;
    int ret = 0;
    WMI_START_SCAN_CMD *cmd = (WMI_START_SCAN_CMD*)cmdbuf;
    const char *scanType = (cmd->scanType == WMI_SHORT_SCAN) ? "short" : "long";
    if (cmd->forceFgScan) {
        ret += snprintf(output+ret, len-ret, "forceFg ");
    }
    ret += snprintf(output+ret, len-ret, "hmdwell %u ", cmd->homeDwellTime);
    ret += snprintf(output+ret, len-ret, "fscanint %u ", cmd->forceScanInterval);
    ret += snprintf(output+ret, len-ret, "%s ", scanType);
    for (i=0; i<cmd->numChannels; ++i) {
        ret += snprintf(output+ret, len-ret, "%d ", cmd->channelList[i]);
    }
    return ret;
}

static int WMI_CONNECT_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_CONNECT_CMD *cmd = (WMI_CONNECT_CMD*)cmdbuf;
    char ssid[33];
    char pairwise[128], group[128];
    const char *dot11Auth, *authMode;
    memcpy(ssid, cmd->ssid, 32);
    ssid[cmd->ssidLength] = 0;
    cipher2text(pairwise, sizeof(pairwise), cmd->pairwiseCryptoType);
    cipher2text(group, sizeof(group), cmd->groupCryptoType);

    switch (cmd->dot11AuthMode) {
    CASE_STR(OPEN_AUTH, dot11Auth);
    CASE_STR(SHARED_AUTH, dot11Auth);
    CASE_STR(LEAP_AUTH, dot11Auth);
    CASE_DEF_STR(dot11Auth);
    }

    switch (cmd->authMode) {
    CASE_STR(WMI_NONE_AUTH, authMode);
    CASE_STR(WMI_WPA_AUTH, authMode);
    CASE_STR(WMI_WPA2_AUTH, authMode);
    CASE_STR(WMI_WPA_PSK_AUTH, authMode);
    CASE_STR(WMI_WPA2_PSK_AUTH, authMode);
    CASE_STR(WMI_WPA_AUTH_CCKM, authMode);
    CASE_STR(WMI_WPA2_AUTH_CCKM, authMode);
    CASE_DEF_STR(authMode);
    }
    return snprintf(output, len, "'%s' ch %d %s %s uni:%s grp:%s %02X:%02X:%02X:%02X:%02X:%02X ctrl 0x%x",
        ssid, cmd->channel, 
        dot11Auth, authMode, pairwise, group,
        cmd->bssid[0], cmd->bssid[1], cmd->bssid[2], 
        cmd->bssid[3], cmd->bssid[4], cmd->bssid[5], 
        cmd->ctrl_flags);
}

static int WMI_SET_BTCOEX_FE_ANT_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_SET_BTCOEX_FE_ANT_CMD *cmd = (WMI_SET_BTCOEX_FE_ANT_CMD*)cmdbuf;
    const char *fe;
    switch (cmd->btcoexFeAntType) {
    CASE_STR(WMI_BTCOEX_NOT_ENABLED, fe);
    CASE_STR(WMI_BTCOEX_FE_ANT_SINGLE, fe);
    CASE_STR(WMI_BTCOEX_FE_ANT_DUAL, fe);
    CASE_STR(WMI_BTCOEX_FE_ANT_DUAL_HIGH_ISO, fe);
    CASE_DEF_STR(fe);
    }
    return snprintf(output, len, "%s", fe);
}

static int WMI_SET_BTCOEX_SCO_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_SET_BTCOEX_SCO_CONFIG_CMD *cmd = (WMI_SET_BTCOEX_SCO_CONFIG_CMD*)cmdbuf;
    char scoFlags[512];
    int blen = sizeof(scoFlags);
    int bret = 0;
    BIT_STR(scoFlags, blen, bret, "OPT ", (1<<0), cmd->scoConfig.scoFlags);
    BIT_STR(scoFlags, blen, bret, "EDR ", (1<<1), cmd->scoConfig.scoFlags);   
    BIT_STR(scoFlags, blen, bret, "MASTER ", (1<<2), cmd->scoConfig.scoFlags);
    BIT_STR(scoFlags, blen, bret, "FRM ", (1<<3), cmd->scoConfig.scoFlags);
    scoFlags[(bret>0) ? --bret : bret] = 0;

    return snprintf(output, len, "%d/%d slots [%s] ps %u-%u-%u opt %u-%u-%u-%u-%u-%u scan %u/%u", 
                    cmd->scoConfig.scoSlots, cmd->scoConfig.scoIdleSlots, scoFlags,

                    cmd->scoPspollConfig.scoCyclesForceTrigger,
                    cmd->scoPspollConfig.scoDataResponseTimeout,
                    cmd->scoPspollConfig.scoPsPollLatencyFraction,

                    cmd->scoOptModeConfig.scoStompCntIn100ms,
	                cmd->scoOptModeConfig.scoContStompMax,
	                cmd->scoOptModeConfig.scoMinlowRateMbps,
	                cmd->scoOptModeConfig.scoLowRateCnt,
	                cmd->scoOptModeConfig.scoHighPktRatio,
	                cmd->scoOptModeConfig.scoMaxAggrSize,

                    cmd->scoWlanScanConfig.scanInterval,
                    cmd->scoWlanScanConfig.maxScanStompCnt);
}

static int WMI_SET_BTCOEX_A2DP_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    return 0;
}

static int WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    return 0;
}

static int WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD *cmd = (WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD*)cmdbuf;
    return snprintf(output, len, "pspoll every %u inquiry duration %u",
                    cmd->btInquiryDataFetchFrequency,
                    cmd->protectBmissDurPostBtInquiry);
}

static int WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD *cmd = (WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD*)cmdbuf;
    const char *profile;
    const char *op = (cmd->btOperatingStatus==1) ? "START" : "STOP";
    switch (cmd->btProfileType) {
    CASE_STR_CONST(SCO, 1, profile);
    CASE_STR_CONST(A2DP, 2, profile);
    CASE_STR_CONST(Inquiry, 3, profile);
    CASE_STR_CONST(ACL, 4, profile);
    CASE_DEF_STR(profile);
    }
    return snprintf(output, len, "%s %s", profile, op);
}

static int WMI_SET_LISTEN_INT_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_LISTEN_INT_CMD *cmd = (WMI_LISTEN_INT_CMD*)cmdbuf;
    return snprintf(output, len, "interval %d numBeacons %d", cmd->listenInterval, cmd->numBeacons);
}

static int WMI_SET_BSS_FILTER_CMDID_fmt(char *output, size_t len, const A_UINT8 *cmdbuf)
{
    WMI_BSS_FILTER_CMD *cmd = (WMI_BSS_FILTER_CMD*)cmdbuf;
    const char *filter;
    switch (cmd->bssFilter) {
    CASE_STR(NONE_BSS_FILTER, filter);
    CASE_STR(ALL_BSS_FILTER, filter);
    CASE_STR(PROFILE_FILTER, filter);
    CASE_STR(ALL_BUT_PROFILE_FILTER, filter);
    CASE_STR(CURRENT_BSS_FILTER, filter);
    CASE_STR(ALL_BUT_BSS_FILTER, filter);
    CASE_STR(PROBED_SSID_FILTER, filter);
    CASE_STR(LAST_BSS_FILTER, filter);
    CASE_DEF_STR(filter);
    }
    return snprintf(output, len, "[%s]", filter);
}

static int CO_CHANGE_CHANNEL_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 freq = buffer[1];
    A_INT32 duration = buffer[2];
    return snprintf(output, len, "freq %d duration %d", freq, duration);
}

static int CO_CHANGE_STATE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 stateLog = (numargs==1) ? buffer[1] : buffer[2];
    int op = stateLog & 0xff;
    const char *opstr = op ? "set" : "clr";
    int opState = (stateLog >> 8) & 0xff;
    int oldState = stateLog >> 16;
    int newState = (op) ? (oldState | opState) : (oldState & ~(opState));
    char state[256];
    size_t blen = sizeof(state);
    int ret = 0;
    BIT_STR(state, blen, ret, "DRAIN_IN_PROGRESS ", 0x01, newState);
    BIT_STR(state, blen, ret, "FAKE_SLEEP_ENABLE_IN_PROGRESS ", 0x02, newState);
    BIT_STR(state, blen, ret, "FAKE_SLEEP_ENABLED ", 0x04, newState);
    BIT_STR(state, blen, ret, "TXQ_PAUSED ", 0x08, newState);
    BIT_STR(state, blen, ret, "CHANNEL_CHANGE_IN_PROGRESS ", 0x10, newState);
    state[(ret>0) ? --ret : ret] = 0;

    ret = 0;
    if (numargs==2) {
        ret = snprintf(output+ret, len-ret, "dev %d ", buffer[1]);
    }
    ret += snprintf(output+ret, len-ret, "0x%x %s 0x%x->0x%x [%s]",
                    oldState, opstr, opState, newState, state);
    return ret;
}

static int TXRX_MGMTBUF_WLAN_RESET_ON_ERROR_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    if (numargs==1) {
        char buf[512];
        A_INT32 rxfilter = buffer[1];
        rxfilter2text(buf, sizeof(buf),rxfilter);
        return snprintf(output, len, "rxfilter:[%s]", buf);
    } else if (numargs==2) {
        return snprintf(output, len, "rstCnt %d caller %p", 
                        buffer[1], (void*)buffer[2]);
    } else {
        return 0;
    }
}
static int TXRX_MGMTBUF_WAIT_FOR_TXQ_DRAIN_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *mid;
    switch (buffer[2]) {
    CASE_STR_CONST(CO, 0x001, mid);
    CASE_STR_CONST(PM, 0x002, mid);
    CASE_STR_CONST(BTCOEX, 0x004, mid);
    CASE_DEF_STR(mid);
    }
    return snprintf(output, len, "wait drain %d ms %s ", buffer[1], mid);
}

static int TXRX_MGMTBUF_REAPED_BUF_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *txstatus = txrxstatus2text(buffer[2]);
    return snprintf(output, len, "mgt %p %s", (void*)buffer[1], txstatus);
}

static int TXRX_MGMTBUF_DRAINQ_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 hwq = buffer[1];
    A_INT32 depth = buffer[2];
    return snprintf(output, len, "hwq 0x%x depth 0x%x", hwq, depth);
}

static int DC_RECEIVED_ANY_BEACON_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    if (numargs==1) {
        A_INT32 addr3 = buffer[1];
        return snprintf(output, len, "addr3 ??:??:%02X:%02X:%02X:%02X",
                 (addr3 & 0xff), ((addr3>>8)&0xff), ((addr3>>16)&0xff), ((addr3>>24)&0xff));
    } else if (numargs==2) {
        A_UINT64 tsf;
        A_UINT8 ie_tstamp[8];
        ie_tstamp[4] = buffer[1] & 0xff;
        ie_tstamp[5] = (buffer[1]>>8) & 0xff;
        ie_tstamp[6] = (buffer[1]>>16) & 0xff;
        ie_tstamp[7] = (buffer[1]>>24) & 0xff;
        ie_tstamp[0] = buffer[2] & 0xff;
        ie_tstamp[1] = (buffer[2]>>8) & 0xff;
        ie_tstamp[2] = (buffer[2]>>16) & 0xff;
        ie_tstamp[3] = (buffer[2]>>24) & 0xff;
        A_MEMCPY((A_UINT8 *)&tsf, ie_tstamp, sizeof(ie_tstamp));
        return snprintf(output, len, "ie_tsf %llu", tsf);
    }
    return 0;
}

static int DC_SET_POWER_MODE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *pm = pmmode2text(buffer[1]);
    return snprintf(output, len, "%s caller %p", pm, (void*)buffer[2]);
}

static int DC_SSID_PROBE_CB_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *txstatus = txrxstatus2text(buffer[1]);
    return snprintf(output, len, "%s", txstatus);
}

static int DC_SEARCH_OPPORTUNITY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *opt;
    switch (buffer[1]) {
    CASE_STR_CONST(SCAN_IN_PROGRESS, 1, opt);
    CASE_STR_CONST(NOT_SCAN_IN_PROGRESS,  0, opt);
    CASE_DEF_STR(opt);
    }
    return snprintf(output, len, "%s", opt);
}

static int DC_SEND_NEXT_SSID_PROBE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *flags;
    switch (buffer[2]) {
    CASE_STR(DISABLE_SSID_FLAG, flags);
    CASE_STR(SPECIFIC_SSID_FLAG, flags);
    CASE_STR(ANY_SSID_FLAG, flags);
    CASE_DEF_STR(flags);
    }  
    return snprintf(output, len, "idx %d %s", buffer[1], flags);
}

static int DC_SCAN_CHAN_FINISH_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_UINT16 freq = buffer[1] & 0xffff;
    A_UINT16 status = (buffer[1] >> 16) & 0xffff;
    A_INT32 rxfilter = buffer[2];   
    char rxfilterMsg[1024];
    rxfilter2text(rxfilterMsg, sizeof(rxfilterMsg), rxfilter);
    return snprintf(output, len, "freq %d status %s(%d), %s", 
                    freq, status2text(status), status, rxfilterMsg);
}

static int DC_SCAN_CHAN_START_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 rxfilter = buffer[2];   
    char rxfilterMsg[1024];
    A_UINT16 freq;
    A_UINT16 attrib;
    const char *probed;
    rxfilter2text(rxfilterMsg, sizeof(rxfilterMsg), rxfilter);
    freq = buffer[1] & 0xffff;
    attrib = (buffer[1] >> 16) & 0xffff;
    probed = ((attrib & (0x0100|0x10))==(0x0100|0x10)) && !(attrib &  0x0800) ? "allow" : "not allow";

    return snprintf(output, len, "freq %d attrib %d probed %s %s", 
                    freq, attrib, probed, rxfilterMsg);
}

static int DC_START_SEARCH_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    if (numargs==1) {
        return snprintf(output, len, "devid %d", buffer[1]);
    } else {
        A_INT32 stype = buffer[1];
        int ret = 0;  
        char buf[1024];
        size_t blen = sizeof(buf);
        if (stype == 0) {
            BIT_STR(buf, blen, ret, "RESET "                     , 0, stype);
        }
        BIT_STR(buf, blen, ret, "ALL "                      , (0x01|0x02|0x04|0x08), stype);
        if (((0x01|0x02|0x04|0x08)& stype)!=(0x01|0x02|0x04|0x08)) {
            BIT_STR(buf, blen, ret, "POPULAR "                   , (0x02 | 0x04 | 0x08), stype);
            if (((0x02|0x04|0x08)& stype)!=(0x02|0x04|0x08)) {
                BIT_STR(buf, blen, ret, "SSIDS "                     , (0x04 | 0x08), stype);
                if (((0x04|0x08)& stype)!=(0x04|0x08)) {
                    BIT_STR(buf, blen, ret, "PROF_MASK "                 , (0x08), stype);
                }
            }
        }

        BIT_STR(buf, blen, ret, "MULTI_CHANNEL "             , 0x000100, stype);
        BIT_STR(buf, blen, ret, "DETERMINISTIC "             , 0x000200, stype);
        BIT_STR(buf, blen, ret, "PROFILE_MATCH_TERMINATED "  , 0x000400, stype);
        BIT_STR(buf, blen, ret, "HOME_CHANNEL_SKIP "         , 0x000800, stype);
        BIT_STR(buf, blen, ret, "CHANNEL_LIST_CONTINUE "     , 0x001000, stype);
        BIT_STR(buf, blen, ret, "CURRENT_SSID_SKIP "         , 0x002000, stype);
        BIT_STR(buf, blen, ret, "ACTIVE_PROBE_DISABLE "      , 0x004000, stype);
        BIT_STR(buf, blen, ret, "CHANNEL_HINT_ONLY "         , 0x008000, stype);
        BIT_STR(buf, blen, ret, "ACTIVE_CHANNELS_ONLY "      , 0x010000, stype);
        BIT_STR(buf, blen, ret, "UNUSED1 "                   , 0x020000, stype);
        BIT_STR(buf, blen, ret, "PERIODIC "                  , 0x040000, stype);
        BIT_STR(buf, blen, ret, "FIXED_DURATION "            , 0x080000, stype);
        BIT_STR(buf, blen, ret, "AP_ASSISTED "               , 0x100000, stype);
        buf[(ret>0) ? --ret : ret] = 0;
        return snprintf(output, len, "%s cb 0x%x", buf, buffer[2]);
    }
}

static int PM_CHAN_OP_REQ_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *start = (buffer[1]==1) ? "start" : "stop";
    A_INT32 chanOpReq = buffer[2];
    return snprintf(output, len, "%s chan OpReq %d", start, chanOpReq);
}

static int PM_SET_ALL_BEACON_POLICY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *policyMsg;
    A_UINT16 policy = buffer[1];
    A_UINT32 cnt = buffer[2];
    switch (policy) {
    CASE_STR_CONST(disallow, 1, policyMsg);
    CASE_STR_CONST(allow, 2, policyMsg);
    CASE_DEF_STR(policyMsg);
    }
    return snprintf(output, len, "%s beacons filterCnt %d", policyMsg, cnt);
}

static int PM_SET_MY_BEACON_POLICY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *policyMsg;
    A_UINT16 policy = buffer[1] & 0xff;
    A_UINT32 bMiss = (buffer[1] >> 8);
    A_UINT32 myBeaconCnt = buffer[2];
    switch (policy) {
    CASE_STR_CONST(disallow, 1, policyMsg);
    CASE_STR_CONST(allow, 2, policyMsg);
    CASE_DEF_STR(policyMsg);
    }
    return snprintf(output, len, "bmiss %d %s during sleep filterCnt %d", bMiss, policyMsg, myBeaconCnt);
}


static int PM_SET_STATE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT16 pmStateWakeupCount = (buffer[1] >> 16) & 0xffff;
    A_INT16 pmState = buffer[1] & 0xffff;
    A_INT16 pmAwakeCount = (buffer[2] >> 16) & 0xffff;
    A_INT8 pmSleepCount = (buffer[2] >> 8) & 0xff;
    A_INT8 pmOldState = buffer[2] & 0xff;
    return snprintf(output, len, "StateWakeupCnt %d AwakeCnt %d, SleepCnt %d, %s to %s",
                    pmStateWakeupCount, pmAwakeCount, pmSleepCount, 
                    pmmode2text(pmOldState), pmmode2text(pmState));
}

static int PM_SET_POWERMODE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_UINT16 wcnt = buffer[1] >> 16;
    A_UINT16 fakeSleep = buffer[1] & 0xffff;
    A_UINT16 oldPowerMode = buffer[2] >> 16;
    A_UINT8 powerMode = (buffer[2] >> 8) & 0xff;
    A_UINT8 moduleId = buffer[2] & 0xff;
    return snprintf(output, len, "wakeCnt %d fakeSleep %d %s(%d)=>%s(%d) %s(%d)",
         wcnt, fakeSleep, pmmode2text(oldPowerMode), oldPowerMode, pmmode2text(powerMode), powerMode, pmmodule2text(moduleId), moduleId);
}

static int PM_FAKE_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT16 enable = (buffer[1] >> 16) & 0xffff;
    const char *state = enable2text(enable);
    A_INT8 pmFakeSleepCount = (buffer[1] >> 8) & 0xff;
    A_INT8 fakeSleepEnable = (buffer[1] & 0xff);
    A_INT16 forceAwake = (buffer[2] >> 16) & 0xffff;
    A_INT8 dontWaitForDrain = (buffer[2] >> 8) & 0xff;
    A_INT8 module = buffer[2] & 0xff;
    return snprintf(output, len, "%s cnt %d hasCnt %d forceAwake %d dontWaitDrain %d %s(%d)",
            state, pmFakeSleepCount, fakeSleepEnable, forceAwake, dontWaitForDrain, pmmodule2text(module), module);
}

static int BTCOEX_DBG_pmwakeupcnt_flags(char *output, size_t len, A_INT32 pmWakeupCnt, A_INT32 btCoexFlags)
{
    int ret = 0;
    ret += snprintf(output+ret, len-ret, "coexPmWakeupCnt %d", pmWakeupCnt);
    if (btCoexFlags!=-1) {
        char buf[512];
        btcoexFlags2text(buf, sizeof(buf), btCoexFlags);
        ret += snprintf(output+ret, len-ret, " coex [%s]", buf);
    }
    return ret;
}

static int BTCOEX_ACL_COEX_STATUS_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 btStatus = (buffer[1] >> 16) & 0xffff;
    A_INT32 redoAggr = buffer[1] & 0xffff;
    return snprintf(output, len, "%s redoAggr %d", btStatus2text(btStatus), redoAggr);
}

static int BTCOEX_DBG_PM_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 pmWakeupCnt = buffer[1];
    A_INT32 btCoexFlags = buffer[2];
    return BTCOEX_DBG_pmwakeupcnt_flags(output,len,pmWakeupCnt,btCoexFlags); 
}

static int BTCOEX_PSPOLL_QUEUED_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT16 isEolEnabled = (buffer[1] >> 16) & 0xffff;
    A_INT8 bSendAtLowestRate = (buffer[1] >>8) & 0xff;
    A_INT8 isPmSleep = (buffer[1]) & 0xff;
    return snprintf(output, len, "Eol:%s LowestRate:%s PmSleep:%s", 
                    enable2text(isEolEnabled), enable2text(bSendAtLowestRate),
                    enable2text(isPmSleep));
}

static int BTCOEX_PSPOLL_COMPLETE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    return snprintf(output, len, "%s", txrxstatus2text(buffer[1]));
}

static int BTCOEX_DBG_PM_AWAKE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    return BTCOEX_DBG_PM_SLEEP_fmt(output,len,numargs,buffer);
}

static int BTCOEX_DBG_GO_TO_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    return BTCOEX_DBG_pmwakeupcnt_flags(output,len,buffer[1],-1);
}

static int BTCOEX_WAKEUP_ON_DATA_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    return BTCOEX_DBG_pmwakeupcnt_flags(output,len,buffer[2], buffer[1]);
}

static int BTCOEX_TIM_NOTIFICATION_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    int ret = 0;
    A_INT32 btCoexFlags = buffer[1];
    A_INT32 btStatus = (buffer[2]>>16) & 0xffff;
    A_INT32 pmWakeupCnt = (buffer[2] & 0xffff);
    ret = BTCOEX_DBG_pmwakeupcnt_flags(output,len, pmWakeupCnt, btCoexFlags);
    ret += snprintf(output+ret, len-ret, " %s", btStatus2text(btStatus));
    return ret;
}

static int BTCOEX_DBG_ALLOW_SCAN_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    char buf[512];
    A_INT32 retStatus = buffer[2];
    A_INT32 btState = buffer[1];
    btState2text(buf, sizeof(buf), btState);
    return snprintf(output, len, "state: [%s] allow:%d", buf, retStatus);
}

static int BTCOEX_DBG_SCAN_REQUEST_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    char buf[512];
    A_INT32 scanReqEnabled = buffer[2];
    A_INT32 btState = buffer[1];
    btState2text(buf, sizeof(buf), btState);
    return snprintf(output, len, "state: [%s] scanReqEnabled:%d", buf, scanReqEnabled);
}

static int BTCOEX_DBG_SET_WLAN_STATE_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 btCoexFlags = buffer[2];
    char buf[512];
    const char *wlanState;
    switch (buffer[1]) {
    CASE_STR_CONST(IDLE     , 1, wlanState);
    CASE_STR_CONST(CONNECTED , 2, wlanState);
    CASE_STR_CONST(SCAN_START  , 3, wlanState);
    CASE_STR_CONST(CONNECT_START ,4, wlanState);
    CASE_STR_CONST(SCAN_END    , 5, wlanState);
    CASE_STR_CONST(APMODE_STA_CONNECTED , 6, wlanState);
    CASE_STR_CONST(APMODE_IDLE , 7, wlanState);
    CASE_STR_CONST(APMODE_SWITCH , 8, wlanState);
    CASE_STR_CONST(APMODE_TEARDOWN , 9, wlanState);
    CASE_DEF_STR(wlanState);
    }
    btcoexFlags2text(buf, sizeof(buf), btCoexFlags);
    return snprintf(output, len, "wlan %s coex [%s]", wlanState, buf);
}

static int BTCOEX_DBG_BT_INQUIRY_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *btState = btStatus2text(buffer[1]);
    A_INT32 btCoexFlags = buffer[2];
    char buf[512];
    btcoexFlags2text(buf, sizeof(buf), btCoexFlags);
    return snprintf(output, len, "%s coex [%s]", btState, buf);
}

static int BTCOEX_SET_WEIGHTS_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *weights;
    switch (buffer[1]) {
    CASE_STR_CONST(ALL_BT_TRAFFIC,1,weights);
    CASE_STR_CONST(ONLY_HIGH_PRI_BT_TRAFFIC,2,weights);
    CASE_STR_CONST(STOMP_ALL_BT_TRAFFIC,3,weights);
    CASE_STR_CONST(ONLY_A2DP_TRAFFIC,4,weights);
    CASE_STR_CONST(ONLY_HIGH_PRIO_AND_A2DP,5,weights);
    CASE_STR_CONST(A2DP_STOMPED,6,weights);
    CASE_STR_CONST(ALL_BT_TRAFFIC_WTX,7,weights);
    CASE_STR_CONST(ALL_BT_TRAFFIC_WTX_HIGHISO_TXRX,8,weights);
    CASE_STR_CONST(HIGH_PRI_TRAFFIC_WTX,9,weights);
    CASE_STR_CONST(HIGH_PRI_TRAFFIC_WTX_HIGHISO_TXRX,0xa,weights);
    CASE_STR_CONST(MCI_TEST,0xb,weights);
    CASE_DEF_STR(weights);
    }

    return snprintf(output, len, "%s val 0x%x", weights, buffer[2]);    
}

static int BTCOEX_PM_FAKE_SLEEP_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *enable = enable2text(buffer[1]);
    A_STATUS status = buffer[2];
    return snprintf(output, len, "%s -> %s", enable, status2text(status));
}

static const struct wmi_id_desc evt_desc[] = {
    WM_ID_DESC(WMI_READY_EVENTID), 
    WM_ID_DESC(WMI_CONNECT_EVENTID),
    WM_ID_DESC(WMI_DISCONNECT_EVENTID),
    WM_ID_DESC(WMI_BSSINFO_EVENTID),
    WM_ID_DESC(WMI_CMDERROR_EVENTID),
    WM_ID_DESC(WMI_REGDOMAIN_EVENTID),
    WM_ID_DESC(WMI_PSTREAM_TIMEOUT_EVENTID),
    WM_ID_DESC(WMI_NEIGHBOR_REPORT_EVENTID),
    WM_ID_DESC(WMI_TKIP_MICERR_EVENTID),
    WM_ID_DESC(WMI_SCAN_COMPLETE_EVENTID),           /* 0x100a */
    WM_ID_DESC(WMI_REPORT_STATISTICS_EVENTID),
    WM_ID_DESC(WMI_RSSI_THRESHOLD_EVENTID),
    WM_ID_DESC(WMI_ERROR_REPORT_EVENTID),
    WM_ID_DESC(WMI_OPT_RX_FRAME_EVENTID),
    WM_ID_DESC(WMI_REPORT_ROAM_TBL_EVENTID),
    WM_ID_DESC(WMI_EXTENSION_EVENTID),
    WM_ID_DESC(WMI_CAC_EVENTID),
    WM_ID_DESC(WMI_SNR_THRESHOLD_EVENTID),
    WM_ID_DESC(WMI_LQ_THRESHOLD_EVENTID),
    WM_ID_DESC(WMI_TX_RETRY_ERR_EVENTID),            /* 0x1014 */
    WM_ID_DESC(WMI_REPORT_ROAM_DATA_EVENTID),
    WM_ID_DESC(WMI_TEST_EVENTID),
    WM_ID_DESC(WMI_APLIST_EVENTID),
    WM_ID_DESC(WMI_GET_WOW_LIST_EVENTID),
    WM_ID_DESC(WMI_GET_PMKID_LIST_EVENTID),
    WM_ID_DESC(WMI_CHANNEL_CHANGE_EVENTID),
    WM_ID_DESC(WMI_PEER_NODE_EVENTID),
    WM_ID_DESC(WMI_PSPOLL_EVENTID),
    WM_ID_DESC(WMI_DTIMEXPIRY_EVENTID),
    WM_ID_DESC(WMI_WLAN_VERSION_EVENTID),
    WM_ID_DESC(WMI_SET_PARAMS_REPLY_EVENTID),
    WM_ID_DESC(WMI_ADDBA_REQ_EVENTID),              /*0x1020 */
    WM_ID_DESC(WMI_ADDBA_RESP_EVENTID),
    WM_ID_DESC(WMI_DELBA_REQ_EVENTID),
    WM_ID_DESC(WMI_TX_COMPLETE_EVENTID),
    WM_ID_DESC(WMI_HCI_EVENT_EVENTID),
    WM_ID_DESC(WMI_ACL_DATA_EVENTID),
    WM_ID_DESC(WMI_REPORT_SLEEP_STATE_EVENTID),

    WM_ID_DESC(WMI_WAPI_REKEY_EVENTID),

    WM_ID_DESC(WMI_REPORT_BTCOEX_STATS_EVENTID),
    WM_ID_DESC(WMI_REPORT_BTCOEX_CONFIG_EVENTID),
    WM_ID_DESC(WMI_GET_PMK_EVENTID),

    /* DFS Events */
    WM_ID_DESC(WMI_DFS_HOST_ATTACH_EVENTID),
    WM_ID_DESC(WMI_DFS_HOST_INIT_EVENTID),
    WM_ID_DESC(WMI_DFS_RESET_DELAYLINES_EVENTID),
    WM_ID_DESC(WMI_DFS_RESET_RADARQ_EVENTID),
    WM_ID_DESC(WMI_DFS_RESET_AR_EVENTID),
    WM_ID_DESC(WMI_DFS_RESET_ARQ_EVENTID),          /*0x1030*/
    WM_ID_DESC(WMI_DFS_SET_DUR_MULTIPLIER_EVENTID),
    WM_ID_DESC(WMI_DFS_SET_BANGRADAR_EVENTID),
    WM_ID_DESC(WMI_DFS_SET_DEBUGLEVEL_EVENTID),
    WM_ID_DESC(WMI_DFS_PHYERR_EVENTID),
    /* CCX Evants */
    WM_ID_DESC(WMI_CCX_RM_STATUS_EVENTID),

    /* P2P Events */
    WM_ID_DESC(WMI_P2P_GO_NEG_RESULT_EVENTID),

    WM_ID_DESC(WMI_WAC_SCAN_DONE_EVENTID),
    WM_ID_DESC(WMI_WAC_REPORT_BSS_EVENTID),
    WM_ID_DESC(WMI_WAC_START_WPS_EVENTID),
    WM_ID_DESC(WMI_WAC_CTRL_REQ_REPLY_EVENTID),
        
    /*RFKILL Events*/
    WM_ID_DESC(WMI_RFKILL_STATE_CHANGE_EVENTID),
    WM_ID_DESC(WMI_RFKILL_GET_MODE_CMD_EVENTID),

    /* More P2P Events */
    WM_ID_DESC(WMI_P2P_GO_NEG_REQ_EVENTID),
    WM_ID_DESC(WMI_P2P_INVITE_REQ_EVENTID),
    WM_ID_DESC(WMI_P2P_INVITE_RCVD_RESULT_EVENTID),
    WM_ID_DESC(WMI_P2P_INVITE_SENT_RESULT_EVENTID), /*1040*/
    WM_ID_DESC(WMI_P2P_PROV_DISC_RESP_EVENTID),
    WM_ID_DESC(WMI_P2P_PROV_DISC_REQ_EVENTID),
    WM_ID_DESC(WMI_P2P_START_SDPD_EVENTID),
    WM_ID_DESC(WMI_P2P_SDPD_RX_EVENTID),

    /* Special event to notify host that cmd is processed and credit report is returned */
    WM_ID_DESC(WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID),
};

static const struct wmi_id_desc cmds_desc[] = {
    WM_ID_DESC_FMT(WMI_CONNECT_CMDID, sizeof(WMI_CONNECT_CMD)),
    WM_ID_DESC(WMI_RECONNECT_CMDID),
    WM_ID_DESC(WMI_DISCONNECT_CMDID),
    WM_ID_DESC(WMI_SYNCHRONIZE_CMDID),
    WM_ID_DESC(WMI_CREATE_PSTREAM_CMDID),
    WM_ID_DESC(WMI_DELETE_PSTREAM_CMDID),
    WM_ID_DESC_FMT(WMI_START_SCAN_CMDID, sizeof(WMI_START_SCAN_CMD)),
    WM_ID_DESC(WMI_SET_SCAN_PARAMS_CMDID),
    WM_ID_DESC_FMT(WMI_SET_BSS_FILTER_CMDID, sizeof(WMI_BSS_FILTER_CMD)),
    WM_ID_DESC(WMI_SET_PROBED_SSID_CMDID),               /* 10 */
    WM_ID_DESC_FMT(WMI_SET_LISTEN_INT_CMDID, sizeof(WMI_LISTEN_INT_CMD)),
    WM_ID_DESC(WMI_SET_BMISS_TIME_CMDID),
    WM_ID_DESC(WMI_SET_DISC_TIMEOUT_CMDID),
    WM_ID_DESC(WMI_GET_CHANNEL_LIST_CMDID),
    WM_ID_DESC(WMI_SET_BEACON_INT_CMDID),
    WM_ID_DESC(WMI_GET_STATISTICS_CMDID),
    WM_ID_DESC(WMI_SET_CHANNEL_PARAMS_CMDID),
    WM_ID_DESC(WMI_SET_POWER_MODE_CMDID),
    WM_ID_DESC(WMI_SET_IBSS_PM_CAPS_CMDID),
    WM_ID_DESC(WMI_SET_POWER_PARAMS_CMDID),              /* 20 */
    WM_ID_DESC(WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID),
    WM_ID_DESC(WMI_ADD_CIPHER_KEY_CMDID),
    WM_ID_DESC(WMI_DELETE_CIPHER_KEY_CMDID),
    WM_ID_DESC(WMI_ADD_KRK_CMDID),
    WM_ID_DESC(WMI_DELETE_KRK_CMDID),
    WM_ID_DESC(WMI_SET_PMKID_CMDID),
    WM_ID_DESC(WMI_SET_TX_PWR_CMDID),
    WM_ID_DESC(WMI_GET_TX_PWR_CMDID),
    WM_ID_DESC(WMI_SET_ASSOC_INFO_CMDID),
    WM_ID_DESC(WMI_ADD_BAD_AP_CMDID),                    /* 30 */
    WM_ID_DESC(WMI_DELETE_BAD_AP_CMDID),
    WM_ID_DESC(WMI_SET_TKIP_COUNTERMEASURES_CMDID),
    WM_ID_DESC(WMI_RSSI_THRESHOLD_PARAMS_CMDID),
    WM_ID_DESC(WMI_TARGET_ERROR_REPORT_BITMASK_CMDID),
    WM_ID_DESC(WMI_SET_ACCESS_PARAMS_CMDID),
    WM_ID_DESC(WMI_SET_RETRY_LIMITS_CMDID),
    WM_ID_DESC(WMI_RESERVED1),
    WM_ID_DESC(WMI_RESERVED2),
    WM_ID_DESC(WMI_SET_VOICE_PKT_SIZE_CMDID),
    WM_ID_DESC(WMI_SET_MAX_SP_LEN_CMDID),                /* 40 */
    WM_ID_DESC(WMI_SET_ROAM_CTRL_CMDID),
    WM_ID_DESC(WMI_GET_ROAM_TBL_CMDID),
    WM_ID_DESC(WMI_GET_ROAM_DATA_CMDID),
    WM_ID_DESC(WMI_ENABLE_RM_CMDID),
    WM_ID_DESC(WMI_SET_MAX_OFFHOME_DURATION_CMDID),
    WM_ID_DESC(WMI_EXTENSION_CMDID),                        /* Non-wireless extensions */
    WM_ID_DESC(WMI_SNR_THRESHOLD_PARAMS_CMDID),
    WM_ID_DESC(WMI_LQ_THRESHOLD_PARAMS_CMDID),
    WM_ID_DESC(WMI_SET_LPREAMBLE_CMDID),
    WM_ID_DESC(WMI_SET_RTS_CMDID),                       /* 50 */
    WM_ID_DESC(WMI_CLR_RSSI_SNR_CMDID),
    WM_ID_DESC(WMI_SET_FIXRATES_CMDID),
    WM_ID_DESC(WMI_GET_FIXRATES_CMDID),
    WM_ID_DESC(WMI_SET_AUTH_MODE_CMDID),
    WM_ID_DESC(WMI_SET_REASSOC_MODE_CMDID),
    WM_ID_DESC(WMI_SET_WMM_CMDID),
    WM_ID_DESC(WMI_SET_WMM_TXOP_CMDID),
    WM_ID_DESC(WMI_TEST_CMDID),
    /* COEX AR6002 only*/
    WM_ID_DESC(WMI_SET_BT_STATUS_CMDID),                
    WM_ID_DESC(WMI_SET_BT_PARAMS_CMDID),                /* 60 */

    WM_ID_DESC(WMI_SET_KEEPALIVE_CMDID),
    WM_ID_DESC(WMI_GET_KEEPALIVE_CMDID),
    WM_ID_DESC(WMI_SET_APPIE_CMDID),
    WM_ID_DESC(WMI_GET_APPIE_CMDID),
    WM_ID_DESC(WMI_SET_WSC_STATUS_CMDID),

    /* Wake on Wireless */
    WM_ID_DESC(WMI_SET_HOST_SLEEP_MODE_CMDID),
    WM_ID_DESC(WMI_SET_WOW_MODE_CMDID),
    WM_ID_DESC(WMI_GET_WOW_LIST_CMDID),
    WM_ID_DESC(WMI_ADD_WOW_PATTERN_CMDID),
    WM_ID_DESC(WMI_DEL_WOW_PATTERN_CMDID),               /* 70 */

    WM_ID_DESC(WMI_SET_FRAMERATES_CMDID),
    WM_ID_DESC(WMI_SET_AP_PS_CMDID),
    WM_ID_DESC(WMI_SET_QOS_SUPP_CMDID),
};

static const struct wmi_id_desc cmdxs_desc[] = {
    WM_ID_DESC(WMI_SET_BITRATE_CMDID),
    WM_ID_DESC(WMI_GET_BITRATE_CMDID),
    WM_ID_DESC(WMI_SET_WHALPARAM_CMDID),


    /*Should add the new command to the tail for compatible with
     * etna.
     */
    WM_ID_DESC(WMI_SET_MAC_ADDRESS_CMDID),
    WM_ID_DESC(WMI_SET_AKMP_PARAMS_CMDID),
    WM_ID_DESC(WMI_SET_PMKID_LIST_CMDID),
    WM_ID_DESC(WMI_GET_PMKID_LIST_CMDID),
    WM_ID_DESC(WMI_ABORT_SCAN_CMDID),
    WM_ID_DESC(WMI_SET_TARGET_EVENT_REPORT_CMDID),

    /* Unused */
    WM_ID_DESC(WMI_UNUSED1),
    WM_ID_DESC(WMI_UNUSED2),

    /*
     * AP mode commands
     */
    WM_ID_DESC(WMI_AP_HIDDEN_SSID_CMDID),
    WM_ID_DESC(WMI_AP_SET_NUM_STA_CMDID),
    WM_ID_DESC(WMI_AP_ACL_POLICY_CMDID),
    WM_ID_DESC(WMI_AP_ACL_MAC_LIST_CMDID),
    WM_ID_DESC(WMI_AP_CONFIG_COMMIT_CMDID),
    WM_ID_DESC(WMI_AP_SET_MLME_CMDID),
    WM_ID_DESC(WMI_AP_SET_PVB_CMDID),
    WM_ID_DESC(WMI_AP_CONN_INACT_CMDID),
    WM_ID_DESC(WMI_AP_PROT_SCAN_TIME_CMDID),
    WM_ID_DESC(WMI_AP_SET_COUNTRY_CMDID),
    WM_ID_DESC(WMI_AP_SET_DTIM_CMDID),
    WM_ID_DESC(WMI_AP_MODE_STAT_CMDID),

    WM_ID_DESC(WMI_SET_IP_CMDID),
    WM_ID_DESC(WMI_SET_PARAMS_CMDID),
    WM_ID_DESC_FMT(WMI_SET_MCAST_FILTER_CMDID, sizeof(WMI_SET_MCAST_FILTER_CMD)),
    WM_ID_DESC_FMT(WMI_DEL_MCAST_FILTER_CMDID, sizeof(WMI_SET_MCAST_FILTER_CMD)),

    WM_ID_DESC(WMI_ALLOW_AGGR_CMDID),
    WM_ID_DESC(WMI_ADDBA_REQ_CMDID),
    WM_ID_DESC(WMI_DELBA_REQ_CMDID),
    WM_ID_DESC(WMI_SET_HT_CAP_CMDID),
    WM_ID_DESC(WMI_SET_HT_OP_CMDID),
    WM_ID_DESC(WMI_SET_TX_SELECT_RATES_CMDID),
    WM_ID_DESC(WMI_SET_TX_SGI_PARAM_CMDID),
    WM_ID_DESC(WMI_SET_RATE_POLICY_CMDID),

    WM_ID_DESC(WMI_HCI_CMD_CMDID),
    WM_ID_DESC(WMI_RX_FRAME_FORMAT_CMDID),
    WM_ID_DESC(WMI_SET_THIN_MODE_CMDID),
    WM_ID_DESC(WMI_SET_BT_WLAN_CONN_PRECEDENCE_CMDID),

    WM_ID_DESC(WMI_AP_SET_11BG_RATESET_CMDID),
    WM_ID_DESC(WMI_SET_PMK_CMDID),
    WM_ID_DESC_FMT(WMI_MCAST_FILTER_CMDID, sizeof(WMI_MCAST_FILTER_CMD)),
	/* COEX CMDID AR6003*/
	WM_ID_DESC_FMT(WMI_SET_BTCOEX_FE_ANT_CMDID, sizeof(WMI_SET_BTCOEX_FE_ANT_CMD)),
	WM_ID_DESC(WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMDID),
	WM_ID_DESC_FMT(WMI_SET_BTCOEX_SCO_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_SCO_CONFIG_CMD)),
	WM_ID_DESC_FMT(WMI_SET_BTCOEX_A2DP_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_A2DP_CONFIG_CMD)),
	WM_ID_DESC_FMT(WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMD)),
	WM_ID_DESC_FMT(WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMDID, sizeof(WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD)),
	WM_ID_DESC(WMI_SET_BTCOEX_DEBUG_CMDID),
	WM_ID_DESC_FMT(WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMDID, sizeof(WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD)),
	WM_ID_DESC(WMI_GET_BTCOEX_STATS_CMDID),
	WM_ID_DESC(WMI_GET_BTCOEX_CONFIG_CMDID),

    WM_ID_DESC(WMI_SET_DFS_ENABLE_CMDID),   /* F034 */
    WM_ID_DESC(WMI_SET_DFS_MINRSSITHRESH_CMDID),
    WM_ID_DESC(WMI_SET_DFS_MAXPULSEDUR_CMDID),
    WM_ID_DESC(WMI_DFS_RADAR_DETECTED_CMDID),

    /* P2P CMDS */
    WM_ID_DESC(WMI_P2P_SET_CONFIG_CMDID),    /* F038 */
    WM_ID_DESC(WMI_WPS_SET_CONFIG_CMDID),
    WM_ID_DESC(WMI_SET_REQ_DEV_ATTR_CMDID),
    WM_ID_DESC(WMI_P2P_FIND_CMDID),
    WM_ID_DESC(WMI_P2P_STOP_FIND_CMDID),
    WM_ID_DESC(WMI_P2P_GO_NEG_START_CMDID),
    WM_ID_DESC(WMI_P2P_LISTEN_CMDID),

    WM_ID_DESC(WMI_CONFIG_TX_MAC_RULES_CMDID),
    WM_ID_DESC(WMI_SET_PROMISCUOUS_MODE_CMDID),/* F040 */
    WM_ID_DESC(WMI_RX_FRAME_FILTER_CMDID),
    WM_ID_DESC(WMI_SET_CHANNEL_CMDID),

    /* WAC commands */
    WM_ID_DESC(WMI_ENABLE_WAC_CMDID),
    WM_ID_DESC(WMI_WAC_SCAN_REPLY_CMDID),
    WM_ID_DESC(WMI_WAC_CTRL_REQ_CMDID),
    WM_ID_DESC(WMI_SET_DIV_PARAMS_CMDID),

    WM_ID_DESC(WMI_GET_PMK_CMDID),
    WM_ID_DESC(WMI_SET_PASSPHRASE_CMDID),
    WM_ID_DESC(WMI_SEND_ASSOC_RES_CMDID),
    WM_ID_DESC(WMI_SET_ASSOC_REQ_RELAY_CMDID),
    WM_ID_DESC(WMI_GET_RFKILL_MODE_CMDID),
    WM_ID_DESC(WMI_SET_RFKILL_MODE_CMDID),

    /* ACS command, consists of sub-commands */
    WM_ID_DESC(WMI_ACS_CTRL_CMDID),
    
    /* Ultra low power store / recall commands */
    WM_ID_DESC(WMI_STORERECALL_CONFIGURE_CMDID),
    WM_ID_DESC(WMI_STORERECALL_RECALL_CMDID),
    WM_ID_DESC(WMI_STORERECALL_HOST_READY_CMDID),
    WM_ID_DESC(WMI_FORCE_TARGET_ASSERT_CMDID),
    WM_ID_DESC(WMI_SET_EXCESS_TX_RETRY_THRES_CMDID),

    WM_ID_DESC(WMI_P2P_GO_NEG_REQ_RSP_CMDID),  /* F053 */
    WM_ID_DESC(WMI_P2P_GRP_INIT_CMDID),
    WM_ID_DESC(WMI_P2P_GRP_FORMATION_DONE_CMDID),
    WM_ID_DESC(WMI_P2P_INVITE_CMDID),
    WM_ID_DESC(WMI_P2P_INVITE_REQ_RSP_CMDID),
    WM_ID_DESC(WMI_P2P_PROV_DISC_REQ_CMDID),
    WM_ID_DESC(WMI_P2P_SET_CMDID),

    WM_ID_DESC(WMI_AP_SET_APSD_CMDID),         /* F05A */
    WM_ID_DESC(WMI_AP_APSD_BUFFERED_TRAFFIC_CMDID),

    WM_ID_DESC(WMI_P2P_SDPD_TX_CMDID), /* F05C */
    WM_ID_DESC(WMI_P2P_STOP_SDPD_CMDID),
    WM_ID_DESC(WMI_P2P_CANCEL_CMDID),
};

static int dbg_wmi_cmd_params_pos, dbg_wmi_cmd_params_cmdid;
static A_UINT8 *dbg_wmi_cmd_params_buf;

static int WMI_EVENT_SEND_XTND_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    const char *txt;
    A_INT32 evt = buffer[1];
    switch (evt) {
    CASE_STR(WMIX_DSETOPENREQ_EVENTID, txt);
    CASE_STR(WMIX_DSETCLOSE_EVENTID, txt);
    CASE_STR(WMIX_DSETDATAREQ_EVENTID, txt);
    CASE_STR(WMIX_GPIO_INTR_EVENTID, txt);
    CASE_STR(WMIX_GPIO_DATA_EVENTID, txt);
    CASE_STR(WMIX_GPIO_ACK_EVENTID, txt);
    CASE_STR(WMIX_HB_CHALLENGE_RESP_EVENTID, txt);
    CASE_STR(WMIX_DBGLOG_EVENTID, txt);
    CASE_STR(WMIX_PROF_COUNT_EVENTID, txt);
    CASE_DEF_STR(txt);
    }
    return snprintf(output, len, "%s", txt);
}

static int WMI_EVENT_SEND_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 idx = buffer[1];
    A_INT32 sidx;
    if (idx>=(A_INT32)WMI_READY_EVENTID && 
            idx<(A_INT32)(WMI_READY_EVENTID+ARRAY_SIZE(evt_desc))) {
        sidx = idx - WMI_READY_EVENTID;
        return snprintf(output, len, "%s", evt_desc[sidx].desc);
    } else if (idx>=(A_INT32)WMI_SET_BITRATE_CMDID && 
            idx<(A_INT32)(WMI_SET_BITRATE_CMDID+ARRAY_SIZE(cmdxs_desc))) {
        sidx = idx - WMI_SET_BITRATE_CMDID;
        return snprintf(output, len, "%s", cmdxs_desc[sidx].desc);
    }
    return 0;
}


static int WMI_CMD_RX_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 idx = buffer[1];
    A_INT32 length = buffer[2];
    A_INT32 sidx;
    if (idx>=(A_INT32)WMI_CONNECT_CMDID && 
            idx<(A_INT32)(WMI_CONNECT_CMDID+ARRAY_SIZE(cmds_desc))) {
        sidx = idx-WMI_CONNECT_CMDID;
        return snprintf(output, len, "%s, len %d", 
                       cmds_desc[sidx].desc, length);
    } else if (idx>=(A_INT32)WMI_SET_BITRATE_CMDID && 
            idx<(A_INT32)(WMI_SET_BITRATE_CMDID+ARRAY_SIZE(cmdxs_desc))) {
        sidx = idx - WMI_SET_BITRATE_CMDID;
        return snprintf(output, len, "%s, len %d", 
                       cmdxs_desc[sidx].desc, length);
    }
    return 0;
}

static int WMI_CMD_PARAMS_DUMP_START_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    A_INT32 paramslen = buffer[2];
    paramslen += (sizeof(A_INT32) * 2); /* adding pad */
    dbg_wmi_cmd_params_pos = 0;
    dbg_wmi_cmd_params_cmdid = buffer[1];
    dbg_wmi_cmd_params_buf = (paramslen>0) ? malloc(paramslen) : NULL;
    return 0;
}

static int WMI_CMD_PARAMS_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    if (dbg_wmi_cmd_params_buf == NULL) {
        /* partial debug log where there is no START. Skip it*/
        return 0;
    }   
    memcpy(&dbg_wmi_cmd_params_buf[dbg_wmi_cmd_params_pos], &buffer[1], sizeof(A_INT32));
    memcpy(&dbg_wmi_cmd_params_buf[dbg_wmi_cmd_params_pos+4], &buffer[2], sizeof(A_INT32));
    dbg_wmi_cmd_params_pos += (sizeof(A_INT32) * 2);
    return 0;
}

static int WMI_CMD_PARAMS_DUMP_END_fmt(char *output, size_t len, A_UINT32 numargs, A_INT32 *buffer)
{
    int ret = 0;
    A_INT32 idx = dbg_wmi_cmd_params_cmdid;
    DbgCmdFormatter cmdFormatter = NULL;
    size_t cmdSize;
    if (dbg_wmi_cmd_params_buf == NULL) {
        /* partial debug log where there is no START. Skip it*/
        return 0;
    }   
    if (idx>=(A_INT32)WMI_CONNECT_CMDID && 
            idx<(A_INT32)(WMI_CONNECT_CMDID+ARRAY_SIZE(cmds_desc)) ) {
        cmdFormatter = cmds_desc[idx-WMI_CONNECT_CMDID].formatter;
        cmdSize = cmds_desc[idx-WMI_CONNECT_CMDID].cmdSize;
    } else if (idx>=(A_INT32)WMI_SET_BITRATE_CMDID && 
            idx<(A_INT32)(WMI_SET_BITRATE_CMDID+ARRAY_SIZE(cmdxs_desc))) {
        cmdFormatter = cmdxs_desc[idx-WMI_SET_BITRATE_CMDID].formatter;
        cmdSize = cmdxs_desc[idx-WMI_SET_BITRATE_CMDID].cmdSize;
    }
    if (cmdFormatter) {
        ret += snprintf(output+ret, len-ret, " ");
        if (dbg_wmi_cmd_params_pos>=cmdSize) {
            ret += cmdFormatter(output+ret, len-ret, dbg_wmi_cmd_params_buf);
        } else {
            ret += snprintf(output+ret, len-ret, "malformed cmd. size too small %d < %d",
                    dbg_wmi_cmd_params_pos, cmdSize);
        }
    }
    dbg_wmi_cmd_params_pos = 0;
    dbg_wmi_cmd_params_cmdid = 0;
    free(dbg_wmi_cmd_params_buf);
    dbg_wmi_cmd_params_buf = NULL;
    return ret;
}

static struct dbglog_desc wmi_desc[] = {
    DBG_DESC(0),
    DBG_DESC(WMI_CMD_RX_XTND_PKT_TOO_SHORT),
    DBG_DESC(WMI_EXTENDED_CMD_NOT_HANDLED),
    DBG_DESC(WMI_CMD_RX_PKT_TOO_SHORT),
    DBG_DESC(WMI_CALLING_WMI_EXTENSION_FN),
    DBG_DESC(WMI_CMD_NOT_HANDLED),
    DBG_DESC(WMI_IN_SYNC),
    DBG_DESC(WMI_TARGET_WMI_SYNC_CMD),
    DBG_DESC(WMI_SET_SNR_THRESHOLD_PARAMS),
    DBG_DESC(WMI_SET_RSSI_THRESHOLD_PARAMS),
    DBG_DESC(WMI_SET_LQ_TRESHOLD_PARAMS),
    DBG_DESC(WMI_TARGET_CREATE_PSTREAM_CMD),
    DBG_DESC(WMI_WI_DTM_INUSE),
    DBG_DESC(WMI_TARGET_DELETE_PSTREAM_CMD),
    DBG_DESC(WMI_TARGET_IMPLICIT_DELETE_PSTREAM_CMD),
    DBG_DESC(WMI_TARGET_GET_BIT_RATE_CMD),
    DBG_DESC(WMI_GET_RATE_MASK_CMD_FIX_RATE_MASK_IS),
    DBG_DESC(WMI_TARGET_GET_AVAILABLE_CHANNELS_CMD),
    DBG_DESC(WMI_TARGET_GET_TX_PWR_CMD),
    DBG_DESC(WMI_FREE_EVBUF_WMIBUF),
    DBG_DESC(WMI_FREE_EVBUF_DATABUF),
    DBG_DESC(WMI_FREE_EVBUF_BADFLAG),
    DBG_DESC(WMI_HTC_RX_ERROR_DATA_PACKET),
    DBG_DESC(WMI_HTC_RX_SYNC_PAUSING_FOR_MBOX),
    DBG_DESC(WMI_INCORRECT_WMI_DATA_HDR_DROPPING_PKT),
    DBG_DESC(WMI_SENDING_READY_EVENT),
    DBG_DESC(WMI_SETPOWER_MDOE_TO_MAXPERF),
    DBG_DESC(WMI_SETPOWER_MDOE_TO_REC),
    DBG_DESC(WMI_BSSINFO_EVENT_FROM),
    DBG_DESC(WMI_TARGET_GET_STATS_CMD),
    DBG_DESC(WMI_SENDING_SCAN_COMPLETE_EVENT),
    DBG_DESC(WMI_SENDING_RSSI_INDB_THRESHOLD_EVENT),
    DBG_DESC(WMI_SENDING_RSSI_INDBM_THRESHOLD_EVENT),
    DBG_DESC(WMI_SENDING_LINK_QUALITY_THRESHOLD_EVENT),
    DBG_DESC(WMI_SENDING_ERROR_REPORT_EVENT),
    DBG_DESC(WMI_SENDING_CAC_EVENT),
    DBG_DESC(WMI_TARGET_GET_ROAM_TABLE_CMD),
    DBG_DESC(WMI_TARGET_GET_ROAM_DATA_CMD),
    DBG_DESC(WMI_SENDING_GPIO_INTR_EVENT),
    DBG_DESC(WMI_SENDING_GPIO_ACK_EVENT),
    DBG_DESC(WMI_SENDING_GPIO_DATA_EVENT),
    DBG_DESC_FMT(WMI_CMD_RX),
    DBG_DESC(WMI_CMD_RX_XTND),
    DBG_DESC_FMT(WMI_EVENT_SEND),
    DBG_DESC_FMT(WMI_EVENT_SEND_XTND),
    DBG_DESC_FMT(WMI_CMD_PARAMS_DUMP_START),
    DBG_DESC_FMT(WMI_CMD_PARAMS_DUMP_END),
    DBG_DESC_FMT(WMI_CMD_PARAMS),
};

static struct dbglog_desc co_desc[] = {
    DBG_DESC(0),
    DBG_DESC(CO_INIT),
    DBG_DESC(CO_ACQUIRE_LOCK),
    DBG_DESC(CO_START_OP1),
    DBG_DESC(CO_START_OP2),
    DBG_DESC(CO_DRAIN_TX_COMPLETE_CB),
    DBG_DESC(CO_CHANGE_CHANNEL_CB),
    DBG_DESC(CO_RETURN_TO_HOME_CHANNEL),
    DBG_DESC(CO_FINISH_OP_TIMEOUT),
    DBG_DESC(CO_OP_END),
    DBG_DESC(CO_CANCEL_OP),
    DBG_DESC_FMT(CO_CHANGE_CHANNEL),
    DBG_DESC(CO_RELEASE_LOCK),
    DBG_DESC_FMT(CO_CHANGE_STATE),
};

static struct dbglog_desc mgmtbuf_desc[] = {
    DBG_DESC(0),
    DBG_DESC(TXRX_MGMTBUF_ALLOCATE_BUF),
    DBG_DESC(TXRX_MGMTBUF_ALLOCATE_SM_BUF),
    DBG_DESC(TXRX_MGMTBUF_ALLOCATE_RMBUF),
    DBG_DESC(TXRX_MGMTBUF_GET_BUF),
    DBG_DESC(TXRX_MGMTBUF_GET_SM_BUF),
    DBG_DESC(TXRX_MGMTBUF_QUEUE_BUF_TO_TXQ),
    DBG_DESC_FMT(TXRX_MGMTBUF_REAPED_BUF),
    DBG_DESC(TXRX_MGMTBUF_REAPED_SM_BUF),
    DBG_DESC_FMT(TXRX_MGMTBUF_WAIT_FOR_TXQ_DRAIN),
    DBG_DESC(TXRX_MGMTBUF_WAIT_FOR_TXQ_SFQ_DRAIN),
    DBG_DESC(TXRX_MGMTBUF_ENQUEUE_INTO_DATA_SFQ),
    DBG_DESC(TXRX_MGMTBUF_DEQUEUE_FROM_DATA_SFQ),
    DBG_DESC(TXRX_MGMTBUF_PAUSE_DATA_TXQ),
    DBG_DESC(TXRX_MGMTBUF_RESUME_DATA_TXQ),
    DBG_DESC(TXRX_MGMTBUF_WAIT_FORTXQ_DRAIN_TIMEOUT),
    DBG_DESC_FMT(TXRX_MGMTBUF_DRAINQ),
    DBG_DESC(TXRX_MGMTBUF_INDICATE_Q_DRAINED),
    DBG_DESC(TXRX_MGMTBUF_ENQUEUE_INTO_HW_SFQ),
    DBG_DESC(TXRX_MGMTBUF_DEQUEUE_FROM_HW_SFQ),
    DBG_DESC(TXRX_MGMTBUF_PAUSE_HW_TXQ),
    DBG_DESC(TXRX_MGMTBUF_RESUME_HW_TXQ),
    DBG_DESC(TXRX_MGMTBUF_TEAR_DOWN_BA),
    DBG_DESC(TXRX_MGMTBUF_PROCESS_ADDBA_REQ),
    DBG_DESC(TXRX_MGMTBUF_PROCESS_DELBA),
    DBG_DESC(TXRX_MGMTBUF_PERFORM_BA),
    DBG_DESC_FMT(TXRX_MGMTBUF_WLAN_RESET_ON_ERROR),
};

static struct dbglog_desc dc_desc[] = {
    DBG_DESC(0),
    DBG_DESC_FMT(DC_SCAN_CHAN_START),
    DBG_DESC_FMT(DC_SCAN_CHAN_FINISH),
    DBG_DESC(DC_BEACON_RECEIVE7),
    DBG_DESC_FMT(DC_SSID_PROBE_CB),
    DBG_DESC_FMT(DC_SEND_NEXT_SSID_PROBE),
    DBG_DESC_FMT(DC_START_SEARCH),
    DBG_DESC(DC_CANCEL_SEARCH_CB),
    DBG_DESC(DC_STOP_SEARCH),
    DBG_DESC(DC_END_SEARCH),
    DBG_DESC(DC_MIN_CHDWELL_TIMEOUT),
    DBG_DESC(DC_START_SEARCH_CANCELED),
    DBG_DESC_FMT(DC_SET_POWER_MODE),
    DBG_DESC(DC_INIT),
    DBG_DESC_FMT(DC_SEARCH_OPPORTUNITY),
    DBG_DESC_FMT(DC_RECEIVED_ANY_BEACON),
    DBG_DESC(DC_RECEIVED_MY_BEACON),
    DBG_DESC(DC_PROFILE_IS_ADHOC_BUT_BSS_IS_INFRA),
    DBG_DESC(DC_PS_ENABLED_BUT_ATHEROS_IE_ABSENT),
    DBG_DESC(DC_BSS_ADHOC_CHANNEL_NOT_ALLOWED),
    DBG_DESC(DC_SET_BEACON_UPDATE),
    DBG_DESC(DC_BEACON_UPDATE_COMPLETE),
    DBG_DESC(DC_END_SEARCH_BEACON_UPDATE_COMP_CB),
    DBG_DESC(DC_BSSINFO_EVENT_DROPPED),
    DBG_DESC(DC_IEEEPS_ENABLED_BUT_ATIM_ABSENT),
};

static struct dbglog_desc btcoex_desc[] = {
    DBG_DESC(0),
    DBG_DESC(BTCOEX_STATUS_CMD),
    DBG_DESC(BTCOEX_PARAMS_CMD),
    DBG_DESC(BTCOEX_ANT_CONFIG),
    DBG_DESC(BTCOEX_COLOCATED_BT_DEVICE),
    DBG_DESC(BTCOEX_CLOSE_RANGE_SCO_ON),
    DBG_DESC(BTCOEX_CLOSE_RANGE_SCO_OFF),
    DBG_DESC(BTCOEX_CLOSE_RANGE_A2DP_ON),
    DBG_DESC(BTCOEX_CLOSE_RANGE_A2DP_OFF),
    DBG_DESC(BTCOEX_A2DP_PROTECT_ON),
    DBG_DESC(BTCOEX_A2DP_PROTECT_OFF),
    DBG_DESC(BTCOEX_SCO_PROTECT_ON),
    DBG_DESC(BTCOEX_SCO_PROTECT_OFF),
    DBG_DESC(BTCOEX_CLOSE_RANGE_DETECTOR_START),
    DBG_DESC(BTCOEX_CLOSE_RANGE_DETECTOR_STOP),
    DBG_DESC(BTCOEX_CLOSE_RANGE_TOGGLE),
    DBG_DESC(BTCOEX_CLOSE_RANGE_TOGGLE_RSSI_LRCNT),
    DBG_DESC(BTCOEX_CLOSE_RANGE_RSSI_THRESH),
    DBG_DESC(BTCOEX_CLOSE_RANGE_LOW_RATE_THRESH),
    DBG_DESC(BTCOEX_PTA_PRI_INTR_HANDLER),
    DBG_DESC_FMT(BTCOEX_PSPOLL_QUEUED),
    DBG_DESC_FMT(BTCOEX_PSPOLL_COMPLETE),
    DBG_DESC_FMT(BTCOEX_DBG_PM_AWAKE),
    DBG_DESC_FMT(BTCOEX_DBG_PM_SLEEP),
    DBG_DESC(BTCOEX_DBG_SCO_COEX_ON),
    DBG_DESC(BTCOEX_SCO_DATARECEIVE),
    DBG_DESC(BTCOEX_INTR_INIT),
    DBG_DESC(BTCOEX_PTA_PRI_DIFF),
    DBG_DESC_FMT(BTCOEX_TIM_NOTIFICATION),
    DBG_DESC(BTCOEX_SCO_WAKEUP_ON_DATA),
    DBG_DESC(BTCOEX_SCO_SLEEP),
    DBG_DESC_FMT(BTCOEX_SET_WEIGHTS),
    DBG_DESC(BTCOEX_SCO_DATARECEIVE_LATENCY_VAL),
    DBG_DESC(BTCOEX_SCO_MEASURE_TIME_DIFF),
    DBG_DESC(BTCOEX_SET_EOL_VAL),
    DBG_DESC(BTCOEX_OPT_DETECT_HANDLER),
    DBG_DESC(BTCOEX_SCO_TOGGLE_STATE),
    DBG_DESC(BTCOEX_SCO_STOMP),
    DBG_DESC(BTCOEX_NULL_COMP_CALLBACK),
    DBG_DESC(BTCOEX_RX_INCOMING),
    DBG_DESC(BTCOEX_RX_INCOMING_CTL),
    DBG_DESC(BTCOEX_RX_INCOMING_MGMT),
    DBG_DESC(BTCOEX_RX_INCOMING_DATA),
    DBG_DESC(BTCOEX_RTS_RECEPTION),
    DBG_DESC(BTCOEX_FRAME_PRI_LOW_RATE_THRES),
    DBG_DESC_FMT(BTCOEX_PM_FAKE_SLEEP),
    DBG_DESC_FMT(BTCOEX_ACL_COEX_STATUS),
    DBG_DESC(BTCOEX_ACL_COEX_DETECTION),
    DBG_DESC(BTCOEX_A2DP_COEX_STATUS),
    DBG_DESC(BTCOEX_SCO_STATUS),
    DBG_DESC_FMT(BTCOEX_WAKEUP_ON_DATA),
    DBG_DESC(BTCOEX_DATARECEIVE),
    DBG_DESC(0),
    DBG_DESC(BTCOEX_GET_MAX_AGGR_SIZE),
    DBG_DESC(BTCOEX_MAX_AGGR_AVAIL_TIME),
    DBG_DESC(BTCOEX_DBG_WBTIMER_INTR),
    DBG_DESC(0),
    DBG_DESC(BTCOEX_DBG_SCO_SYNC),
    DBG_DESC(0),
    DBG_DESC(BTCOEX_UPLINK_QUEUED_RATE),
    DBG_DESC(BTCOEX_DBG_UPLINK_ENABLE_EOL),
    DBG_DESC(BTCOEX_UPLINK_FRAME_DURATION),
    DBG_DESC(BTCOEX_UPLINK_SET_EOL),
    DBG_DESC(BTCOEX_DBG_EOL_EXPIRED),
    DBG_DESC(BTCOEX_DBG_DATA_COMPLETE),
    DBG_DESC(BTCOEX_UPLINK_QUEUED_TIMESTAMP),
    DBG_DESC(BTCOEX_DBG_DATA_COMPLETE_TIME),
    DBG_DESC(BTCOEX_DBG_A2DP_ROLE_IS_SLAVE),
    DBG_DESC(BTCOEX_DBG_A2DP_ROLE_IS_MASTER),
    DBG_DESC(BTCOEX_DBG_UPLINK_SEQ_NUM),
    DBG_DESC(BTCOEX_UPLINK_AGGR_SEQ),
    DBG_DESC(BTCOEX_DBG_TX_COMP_SEQ_NO),
    DBG_DESC(BTCOEX_DBG_MAX_AGGR_PAUSE_STATE),
    DBG_DESC(BTCOEX_DBG_ACL_TRAFFIC),
    DBG_DESC(BTCOEX_CURR_AGGR_PROP),
    DBG_DESC(BTCOEX_DBG_SCO_GET_PER_TIME_DIFF),
    DBG_DESC(BTCOEX_PSPOLL_PROCESS),
    DBG_DESC(BTCOEX_RETURN_FROM_MAC),
    DBG_DESC(BTCOEX_FREED_REQUEUED_CNT),
    DBG_DESC(BTCOEX_DBG_TOGGLE_LOW_RATES),
    DBG_DESC(BTCOEX_MAC_GOES_TO_SLEEP),
    DBG_DESC(BTCOEX_DBG_A2DP_NO_SYNC),
    DBG_DESC(BTCOEX_RETURN_FROM_MAC_HOLD_Q_INFO),
    DBG_DESC(BTCOEX_RETURN_FROM_MAC_AC),
    DBG_DESC(BTCOEX_DBG_DTIM_RECV),
    DBG_DESC(0),
    DBG_DESC(BTCOEX_IS_PRE_UPDATE),
    DBG_DESC(BTCOEX_ENQUEUED_BIT_MAP),
    DBG_DESC(BTCOEX_TX_COMPLETE_FIRST_DESC_STATS),
    DBG_DESC(BTCOEX_UPLINK_DESC),
    DBG_DESC(BTCOEX_SCO_GET_PER_FIRST_FRM_TIMESTAMP),
    DBG_DESC(0), DBG_DESC(0), DBG_DESC(0),
    DBG_DESC(BTCOEX_DBG_RECV_ACK),
    DBG_DESC(BTCOEX_DBG_ADDBA_INDICATION),
    DBG_DESC(BTCOEX_TX_COMPLETE_EOL_FAILED),
    DBG_DESC(BTCOEX_DBG_A2DP_USAGE_COMPLETE),
    DBG_DESC(BTCOEX_DBG_A2DP_STOMP_FOR_BCN_HANDLER),
    DBG_DESC(BTCOEX_DBG_A2DP_SYNC_INTR),
    DBG_DESC(BTCOEX_DBG_A2DP_STOMP_FOR_BCN_RECEPTION),
    DBG_DESC(BTCOEX_FORM_AGGR_CURR_AGGR),
    DBG_DESC(BTCOEX_DBG_TOGGLE_A2DP_BURST_CNT),
    DBG_DESC(BTCOEX_DBG_BT_TRAFFIC),
    DBG_DESC(BTCOEX_DBG_STOMP_BT_TRAFFIC),
    DBG_DESC(BTCOEX_RECV_NULL),
    DBG_DESC(BTCOEX_DBG_A2DP_MASTER_BT_END),
    DBG_DESC(BTCOEX_DBG_A2DP_BT_START),
    DBG_DESC(BTCOEX_DBG_A2DP_SLAVE_BT_END),
    DBG_DESC(BTCOEX_DBG_A2DP_STOMP_BT),
    DBG_DESC_FMT(BTCOEX_DBG_GO_TO_SLEEP),
    DBG_DESC(BTCOEX_DBG_A2DP_PKT),
    DBG_DESC(BTCOEX_DBG_A2DP_PSPOLL_DATA_RECV),
    DBG_DESC(BTCOEX_DBG_A2DP_NULL),
    DBG_DESC(BTCOEX_DBG_UPLINK_DATA),
    DBG_DESC(BTCOEX_DBG_A2DP_STOMP_LOW_PRIO_NULL),
    DBG_DESC(BTCOEX_DBG_ADD_BA_RESP_TIMEOUT),
    DBG_DESC(BTCOEX_DBG_TXQ_STATE),
    DBG_DESC_FMT(BTCOEX_DBG_ALLOW_SCAN),
    DBG_DESC_FMT(BTCOEX_DBG_SCAN_REQUEST),
    DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0),
    DBG_DESC(BTCOEX_A2DP_SLEEP),
    DBG_DESC(BTCOEX_DBG_DATA_ACTIV_TIMEOUT),
    DBG_DESC(BTCOEX_DBG_SWITCH_TO_PSPOLL_ON_MODE),
    DBG_DESC(BTCOEX_DBG_SWITCH_TO_PSPOLL_OFF_MODE),
    DBG_DESC(BTCOEX_DATARECEIVE_AGGR),
    DBG_DESC(BTCOEX_DBG_DATA_RECV_SLEEPING_PENDING),
    DBG_DESC(BTCOEX_DBG_DATARESP_TIMEOUT),
    DBG_DESC(BTCOEX_BDG_BMISS),
    DBG_DESC(BTCOEX_DBG_DATA_RECV_WAKEUP_TIM),
    DBG_DESC(BTCOEX_DBG_SECOND_BMISS),
    DBG_DESC(0), 
    DBG_DESC_FMT(BTCOEX_DBG_SET_WLAN_STATE),
    DBG_DESC(BTCOEX_BDG_FIRST_BMISS),
    DBG_DESC(BTCOEX_DBG_A2DP_CHAN_OP),
    DBG_DESC(BTCOEX_DBG_A2DP_INTR),
    DBG_DESC_FMT(BTCOEX_DBG_BT_INQUIRY),
    DBG_DESC(BTCOEX_DBG_BT_INQUIRY_DATA_FETCH),
    DBG_DESC(BTCOEX_DBG_POST_INQUIRY_FINISH),
    DBG_DESC(BTCOEX_DBG_SCO_OPT_MODE_TIMER_HANDLER),
    DBG_DESC(BTCOEX_DBG_NULL_FRAME_SLEEP),
    DBG_DESC(BTCOEX_DBG_NULL_FRAME_AWAKE),
    DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), DBG_DESC(0), 
    DBG_DESC(BTCOEX_DBG_SET_AGGR_SIZE),
    DBG_DESC(BTCOEX_DBG_TEAR_BA_TIMEOUT),
    DBG_DESC(BTCOEX_DBG_MGMT_FRAME_SEQ_NO),
    DBG_DESC(BTCOEX_DBG_SCO_STOMP_HIGH_PRI),
    DBG_DESC(BTCOEX_DBG_COLOCATED_BT_DEV),
    DBG_DESC(BTCOEX_DBG_FE_ANT_TYPE),
    DBG_DESC(BTCOEX_DBG_BT_INQUIRY_CMD),
    DBG_DESC(BTCOEX_DBG_SCO_CONFIG),
    DBG_DESC(BTCOEX_DBG_SCO_PSPOLL_CONFIG),
    DBG_DESC(BTCOEX_DBG_SCO_OPTMODE_CONFIG),
    DBG_DESC(BTCOEX_DBG_A2DP_CONFIG),
    DBG_DESC(BTCOEX_DBG_A2DP_PSPOLL_CONFIG),
    DBG_DESC(BTCOEX_DBG_A2DP_OPTMODE_CONFIG),
    DBG_DESC(BTCOEX_DBG_ACLCOEX_CONFIG),
    DBG_DESC(BTCOEX_DBG_ACLCOEX_PSPOLL_CONFIG),
    DBG_DESC(BTCOEX_DBG_ACLCOEX_OPTMODE_CONFIG),
    DBG_DESC(BTCOEX_DBG_DEBUG_CMD),
    DBG_DESC(BTCOEX_DBG_SET_BT_OPERATING_STATUS),
    DBG_DESC(BTCOEX_DBG_GET_CONFIG),
    DBG_DESC(BTCOEX_DBG_GET_STATS),
    DBG_DESC(BTCOEX_DBG_BT_OPERATING_STATUS),
    DBG_DESC(BTCOEX_DBG_PERFORM_RECONNECT),
    DBG_DESC(0), 
    DBG_DESC(BTCOEX_DBG_ACL_WLAN_MED),
    DBG_DESC(BTCOEX_DBG_ACL_BT_MED),
    DBG_DESC(BTCOEX_DBG_WLAN_CONNECT),
    DBG_DESC(BTCOEX_DBG_A2DP_DUAL_START),
    DBG_DESC(BTCOEX_DBG_PMAWAKE_NOTIFY),
    DBG_DESC(BTCOEX_DBG_BEACON_SCAN_ENABLE),
    DBG_DESC(BTCOEX_DBG_BEACON_SCAN_DISABLE),
    DBG_DESC(BTCOEX_DBG_RX_NOTIFY),
    DBG_DESC(BTCOEX_SCO_GET_PER_SECOND_FRM_TIMESTAMP),
    DBG_DESC(BTCOEX_DBG_TXQ_DETAILS),
    DBG_DESC(BTCOEX_DBG_SCO_STOMP_LOW_PRI),
    DBG_DESC(BTCOEX_DBG_A2DP_FORCE_SCAN),
    DBG_DESC(BTCOEX_DBG_DTIM_STOMP_COMP),
    DBG_DESC(BTCOEX_ACL_PRESENCE_TIMER),
    DBG_DESC(BTCOEX_DBG_QUEUE_SELF_CTS),
    DBG_DESC(BTCOEX_DBG_SELF_CTS_COMP),
    DBG_DESC(BTCOEX_DBG_APMODE_WAIT_FOR_CTS_COMP_FAILED),
    DBG_DESC(BTCOEX_DBG_APMODE_A2DP_MED_TO_BT),
    DBG_DESC(BTCOEX_DBG_APMODE_SET_BTSTATE),
    DBG_DESC(BTCOEX_DBG_APMODE_A2DP_STATUS),
    DBG_DESC(BTCOEX_DBG_APMODE_SCO_CTS_HANDLER),
    DBG_DESC(BTCOEX_DBG_APMODE_SCO_STATUS),
    DBG_DESC(BTCOEX_DBG_APMODE_TXQ_DRAINED),
    DBG_DESC(BTCOEX_DBG_APMODE_SCO_ARM_TIMER),
    DBG_DESC(BTCOEX_DBG_APMODE_SWITCH_MED_TO_WLAN),
    DBG_DESC(BTCOEX_APMODE_BCN_TX_HANDLER),
    DBG_DESC(BTCOEX_APMODE_BCN_TX),
    DBG_DESC(BTCOEX_APMODE_SCO_RTS_HANDLER),
};

static struct dbglog_desc pm_desc[] = {
    DBG_DESC(0),
    DBG_DESC(PM_INIT), 
    DBG_DESC(PM_ENABLE),
    DBG_DESC_FMT(PM_SET_STATE),
    DBG_DESC_FMT(PM_SET_POWERMODE),
    DBG_DESC(PM_CONN_NOTIFY),
    DBG_DESC(PM_REF_COUNT_NEGATIVE),
    DBG_DESC(PM_INFRA_STA_APSD_ENABLE),
    DBG_DESC(PM_INFRA_STA_UPDATE_APSD_STATE),
    DBG_DESC_FMT(PM_CHAN_OP_REQ),
    DBG_DESC_FMT(PM_SET_MY_BEACON_POLICY),
    DBG_DESC_FMT(PM_SET_ALL_BEACON_POLICY),
    DBG_DESC(PM_INFRA_STA_SET_PM_PARAMS1),
    DBG_DESC(PM_INFRA_STA_SET_PM_PARAMS2),
    DBG_DESC(PM_ADHOC_SET_PM_CAPS_FAIL),
    DBG_DESC(PM_ADHOC_UNKNOWN_IBSS_ATTRIB_ID),
    DBG_DESC(PM_ADHOC_SET_PM_PARAMS),
    DBG_DESC(0),
    DBG_DESC(PM_ADHOC_STATE1),
    DBG_DESC(PM_ADHOC_STATE2),
    DBG_DESC(PM_ADHOC_CONN_MAP),
    DBG_DESC_FMT(PM_FAKE_SLEEP),
    DBG_DESC(PM_AP_STATE1),
    DBG_DESC(PM_AP_SET_PM_PARAMS),
    DBG_DESC(PM_P2P_STATE1),
};

static struct dbglog_desc dummy_desc[] = {
    DBG_DESC(0),
};

static struct module_desc modules[] = {
    MODULE_DESC(INF, dummy_desc),
    MODULE_DESC(WMI, wmi_desc),
    MODULE_DESC(MISC, dummy_desc),
    MODULE_DESC(PM, pm_desc),
    MODULE_DESC(TXRX_MGMTBUF, mgmtbuf_desc),
    MODULE_DESC(TXRX_TXBUF, dummy_desc),
    MODULE_DESC(TXRX_RXBUF, dummy_desc),
    MODULE_DESC(WOW, dummy_desc),
    MODULE_DESC(WHAL, dummy_desc),
    MODULE_DESC(DC, dc_desc),
    MODULE_DESC(CO, co_desc),
    MODULE_DESC(RO, dummy_desc),
    MODULE_DESC(CM, dummy_desc),
    MODULE_DESC(MGMT, dummy_desc),
    MODULE_DESC(TMR, dummy_desc),
    MODULE_DESC(BTCOEX, btcoex_desc),
};

static int compOid(const void *a, const void *b)
{
    return *(A_INT32*)a  - *(A_INT32*)b;
}

static void do_check_ids(void)
{
    size_t m, d, td;
    for (m = 0; m < DBGLOG_MODULEID_NUM_MAX; ++m) {
        size_t mlen;
        struct dbglog_desc *dlog;
        if (m >= ARRAY_SIZE(modules)) {
            printf("module id %d does not matched\n", m);
            break;
        }
        dlog = modules[m].descs;
        mlen = modules[m].len;
        d=td=1;
        while (dlog && (d<mlen||dbglog_id_tag[m][td][0]!='\0')) {       
            if (d>=mlen) {
                if (dlog != dummy_desc) {
                    printf("m %s dbgid %s(%d) is larger than max internal table %d host/firmware mismatch?\n", 
                            modules[m].name, dbglog_id_tag[m][td], td, mlen);
                }                
                break;
            }

            if (dbglog_id_tag[m][td][0]=='\0' && dlog[d].oid!=0) {
                for (;td < DBGLOG_DBGID_NUM_MAX && dbglog_id_tag[m][td][0]=='\0'; ++td);
            }
            if (strcmp(dbglog_id_tag[m][td], dlog[d].desc)!=0 && dlog[d].oid!=0) {
                printf("debug id does not matched '%s' <> '%s'\n", dbglog_id_tag[m][td], dlog[d].desc);
                break;
            } else {
                if (td!=d && !modules[m].bsearch) {                    
                    printf("Module %s debugid %s(%d) mismatched. using binary search for debugid",
                           modules[m].name, dbglog_id_tag[m][td], td); 
                    modules[m].bsearch = 1;
                }
            }
            ++d; ++td;
        }
        if (modules[m].bsearch && dlog) {
            qsort(dlog, mlen, sizeof(dlog[0]), compOid);
        }
    }
    check_ids = 1;
}

static DbgLogFormatter getFormatter(A_INT32 moduleid, A_INT32 debugid)
{
    if (!check_ids) {
        do_check_ids();
    }

    if ( moduleid < ARRAY_SIZE(modules)) {
        const struct module_desc *m = &modules[moduleid];
        if (m->descs ) {
            if (m->bsearch){
                struct dbglog_desc *d;
                d = (struct dbglog_desc*)bsearch(&debugid, m->descs, m->len, sizeof(m->descs[0]), compOid);
                return d ? d->formatter : NULL;
            } else if (debugid>0 && debugid<m->len) {
                return m->descs[debugid].formatter;   
            }
        }
    }
    return NULL;
}

int dbg_formater(int lv, char *output, size_t len, A_UINT32 ts, A_INT32 *logbuf)
{
    int ret = 0;
	A_UINT32 idx, last_idx;
    A_UINT32 debugid = DBGLOG_GET_DBGID(logbuf[0]);
    A_UINT32 moduleid = DBGLOG_GET_MODULEID(logbuf[0]);
    A_UINT32 numargs = DBGLOG_GET_NUMARGS(logbuf[0]);
    A_UINT32 timestamp = DBGLOG_GET_TIMESTAMP(logbuf[0]);
    DbgLogFormatter dbgFormatter = NULL;

    if (numargs>2) {
        return ret;
    }

    if (lv > 0) {
        dbgFormatter = getFormatter(moduleid, debugid);
    }

    if (ts>0) {
        if (lv == 0) {
            ret += snprintf(output+ret, len-ret, "%8d: ", ts);
        } else {
            ret += strftime(output+ret, len-ret, "%m-%d %H:%M:%S ", gmtime((time_t*)&ts));
        }
    }
    ret += snprintf(output+ret, len-ret, "(%05d) %s", timestamp, dbglog_id_tag[moduleid][debugid]);
    if (lv>1 || lv == 0 || !dbgFormatter) {

        if(numargs == 1 && !strcmp(dbglog_id_tag[moduleid][debugid], "WMI_EVENT_SEND"))
        {
            idx = 0;
            last_idx = ARRAY_SIZE(dbg_wmi_event_str);
            for(idx = 0 ; idx < last_idx ; idx++) {
                if(dbg_wmi_event_str[idx].id == logbuf[1]) {
                    break;
                }
            }
            if(idx < last_idx) {
                ret += snprintf(output+ret, len-ret, ": 0x%04x\t\t--- %s",
                                logbuf[1], dbg_wmi_event_str[idx].str );
            } else {
            	ret += snprintf(output+ret, len-ret, ": 0x%04x", logbuf[1]);
            }
        } else if(numargs == 2 && !strcmp(dbglog_id_tag[moduleid][debugid], "WMI_CMD_RX")) {
            idx = 0;
            last_idx = ARRAY_SIZE(dbg_wmi_cmd_str);
            for(idx = 0 ; idx < last_idx ; idx++) {
                if(dbg_wmi_cmd_str[idx].id == logbuf[1])
                    break;
            }
            if(idx < last_idx) {
                ret += snprintf(output+ret, len-ret, ": 0x%02x, 0x%02x\t\t+++ %s",
                                logbuf[1], logbuf[2], dbg_wmi_cmd_str[idx].str );
            } else {
            	ret += snprintf(output+ret, len-ret, ": 0x%02x, 0x%02x", 
            	                logbuf[1], logbuf[2]);
            }
        } else {
	        if (numargs>0) {
	            ret += snprintf(output+ret, len-ret, ": 0x%x", logbuf[1]);
	        }
	        if (numargs>1) {
	            ret += snprintf(output+ret, len-ret, ", 0x%x", logbuf[2]);
	        }
	        if (dbgFormatter && numargs>0 && lv > 0) {
	            ret += snprintf(output+ret, len-ret, ", ");
	        }
        }
    } else {
        ret += snprintf(output+ret, len-ret, ": ");
    }

    if (dbgFormatter && lv > 0) {
        int pos = ret;
        int addlen;
        addlen = dbgFormatter(output+ret, len-ret, numargs, logbuf);
        if (addlen>0) {
            ret += addlen;
        } else if (lv<=1) {
            /* skip this message */
            (void)pos;
            return 0;
        }
    }
    ret += snprintf(output+ret, len-ret, "\n");
    return ret;
}

