1 /* 2 * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #if !defined(__QDF_TRACE_H) 21 #define __QDF_TRACE_H 22 23 /** 24 * DOC: qdf_trace 25 * QCA driver framework trace APIs 26 * Trace, logging, and debugging definitions and APIs 27 */ 28 29 /* Include Files */ 30 #include <qdf_types.h> /* For QDF_MODULE_ID... */ 31 #include <qdf_status.h> 32 #include <qdf_nbuf.h> 33 #include <i_qdf_types.h> 34 #include <qdf_debugfs.h> 35 36 37 /* Type declarations */ 38 39 #ifdef LOG_LINE_NUMBER 40 #define FL(x) "%s: %d: " x, __func__, __LINE__ 41 #else 42 #define FL(x) "%s: " x, __func__ 43 #endif 44 45 #define QDF_TRACE_BUFFER_SIZE (512) 46 47 /* 48 * Extracts the 8-bit group id from the wmi command id by performing the 49 * reverse operation of WMI_CMD_GRP_START_ID 50 */ 51 #define QDF_WMI_MTRACE_GRP_ID(message_id) (((message_id) >> 12) & 0xFF) 52 /* 53 * Number of bits reserved for WMI mtrace command id 54 */ 55 #define QDF_WMI_MTRACE_CMD_NUM_BITS 7 56 /* 57 * Extracts the 7-bit group specific command id from the wmi command id 58 */ 59 #define QDF_WMI_MTRACE_CMD_ID(message_id) ((message_id) & 0x7F) 60 61 #ifdef QDF_TRACE_PRINT_ENABLE 62 #define QDF_DEFAULT_TRACE_LEVEL (1 << QDF_TRACE_LEVEL_INFO) 63 #endif 64 65 #define QDF_CATEGORY_INFO_U16(val) (((val >> 16) & 0x0000FFFF)) 66 #define QDF_TRACE_LEVEL_INFO_L16(val) (val & 0x0000FFFF) 67 68 typedef int (qdf_abstract_print)(void *priv, const char *fmt, ...); 69 70 /* 71 * Log levels 72 */ 73 #define QDF_DEBUG_FUNCTRACE 0x01 74 #define QDF_DEBUG_LEVEL0 0x02 75 #define QDF_DEBUG_LEVEL1 0x04 76 #define QDF_DEBUG_LEVEL2 0x08 77 #define QDF_DEBUG_LEVEL3 0x10 78 #define QDF_DEBUG_ERROR 0x20 79 #define QDF_DEBUG_CFG 0x40 80 81 /* 82 * Rate limit based on pkt prototype 83 */ 84 #define QDF_MAX_DHCP_PKTS_PER_SEC (20) 85 #define QDF_MAX_EAPOL_PKTS_PER_SEC (50) 86 #define QDF_MAX_ARP_PKTS_PER_SEC (5) 87 #define QDF_MAX_DNS_PKTS_PER_SEC (5) 88 #define QDF_MAX_OTHER_PKTS_PER_SEC (1) 89 90 /* DP Trace Implementation */ 91 #ifdef CONFIG_DP_TRACE 92 #define DPTRACE(p) p 93 #define DPTRACE_PRINT(args...) \ 94 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, args) 95 #else 96 #define DPTRACE(p) 97 #define DPTRACE_PRINT(args...) 98 #endif 99 100 /* By default Data Path module will have all log levels enabled, except debug 101 * log level. Debug level will be left up to the framework or user space modules 102 * to be enabled when issue is detected 103 */ 104 #define QDF_DATA_PATH_TRACE_LEVEL \ 105 ((1 << QDF_TRACE_LEVEL_FATAL) | (1 << QDF_TRACE_LEVEL_ERROR) | \ 106 (1 << QDF_TRACE_LEVEL_WARN) | (1 << QDF_TRACE_LEVEL_INFO) | \ 107 (1 << QDF_TRACE_LEVEL_INFO_HIGH) | (1 << QDF_TRACE_LEVEL_INFO_MED) | \ 108 (1 << QDF_TRACE_LEVEL_INFO_LOW)) 109 110 /* Preprocessor definitions and constants */ 111 #define ASSERT_BUFFER_SIZE (512) 112 113 #ifndef MAX_QDF_TRACE_RECORDS 114 #define MAX_QDF_TRACE_RECORDS 4000 115 #endif 116 117 #define QDF_TRACE_DEFAULT_PDEV_ID 0xff 118 #define INVALID_QDF_TRACE_ADDR 0xffffffff 119 #define DEFAULT_QDF_TRACE_DUMP_COUNT 0 120 #define QDF_TRACE_DEFAULT_MSDU_ID 0 121 122 /* 123 * first parameter to iwpriv command - dump_dp_trace 124 * iwpriv wlan0 dump_dp_trace 0 0 -> dump full buffer 125 * iwpriv wlan0 dump_dp_trace 1 0 -> enable live view mode 126 * iwpriv wlan0 dump_dp_trace 2 0 -> clear dp trace buffer 127 * iwpriv wlan0 dump_dp_trace 3 0 -> disable live view mode 128 */ 129 #define DUMP_DP_TRACE 0 130 #define ENABLE_DP_TRACE_LIVE_MODE 1 131 #define CLEAR_DP_TRACE_BUFFER 2 132 #define DISABLE_DP_TRACE_LIVE_MODE 3 133 134 135 #ifdef TRACE_RECORD 136 137 #define MTRACE(p) p 138 139 #else 140 #define MTRACE(p) do { } while (0) 141 142 #endif 143 #define NO_SESSION 0xFF 144 145 /** 146 * struct qdf_trace_record_s - keep trace record 147 * @qtime: qtimer ticks 148 * @time: user timestamp 149 * @module: module name 150 * @code: hold record of code 151 * @session: hold record of session 152 * @data: hold data 153 * @pid: hold pid of the process 154 */ 155 typedef struct qdf_trace_record_s { 156 uint64_t qtime; 157 char time[18]; 158 uint8_t module; 159 uint16_t code; 160 uint16_t session; 161 uint32_t data; 162 uint32_t pid; 163 } qdf_trace_record_t, *tp_qdf_trace_record; 164 165 /** 166 * struct s_qdf_trace_data - MTRACE logs are stored in ring buffer 167 * @head: position of first record 168 * @tail: position of last record 169 * @num: count of total record 170 * @num_since_last_dump: count from last dump 171 * @enable: config for controlling the trace 172 * @dump_count: Dump after number of records reach this number 173 */ 174 typedef struct s_qdf_trace_data { 175 uint32_t head; 176 uint32_t tail; 177 uint32_t num; 178 uint16_t num_since_last_dump; 179 uint8_t enable; 180 uint16_t dump_count; 181 } t_qdf_trace_data; 182 183 #ifdef CONNECTIVITY_DIAG_EVENT 184 /** 185 * enum diag_dp_tx_rx_status - TX/RX packet status 186 * @DIAG_TX_RX_STATUS_INVALID: default invalid status 187 * @DIAG_TX_RX_STATUS_OK: successfully sent + acked 188 * @DIAG_TX_RX_STATUS_FW_DISCARD: queued but not sent over air 189 * @DIAG_TX_RX_STATUS_NO_ACK: packet sent but no ack received 190 * @DIAG_TX_RX_STATUS_DROP: packet dropped due to congestion 191 * @DIAG_TX_RX_STATUS_DOWNLOAD_SUCC: packet delivered to target 192 * @DIAG_TX_RX_STATUS_DEFAULT: default status 193 * @DIAG_TX_RX_STATUS_MAX: 194 */ 195 enum diag_dp_tx_rx_status { 196 DIAG_TX_RX_STATUS_INVALID, 197 DIAG_TX_RX_STATUS_OK, 198 DIAG_TX_RX_STATUS_FW_DISCARD, 199 DIAG_TX_RX_STATUS_NO_ACK, 200 DIAG_TX_RX_STATUS_DROP, 201 DIAG_TX_RX_STATUS_DOWNLOAD_SUCC, 202 DIAG_TX_RX_STATUS_DEFAULT, 203 DIAG_TX_RX_STATUS_MAX 204 }; 205 206 /** 207 * enum diag_tx_status - Used by attribute 208 * @DIAG_TX_STATUS_FAIL: Indicates frame is not sent over the air. 209 * @DIAG_TX_STATUS_NO_ACK: Indicates packet sent but acknowledgment 210 * is not received. 211 * @DIAG_TX_STATUS_ACK: Indicates the frame is successfully sent and 212 * acknowledged. 213 */ 214 enum diag_tx_status { 215 DIAG_TX_STATUS_FAIL = 1, 216 DIAG_TX_STATUS_NO_ACK = 2, 217 DIAG_TX_STATUS_ACK = 3 218 }; 219 220 /** 221 * wlan_get_diag_tx_status() - Gives the diag logging specific tx status 222 * @tx_status: fw specific TX status 223 * 224 * Returns TX status specified in enum diag_tx_status 225 */ 226 enum diag_tx_status wlan_get_diag_tx_status(enum qdf_dp_tx_rx_status tx_status); 227 #endif 228 229 #define CASE_RETURN_STRING(str) case ((str)): return (uint8_t *)(# str); 230 231 #ifndef MAX_QDF_DP_TRACE_RECORDS 232 #define MAX_QDF_DP_TRACE_RECORDS 2000 233 #endif 234 235 #define QDF_DP_TRACE_RECORD_SIZE 66 /* bytes */ 236 #define INVALID_QDF_DP_TRACE_ADDR 0xffffffff 237 #define QDF_DP_TRACE_VERBOSITY_HIGH 4 238 #define QDF_DP_TRACE_VERBOSITY_MEDIUM 3 239 #define QDF_DP_TRACE_VERBOSITY_LOW 2 240 #define QDF_DP_TRACE_VERBOSITY_ULTRA_LOW 1 241 #define QDF_DP_TRACE_VERBOSITY_BASE 0 242 243 /** 244 * enum QDF_DP_TRACE_ID - Generic ID to identify various events in data path 245 * @QDF_DP_TRACE_INVALID: invalid 246 * @QDF_DP_TRACE_DROP_PACKET_RECORD: record drop packet 247 * @QDF_DP_TRACE_EAPOL_PACKET_RECORD: record EAPOL packet 248 * @QDF_DP_TRACE_DHCP_PACKET_RECORD: record DHCP packet 249 * @QDF_DP_TRACE_ARP_PACKET_RECORD: record ARP packet 250 * @QDF_DP_TRACE_MGMT_PACKET_RECORD: record MGMT pacekt 251 * @QDF_DP_TRACE_EVENT_RECORD: record events 252 * @QDF_DP_TRACE_BASE_VERBOSITY: below this are part of base verbosity 253 * @QDF_DP_TRACE_ICMP_PACKET_RECORD: record ICMP packet 254 * @QDF_DP_TRACE_ICMPv6_PACKET_RECORD: record ICMPv6 packet 255 * @QDF_DP_TRACE_HDD_TX_TIMEOUT: HDD tx timeout 256 * @QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT: SOFTAP HDD tx timeout 257 * @QDF_DP_TRACE_TX_CREDIT_RECORD: credit update record 258 * @QDF_DP_TRACE_ULTRA_LOW_VERBOSITY: Below this is not logged for >4PPS 259 * @QDF_DP_TRACE_TX_PACKET_RECORD: record 32 bytes of tx pkt at any layer 260 * @QDF_DP_TRACE_RX_PACKET_RECORD: record 32 bytes of rx pkt at any layer 261 * @QDF_DP_TRACE_HDD_TX_PACKET_RECORD: record 32 bytes of tx pkt at HDD 262 * @QDF_DP_TRACE_HDD_RX_PACKET_RECORD: record 32 bytes of rx pkt at HDD 263 * @QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD: record data bytes of tx pkt at LI_DP 264 * @QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD: record data bytes of rx pkt at LI_DP 265 * @QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD: tx completion ptr record for 266 * lithium 267 * @QDF_DP_TRACE_FREE_PACKET_PTR_RECORD: tx completion ptr record 268 * @QDF_DP_TRACE_LOW_VERBOSITY: below this are part of low verbosity 269 * @QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD: HDD layer ptr record 270 * @QDF_DP_TRACE_TX_PACKET_PTR_RECORD: DP component Tx ptr record 271 * @QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD: Lithium DP layer ptr record 272 * @QDF_DP_TRACE_RX_PACKET_PTR_RECORD: DP component Rx ptr record 273 * @QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD: HDD RX record 274 * @QDF_DP_TRACE_CE_PACKET_PTR_RECORD: CE layer ptr record 275 * @QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD: CE fastpath ptr record 276 * @QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD: CE fastpath error record 277 * @QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD: HTT RX record 278 * @QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD: HTT RX offload record 279 * @QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD: Lithium DP RX record 280 * @QDF_DP_TRACE_MED_VERBOSITY: below this are part of med verbosity 281 * @QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD: tx queue ptr record 282 * @QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD: txrx packet ptr record 283 * @QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD: txrx fast path record 284 * @QDF_DP_TRACE_HTT_PACKET_PTR_RECORD: htt packet ptr record 285 * @QDF_DP_TRACE_HTC_PACKET_PTR_RECORD: htc packet ptr record 286 * @QDF_DP_TRACE_HIF_PACKET_PTR_RECORD: hif packet ptr record 287 * @QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD: txrx packet ptr record 288 * @QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD: 289 * record data bytes of rx null_queue pkt at LI_DP 290 * @QDF_DP_TRACE_HIGH_VERBOSITY: below this are part of high verbosity 291 * @QDF_DP_TRACE_MAX: Max enumeration 292 */ 293 294 enum QDF_DP_TRACE_ID { 295 QDF_DP_TRACE_INVALID, 296 QDF_DP_TRACE_DROP_PACKET_RECORD, 297 QDF_DP_TRACE_EAPOL_PACKET_RECORD, 298 QDF_DP_TRACE_DHCP_PACKET_RECORD, 299 QDF_DP_TRACE_ARP_PACKET_RECORD, 300 QDF_DP_TRACE_MGMT_PACKET_RECORD, 301 QDF_DP_TRACE_EVENT_RECORD, 302 QDF_DP_TRACE_BASE_VERBOSITY, 303 QDF_DP_TRACE_ICMP_PACKET_RECORD, 304 QDF_DP_TRACE_ICMPv6_PACKET_RECORD, 305 QDF_DP_TRACE_HDD_TX_TIMEOUT, 306 QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT, 307 QDF_DP_TRACE_TX_CREDIT_RECORD, 308 QDF_DP_TRACE_ULTRA_LOW_VERBOSITY, 309 QDF_DP_TRACE_TX_PACKET_RECORD, 310 QDF_DP_TRACE_RX_PACKET_RECORD, 311 QDF_DP_TRACE_HDD_TX_PACKET_RECORD, 312 QDF_DP_TRACE_HDD_RX_PACKET_RECORD, 313 QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD, 314 QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD, 315 QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD, 316 QDF_DP_TRACE_FREE_PACKET_PTR_RECORD, 317 QDF_DP_TRACE_LOW_VERBOSITY, 318 QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD, 319 QDF_DP_TRACE_TX_PACKET_PTR_RECORD, 320 QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD, 321 QDF_DP_TRACE_RX_PACKET_PTR_RECORD, 322 QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD, 323 QDF_DP_TRACE_CE_PACKET_PTR_RECORD, 324 QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD, 325 QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD, 326 QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD, 327 QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD, 328 QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD, 329 QDF_DP_TRACE_MED_VERBOSITY, 330 QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD, 331 QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD, 332 QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD, 333 QDF_DP_TRACE_HTT_PACKET_PTR_RECORD, 334 QDF_DP_TRACE_HTC_PACKET_PTR_RECORD, 335 QDF_DP_TRACE_HIF_PACKET_PTR_RECORD, 336 QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD, 337 QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD, 338 QDF_DP_TRACE_HIGH_VERBOSITY, 339 QDF_DP_TRACE_MAX 340 }; 341 342 /** 343 * enum qdf_proto_dir - direction 344 * @QDF_TX: TX direction 345 * @QDF_RX: RX direction 346 * @QDF_NA: not applicable 347 */ 348 enum qdf_proto_dir { 349 QDF_TX, 350 QDF_RX, 351 QDF_NA 352 }; 353 354 /** 355 * enum QDF_CREDIT_UPDATE_SOURCE - source of credit record 356 * @QDF_TX_SCHED: Tx scheduler 357 * @QDF_TX_COMP: TX completion 358 * @QDF_TX_CREDIT_UPDATE: credit update indication 359 * @QDF_HTT_ATTACH: HTT attach 360 * @QDF_TX_HTT_MSG: HTT TX message 361 */ 362 enum QDF_CREDIT_UPDATE_SOURCE { 363 QDF_TX_SCHED, 364 QDF_TX_COMP, 365 QDF_TX_CREDIT_UPDATE, 366 QDF_HTT_ATTACH, 367 QDF_TX_HTT_MSG 368 }; 369 370 /** 371 * enum QDF_CREDIT_OPERATION - operation on credit 372 * @QDF_CREDIT_INC: credit increment 373 * @QDF_CREDIT_DEC: credit decrement 374 * @QDF_CREDIT_ABS: Abosolute credit 375 * @QDF_OP_NA: Not applicable 376 */ 377 enum QDF_CREDIT_OPERATION { 378 QDF_CREDIT_INC, 379 QDF_CREDIT_DEC, 380 QDF_CREDIT_ABS, 381 QDF_OP_NA 382 }; 383 384 /** 385 * struct qdf_dp_trace_ptr_buf - pointer record buffer 386 * @cookie: cookie value 387 * @msdu_id: msdu_id 388 * @status: completion status 389 */ 390 struct qdf_dp_trace_ptr_buf { 391 uint64_t cookie; 392 uint16_t msdu_id; 393 uint16_t status; 394 }; 395 396 /** 397 * struct qdf_dp_trace_proto_cmn - common info in proto packet 398 * @vdev_id: vdev id 399 * @type: packet type 400 * @subtype: packet subtype 401 * @proto_priv_data: protocol private data 402 * can be stored in this. 403 * @mpdu_seq: 802.11 MPDU sequence number 404 */ 405 struct qdf_dp_trace_proto_cmn { 406 uint8_t vdev_id; 407 uint8_t type; 408 uint8_t subtype; 409 uint32_t proto_priv_data; 410 uint16_t mpdu_seq; 411 }; 412 413 /** 414 * struct qdf_dp_trace_proto_buf - proto packet buffer 415 * @sa: source address 416 * @da: destination address 417 * @dir: direction 418 * @cmn_info: common info 419 */ 420 struct qdf_dp_trace_proto_buf { 421 struct qdf_mac_addr sa; 422 struct qdf_mac_addr da; 423 uint8_t dir; 424 struct qdf_dp_trace_proto_cmn cmn_info; 425 }; 426 427 /** 428 * struct qdf_dp_trace_mgmt_buf - mgmt packet buffer 429 * @vdev_id: vdev id 430 * @type: packet type 431 * @subtype: packet subtype 432 */ 433 struct qdf_dp_trace_mgmt_buf { 434 uint8_t vdev_id; 435 uint8_t type; 436 uint8_t subtype; 437 }; 438 439 /** 440 * struct qdf_dp_trace_credit_record - tx credit record 441 * @source: credit record source 442 * @operation: credit operation 443 * @delta: delta of credit 444 * @total_credits: total credit 445 * @g0_credit: group 0 credit 446 * @g1_credit: group 1 credit 447 */ 448 struct qdf_dp_trace_credit_record { 449 enum QDF_CREDIT_UPDATE_SOURCE source; 450 enum QDF_CREDIT_OPERATION operation; 451 int delta; 452 int total_credits; 453 int g0_credit; 454 int g1_credit; 455 }; 456 457 /** 458 * struct qdf_dp_trace_event_buf - event buffer 459 * @vdev_id: vdev id 460 * @type: packet type 461 * @subtype: packet subtype 462 */ 463 struct qdf_dp_trace_event_buf { 464 uint8_t vdev_id; 465 uint8_t type; 466 uint8_t subtype; 467 }; 468 469 /** 470 * struct qdf_dp_trace_data_buf - nbuf data buffer 471 * @msdu_id: msdu id 472 */ 473 struct qdf_dp_trace_data_buf { 474 uint16_t msdu_id; 475 }; 476 477 /** 478 * struct qdf_dp_trace_record_s - Describes a record in DP trace 479 * @time: time when it got stored 480 * @code: Describes the particular event 481 * @data: buffer to store data 482 * @size: Length of the valid data stored in this record 483 * @pid: process id which stored the data in this record 484 * @pdev_id: pdev associated with the event 485 */ 486 struct qdf_dp_trace_record_s { 487 uint64_t time; 488 uint8_t code; 489 uint8_t data[QDF_DP_TRACE_RECORD_SIZE]; 490 uint8_t size; 491 uint32_t pid; 492 uint8_t pdev_id; 493 }; 494 495 /** 496 * struct s_qdf_dp_trace_data - Parameters to configure/control DP trace 497 * @head: Position of first record 498 * @tail: Position of last record 499 * @num: Current index 500 * @proto_bitmap: defines which protocol to be traced 501 * @no_of_record: defines every nth packet to be traced 502 * @num_records_to_dump: defines number of records to be dumped 503 * @dump_counter: counter to track number of records dumped 504 * @verbosity: defines verbosity level 505 * @ini_conf_verbosity: Configured verbosity from INI 506 * @enable: enable/disable DP trace 507 * @count: current packet number 508 * @live_mode_config: configuration as received during initialization 509 * @live_mode: current live mode, enabled or disabled, can be throttled based 510 * on throughput 511 * @curr_pos: 512 * @saved_tail: 513 * @force_live_mode: flag to enable live mode all the time for all packets. 514 * This can be set/unset from userspace and overrides other 515 * live mode flags. 516 * @dynamic_verbosity_modify: Dynamic user configured verbosity overrides all 517 * @print_pkt_cnt: count of number of packets printed in live mode 518 * @high_tput_thresh: thresh beyond which live mode is turned off 519 * @thresh_time_limit: max time, in terms of BW timer intervals to wait, 520 * for determining if high_tput_thresh has been crossed. ~1s 521 * @tx_count: tx counter 522 * @rx_count: rx counter 523 * @arp_req: stats for arp reqs 524 * @arp_resp: stats for arp resps 525 * @icmp_req: stats for icmp reqs 526 * @icmp_resp: stats for icmp resps 527 * @dhcp_disc: stats for dhcp discover msgs 528 * @dhcp_req: stats for dhcp req msgs 529 * @dhcp_off: stats for dhcp offer msgs 530 * @dhcp_ack: stats for dhcp ack msgs 531 * @dhcp_nack: stats for dhcp nack msgs 532 * @dhcp_others: stats for other dhcp pkts types 533 * @eapol_m1: stats for eapol m1 534 * @eapol_m2: stats for eapol m2 535 * @eapol_m3: stats for eapol m3 536 * @eapol_m4: stats for eapol m4 537 * @eapol_others: stats for other eapol pkt types 538 * @icmpv6_req: stats for icmpv6 reqs 539 * @icmpv6_resp: stats for icmpv6 resps 540 * @icmpv6_ns: stats for icmpv6 nss 541 * @icmpv6_na: stats for icmpv6 nas 542 * @icmpv6_rs: stats for icmpv6 rss 543 * @icmpv6_ra: stats for icmpv6 ras 544 * @proto_event_bitmap: defines which protocol to be diag logged. 545 * refer QDF_NBUF_PKT_TRAC_TYPE_DNS to QDF_NBUF_PKT_TRAC_TYPE_ARP 546 * for bitmap. 547 */ 548 struct s_qdf_dp_trace_data { 549 uint32_t head; 550 uint32_t tail; 551 uint32_t num; 552 uint32_t proto_bitmap; 553 uint8_t no_of_record; 554 uint16_t num_records_to_dump; 555 uint16_t dump_counter; 556 uint8_t verbosity; 557 uint8_t ini_conf_verbosity; 558 bool enable; 559 bool live_mode_config; 560 bool live_mode; 561 uint32_t curr_pos; 562 uint32_t saved_tail; 563 bool force_live_mode; 564 bool dynamic_verbosity_modify; 565 uint8_t print_pkt_cnt; 566 uint8_t high_tput_thresh; 567 uint16_t thresh_time_limit; 568 /* Stats */ 569 uint32_t tx_count; 570 uint32_t rx_count; 571 u16 arp_req; 572 u16 arp_resp; 573 u16 dhcp_disc; 574 u16 dhcp_req; 575 u16 dhcp_off; 576 u16 dhcp_ack; 577 u16 dhcp_nack; 578 u16 dhcp_others; 579 u16 eapol_m1; 580 u16 eapol_m2; 581 u16 eapol_m3; 582 u16 eapol_m4; 583 u16 eapol_others; 584 u16 icmp_req; 585 u16 icmp_resp; 586 u16 icmpv6_req; 587 u16 icmpv6_resp; 588 u16 icmpv6_ns; 589 u16 icmpv6_na; 590 u16 icmpv6_rs; 591 u16 icmpv6_ra; 592 uint32_t proto_event_bitmap; 593 }; 594 595 /** 596 * enum qdf_dpt_debugfs_state - state to control read to debugfs file 597 * @QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INVALID: invalid state 598 * @QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INIT: initial state 599 * @QDF_DPT_DEBUGFS_STATE_SHOW_IN_PROGRESS: read is in progress 600 * @QDF_DPT_DEBUGFS_STATE_SHOW_COMPLETE: read complete 601 */ 602 603 enum qdf_dpt_debugfs_state { 604 QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INVALID, 605 QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INIT, 606 QDF_DPT_DEBUGFS_STATE_SHOW_IN_PROGRESS, 607 QDF_DPT_DEBUGFS_STATE_SHOW_COMPLETE, 608 }; 609 610 #define QDF_WIFI_MODULE_PARAMS_FILE "wifi_module_param.ini" 611 612 typedef void (*tp_qdf_trace_cb)(void *p_mac, tp_qdf_trace_record, uint16_t); 613 typedef void (*tp_qdf_state_info_cb) (char **buf, uint16_t *size); 614 #ifdef WLAN_FEATURE_MEMDUMP_ENABLE 615 616 /** 617 * qdf_register_debugcb_init() - initializes debug callbacks 618 * to NULL 619 * 620 * Return: None 621 */ 622 void qdf_register_debugcb_init(void); 623 624 /** 625 * qdf_register_debug_callback() - stores callback handlers to print 626 * state information 627 * @module_id: module id of layer 628 * @qdf_state_infocb: callback to be registered 629 * 630 * This function is used to store callback handlers to print 631 * state information 632 * 633 * Return: None 634 */ 635 void qdf_register_debug_callback(QDF_MODULE_ID module_id, 636 tp_qdf_state_info_cb qdf_state_infocb); 637 638 /** 639 * qdf_state_info_dump_all() - it invokes callback of layer which registered 640 * its callback to print its state information. 641 * @buf: buffer pointer to be passed 642 * @size: size of buffer to be filled 643 * @driver_dump_size: actual size of buffer used 644 * 645 * Return: QDF_STATUS_SUCCESS on success 646 */ 647 QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size, 648 uint16_t *driver_dump_size); 649 #else /* WLAN_FEATURE_MEMDUMP_ENABLE */ qdf_register_debugcb_init(void)650 static inline void qdf_register_debugcb_init(void) 651 { 652 } 653 #endif /* WLAN_FEATURE_MEMDUMP_ENABLE */ 654 655 #ifdef TRACE_RECORD 656 /** 657 * qdf_trace_register() - registers the call back functions 658 * @module_id: enum value of module 659 * @qdf_trace_callback: call back functions to display the messages in 660 * particular format. 661 * 662 * Registers the call back functions to display the messages in particular 663 * format mentioned in these call back functions. This functions should be 664 * called by interested module in their init part as we will be ready to 665 * register as soon as modules are up. 666 * 667 * Return: None 668 */ 669 void qdf_trace_register(QDF_MODULE_ID module_id, 670 tp_qdf_trace_cb qdf_trace_callback); 671 672 /** 673 * qdf_trace_init() - initializes qdf trace structures and variables 674 * 675 * Called immediately after cds_preopen, so that we can start recording HDD 676 * events ASAP. 677 * 678 * Return: None 679 */ 680 void qdf_trace_init(void); 681 682 /** 683 * qdf_trace_deinit() - frees memory allocated dynamically 684 * 685 * Called from cds_deinit, so that we can free the memory and resets 686 * the variables 687 * 688 * Return: None 689 */ 690 void qdf_trace_deinit(void); 691 692 /** 693 * qdf_trace() - puts the messages in to ring-buffer 694 * @module: Enum of module, basically module id. 695 * @code: Code to be recorded 696 * @session: Session ID of the log 697 * @data: Actual message contents 698 * 699 * This function will be called from each module who wants record the messages 700 * in circular queue. Before calling this functions make sure you have 701 * registered your module with qdf through qdf_trace_register function. 702 * 703 * Return: None 704 */ 705 void qdf_trace(uint8_t module, uint16_t code, uint16_t session, uint32_t data); 706 707 /** 708 * qdf_trace_enable() - Enable MTRACE for specific modules 709 * @bitmask_of_module_id: Bitmask according to enum of the modules. 710 * 32[dec] = 0010 0000 [bin] <enum of HDD is 5> 711 * 64[dec] = 0100 0000 [bin] <enum of SME is 6> 712 * 128[dec] = 1000 0000 [bin] <enum of PE is 7> 713 * @enable: can be true or false true implies enabling MTRACE false implies 714 * disabling MTRACE. 715 * 716 * Enable MTRACE for specific modules whose bits are set in bitmask and enable 717 * is true. if enable is false it disables MTRACE for that module. set the 718 * bitmask according to enum value of the modules. 719 * This functions will be called when you issue ioctl as mentioned following 720 * [iwpriv wlan0 setdumplog <value> <enable>]. 721 * <value> - Decimal number, i.e. 64 decimal value shows only SME module, 722 * 128 decimal value shows only PE module, 192 decimal value shows PE and SME. 723 * 724 * Return: None 725 */ 726 void qdf_trace_enable(uint32_t bitmask_of_module_id, uint8_t enable); 727 728 /** 729 * qdf_trace_dump_all() - Dump data from ring buffer via call back functions 730 * registered with QDF 731 * @p_mac: Context of particular module 732 * @code: Reason code 733 * @session: Session id of log 734 * @count: Number of lines to dump starting from tail to head 735 * @bitmask_of_module: Bitmask according to enum of the modules. 736 * 737 * This function will be called up on issuing ioctl call as mentioned following 738 * [iwpriv wlan0 dumplog 0 0 <n> <bitmask_of_module>] 739 * 740 * <n> - number lines to dump starting from tail to head. 741 * 742 * <bitmask_of_module> - if anybody wants to know how many messages were 743 * recorded for particular module/s mentioned by setbit in bitmask from last 744 * <n> messages. It is optional, if you don't provide then it will dump 745 * everything from buffer. 746 * 747 * Return: None 748 */ 749 void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session, 750 uint32_t count, uint32_t bitmask_of_module); 751 752 /** 753 * qdf_trace_spin_lock_init() - initializes the lock variable before use 754 * 755 * This function will be called from cds_alloc_global_context, we will have lock 756 * available to use ASAP 757 * 758 * Return: None 759 */ 760 QDF_STATUS qdf_trace_spin_lock_init(void); 761 #else 762 #ifndef QDF_TRACE_PRINT_ENABLE 763 static inline qdf_trace_init(void)764 void qdf_trace_init(void) 765 { 766 } 767 768 static inline qdf_trace_deinit(void)769 void qdf_trace_deinit(void) 770 { 771 } 772 773 static inline qdf_trace_enable(uint32_t bitmask_of_module_id,uint8_t enable)774 void qdf_trace_enable(uint32_t bitmask_of_module_id, uint8_t enable) 775 { 776 } 777 778 static inline qdf_trace(uint8_t module,uint16_t code,uint16_t session,uint32_t data)779 void qdf_trace(uint8_t module, uint16_t code, uint16_t session, uint32_t data) 780 { 781 } 782 783 static inline qdf_trace_dump_all(void * p_mac,uint8_t code,uint8_t session,uint32_t count,uint32_t bitmask_of_module)784 void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session, 785 uint32_t count, uint32_t bitmask_of_module) 786 { 787 } 788 789 static inline qdf_trace_spin_lock_init(void)790 QDF_STATUS qdf_trace_spin_lock_init(void) 791 { 792 return QDF_STATUS_SUCCESS; 793 } 794 #endif 795 #endif 796 797 #ifdef WLAN_MAX_LOGS_PER_SEC 798 /** 799 * qdf_detected_excessive_logging() - Excessive logging detected 800 * 801 * Track logging count using a quasi-tumbling window. 802 * If the max logging count for a given window is exceeded, 803 * return true else fails. 804 * 805 * Return: true/false 806 */ 807 bool qdf_detected_excessive_logging(void); 808 809 /** 810 * qdf_rl_print_count_set() - set the ratelimiting print count 811 * @rl_print_count: ratelimiting print count 812 * 813 * Return: none 814 */ 815 void qdf_rl_print_count_set(uint32_t rl_print_count); 816 817 /** 818 * qdf_rl_print_time_set() - set the ratelimiting print time 819 * @rl_print_time: ratelimiting print time 820 * 821 * Return: none 822 */ 823 void qdf_rl_print_time_set(uint32_t rl_print_time); 824 825 /** 826 * qdf_rl_print_suppressed_log() - print the suppressed logs count 827 * 828 * Return: none 829 */ 830 void qdf_rl_print_suppressed_log(void); 831 832 /** 833 * qdf_rl_print_suppressed_inc() - increment the suppressed logs count 834 * 835 * Return: none 836 */ 837 void qdf_rl_print_suppressed_inc(void); 838 839 #else /* WLAN_MAX_LOGS_PER_SEC */ qdf_detected_excessive_logging(void)840 static inline bool qdf_detected_excessive_logging(void) 841 { 842 return false; 843 } qdf_rl_print_count_set(uint32_t rl_print_count)844 static inline void qdf_rl_print_count_set(uint32_t rl_print_count) {} qdf_rl_print_time_set(uint32_t rl_print_time)845 static inline void qdf_rl_print_time_set(uint32_t rl_print_time) {} qdf_rl_print_suppressed_log(void)846 static inline void qdf_rl_print_suppressed_log(void) {} qdf_rl_print_suppressed_inc(void)847 static inline void qdf_rl_print_suppressed_inc(void) {} 848 #endif /* WLAN_MAX_LOGS_PER_SEC */ 849 850 #ifdef ENABLE_MTRACE_LOG 851 /** 852 * qdf_mtrace_log() - Logs a message tracepoint to DIAG 853 * Infrastructure. 854 * @src_module: Enum of source module (basically module id) 855 * from where the message with message_id is posted. 856 * @dst_module: Enum of destination module (basically module id) 857 * to which the message with message_id is posted. 858 * @message_id: Id of the message to be posted 859 * @vdev_id: Vdev Id 860 * 861 * This function logs to the DIAG Infrastructure a tracepoint for a 862 * message being sent from a source module to a destination module 863 * with a specific ID for the benefit of a specific vdev. 864 * For non-vdev messages vdev_id will be NO_SESSION 865 * Return: None 866 */ 867 void qdf_mtrace_log(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module, 868 uint16_t message_id, uint8_t vdev_id); 869 #else 870 static inline qdf_mtrace_log(QDF_MODULE_ID src_module,QDF_MODULE_ID dst_module,uint16_t message_id,uint8_t vdev_id)871 void qdf_mtrace_log(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module, 872 uint16_t message_id, uint8_t vdev_id) 873 { 874 } 875 #endif 876 877 #ifdef TRACE_RECORD 878 /** 879 * qdf_mtrace() - puts the messages in to ring-buffer 880 * and logs a message tracepoint to DIAG Infrastructure. 881 * @src_module: Enum of source module (basically module id) 882 * from where the message with message_id is posted. 883 * @dst_module: Enum of destination module (basically module id) 884 * to which the message with message_id is posted. 885 * @message_id: Id of the message to be posted 886 * @vdev_id: Vdev Id 887 * @data: Actual message contents 888 * 889 * This function will be called from each module which wants to record the 890 * messages in circular queue. Before calling this function make sure you 891 * have registered your module with qdf through qdf_trace_register function. 892 * In addition of the recording the messages in circular queue this function 893 * will log the message tracepoint to the DIAG infrastructure. 894 * these logs will be later used by post processing script. 895 * 896 * Return: None 897 */ 898 void qdf_mtrace(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module, 899 uint16_t message_id, uint8_t vdev_id, uint32_t data); 900 #else 901 static inline qdf_mtrace(QDF_MODULE_ID src_module,QDF_MODULE_ID dst_module,uint16_t message_id,uint8_t vdev_id,uint32_t data)902 void qdf_mtrace(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module, 903 uint16_t message_id, uint8_t vdev_id, uint32_t data) 904 { 905 } 906 #endif 907 908 #ifdef CONFIG_DP_TRACE 909 /** 910 * qdf_dp_set_proto_bitmap() - set dp trace proto bitmap 911 * @val: unsigned bitmap to set 912 * 913 * Return: proto bitmap 914 */ 915 void qdf_dp_set_proto_bitmap(uint32_t val); 916 917 /** 918 * qdf_dp_trace_set_verbosity() - set verbosity value 919 * @val: Value to set 920 * 921 * Return: Null 922 */ 923 void qdf_dp_trace_set_verbosity(uint32_t val); 924 925 /** 926 * qdf_dp_set_no_of_record() - set dp trace no_of_record 927 * @val: unsigned no_of_record to set 928 * 929 * Return: null 930 */ 931 void qdf_dp_set_no_of_record(uint32_t val); 932 933 #define QDF_DP_TRACE_RECORD_INFO_LIVE (0x1) 934 #define QDF_DP_TRACE_RECORD_INFO_THROTTLED (0x1 << 1) 935 936 /** 937 * qdf_dp_trace_log_pkt() - log packet type enabled through iwpriv 938 * @vdev_id: vdev_id 939 * @skb: skb pointer 940 * @dir: direction 941 * @pdev_id: pdev_id 942 * @op_mode: Vdev Operation mode 943 * 944 * Return: true: some protocol was logged, false: no protocol was logged. 945 */ 946 bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb, 947 enum qdf_proto_dir dir, uint8_t pdev_id, 948 enum QDF_OPMODE op_mode); 949 950 /** 951 * qdf_dp_trace_init() - enables the DP trace 952 * @live_mode_config: live mode configuration 953 * @thresh: high throughput threshold for disabling live mode 954 * @time_limit: max time to wait before deciding if thresh is crossed 955 * @verbosity: dptrace verbosity level 956 * @proto_bitmap: bitmap to enable/disable specific protocols 957 * 958 * Called during driver load to init dptrace 959 * 960 * A brief note on the 'thresh' param - 961 * Total # of packets received in a bandwidth timer interval beyond which 962 * DP Trace logging for data packets (including ICMP) will be disabled. 963 * In memory logging will still continue for these packets. Other packets for 964 * which proto.bitmap is set will continue to be recorded in logs and in memory. 965 * 966 * Return: None 967 */ 968 void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, 969 uint16_t time_limit, uint8_t verbosity, 970 uint32_t proto_bitmap); 971 972 void qdf_dp_trace_deinit(void); 973 974 /** 975 * qdf_dp_trace_spin_lock_init() - initializes the lock variable before use 976 * This function will be called from cds_alloc_global_context, we will have lock 977 * available to use ASAP 978 * 979 * Return: None 980 */ 981 void qdf_dp_trace_spin_lock_init(void); 982 983 /** 984 * qdf_dp_trace_set_value() - Configure the value to control DP trace 985 * @proto_bitmap: defines the protocol to be tracked 986 * @no_of_records: defines the nth packet which is traced 987 * @verbosity: defines the verbosity level 988 * 989 * Return: None 990 */ 991 void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records, 992 uint8_t verbosity); 993 994 /** 995 * qdf_dp_trace_set_track() - Marks whether the packet needs to be traced 996 * @nbuf: defines the netbuf 997 * @dir: direction 998 * 999 * Return: None 1000 */ 1001 void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir); 1002 1003 /** 1004 * qdf_dp_trace() - Stores the data in buffer 1005 * @nbuf: defines the netbuf 1006 * @code: defines the event 1007 * @pdev_id: pdev_id 1008 * @data: defines the data to be stored 1009 * @size: defines the size of the data record 1010 * @dir: direction 1011 * 1012 * Return: None 1013 */ 1014 void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id, 1015 uint8_t *data, uint8_t size, enum qdf_proto_dir dir); 1016 1017 /** 1018 * qdf_dp_trace_dump_all() - Dump data from ring buffer via call back functions 1019 * registered with QDF 1020 * @count: Number of lines to dump starting from tail to head 1021 * @pdev_id: pdev_id 1022 * 1023 * Return: None 1024 */ 1025 void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id); 1026 1027 /** 1028 * qdf_dpt_get_curr_pos_debugfs() - get curr position to start read 1029 * @file: debugfs file to read 1030 * @state: state to control read to debugfs file 1031 * 1032 * Return: curr pos 1033 */ 1034 uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file, 1035 enum qdf_dpt_debugfs_state state); 1036 /** 1037 * qdf_dpt_dump_stats_debugfs() - dump DP Trace stats to debugfs file 1038 * @file: debugfs file to read 1039 * @curr_pos: curr position to start read 1040 * 1041 * Return: QDF_STATUS 1042 */ 1043 QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, 1044 uint32_t curr_pos); 1045 1046 /** 1047 * qdf_dpt_set_value_debugfs() - set value of DP Trace debugfs params 1048 * @proto_bitmap: defines which protocol to be traced 1049 * @no_of_record: defines every nth packet to be traced 1050 * @verbosity: defines verbosity level 1051 * @num_records_to_dump: defines number of records to be dumped 1052 * 1053 * Return: none 1054 */ 1055 void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, 1056 uint8_t verbosity, uint16_t num_records_to_dump); 1057 1058 1059 /** 1060 * qdf_dp_trace_dump_stats() - dump DP Trace stats 1061 * 1062 * Return: none 1063 */ 1064 void qdf_dp_trace_dump_stats(void); 1065 typedef void (*tp_qdf_dp_trace_cb)(struct qdf_dp_trace_record_s*, 1066 uint16_t, uint8_t, uint8_t info); 1067 /** 1068 * qdf_dp_display_record() - Displays a record in DP trace 1069 * @record: pointer to a record in DP trace 1070 * @index: record index 1071 * @pdev_id: pdev id for the mgmt pkt 1072 * @info: info used to display pkt (live mode, throttling) 1073 * 1074 * Return: None 1075 */ 1076 void qdf_dp_display_record(struct qdf_dp_trace_record_s *record, 1077 uint16_t index, uint8_t pdev_id, 1078 uint8_t info); 1079 1080 /** 1081 * qdf_dp_display_ptr_record() - display record 1082 * @record: dptrace record 1083 * @rec_index: index 1084 * @pdev_id: pdev id for the mgmt pkt 1085 * @info: info used to display pkt (live mode, throttling) 1086 * 1087 * Return: none 1088 */ 1089 void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record, 1090 uint16_t rec_index, uint8_t pdev_id, 1091 uint8_t info); 1092 1093 /** 1094 * qdf_dp_display_proto_pkt() - display proto packet 1095 * @record: dptrace record 1096 * @index: index 1097 * @pdev_id: pdev id for the mgmt pkt 1098 * @info: info used to display pkt (live mode, throttling) 1099 * 1100 * Return: none 1101 */ 1102 void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record, 1103 uint16_t index, uint8_t pdev_id, 1104 uint8_t info); 1105 /** 1106 * qdf_dp_display_data_pkt_record() - Displays a data packet in DP trace 1107 * @record: pointer to a record in DP trace 1108 * @rec_index: record index 1109 * @pdev_id: pdev id 1110 * @info: display info regarding record 1111 * 1112 * Return: None 1113 */ 1114 void 1115 qdf_dp_display_data_pkt_record(struct qdf_dp_trace_record_s *record, 1116 uint16_t rec_index, uint8_t pdev_id, 1117 uint8_t info); 1118 1119 /** 1120 * qdf_dp_get_status_from_htt() - Convert htt tx status to qdf dp status 1121 * @status: htt_tx_status which needs to be converted 1122 * 1123 * Return: the status that from qdf_dp_tx_rx_status 1124 */ 1125 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_htt(uint8_t status); 1126 1127 /** 1128 * qdf_dp_get_status_from_a_status() - Convert A_STATUS to qdf dp status 1129 * @status: A_STATUS which needs to be converted 1130 * 1131 * Return: the status that from qdf_dp_tx_rx_status 1132 */ 1133 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_a_status(uint8_t status); 1134 1135 /** 1136 * qdf_dp_trace_ptr() - record dptrace 1137 * @nbuf: network buffer 1138 * @code: dptrace code 1139 * @pdev_id: pdev_id 1140 * @data: data 1141 * @size: size of data 1142 * @msdu_id: msdu_id 1143 * @buf_arg_status: return status 1144 * @qdf_tx_status: qdf tx rx status 1145 * @op_mode: Vdev Operation mode 1146 * 1147 * Return: none 1148 */ 1149 void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, 1150 uint8_t pdev_id, uint8_t *data, uint8_t size, 1151 uint16_t msdu_id, uint16_t buf_arg_status, 1152 enum qdf_dp_tx_rx_status qdf_tx_status, 1153 enum QDF_OPMODE op_mode); 1154 1155 /** 1156 * qdf_dp_trace_throttle_live_mode() - Throttle DP Trace live mode 1157 * @high_bw_request: whether this is a high BW req or not 1158 * 1159 * The function tries to prevent excessive logging into the live buffer by 1160 * having an upper limit on number of packets that can be logged per second. 1161 * 1162 * The intention is to allow occasional pings and data packets and really low 1163 * throughput levels while suppressing bursts and higher throughput levels so 1164 * that we donot hog the live buffer. 1165 * 1166 * If the number of packets printed in a particular second exceeds the thresh, 1167 * disable printing in the next second. 1168 * 1169 * Return: None 1170 */ 1171 void qdf_dp_trace_throttle_live_mode(bool high_bw_request); 1172 1173 /** 1174 * qdf_dp_trace_apply_tput_policy() - Change verbosity based on the TPUT 1175 * @is_data_traffic: Is traffic more than low TPUT threashould 1176 * 1177 * Return: None 1178 */ 1179 void qdf_dp_trace_apply_tput_policy(bool is_data_traffic); 1180 1181 /** 1182 * qdf_dp_trace_data_pkt() - trace data packet 1183 * @nbuf: nbuf which needs to be traced 1184 * @pdev_id: pdev_id 1185 * @code: QDF_DP_TRACE_ID for the packet (TX or RX) 1186 * @msdu_id: tx desc id for the nbuf (Only applies to TX packets) 1187 * @dir: TX or RX packet direction 1188 * 1189 * Return: None 1190 */ 1191 void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id, 1192 enum QDF_DP_TRACE_ID code, uint16_t msdu_id, 1193 enum qdf_proto_dir dir); 1194 1195 /** 1196 * qdf_dp_get_proto_bitmap() - get dp trace proto bitmap 1197 * 1198 * Return: proto bitmap 1199 */ 1200 uint32_t qdf_dp_get_proto_bitmap(void); 1201 1202 uint8_t qdf_dp_get_verbosity(void); 1203 1204 /** 1205 * qdf_dp_get_no_of_record() - get dp trace no_of_record 1206 * 1207 * Return: number of records 1208 */ 1209 uint8_t qdf_dp_get_no_of_record(void); 1210 1211 /** 1212 * qdf_dp_trace_proto_pkt() - record proto packet 1213 * @code: dptrace code 1214 * @sa: source mac address 1215 * @da: destination mac address 1216 * @dir: direction 1217 * @pdev_id: pdev id 1218 * @print: to print this proto pkt or not 1219 * @cmn_info: common info for proto pkt 1220 * 1221 * Return: none 1222 */ 1223 void 1224 qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, 1225 uint8_t *sa, uint8_t *da, 1226 enum qdf_proto_dir dir, 1227 uint8_t pdev_id, bool print, 1228 struct qdf_dp_trace_proto_cmn *cmn_info); 1229 1230 /** 1231 * qdf_dp_trace_disable_live_mode() - disable live mode for dptrace 1232 * 1233 * Return: none 1234 */ 1235 void qdf_dp_trace_disable_live_mode(void); 1236 1237 /** 1238 * qdf_dp_trace_enable_live_mode() - enable live mode for dptrace 1239 * 1240 * Return: none 1241 */ 1242 void qdf_dp_trace_enable_live_mode(void); 1243 1244 /** 1245 * qdf_dp_trace_clear_buffer() - clear dp trace buffer 1246 * 1247 * Return: none 1248 */ 1249 void qdf_dp_trace_clear_buffer(void); 1250 1251 /** 1252 * qdf_dp_trace_mgmt_pkt() - record mgmt packet 1253 * @code: dptrace code 1254 * @vdev_id: vdev id 1255 * @pdev_id: pdev_id 1256 * @type: proto type 1257 * @subtype: proto subtype 1258 * 1259 * Return: none 1260 */ 1261 void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id, 1262 uint8_t pdev_id, enum qdf_proto_type type, 1263 enum qdf_proto_subtype subtype); 1264 1265 /** 1266 * qdf_dp_trace_credit_record() - record credit update 1267 * @source: source of record 1268 * @operation: credit operation 1269 * @delta: credit delta 1270 * @total_credits: total credit 1271 * @g0_credit: group 0 credit 1272 * @g1_credit: group 1 credit 1273 */ 1274 void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source, 1275 enum QDF_CREDIT_OPERATION operation, 1276 int delta, int total_credits, 1277 int g0_credit, int g1_credit); 1278 1279 /** 1280 * qdf_dp_display_mgmt_pkt() - display proto packet 1281 * @record: dptrace record 1282 * @index: index 1283 * @pdev_id: pdev id for the mgmt pkt 1284 * @info: info used to display pkt (live mode, throttling) 1285 * 1286 * Return: none 1287 */ 1288 void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record, 1289 uint16_t index, uint8_t pdev_id, uint8_t info); 1290 1291 /** 1292 * qdf_dp_display_credit_record() - display credit record 1293 * @record: dptrace record 1294 * @index: index 1295 * @pdev_id: pdev id 1296 * @info: metadeta info 1297 */ 1298 void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record, 1299 uint16_t index, uint8_t pdev_id, 1300 uint8_t info); 1301 1302 /** 1303 * qdf_dp_display_event_record() - display event records 1304 * @record: dptrace record 1305 * @index: index 1306 * @pdev_id: pdev id for the mgmt pkt 1307 * @info: info used to display pkt (live mode, throttling) 1308 * 1309 * Return: none 1310 */ 1311 void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record, 1312 uint16_t index, uint8_t pdev_id, uint8_t info); 1313 1314 /** 1315 * qdf_dp_trace_record_event() - record events 1316 * @code: dptrace code 1317 * @vdev_id: vdev id 1318 * @pdev_id: pdev_id 1319 * @type: proto type 1320 * @subtype: proto subtype 1321 * 1322 * Return: none 1323 */ 1324 void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id, 1325 uint8_t pdev_id, enum qdf_proto_type type, 1326 enum qdf_proto_subtype subtype); 1327 1328 /** 1329 * qdf_dp_set_proto_event_bitmap() - Set the protocol event bitmap 1330 * @value: proto event bitmap value. 1331 * 1332 * QDF_NBUF_PKT_TRAC_TYPE_DNS 0x01 1333 * QDF_NBUF_PKT_TRAC_TYPE_EAPOL 0x02 1334 * QDF_NBUF_PKT_TRAC_TYPE_DHCP 0x04 1335 * QDF_NBUF_PKT_TRAC_TYPE_ARP 0x10 1336 * 1337 * Return: none 1338 */ 1339 void qdf_dp_set_proto_event_bitmap(uint32_t value); 1340 1341 /** 1342 * qdf_dp_log_proto_pkt_info() - Send diag log event 1343 * @sa: source MAC address 1344 * @da: destination MAC address 1345 * @type: pkt type 1346 * @subtype: pkt subtype 1347 * @dir: tx or rx 1348 * @msdu_id: msdu id 1349 * @status: status 1350 * 1351 * Return: none 1352 */ 1353 void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type, 1354 uint8_t subtype, uint8_t dir, uint16_t msdu_id, 1355 uint8_t status); 1356 1357 /** 1358 * qdf_dp_track_noack_check() - Check if no ack count should be tracked for 1359 * the configured protocol packet types 1360 * @nbuf: nbuf 1361 * @subtype: subtype of packet to be tracked 1362 * 1363 * Return: none 1364 */ 1365 void qdf_dp_track_noack_check(qdf_nbuf_t nbuf, enum qdf_proto_subtype *subtype); 1366 #else 1367 static inline qdf_dp_trace_log_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id,enum QDF_OPMODE op_mode)1368 bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb, 1369 enum qdf_proto_dir dir, uint8_t pdev_id, 1370 enum QDF_OPMODE op_mode) 1371 { 1372 return false; 1373 } 1374 static inline qdf_dp_trace_init(bool live_mode_config,uint8_t thresh,uint16_t time_limit,uint8_t verbosity,uint32_t proto_bitmap)1375 void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, 1376 uint16_t time_limit, uint8_t verbosity, 1377 uint32_t proto_bitmap) 1378 { 1379 } 1380 1381 static inline qdf_dp_trace_deinit(void)1382 void qdf_dp_trace_deinit(void) 1383 { 1384 } 1385 1386 static inline qdf_dp_trace_set_track(qdf_nbuf_t nbuf,enum qdf_proto_dir dir)1387 void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir) 1388 { 1389 } 1390 static inline qdf_dp_trace_set_value(uint32_t proto_bitmap,uint8_t no_of_records,uint8_t verbosity)1391 void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records, 1392 uint8_t verbosity) 1393 { 1394 } 1395 1396 static inline qdf_dp_trace_dump_all(uint32_t count,uint8_t pdev_id)1397 void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id) 1398 { 1399 } 1400 1401 static inline qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,enum qdf_dpt_debugfs_state state)1402 uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file, 1403 enum qdf_dpt_debugfs_state state) 1404 { 1405 return 0; 1406 } 1407 1408 static inline qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,uint32_t curr_pos)1409 QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, 1410 uint32_t curr_pos) 1411 { 1412 return QDF_STATUS_SUCCESS; 1413 } 1414 1415 static inline qdf_dpt_set_value_debugfs(uint8_t proto_bitmap,uint8_t no_of_record,uint8_t verbosity,uint16_t num_records_to_dump)1416 void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, 1417 uint8_t verbosity, uint16_t num_records_to_dump) 1418 { 1419 } 1420 qdf_dp_trace_dump_stats(void)1421 static inline void qdf_dp_trace_dump_stats(void) 1422 { 1423 } 1424 1425 static inline qdf_dp_trace_disable_live_mode(void)1426 void qdf_dp_trace_disable_live_mode(void) 1427 { 1428 } 1429 1430 static inline qdf_dp_trace_enable_live_mode(void)1431 void qdf_dp_trace_enable_live_mode(void) 1432 { 1433 } 1434 1435 static inline qdf_dp_trace_throttle_live_mode(bool high_bw_request)1436 void qdf_dp_trace_throttle_live_mode(bool high_bw_request) 1437 { 1438 } 1439 1440 static inline qdf_dp_trace_clear_buffer(void)1441 void qdf_dp_trace_clear_buffer(void) 1442 { 1443 } 1444 1445 static inline qdf_dp_trace_apply_tput_policy(bool is_data_traffic)1446 void qdf_dp_trace_apply_tput_policy(bool is_data_traffic) 1447 { 1448 } 1449 1450 static inline qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf,uint8_t pdev_id,enum QDF_DP_TRACE_ID code,uint16_t msdu_id,enum qdf_proto_dir dir)1451 void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id, 1452 enum QDF_DP_TRACE_ID code, uint16_t msdu_id, 1453 enum qdf_proto_dir dir) 1454 { 1455 } 1456 1457 static inline qdf_dp_log_proto_pkt_info(uint8_t * sa,uint8_t * da,uint8_t type,uint8_t subtype,uint8_t dir,uint16_t msdu_id,uint8_t status)1458 void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type, 1459 uint8_t subtype, uint8_t dir, uint16_t msdu_id, 1460 uint8_t status) 1461 { 1462 } 1463 1464 static inline qdf_dp_track_noack_check(qdf_nbuf_t nbuf,enum qdf_proto_subtype * subtype)1465 void qdf_dp_track_noack_check(qdf_nbuf_t nbuf, enum qdf_proto_subtype *subtype) 1466 { 1467 } 1468 1469 static inline qdf_dp_get_status_from_htt(uint8_t status)1470 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_htt(uint8_t status) 1471 { 1472 return QDF_TX_RX_STATUS_OK; 1473 } 1474 1475 static inline qdf_dp_get_status_from_a_status(uint8_t status)1476 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_a_status(uint8_t status) 1477 { 1478 return QDF_TX_RX_STATUS_OK; 1479 } 1480 #endif 1481 1482 /** 1483 * qdf_trace_display() - Display trace 1484 * 1485 * Return: None 1486 */ 1487 void qdf_trace_display(void); 1488 1489 /** 1490 * qdf_snprintf() - wrapper function to snprintf 1491 * @str_buffer: string Buffer 1492 * @size: defines the size of the data record 1493 * @str_format: Format string in which the message to be logged. This format 1494 * string contains printf-like replacement parameters, which follow 1495 * this parameter in the variable argument list. 1496 * 1497 * Return: num of bytes written to buffer 1498 */ 1499 int __printf(3, 4) qdf_snprintf(char *str_buffer, unsigned int size, 1500 char *str_format, ...); 1501 1502 #define QDF_SNPRINTF qdf_snprintf 1503 1504 #ifdef TSOSEG_DEBUG 1505 qdf_tso_seg_dbg_bug(char * msg)1506 static inline void qdf_tso_seg_dbg_bug(char *msg) 1507 { 1508 qdf_print("%s", msg); 1509 QDF_BUG(0); 1510 }; 1511 1512 /** 1513 * qdf_tso_seg_dbg_init - initialize TSO segment debug structure 1514 * @tsoseg: structure to initialize 1515 * 1516 * TSO segment dbg structures are attached to qdf_tso_seg_elem_t 1517 * structures and are allocated only of TSOSEG_DEBUG is defined. 1518 * When allocated, at the time of the tso_seg_pool initialization, 1519 * which goes with tx_desc initialization (1:1), each structure holds 1520 * a number of (currently 16) history entries, basically describing 1521 * what operation has been performed on this particular tso_seg_elem. 1522 * This history buffer is a circular buffer and the current index is 1523 * held in an atomic variable called cur. It is incremented every 1524 * operation. Each of these operations are added with the function 1525 * qdf_tso_seg_dbg_record. 1526 * For each segment, this initialization function MUST be called PRIOR 1527 * TO any _dbg_record() function calls. 1528 * On free, qdf_tso_seg_elem structure is cleared (using qdf_tso_seg_dbg_zero) 1529 * which clears the tso_desc, BUT DOES NOT CLEAR THE HISTORY element. 1530 * 1531 * Return: 1532 * None 1533 */ 1534 static inline qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t * tsoseg)1535 void qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t *tsoseg) 1536 { 1537 tsoseg->dbg.txdesc = NULL; 1538 qdf_atomic_init(&tsoseg->dbg.cur); /* history empty */ 1539 } 1540 1541 /** 1542 * qdf_tso_seg_dbg_record - add a history entry to TSO debug structure 1543 * @tsoseg: structure to initialize 1544 * @id: operation ID (identifies the caller) 1545 * 1546 * Adds a history entry to the history circular buffer. Each entry 1547 * contains an operation id (caller, as currently each ID is used only 1548 * once in the source, so it directly identifies the src line that invoked 1549 * the recording. 1550 * 1551 * qdf_tso_seg_dbg_record CAN ONLY BE CALLED AFTER the entry is initialized 1552 * by qdf_tso_seg_dbg_init. 1553 * 1554 * The entry to be added is written at the location pointed by the atomic 1555 * variable called cur. Cur is an ever increasing atomic variable. It is 1556 * masked so that only the lower 4 bits are used (16 history entries). 1557 * 1558 * Return: 1559 * int: the entry this record was recorded at 1560 */ 1561 static inline qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t * tsoseg,short id)1562 int qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t *tsoseg, short id) 1563 { 1564 int rc = -1; 1565 unsigned int c; 1566 1567 qdf_assert(tsoseg); 1568 1569 if (id == TSOSEG_LOC_ALLOC) { 1570 c = qdf_atomic_read(&tsoseg->dbg.cur); 1571 /* dont crash on the very first alloc on the segment */ 1572 c &= 0x0f; 1573 /* allow only INIT and FREE ops before ALLOC */ 1574 if (tsoseg->dbg.h[c].id >= id) 1575 qdf_tso_seg_dbg_bug("Rogue TSO seg alloc"); 1576 } 1577 c = qdf_atomic_inc_return(&tsoseg->dbg.cur); 1578 1579 c &= 0x0f; 1580 tsoseg->dbg.h[c].ts = qdf_get_log_timestamp(); 1581 tsoseg->dbg.h[c].id = id; 1582 rc = c; 1583 1584 return rc; 1585 }; 1586 1587 static inline void qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t * tsoseg,void * owner)1588 qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t *tsoseg, void *owner) 1589 { 1590 if (tsoseg) 1591 tsoseg->dbg.txdesc = owner; 1592 }; 1593 1594 static inline void qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t * tsoseg)1595 qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t *tsoseg) 1596 { 1597 memset(tsoseg, 0, offsetof(struct qdf_tso_seg_elem_t, dbg)); 1598 return; 1599 }; 1600 1601 #else 1602 static inline qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t * tsoseg)1603 void qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t *tsoseg) 1604 { 1605 }; 1606 static inline qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t * tsoseg,short id)1607 int qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t *tsoseg, short id) 1608 { 1609 return 0; 1610 }; qdf_tso_seg_dbg_bug(char * msg)1611 static inline void qdf_tso_seg_dbg_bug(char *msg) 1612 { 1613 }; 1614 static inline void qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t * tsoseg,void * owner)1615 qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t *tsoseg, void *owner) 1616 { 1617 }; 1618 static inline int qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t * tsoseg)1619 qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t *tsoseg) 1620 { 1621 memset(tsoseg, 0, sizeof(struct qdf_tso_seg_elem_t)); 1622 return 0; 1623 }; 1624 1625 #endif /* TSOSEG_DEBUG */ 1626 1627 /** 1628 * qdf_trace_hex_dump() - externally called hex dump function 1629 * @module: Module identifier a member of the QDF_MODULE_ID enumeration that 1630 * identifies the module issuing the trace message. 1631 * @level: Trace level a member of the QDF_TRACE_LEVEL enumeration indicating 1632 * the severity of the condition causing the trace message to be 1633 * issued. More severe conditions are more likely to be logged. 1634 * @data: The base address of the buffer to be logged. 1635 * @buf_len: The size of the buffer to be logged. 1636 * 1637 * Checks the level of severity and accordingly prints the trace messages 1638 * 1639 * Return: None 1640 */ 1641 void qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level, 1642 void *data, int buf_len); 1643 1644 /** 1645 * qdf_trace_hex_ascii_dump() - externally called hex and ascii dump function 1646 * @module: Module identifier a member of the QDF_MODULE_ID enumeration that 1647 * identifies the module issuing the trace message. 1648 * @level: Trace level a member of the QDF_TRACE_LEVEL enumeration indicating 1649 * the severity of the condition causing the trace message to be 1650 * issued. More severe conditions are more likely to be logged. 1651 * @data: The base address of the buffer to be logged. 1652 * @buf_len: The size of the buffer to be logged. 1653 * 1654 * Checks the level of severity and accordingly prints the trace messages 1655 * 1656 * Return: None 1657 */ 1658 void qdf_trace_hex_ascii_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level, 1659 void *data, int buf_len); 1660 1661 #define ERROR_CODE -1 1662 #define QDF_MAX_NAME_SIZE 32 1663 #define MAX_PRINT_CONFIG_SUPPORTED 32 1664 1665 #define MAX_SUPPORTED_CATEGORY QDF_MODULE_ID_MAX 1666 1667 /** 1668 * qdf_set_pidx() - Sets the global qdf_pidx. 1669 * @pidx: Index of print control object assigned to the module 1670 * 1671 */ 1672 void qdf_set_pidx(int pidx); 1673 1674 /** 1675 * qdf_get_pidx() - Returns the global qdf_pidx. 1676 * 1677 * Return: Current qdf print index. 1678 */ 1679 int qdf_get_pidx(void); 1680 /* 1681 * Shared print control index 1682 * for converged debug framework 1683 */ 1684 1685 #define QDF_PRINT_IDX_SHARED -1 1686 1687 /** 1688 * QDF_PRINT_INFO() - Generic wrapper API for logging 1689 * @idx: Index of print control object 1690 * @module: Module identifier. A member of QDF_MODULE_ID enumeration that 1691 * identifies the module issuing the trace message 1692 * @level: Trace level. A member of QDF_TRACE_LEVEL enumeration indicating 1693 * the severity of the condition causing the trace message to be 1694 * issued. 1695 * @str_format: Format string that contains the message to be logged. 1696 * 1697 * 1698 * This wrapper will be used for any generic logging messages. Wrapper will 1699 * compile a call to converged QDF trace message API. 1700 * 1701 * Return: Nothing 1702 * 1703 */ 1704 void QDF_PRINT_INFO(unsigned int idx, QDF_MODULE_ID module, 1705 QDF_TRACE_LEVEL level, 1706 char *str_format, ...); 1707 1708 /** 1709 * struct category_info - Category information structure 1710 * @category_verbose_mask: Embeds information about category's verbose level 1711 */ 1712 struct category_info { 1713 uint16_t category_verbose_mask; 1714 }; 1715 1716 /** 1717 * struct category_name_info - Category name information structure 1718 * @category_name_str: Embeds information about category name 1719 */ 1720 struct category_name_info { 1721 unsigned char category_name_str[QDF_MAX_NAME_SIZE]; 1722 }; 1723 1724 /** 1725 * qdf_trace_msg_cmn() - Converged logging API 1726 * @idx: Index of print control object assigned to the module 1727 * @category: Category identifier. A member of the QDF_MODULE_ID enumeration 1728 * that identifies the category issuing the trace message. 1729 * @verbose: Verbose level. A member of the QDF_TRACE_LEVEL enumeration 1730 * indicating the severity of the condition causing the trace 1731 * message to be issued. More severe conditions are more likely 1732 * to be logged. 1733 * @str_format: Format string. The message to be logged. This format string 1734 * contains printf-like replacement parameters, which follow this 1735 * parameter in the variable argument list. 1736 * @val: Variable argument list part of the log message 1737 * 1738 * Return: nothing 1739 * 1740 */ 1741 void qdf_trace_msg_cmn(unsigned int idx, 1742 QDF_MODULE_ID category, 1743 QDF_TRACE_LEVEL verbose, 1744 const char *str_format, 1745 va_list val); 1746 1747 /** 1748 * struct qdf_print_ctrl - QDF Print Control structure 1749 * Statically allocated objects of print control 1750 * structure are declared that will support maximum of 1751 * 32 print control objects. Any module that needs to 1752 * register to the print control framework needs to 1753 * obtain a print control object using 1754 * qdf_print_ctrl_register API. It will have to pass 1755 * pointer to category info structure, name and 1756 * custom print function to be used if required. 1757 * @name: Optional name for the control object 1758 * @cat_info: Array of category_info struct 1759 * @custom_print: Custom print handler 1760 * @custom_ctxt: Custom print context 1761 * @dbglvlmac_on: Flag to enable/disable MAC level filtering 1762 * @in_use: Boolean to indicate if control object is in use 1763 */ 1764 struct qdf_print_ctrl { 1765 char name[QDF_MAX_NAME_SIZE]; 1766 struct category_info cat_info[MAX_SUPPORTED_CATEGORY]; 1767 void (*custom_print)(void *ctxt, const char *fmt, va_list args); 1768 void *custom_ctxt; 1769 #ifdef DBG_LVL_MAC_FILTERING 1770 unsigned char dbglvlmac_on; 1771 #endif 1772 bool in_use; 1773 }; 1774 1775 /** 1776 * qdf_print_ctrl_register() - Allocate QDF print control object, assign 1777 * pointer to category info or print control 1778 * structure and return the index to the callee 1779 * @cinfo: Pointer to array of category info structure 1780 * @custom_print_handler: Pointer to custom print handler 1781 * @custom_ctx: Pointer to custom context 1782 * @pctrl_name: Pointer to print control object name 1783 * 1784 * Return: Index of qdf_print_ctrl structure 1785 * 1786 */ 1787 int qdf_print_ctrl_register(const struct category_info *cinfo, 1788 void *custom_print_handler, 1789 void *custom_ctx, 1790 const char *pctrl_name); 1791 1792 #ifdef QCA_WIFI_MODULE_PARAMS_FROM_INI 1793 /** 1794 * qdf_initialize_module_param_from_ini() - Update qdf module params 1795 * 1796 * Read the file which has wifi module params, parse and update 1797 * qdf module params. 1798 * 1799 * Return: void 1800 */ 1801 void qdf_initialize_module_param_from_ini(void); 1802 #else 1803 static inline qdf_initialize_module_param_from_ini(void)1804 void qdf_initialize_module_param_from_ini(void) 1805 { 1806 } 1807 #endif 1808 1809 /** 1810 * qdf_shared_print_ctrl_init() - Initialize the shared print ctrl obj with 1811 * all categories set to the default level 1812 * 1813 * Return: void 1814 * 1815 */ 1816 void qdf_shared_print_ctrl_init(void); 1817 1818 /** 1819 * qdf_print_setup() - Setup default values to all the print control objects 1820 * 1821 * Register new print control object for the callee 1822 * 1823 * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE 1824 * on failure 1825 */ 1826 QDF_STATUS qdf_print_setup(void); 1827 1828 /** 1829 * qdf_print_ctrl_cleanup() - Clean up a print control object 1830 * @idx: Index of print control object 1831 * 1832 * Cleanup the print control object for the callee 1833 * 1834 * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE on failure 1835 */ 1836 QDF_STATUS qdf_print_ctrl_cleanup(unsigned int idx); 1837 1838 /** 1839 * qdf_shared_print_ctrl_cleanup() - Clean up of the shared object 1840 * 1841 * Cleanup the shared print-ctrl-object 1842 * 1843 * Return: void 1844 */ 1845 void qdf_shared_print_ctrl_cleanup(void); 1846 1847 /** 1848 * qdf_print_set_category_verbose() - Enable/Disable category for a 1849 * print control object with 1850 * user provided verbose level 1851 * @idx: Index of the print control object assigned to callee 1852 * @category: Category information 1853 * @verbose: Verbose information 1854 * @is_set: Flag indicating if verbose level needs to be enabled or disabled 1855 * 1856 * Return: QDF_STATUS_SUCCESS for success and QDF_STATUS_E_FAILURE for failure 1857 */ 1858 QDF_STATUS qdf_print_set_category_verbose(unsigned int idx, 1859 QDF_MODULE_ID category, 1860 QDF_TRACE_LEVEL verbose, 1861 bool is_set); 1862 1863 /** 1864 * qdf_log_dump_at_kernel_level() - Enable/Disable printk call 1865 * @enable: Indicates whether printk is enabled in QDF_TRACE 1866 * 1867 * Return: void 1868 */ 1869 void qdf_log_dump_at_kernel_level(bool enable); 1870 1871 /** 1872 * qdf_logging_set_flush_timer() - Set the time period in which host logs 1873 * should be flushed out to user-space 1874 * @milliseconds: milliseconds after which the logs should be flushed out to 1875 * user-space 1876 * 1877 * Return: QDF_STATUS_SUCCESS for success and QDF_STATUS_E_FAILURE for failure 1878 */ 1879 int qdf_logging_set_flush_timer(uint32_t milliseconds); 1880 1881 /** 1882 * qdf_logging_flush_logs() - Flush out the logs to user-space one time 1883 * 1884 * Return: void 1885 */ 1886 void qdf_logging_flush_logs(void); 1887 1888 /** 1889 * qdf_print_get_category_verbose() - Get category verbose information for the 1890 * print control object 1891 * 1892 * @idx: Index of print control object 1893 * @category: Category information 1894 * 1895 * Return: Verbose value for the particular category 1896 */ 1897 QDF_TRACE_LEVEL qdf_print_get_category_verbose(unsigned int idx, 1898 QDF_MODULE_ID category); 1899 1900 /** 1901 * qdf_print_is_category_enabled() - Get category information for the 1902 * print control object 1903 * 1904 * @idx: Index of print control object 1905 * @category: Category information 1906 * 1907 * Return: Verbose enabled(true) or disabled(false) or invalid input (false) 1908 */ 1909 bool qdf_print_is_category_enabled(unsigned int idx, 1910 QDF_MODULE_ID category); 1911 1912 /** 1913 * qdf_print_is_verbose_enabled() - Get verbose information of a category for 1914 * the print control object 1915 * 1916 * @idx: Index of print control object 1917 * @category: Category information 1918 * @verbose: Verbose information 1919 * 1920 * Return: Verbose enabled(true) or disabled(false) or invalid input (false) 1921 */ 1922 bool qdf_print_is_verbose_enabled(unsigned int idx, 1923 QDF_MODULE_ID category, 1924 QDF_TRACE_LEVEL verbose); 1925 1926 /** 1927 * qdf_print_clean_node_flag() - Clean up node flag for print control object 1928 * 1929 * @idx: Index of print control object 1930 * 1931 * Return: None 1932 */ 1933 void qdf_print_clean_node_flag(unsigned int idx); 1934 1935 #ifdef DBG_LVL_MAC_FILTERING 1936 1937 /** 1938 * qdf_print_set_node_flag() - Set flag to enable MAC level filtering 1939 * 1940 * @idx: Index of print control object 1941 * @enable: Enable/Disable bit sent by callee 1942 * 1943 * Return: QDF_STATUS_SUCCESS on Success and QDF_STATUS_E_FAILURE on Failure 1944 */ 1945 QDF_STATUS qdf_print_set_node_flag(unsigned int idx, 1946 uint8_t enable); 1947 1948 /** 1949 * qdf_print_get_node_flag() - Get flag that controls MAC level filtering 1950 * 1951 * @idx: Index of print control object 1952 * 1953 * Return: Flag that indicates enable(1) or disable(0) or invalid(-1) 1954 */ 1955 bool qdf_print_get_node_flag(unsigned int idx); 1956 1957 #endif 1958 1959 #ifdef QCA_WIFI_MODULE_PARAMS_FROM_INI 1960 /** 1961 * qdf_module_param_handler() - Function to store module params 1962 * 1963 * @context: NULL, unused. 1964 * @key: Name of the module param 1965 * @value: Value of the module param 1966 * 1967 * Handler function to be called from qdf_ini_parse() 1968 * function when a valid parameter is found in a file. 1969 * 1970 * Return: QDF_STATUS_SUCCESS on Success 1971 */ 1972 QDF_STATUS qdf_module_param_handler(void *context, const char *key, 1973 const char *value); 1974 #else 1975 static inline qdf_module_param_handler(void * context,const char * key,const char * value)1976 QDF_STATUS qdf_module_param_handler(void *context, const char *key, 1977 const char *value) 1978 { 1979 return QDF_STATUS_SUCCESS; 1980 } 1981 #endif 1982 1983 /** 1984 * qdf_logging_init() - Initialize msg logging functionality 1985 * 1986 * Return: void 1987 */ 1988 void qdf_logging_init(void); 1989 1990 /** 1991 * qdf_logging_exit() - Cleanup msg logging functionality 1992 * 1993 * Return: void 1994 */ 1995 void qdf_logging_exit(void); 1996 1997 #define QDF_SYMBOL_LEN __QDF_SYMBOL_LEN 1998 1999 /** 2000 * qdf_sprint_symbol() - prints the name of a symbol into a string buffer 2001 * @buffer: the string buffer to print into 2002 * @addr: address of the symbol to lookup and print 2003 * 2004 * Return: number of characters printed 2005 */ 2006 int qdf_sprint_symbol(char *buffer, void *addr); 2007 2008 /** 2009 * qdf_minidump_init() - Initialize minidump functionality 2010 * 2011 * 2012 * Return: void 2013 */ 2014 static inline qdf_minidump_init(void)2015 void qdf_minidump_init(void) 2016 { 2017 __qdf_minidump_init(); 2018 } 2019 2020 /** 2021 * qdf_minidump_deinit() - De-initialize minidump functionality 2022 * 2023 * 2024 * Return: void 2025 */ 2026 static inline qdf_minidump_deinit(void)2027 void qdf_minidump_deinit(void) 2028 { 2029 __qdf_minidump_deinit(); 2030 } 2031 2032 /** 2033 * qdf_minidump_log() - Log memory address to be included in minidump 2034 * @start_addr: Start address of the memory to be dumped 2035 * @size: Size in bytes 2036 * @name: String to identify this entry 2037 */ 2038 static inline qdf_minidump_log(void * start_addr,const size_t size,const char * name)2039 void qdf_minidump_log(void *start_addr, 2040 const size_t size, const char *name) 2041 { 2042 __qdf_minidump_log(start_addr, size, name); 2043 } 2044 2045 /** 2046 * qdf_minidump_remove() - Remove memory address from minidump 2047 * @start_addr: Start address of the memory previously added 2048 * @size: Size in bytes 2049 * @name: String to identify this entry 2050 */ 2051 static inline qdf_minidump_remove(void * start_addr,const size_t size,const char * name)2052 void qdf_minidump_remove(void *start_addr, 2053 const size_t size, const char *name) 2054 { 2055 __qdf_minidump_remove(start_addr, size, name); 2056 } 2057 2058 #endif /* __QDF_TRACE_H */ 2059