blob: 6a51af53835913422ae8aae1a2492d5a13aef74e [file] [log] [blame]
/******************************************************************************
*
* Copyright(c) 2014 Intel Corporation. All rights reserved.
* Copyright(c) 2014 Intel Mobile Communications GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_IWL_DNT_CFG_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_IWL_DNT_CFG_H_
#include <linux/kthread.h>
#include <linux/sched.h>
#include "iwl-config.h"
#include "iwl-drv.h"
#include "iwl-op-mode.h"
#include "iwl-trans.h"
#define IWL_DNT_ARRAY_SIZE 128
#define BUS_TYPE_PCI "pci"
#define BUS_TYPE_SDIO "sdio"
#define GET_RX_PACKET_SIZE(pkt) \
((le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK) - sizeof(struct iwl_cmd_header))
#define MONITOR_INPUT_MODE_MASK 0x01
#define UCODE_MSGS_INPUT_MODE_MASK 0x02
/* DnT status */
enum {
IWL_DNT_STATUS_MON_CONFIGURED = BIT(0),
IWL_DNT_STATUS_UCODE_MSGS_CONFIGURED = BIT(1),
IWL_DNT_STATUS_DMA_BUFFER_ALLOCATED = BIT(2),
IWL_DNT_STATUS_FAILED_TO_ALLOCATE_DMA = BIT(3),
IWL_DNT_STATUS_FAILED_START_MONITOR = BIT(4),
IWL_DNT_STATUS_INVALID_MONITOR_CONF = BIT(5),
IWL_DNT_STATUS_FAILED_TO_ALLOCATE_DB = BIT(6),
IWL_DNT_STATUS_FW_CRASH = BIT(7),
};
/* input modes */
enum { MONITOR = BIT(0), UCODE_MESSAGES = BIT(1) };
/* output modes */
enum { NETLINK = BIT(0), DEBUGFS = BIT(1), FTRACE = BIT(2) };
/* monitor types */
enum {
NO_MONITOR = 0,
MIPI = BIT(0),
INTERFACE = BIT(1),
DMA = BIT(2),
MARBH_ADC = BIT(3),
MARBH_DBG = BIT(4),
SMEM = BIT(5)
};
/* monitor modes */
enum { NO_MON, DEBUG, SNIFFER, DBGC };
/* incoming mode */
enum { NO_IN, COLLECT, RETRIEVE };
/* outgoing mode */
enum { NO_OUT, PUSH, PULL };
/* crash data */
enum {
NONE = 0,
SRAM = BIT(0),
DBGM = BIT(1),
TX_FIFO = BIT(2),
RX_FIFO = BIT(3),
PERIPHERY = BIT(4)
};
struct dnt_collect_entry {
uint8_t* data;
uint32_t size;
};
/**
* @list_read_ptr: list read pointer
* @list_wr_ptr: list write pointer
* @waitq: waitqueue for new data
* @db_lock: lock for the list
*/
struct dnt_collect_db {
struct dnt_collect_entry collect_array[IWL_DNT_ARRAY_SIZE];
unsigned int read_ptr;
unsigned int wr_ptr;
wait_queue_head_t waitq;
spinlock_t db_lock; /*locks the array */
};
/**
* struct dnt_crash_data - holds pointers for crash data
* @sram: sram data pointer
* @dbgm: monitor data pointer
* @rx: rx fifo data pointer
* @tx: tx fifo data pointer
* @periph: periphery registers data pointer
*/
struct dnt_crash_data {
uint8_t* sram;
uint32_t sram_buf_size;
uint8_t* dbgm;
uint32_t dbgm_buf_size;
uint8_t* rx;
uint32_t rx_buf_size;
uint8_t* tx;
uint32_t tx_buf_size;
uint8_t* periph;
uint32_t periph_buf_size;
};
/**
* struct iwl_dnt_dispatch - the iwl Debug and Trace Dispatch
*
* @in_mode: The dispatch incoming data mode
* @out_mode: The dispatch outgoing data mode
* @dbgm_list: dbgm link list
* @um_list: uCodeMessages link list
*/
struct iwl_dnt_dispatch {
uint32_t mon_in_mode;
uint32_t mon_out_mode;
uint32_t mon_output;
uint32_t ucode_msgs_in_mode;
uint32_t ucode_msgs_out_mode;
uint32_t ucode_msgs_output;
uint32_t crash_out_mode;
struct dnt_collect_db* dbgm_db;
struct dnt_collect_db* um_db;
struct dnt_crash_data crash;
};
/**
* struct iwl_dnt - the iwl Debug and Trace
*
* @cfg: pointer to user configuration
* @dev: pointer to struct device for printing purposes
* @iwl_dnt_status: represents the DnT status
* @is_configuration_valid: indicates whether the persistent configuration
* is valid or not
* @cur_input_mask: current mode mask
* @cur_output_mask: current output mask
* @cur_mon_type: current monitor type
* @mon_buf_cpu_addr: DMA buffer CPU address
* @mon_dma_addr: DMA buffer address
* @mon_base_addr: monitor dma buffer start address
* @mon_end_addr: monitor dma buffer end address
* @mon_buf_size: monitor dma buffer size
* @cur_mon_mode: current monitor mode (DBGM/SNIFFER)
* @dispatch: a pointer to dispatch
*/
struct iwl_dnt {
struct device* dev;
const struct fw_img* image;
uint32_t iwl_dnt_status;
bool is_configuration_valid;
uint8_t cur_input_mask;
uint8_t cur_output_mask;
uint32_t cur_mon_type;
uint8_t* mon_buf_cpu_addr;
dma_addr_t mon_dma_addr;
uint64_t mon_base_addr;
uint64_t mon_end_addr;
uint32_t mon_buf_size;
uint32_t cur_mon_mode;
struct iwl_dnt_dispatch dispatch;
#ifdef CPTCFG_IWLWIFI_DEBUGFS
uint8_t debugfs_counter;
wait_queue_head_t debugfs_waitq;
struct dentry* debugfs_entry;
#endif
};
/**
* iwl_dnt_init - initialize iwl_dnt.
*
*/
void iwl_dnt_init(struct iwl_trans* trans, struct dentry* dbgfs_dir);
/**
* iwl_dnt_free - free iwl_dnt.
*
*/
void iwl_dnt_free(struct iwl_trans* trans);
/**
* iwl_dnt_configure - configures iwl_dnt.
*
*/
void iwl_dnt_configure(struct iwl_trans* trans, const struct fw_img* image);
/**
* iwl_dnt_start - starts monitor and set log level
*
*/
void iwl_dnt_start(struct iwl_trans* trans);
#endif // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_IWL_DNT_CFG_H_