summaryrefslogtreecommitdiff
path: root/utils/pktlog/include/pktlog_ac.h
blob: 9727b7efc18eea4b35b2b7db21231f98d54d444e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/*
 * Copyright (c) 2012-2018 The Linux Foundation. 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.
 */

#ifndef _PKTLOG_AC_H_
#define _PKTLOG_AC_H_

#ifndef REMOVE_PKT_LOG
#include "ol_if_athvar.h"
#include "osdep.h"
#include <wmi_unified.h>
#include <wmi_unified_api.h>
#include <wdi_event_api.h>
#include "hif.h"
#include <ol_defines.h>
#include <pktlog_ac_api.h>
#include <pktlog_ac_fmt.h>

#define NO_REG_FUNCS    4

/* Locking interface for pktlog */
#define PKTLOG_LOCK_INIT(_pl_info)      spin_lock_init(&(_pl_info)->log_lock)
#define PKTLOG_LOCK_DESTROY(_pl_info)
#define PKTLOG_LOCK(_pl_info)           spin_lock(&(_pl_info)->log_lock)
#define PKTLOG_UNLOCK(_pl_info)         spin_unlock(&(_pl_info)->log_lock)

#define PKTLOG_MODE_SYSTEM      1
#define PKTLOG_MODE_ADAPTER     2

/*
 * The proc entry starts with magic number and version field which will be
 * used by post processing scripts. These fields are not needed by applications
 * that do not use these scripts. This is skipped using the offset value.
 */
#define PKTLOG_READ_OFFSET    8

/* forward declaration for cdp_pdev */
struct cdp_pdev;

/* Opaque softc */
struct ol_ath_generic_softc_t;
typedef struct ol_ath_generic_softc_t *ol_ath_generic_softc_handle;
extern void pktlog_disable_adapter_logging(struct hif_opaque_softc *scn);
extern int pktlog_alloc_buf(struct hif_opaque_softc *scn);
extern void pktlog_release_buf(struct hif_opaque_softc *scn);

ssize_t pktlog_read_proc_entry(char *buf, size_t nbytes, loff_t *ppos,
		struct ath_pktlog_info *pl_info, bool *read_complete);
int pktlog_send_per_pkt_stats_to_user(void);
A_STATUS wdi_pktlog_unsubscribe(struct cdp_pdev *txrx_pdev, uint32_t log_state);

struct ol_pl_arch_dep_funcs {
	void (*pktlog_init)(struct hif_opaque_softc *scn);
	int (*pktlog_enable)(struct hif_opaque_softc *scn, int32_t log_state,
			     bool ini, uint8_t user,
			     uint32_t is_iwpriv_command);
	int (*pktlog_setsize)(struct hif_opaque_softc *scn, int32_t log_state);
	int (*pktlog_disable)(struct hif_opaque_softc *scn);
};

struct ol_pl_os_dep_funcs {
	int (*pktlog_attach)(struct hif_opaque_softc *scn);
	void (*pktlog_detach)(struct hif_opaque_softc *scn);

};

struct ath_pktlog_wmi_params {
	WMI_PKTLOG_EVENT pktlog_event;
	WMI_CMD_ID cmd_id;
	bool ini_triggered;
	uint8_t user_triggered;
};

extern struct ol_pl_arch_dep_funcs ol_pl_funcs;
extern struct ol_pl_os_dep_funcs *g_ol_pl_os_dep_funcs;

/* Pktlog handler to save the state of the pktlogs */
struct pktlog_dev_t {
	struct ol_pl_arch_dep_funcs *pl_funcs;
	struct ath_pktlog_info *pl_info;
	ol_ath_generic_softc_handle scn;
	char *name;
	bool tgt_pktlog_alloced;
	bool is_pktlog_cb_subscribed;
	bool mt_pktlog_enabled;
	uint32_t htc_err_cnt;
	uint8_t htc_endpoint;
	void *htc_pdev;
	bool vendor_cmd_send;
	uint8_t callback_type;
};

#define PKTLOG_SYSCTL_SIZE      14
#define PKTLOG_MAX_SEND_QUEUE_DEPTH 64

/*
 * Linux specific pktlog state information
 */
struct ath_pktlog_info_lnx {
	struct ath_pktlog_info info;
	struct ctl_table sysctls[PKTLOG_SYSCTL_SIZE];
	struct proc_dir_entry *proc_entry;
	struct ctl_table_header *sysctl_header;
};

#define PL_INFO_LNX(_pl_info)   ((struct ath_pktlog_info_lnx *)(_pl_info))

extern struct ol_pktlog_dev_t ol_pl_dev;

/*
 * WDI related data and functions
 * Callback function to the WDI events
 */
void pktlog_callback(void *pdev, enum WDI_EVENT event, void *log_data,
			u_int16_t peer_id, uint32_t status);

void pktlog_init(struct hif_opaque_softc *scn);
int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state,
		 bool, uint8_t, uint32_t);
int pktlog_setsize(struct hif_opaque_softc *scn, int32_t log_state);
int pktlog_clearbuff(struct hif_opaque_softc *scn, bool clear_buff);
int pktlog_disable(struct hif_opaque_softc *scn);
int pktlogmod_init(void *context);
void pktlogmod_exit(void *context);
int pktlog_htc_attach(void);
void pktlog_process_fw_msg(uint32_t *msg_word, uint32_t msg_len);
void lit_pktlog_callback(void *context, enum WDI_EVENT event, void *log_data,
	u_int16_t peer_id, uint32_t status);

#define ol_pktlog_attach(_scn)			\
	do {					\
		if (g_ol_pl_os_dep_funcs) {	\
			g_ol_pl_os_dep_funcs->pktlog_attach(_scn);	\
		}				\
	} while (0)

#define ol_pktlog_detach(_scn)			\
	do {					\
		if (g_ol_pl_os_dep_funcs) {	\
			g_ol_pl_os_dep_funcs->pktlog_detach(_scn);	\
		}				\
	} while (0)

#else                           /* REMOVE_PKT_LOG */
#define ol_pktlog_attach(_scn)  ({ (void)_scn; })
#define ol_pktlog_detach(_scn)  ({ (void)_scn; })
static inline void pktlog_init(struct hif_opaque_softc *scn)
{
	return;
}
static int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state,
			 bool ini, uint8_t user, uint32_t is_iwpriv_command)
{
	return 0;
}
static int pktlog_setsize(struct hif_opaque_softc *scn, int32_t log_state)
{
	return 0;
}
static int pktlog_clearbuff(struct hif_opaque_softc *scn, bool clear_buff)
{
	return 0;
}
static int pktlog_disable(struct hif_opaque_softc *scn)
{
	return 0;
}
static inline int pktlog_htc_attach(void)
{
	return 0;
}
static inline void pktlog_process_fw_msg(uint32_t *msg_word, uint32_t msg_len)
{ }
#endif /* REMOVE_PKT_LOG */
#endif /* _PKTLOG_AC_H_ */