1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * DHD debugability packet logging header file 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 7*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 8*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 9*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 10*4882a593Smuzhiyun * following added to such license: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 13*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 14*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 15*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 16*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 17*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 18*4882a593Smuzhiyun * modifications of the software. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Open:>> 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * $Id$ 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #ifndef __DHD_PKTLOG_H_ 27*4882a593Smuzhiyun #define __DHD_PKTLOG_H_ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #include <dhd_debug.h> 30*4882a593Smuzhiyun #include <dhd.h> 31*4882a593Smuzhiyun #include <asm/atomic.h> 32*4882a593Smuzhiyun #ifdef DHD_COMPACT_PKT_LOG 33*4882a593Smuzhiyun #include <linux/rbtree.h> 34*4882a593Smuzhiyun #endif /* DHD_COMPACT_PKT_LOG */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifdef DHD_PKT_LOGGING 37*4882a593Smuzhiyun #define DHD_PKT_LOG(args) DHD_INFO(args) 38*4882a593Smuzhiyun #define DEFAULT_MULTIPLE_PKTLOG_BUF 1 39*4882a593Smuzhiyun #ifndef CUSTOM_MULTIPLE_PKTLOG_BUF 40*4882a593Smuzhiyun #define CUSTOM_MULTIPLE_PKTLOG_BUF DEFAULT_MULTIPLE_PKTLOG_BUF 41*4882a593Smuzhiyun #endif /* CUSTOM_MULTIPLE_PKTLOG_BUF */ 42*4882a593Smuzhiyun #define MIN_PKTLOG_LEN (32 * 10 * 2 * CUSTOM_MULTIPLE_PKTLOG_BUF) 43*4882a593Smuzhiyun #define MAX_PKTLOG_LEN (32 * 10 * 2 * 10) 44*4882a593Smuzhiyun #define MAX_DHD_PKTLOG_FILTER_LEN 14 45*4882a593Smuzhiyun #define MAX_MASK_PATTERN_FILTER_LEN 64 46*4882a593Smuzhiyun #define PKTLOG_TXPKT_CASE 0x0001 47*4882a593Smuzhiyun #define PKTLOG_TXSTATUS_CASE 0x0002 48*4882a593Smuzhiyun #define PKTLOG_RXPKT_CASE 0x0004 49*4882a593Smuzhiyun /* MAX_FILTER_PATTERN_LEN is buf len to print bitmask/pattern with string */ 50*4882a593Smuzhiyun #define MAX_FILTER_PATTERN_LEN \ 51*4882a593Smuzhiyun ((MAX_MASK_PATTERN_FILTER_LEN * HD_BYTE_SIZE) + HD_PREFIX_SIZE + 1) * 2 52*4882a593Smuzhiyun #define PKTLOG_DUMP_BUF_SIZE (64 * 1024) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun typedef struct dhd_dbg_pktlog_info { 55*4882a593Smuzhiyun frame_type payload_type; 56*4882a593Smuzhiyun size_t pkt_len; 57*4882a593Smuzhiyun uint32 driver_ts_sec; 58*4882a593Smuzhiyun uint32 driver_ts_usec; 59*4882a593Smuzhiyun uint32 firmware_ts; 60*4882a593Smuzhiyun uint32 pkt_hash; 61*4882a593Smuzhiyun bool direction; 62*4882a593Smuzhiyun void *pkt; 63*4882a593Smuzhiyun } dhd_dbg_pktlog_info_t; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun typedef struct dhd_pktlog_ring_info 66*4882a593Smuzhiyun { 67*4882a593Smuzhiyun dll_t p_info; /* list pointer */ 68*4882a593Smuzhiyun union { 69*4882a593Smuzhiyun wifi_tx_packet_fate tx_fate; 70*4882a593Smuzhiyun wifi_rx_packet_fate rx_fate; 71*4882a593Smuzhiyun uint32 fate; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun dhd_dbg_pktlog_info_t info; 74*4882a593Smuzhiyun } dhd_pktlog_ring_info_t; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun typedef struct dhd_pktlog_ring 77*4882a593Smuzhiyun { 78*4882a593Smuzhiyun dll_t ring_info_head; /* ring_info list */ 79*4882a593Smuzhiyun dll_t ring_info_free; /* ring_info free list */ 80*4882a593Smuzhiyun osl_atomic_t start; 81*4882a593Smuzhiyun uint32 pktlog_minmize; 82*4882a593Smuzhiyun uint32 pktlog_len; /* size of pkts */ 83*4882a593Smuzhiyun uint32 pktcount; 84*4882a593Smuzhiyun spinlock_t *pktlog_ring_lock; 85*4882a593Smuzhiyun dhd_pub_t *dhdp; 86*4882a593Smuzhiyun dhd_pktlog_ring_info_t *ring_info_mem; /* ring_info mem pointer */ 87*4882a593Smuzhiyun } dhd_pktlog_ring_t; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun typedef struct dhd_pktlog_filter_info 90*4882a593Smuzhiyun { 91*4882a593Smuzhiyun uint32 id; 92*4882a593Smuzhiyun uint32 offset; 93*4882a593Smuzhiyun uint32 size_bytes; /* Size of pattern. */ 94*4882a593Smuzhiyun uint32 enable; 95*4882a593Smuzhiyun uint8 mask[MAX_MASK_PATTERN_FILTER_LEN]; 96*4882a593Smuzhiyun uint8 pattern[MAX_MASK_PATTERN_FILTER_LEN]; 97*4882a593Smuzhiyun } dhd_pktlog_filter_info_t; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun typedef struct dhd_pktlog_filter 100*4882a593Smuzhiyun { 101*4882a593Smuzhiyun dhd_pktlog_filter_info_t *info; 102*4882a593Smuzhiyun uint32 list_cnt; 103*4882a593Smuzhiyun uint32 enable; 104*4882a593Smuzhiyun } dhd_pktlog_filter_t; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun typedef struct dhd_pktlog 107*4882a593Smuzhiyun { 108*4882a593Smuzhiyun struct dhd_pktlog_ring *pktlog_ring; 109*4882a593Smuzhiyun struct dhd_pktlog_filter *pktlog_filter; 110*4882a593Smuzhiyun osl_atomic_t pktlog_status; 111*4882a593Smuzhiyun dhd_pub_t *dhdp; 112*4882a593Smuzhiyun #ifdef DHD_COMPACT_PKT_LOG 113*4882a593Smuzhiyun struct rb_root cpkt_log_tt_rbt; 114*4882a593Smuzhiyun #endif /* DHD_COMPACT_PKT_LOG */ 115*4882a593Smuzhiyun } dhd_pktlog_t; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun typedef struct dhd_pktlog_pcap_hdr 118*4882a593Smuzhiyun { 119*4882a593Smuzhiyun uint32 magic_number; 120*4882a593Smuzhiyun uint16 version_major; 121*4882a593Smuzhiyun uint16 version_minor; 122*4882a593Smuzhiyun uint16 thiszone; 123*4882a593Smuzhiyun uint32 sigfigs; 124*4882a593Smuzhiyun uint32 snaplen; 125*4882a593Smuzhiyun uint32 network; 126*4882a593Smuzhiyun } dhd_pktlog_pcap_hdr_t; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define PKTLOG_PCAP_MAGIC_NUM 0xa1b2c3d4 129*4882a593Smuzhiyun #define PKTLOG_PCAP_MAJOR_VER 0x02 130*4882a593Smuzhiyun #define PKTLOG_PCAP_MINOR_VER 0x04 131*4882a593Smuzhiyun #define PKTLOG_PCAP_SNAP_LEN 0x40000 132*4882a593Smuzhiyun #define PKTLOG_PCAP_NETWORK_TYPE 147 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun extern int dhd_os_attach_pktlog(dhd_pub_t *dhdp); 135*4882a593Smuzhiyun extern int dhd_os_detach_pktlog(dhd_pub_t *dhdp); 136*4882a593Smuzhiyun extern dhd_pktlog_ring_t* dhd_pktlog_ring_init(dhd_pub_t *dhdp, int size); 137*4882a593Smuzhiyun extern int dhd_pktlog_ring_deinit(dhd_pub_t *dhdp, dhd_pktlog_ring_t *ring); 138*4882a593Smuzhiyun extern int dhd_pktlog_ring_set_nextpos(dhd_pktlog_ring_t *ringbuf); 139*4882a593Smuzhiyun extern int dhd_pktlog_ring_get_nextbuf(dhd_pktlog_ring_t *ringbuf, void **data); 140*4882a593Smuzhiyun extern int dhd_pktlog_ring_set_prevpos(dhd_pktlog_ring_t *ringbuf); 141*4882a593Smuzhiyun extern int dhd_pktlog_ring_get_prevbuf(dhd_pktlog_ring_t *ringbuf, void **data); 142*4882a593Smuzhiyun extern int dhd_pktlog_ring_get_writebuf(dhd_pktlog_ring_t *ringbuf, void **data); 143*4882a593Smuzhiyun extern int dhd_pktlog_ring_add_pkts(dhd_pub_t *dhdp, void *pkt, void *pktdata, uint32 pktid, 144*4882a593Smuzhiyun uint32 direction); 145*4882a593Smuzhiyun extern int dhd_pktlog_ring_tx_status(dhd_pub_t *dhdp, void *pkt, void *pktdata, uint32 pktid, 146*4882a593Smuzhiyun uint16 status); 147*4882a593Smuzhiyun extern dhd_pktlog_ring_t* dhd_pktlog_ring_change_size(dhd_pktlog_ring_t *ringbuf, int size); 148*4882a593Smuzhiyun extern void dhd_pktlog_filter_pull_forward(dhd_pktlog_filter_t *filter, 149*4882a593Smuzhiyun uint32 del_filter_id, uint32 list_cnt); 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #define PKT_RX 0 152*4882a593Smuzhiyun #define PKT_TX 1 153*4882a593Smuzhiyun #define PKT_WAKERX 2 154*4882a593Smuzhiyun #define DHD_INVALID_PKTID (0U) 155*4882a593Smuzhiyun #define PKTLOG_TRANS_TX 0x01 156*4882a593Smuzhiyun #define PKTLOG_TRANS_RX 0x02 157*4882a593Smuzhiyun #define PKTLOG_TRANS_TXS 0x04 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun #define PKTLOG_SET_IN_TX(dhdp) \ 160*4882a593Smuzhiyun { \ 161*4882a593Smuzhiyun do { \ 162*4882a593Smuzhiyun OSL_ATOMIC_OR((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, PKTLOG_TRANS_TX); \ 163*4882a593Smuzhiyun } while (0); \ 164*4882a593Smuzhiyun } 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun #define PKTLOG_SET_IN_RX(dhdp) \ 167*4882a593Smuzhiyun { \ 168*4882a593Smuzhiyun do { \ 169*4882a593Smuzhiyun OSL_ATOMIC_OR((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, PKTLOG_TRANS_RX); \ 170*4882a593Smuzhiyun } while (0); \ 171*4882a593Smuzhiyun } 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define PKTLOG_SET_IN_TXS(dhdp) \ 174*4882a593Smuzhiyun { \ 175*4882a593Smuzhiyun do { \ 176*4882a593Smuzhiyun OSL_ATOMIC_OR((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, PKTLOG_TRANS_TXS); \ 177*4882a593Smuzhiyun } while (0); \ 178*4882a593Smuzhiyun } 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #define PKTLOG_CLEAR_IN_TX(dhdp) \ 181*4882a593Smuzhiyun { \ 182*4882a593Smuzhiyun do { \ 183*4882a593Smuzhiyun OSL_ATOMIC_AND((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, ~PKTLOG_TRANS_TX); \ 184*4882a593Smuzhiyun } while (0); \ 185*4882a593Smuzhiyun } 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define PKTLOG_CLEAR_IN_RX(dhdp) \ 188*4882a593Smuzhiyun { \ 189*4882a593Smuzhiyun do { \ 190*4882a593Smuzhiyun OSL_ATOMIC_AND((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, ~PKTLOG_TRANS_RX); \ 191*4882a593Smuzhiyun } while (0); \ 192*4882a593Smuzhiyun } 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #define PKTLOG_CLEAR_IN_TXS(dhdp) \ 195*4882a593Smuzhiyun { \ 196*4882a593Smuzhiyun do { \ 197*4882a593Smuzhiyun OSL_ATOMIC_AND((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, ~PKTLOG_TRANS_TXS); \ 198*4882a593Smuzhiyun } while (0); \ 199*4882a593Smuzhiyun } 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #define DHD_PKTLOG_TX(dhdp, pkt, pktdata, pktid) \ 202*4882a593Smuzhiyun { \ 203*4882a593Smuzhiyun do { \ 204*4882a593Smuzhiyun if ((dhdp) && (dhdp)->pktlog && (pkt)) { \ 205*4882a593Smuzhiyun PKTLOG_SET_IN_TX(dhdp); \ 206*4882a593Smuzhiyun if ((dhdp)->pktlog->pktlog_ring && \ 207*4882a593Smuzhiyun OSL_ATOMIC_READ((dhdp)->osh, \ 208*4882a593Smuzhiyun (&(dhdp)->pktlog->pktlog_ring->start))) { \ 209*4882a593Smuzhiyun dhd_pktlog_ring_add_pkts(dhdp, pkt, pktdata, pktid, PKT_TX); \ 210*4882a593Smuzhiyun } \ 211*4882a593Smuzhiyun PKTLOG_CLEAR_IN_TX(dhdp); \ 212*4882a593Smuzhiyun } \ 213*4882a593Smuzhiyun } while (0); \ 214*4882a593Smuzhiyun } 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun #define DHD_PKTLOG_TXS(dhdp, pkt, pktdata, pktid, status) \ 217*4882a593Smuzhiyun { \ 218*4882a593Smuzhiyun do { \ 219*4882a593Smuzhiyun if ((dhdp) && (dhdp)->pktlog && (pkt)) { \ 220*4882a593Smuzhiyun PKTLOG_SET_IN_TXS(dhdp); \ 221*4882a593Smuzhiyun if ((dhdp)->pktlog->pktlog_ring && \ 222*4882a593Smuzhiyun OSL_ATOMIC_READ((dhdp)->osh, \ 223*4882a593Smuzhiyun (&(dhdp)->pktlog->pktlog_ring->start))) { \ 224*4882a593Smuzhiyun dhd_pktlog_ring_tx_status(dhdp, pkt, pktdata, pktid, status); \ 225*4882a593Smuzhiyun } \ 226*4882a593Smuzhiyun PKTLOG_CLEAR_IN_TXS(dhdp); \ 227*4882a593Smuzhiyun } \ 228*4882a593Smuzhiyun } while (0); \ 229*4882a593Smuzhiyun } 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun #define DHD_PKTLOG_RX(dhdp, pkt, pktdata) \ 232*4882a593Smuzhiyun { \ 233*4882a593Smuzhiyun do { \ 234*4882a593Smuzhiyun if ((dhdp) && (dhdp)->pktlog && (pkt)) { \ 235*4882a593Smuzhiyun PKTLOG_SET_IN_RX(dhdp); \ 236*4882a593Smuzhiyun if (ntoh16((pkt)->protocol) != ETHER_TYPE_BRCM) { \ 237*4882a593Smuzhiyun if ((dhdp)->pktlog->pktlog_ring && \ 238*4882a593Smuzhiyun OSL_ATOMIC_READ((dhdp)->osh, \ 239*4882a593Smuzhiyun (&(dhdp)->pktlog->pktlog_ring->start))) { \ 240*4882a593Smuzhiyun dhd_pktlog_ring_add_pkts(dhdp, pkt, pktdata, \ 241*4882a593Smuzhiyun DHD_INVALID_PKTID, PKT_RX); \ 242*4882a593Smuzhiyun } \ 243*4882a593Smuzhiyun } \ 244*4882a593Smuzhiyun PKTLOG_CLEAR_IN_RX(dhdp); \ 245*4882a593Smuzhiyun } \ 246*4882a593Smuzhiyun } while (0); \ 247*4882a593Smuzhiyun } 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun #define DHD_PKTLOG_WAKERX(dhdp, pkt, pktdata) \ 250*4882a593Smuzhiyun { \ 251*4882a593Smuzhiyun do { \ 252*4882a593Smuzhiyun if ((dhdp) && (dhdp)->pktlog && (pkt)) { \ 253*4882a593Smuzhiyun PKTLOG_SET_IN_RX(dhdp); \ 254*4882a593Smuzhiyun if (ntoh16((pkt)->protocol) != ETHER_TYPE_BRCM) { \ 255*4882a593Smuzhiyun if ((dhdp)->pktlog->pktlog_ring && \ 256*4882a593Smuzhiyun OSL_ATOMIC_READ((dhdp)->osh, \ 257*4882a593Smuzhiyun (&(dhdp)->pktlog->pktlog_ring->start))) { \ 258*4882a593Smuzhiyun dhd_pktlog_ring_add_pkts(dhdp, pkt, pktdata, \ 259*4882a593Smuzhiyun DHD_INVALID_PKTID, PKT_WAKERX); \ 260*4882a593Smuzhiyun } \ 261*4882a593Smuzhiyun } \ 262*4882a593Smuzhiyun PKTLOG_CLEAR_IN_RX(dhdp); \ 263*4882a593Smuzhiyun } \ 264*4882a593Smuzhiyun } while (0); \ 265*4882a593Smuzhiyun } 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun extern dhd_pktlog_filter_t* dhd_pktlog_filter_init(int size); 268*4882a593Smuzhiyun extern int dhd_pktlog_filter_deinit(dhd_pktlog_filter_t *filter); 269*4882a593Smuzhiyun extern int dhd_pktlog_filter_add(dhd_pktlog_filter_t *filter, char *arg); 270*4882a593Smuzhiyun extern int dhd_pktlog_filter_del(dhd_pktlog_filter_t *filter, char *arg); 271*4882a593Smuzhiyun extern int dhd_pktlog_filter_enable(dhd_pktlog_filter_t *filter, uint32 pktlog_case, uint32 enable); 272*4882a593Smuzhiyun extern int dhd_pktlog_filter_pattern_enable(dhd_pktlog_filter_t *filter, char *arg, uint32 enable); 273*4882a593Smuzhiyun extern int dhd_pktlog_filter_info(dhd_pktlog_filter_t *filter); 274*4882a593Smuzhiyun extern bool dhd_pktlog_filter_matched(dhd_pktlog_filter_t *filter, char *data, uint32 pktlog_case); 275*4882a593Smuzhiyun extern bool dhd_pktlog_filter_existed(dhd_pktlog_filter_t *filter, char *arg, uint32 *id); 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun #define DHD_PKTLOG_FILTER_ADD(pattern, filter_pattern, dhdp) \ 278*4882a593Smuzhiyun { \ 279*4882a593Smuzhiyun do { \ 280*4882a593Smuzhiyun if ((strlen(pattern) + 1) < sizeof(filter_pattern)) { \ 281*4882a593Smuzhiyun strncpy(filter_pattern, pattern, sizeof(filter_pattern)); \ 282*4882a593Smuzhiyun dhd_pktlog_filter_add(dhdp->pktlog->pktlog_filter, filter_pattern); \ 283*4882a593Smuzhiyun } \ 284*4882a593Smuzhiyun } while (0); \ 285*4882a593Smuzhiyun } 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun #define DHD_PKTLOG_DUMP_PATH DHD_COMMON_DUMP_PATH 288*4882a593Smuzhiyun extern int dhd_pktlog_debug_dump(dhd_pub_t *dhdp); 289*4882a593Smuzhiyun extern void dhd_pktlog_dump(void *handle, void *event_info, u8 event); 290*4882a593Smuzhiyun extern void dhd_schedule_pktlog_dump(dhd_pub_t *dhdp); 291*4882a593Smuzhiyun extern int dhd_pktlog_dump_write_memory(dhd_pub_t *dhdp, const void *user_buf, uint32 size); 292*4882a593Smuzhiyun extern int dhd_pktlog_dump_write_file(dhd_pub_t *dhdp); 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun #define DHD_PKTLOG_FATE_INFO_STR_LEN 256 295*4882a593Smuzhiyun #define DHD_PKTLOG_FATE_INFO_FORMAT "BRCM_Packet_Fate" 296*4882a593Smuzhiyun #define DHD_PKTLOG_DUMP_TYPE "pktlog_dump" 297*4882a593Smuzhiyun #define DHD_PKTLOG_DEBUG_DUMP_TYPE "pktlog_debug_dump" 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun extern void dhd_pktlog_get_filename(dhd_pub_t *dhdp, char *dump_path, int len); 300*4882a593Smuzhiyun extern uint32 dhd_pktlog_get_item_length(dhd_pktlog_ring_info_t *report_ptr); 301*4882a593Smuzhiyun extern uint32 dhd_pktlog_get_dump_length(dhd_pub_t *dhdp); 302*4882a593Smuzhiyun extern uint32 __dhd_dbg_pkt_hash(uintptr_t pkt, uint32 pktid); 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun #ifdef DHD_COMPACT_PKT_LOG 305*4882a593Smuzhiyun #define CPKT_LOG_BIT_SIZE 22 306*4882a593Smuzhiyun #define CPKT_LOG_MAX_NUM 80 307*4882a593Smuzhiyun extern int dhd_cpkt_log_proc(dhd_pub_t *dhdp, char *buf, int buf_len, 308*4882a593Smuzhiyun int bit_offset, int req_pkt_num); 309*4882a593Smuzhiyun #endif /* DHD_COMPACT_PKT_LOG */ 310*4882a593Smuzhiyun #endif /* DHD_PKT_LOGGING */ 311*4882a593Smuzhiyun #endif /* __DHD_PKTLOG_H_ */ 312