blob: beaf75d41886cb937c092c29b1e5fc825759bda4 [file] [log] [blame]
Shalabh Jainb0037c02013-01-18 12:47:40 -08001/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
Dixon Petersond6a20a92012-09-27 15:58:50 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifdef CONFIG_DEBUG_FS
14
15#include <linux/slab.h>
16#include <linux/debugfs.h>
17#include "diagchar.h"
18#include "diagfwd.h"
Shalabh Jain737fca72012-11-14 21:53:43 -080019#include "diagfwd_bridge.h"
Shalabh Jainb0037c02013-01-18 12:47:40 -080020#include "diagfwd_hsic.h"
Ravi Aravamudhan46df7d22013-06-12 11:57:07 -070021#include "diagmem.h"
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -070022#include "diag_dci.h"
Dixon Petersond6a20a92012-09-27 15:58:50 -070023
24#define DEBUG_BUF_SIZE 4096
25static struct dentry *diag_dbgfs_dent;
26static int diag_dbgfs_table_index;
Dixon Petersonf90f3582013-01-26 18:14:17 -080027static int diag_dbgfs_finished;
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -070028static int diag_dbgfs_dci_data_index;
29static int diag_dbgfs_dci_finished;
Dixon Petersond6a20a92012-09-27 15:58:50 -070030
31static ssize_t diag_dbgfs_read_status(struct file *file, char __user *ubuf,
32 size_t count, loff_t *ppos)
33{
34 char *buf;
35 int ret;
36
37 buf = kzalloc(sizeof(char) * DEBUG_BUF_SIZE, GFP_KERNEL);
38 if (!buf) {
39 pr_err("diag: %s, Error allocating memory\n", __func__);
40 return -ENOMEM;
41 }
42
43 ret = scnprintf(buf, DEBUG_BUF_SIZE,
44 "modem ch: 0x%x\n"
45 "lpass ch: 0x%x\n"
46 "riva ch: 0x%x\n"
47 "dci ch: 0x%x\n"
48 "modem cntl_ch: 0x%x\n"
49 "lpass cntl_ch: 0x%x\n"
50 "riva cntl_ch: 0x%x\n"
Dixon Peterson3ff84ea2012-12-21 20:16:18 -080051 "modem cmd ch: 0x%x\n"
52 "dci cmd ch: 0x%x\n"
Dixon Petersond6a20a92012-09-27 15:58:50 -070053 "CPU Tools id: %d\n"
54 "Apps only: %d\n"
55 "Apps master: %d\n"
56 "Check Polling Response: %d\n"
57 "polling_reg_flag: %d\n"
58 "uses device tree: %d\n"
Dixon Peterson3ff84ea2012-12-21 20:16:18 -080059 "supports separate cmdrsp: %d\n"
60 "Modem separate cmdrsp: %d\n"
61 "LPASS separate cmdrsp: %d\n"
62 "RIVA separate cmdrsp: %d\n"
Dixon Peterson66fb11b2012-12-04 20:30:54 -080063 "Modem in_busy_1: %d\n"
64 "Modem in_busy_2: %d\n"
65 "LPASS in_busy_1: %d\n"
66 "LPASS in_busy_2: %d\n"
67 "RIVA in_busy_1: %d\n"
68 "RIVA in_busy_2: %d\n"
69 "DCI Modem in_busy_1: %d\n"
Dixon Peterson3ff84ea2012-12-21 20:16:18 -080070 "Modem CMD in_busy_1: %d\n"
71 "Modem CMD in_busy_2: %d\n"
72 "DCI CMD Modem in_busy_1: %d\n"
Dixon Peterson15a6ecb2013-06-25 12:36:33 -070073 "Modem supports STM: %d\n"
74 "LPASS supports STM: %d\n"
75 "RIVA supports STM: %d\n"
76 "Modem STM state: %d\n"
77 "LPASS STM state: %d\n"
78 "RIVA STM state: %d\n"
79 "APPS STM state: %d\n"
80 "Modem STM requested state: %d\n"
81 "LPASS STM requested state: %d\n"
82 "RIVA STM requested state: %d\n"
83 "APPS STM requested state: %d\n"
Dixon Peterson9ce39c62013-02-21 13:00:52 -080084 "supports apps hdlc encoding: %d\n"
85 "Modem hdlc encoding: %d\n"
86 "Lpass hdlc encoding: %d\n"
87 "RIVA hdlc encoding: %d\n"
88 "Modem CMD hdlc encoding: %d\n"
Dixon Petersond2309b42013-08-28 21:00:05 -070089 "Modem DATA in_buf_1_size: %d\n"
90 "Modem DATA in_buf_2_size: %d\n"
91 "ADSP DATA in_buf_1_size: %d\n"
92 "ADSP DATA in_buf_2_size: %d\n"
93 "RIVA DATA in_buf_1_size: %d\n"
94 "RIVA DATA in_buf_2_size: %d\n"
95 "Modem DATA in_buf_1_raw_size: %d\n"
96 "Modem DATA in_buf_2_raw_size: %d\n"
97 "ADSP DATA in_buf_1_raw_size: %d\n"
98 "ADSP DATA in_buf_2_raw_size: %d\n"
99 "RIVA DATA in_buf_1_raw_size: %d\n"
100 "RIVA DATA in_buf_2_raw_size: %d\n"
101 "Modem CMD in_buf_1_size: %d\n"
102 "Modem CMD in_buf_1_raw_size: %d\n"
103 "Modem CNTL in_buf_1_size: %d\n"
104 "ADSP CNTL in_buf_1_size: %d\n"
105 "RIVA CNTL in_buf_1_size: %d\n"
106 "Modem DCI in_buf_1_size: %d\n"
107 "Modem DCI CMD in_buf_1_size: %d\n"
Ravi Aravamudhan91391ce2013-10-01 17:09:50 -0700108 "Received Feature mask from Modem: %d\n"
109 "Received Feature mask from LPASS: %d\n"
110 "Received Feature mask from WCNSS: %d\n"
Ravi Aravamudhan6a2da562013-06-17 16:01:34 -0700111 "logging_mode: %d\n"
112 "real_time_mode: %d\n",
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800113 (unsigned int)driver->smd_data[MODEM_DATA].ch,
114 (unsigned int)driver->smd_data[LPASS_DATA].ch,
115 (unsigned int)driver->smd_data[WCNSS_DATA].ch,
116 (unsigned int)driver->smd_dci[MODEM_DATA].ch,
117 (unsigned int)driver->smd_cntl[MODEM_DATA].ch,
118 (unsigned int)driver->smd_cntl[LPASS_DATA].ch,
119 (unsigned int)driver->smd_cntl[WCNSS_DATA].ch,
Dixon Peterson3ff84ea2012-12-21 20:16:18 -0800120 (unsigned int)driver->smd_cmd[MODEM_DATA].ch,
121 (unsigned int)driver->smd_dci_cmd[MODEM_DATA].ch,
Dixon Petersond6a20a92012-09-27 15:58:50 -0700122 chk_config_get_id(),
123 chk_apps_only(),
124 chk_apps_master(),
125 chk_polling_response(),
126 driver->polling_reg_flag,
127 driver->use_device_tree,
Dixon Peterson3ff84ea2012-12-21 20:16:18 -0800128 driver->supports_separate_cmdrsp,
129 driver->separate_cmdrsp[MODEM_DATA],
130 driver->separate_cmdrsp[LPASS_DATA],
131 driver->separate_cmdrsp[WCNSS_DATA],
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800132 driver->smd_data[MODEM_DATA].in_busy_1,
133 driver->smd_data[MODEM_DATA].in_busy_2,
134 driver->smd_data[LPASS_DATA].in_busy_1,
135 driver->smd_data[LPASS_DATA].in_busy_2,
136 driver->smd_data[WCNSS_DATA].in_busy_1,
137 driver->smd_data[WCNSS_DATA].in_busy_2,
138 driver->smd_dci[MODEM_DATA].in_busy_1,
Dixon Peterson3ff84ea2012-12-21 20:16:18 -0800139 driver->smd_cmd[MODEM_DATA].in_busy_1,
140 driver->smd_cmd[MODEM_DATA].in_busy_2,
141 driver->smd_dci_cmd[MODEM_DATA].in_busy_1,
Dixon Peterson15a6ecb2013-06-25 12:36:33 -0700142 driver->peripheral_supports_stm[MODEM_DATA],
143 driver->peripheral_supports_stm[LPASS_DATA],
144 driver->peripheral_supports_stm[WCNSS_DATA],
145 driver->stm_state[MODEM_DATA],
146 driver->stm_state[LPASS_DATA],
147 driver->stm_state[WCNSS_DATA],
148 driver->stm_state[APPS_DATA],
149 driver->stm_state_requested[MODEM_DATA],
150 driver->stm_state_requested[LPASS_DATA],
151 driver->stm_state_requested[WCNSS_DATA],
152 driver->stm_state_requested[APPS_DATA],
Dixon Peterson9ce39c62013-02-21 13:00:52 -0800153 driver->supports_apps_hdlc_encoding,
154 driver->smd_data[MODEM_DATA].encode_hdlc,
155 driver->smd_data[LPASS_DATA].encode_hdlc,
156 driver->smd_data[WCNSS_DATA].encode_hdlc,
157 driver->smd_cmd[MODEM_DATA].encode_hdlc,
Dixon Petersond2309b42013-08-28 21:00:05 -0700158 (unsigned int)driver->smd_data[MODEM_DATA].buf_in_1_size,
159 (unsigned int)driver->smd_data[MODEM_DATA].buf_in_2_size,
160 (unsigned int)driver->smd_data[LPASS_DATA].buf_in_1_size,
161 (unsigned int)driver->smd_data[LPASS_DATA].buf_in_2_size,
162 (unsigned int)driver->smd_data[WCNSS_DATA].buf_in_1_size,
163 (unsigned int)driver->smd_data[WCNSS_DATA].buf_in_2_size,
164 (unsigned int)driver->smd_data[MODEM_DATA].buf_in_1_raw_size,
165 (unsigned int)driver->smd_data[MODEM_DATA].buf_in_2_raw_size,
166 (unsigned int)driver->smd_data[LPASS_DATA].buf_in_1_raw_size,
167 (unsigned int)driver->smd_data[LPASS_DATA].buf_in_2_raw_size,
168 (unsigned int)driver->smd_data[WCNSS_DATA].buf_in_1_raw_size,
169 (unsigned int)driver->smd_data[WCNSS_DATA].buf_in_2_raw_size,
170 (unsigned int)driver->smd_cmd[MODEM_DATA].buf_in_1_size,
171 (unsigned int)driver->smd_cmd[MODEM_DATA].buf_in_1_raw_size,
172 (unsigned int)driver->smd_cntl[MODEM_DATA].buf_in_1_size,
173 (unsigned int)driver->smd_cntl[LPASS_DATA].buf_in_1_size,
174 (unsigned int)driver->smd_cntl[WCNSS_DATA].buf_in_1_size,
175 (unsigned int)driver->smd_dci[MODEM_DATA].buf_in_1_size,
176 (unsigned int)driver->smd_dci_cmd[MODEM_DATA].buf_in_1_size,
Ravi Aravamudhan91391ce2013-10-01 17:09:50 -0700177 driver->rcvd_feature_mask[MODEM_DATA],
178 driver->rcvd_feature_mask[LPASS_DATA],
179 driver->rcvd_feature_mask[WCNSS_DATA],
Ravi Aravamudhan6a2da562013-06-17 16:01:34 -0700180 driver->logging_mode,
181 driver->real_time_mode);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700182
183#ifdef CONFIG_DIAG_OVER_USB
184 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE,
185 "usb_connected: %d\n",
186 driver->usb_connected);
187#endif
188 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
189
190 kfree(buf);
191 return ret;
192}
193
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700194static ssize_t diag_dbgfs_read_dcistats(struct file *file,
195 char __user *ubuf, size_t count, loff_t *ppos)
196{
197 char *buf = NULL;
198 int bytes_remaining, bytes_written = 0, bytes_in_buf = 0, i = 0;
199 struct diag_dci_data_info *temp_data = dci_data_smd;
200 int buf_size = (DEBUG_BUF_SIZE < count) ? DEBUG_BUF_SIZE : count;
201
202 if (diag_dbgfs_dci_finished) {
203 diag_dbgfs_dci_finished = 0;
204 return 0;
205 }
206
207 buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL);
208 if (ZERO_OR_NULL_PTR(buf)) {
209 pr_err("diag: %s, Error allocating memory\n", __func__);
210 return -ENOMEM;
211 }
212
213 bytes_remaining = buf_size;
214
215 if (diag_dbgfs_dci_data_index == 0) {
216 bytes_written =
217 scnprintf(buf, buf_size,
Ravi Aravamudhan6a2da562013-06-17 16:01:34 -0700218 "number of clients: %d\n"
219 "dci proc active: %d\n"
220 "dci real time vote: %d\n",
221 driver->num_dci_client,
222 (driver->proc_active_mask & DIAG_PROC_DCI) ? 1 : 0,
223 (driver->proc_rt_vote_mask & DIAG_PROC_DCI) ? 1 : 0);
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700224 bytes_in_buf += bytes_written;
225 bytes_remaining -= bytes_written;
226#ifdef CONFIG_DIAG_OVER_USB
227 bytes_written = scnprintf(buf+bytes_in_buf, bytes_remaining,
228 "usb_connected: %d\n",
229 driver->usb_connected);
230 bytes_in_buf += bytes_written;
231 bytes_remaining -= bytes_written;
232#endif
Ravi Aravamudhan37903fe2013-06-03 12:35:05 -0700233 if (driver->dci_device) {
234 bytes_written = scnprintf(buf+bytes_in_buf,
235 bytes_remaining,
236 "dci power active, relax: %lu, %lu\n",
237 driver->dci_device->power.wakeup->active_count,
238 driver->dci_device->power.wakeup->relax_count);
239 bytes_in_buf += bytes_written;
240 bytes_remaining -= bytes_written;
241 }
242 if (driver->dci_cmd_device) {
243 bytes_written = scnprintf(buf+bytes_in_buf,
244 bytes_remaining,
245 "dci cmd power active, relax: %lu, %lu\n",
246 driver->dci_cmd_device->power.wakeup->
247 active_count,
248 driver->dci_cmd_device->power.wakeup->
249 relax_count);
250 bytes_in_buf += bytes_written;
251 bytes_remaining -= bytes_written;
252 }
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700253 }
254 temp_data += diag_dbgfs_dci_data_index;
255 for (i = diag_dbgfs_dci_data_index; i < DIAG_DCI_DEBUG_CNT; i++) {
256 if (temp_data->iteration != 0) {
257 bytes_written = scnprintf(
258 buf + bytes_in_buf, bytes_remaining,
Ravi Aravamudhan67db95c2013-07-18 10:00:50 -0700259 "i %-10ld\t"
260 "s %-10d\t"
261 "c %-10d\t"
262 "t %-15s\n",
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700263 temp_data->iteration,
264 temp_data->data_size,
Ravi Aravamudhan67db95c2013-07-18 10:00:50 -0700265 temp_data->ch_type,
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700266 temp_data->time_stamp);
267 bytes_in_buf += bytes_written;
268 bytes_remaining -= bytes_written;
269 /* Check if there is room for another entry */
270 if (bytes_remaining < bytes_written)
271 break;
272 }
273 temp_data++;
274 }
275
276 diag_dbgfs_dci_data_index = (i >= DIAG_DCI_DEBUG_CNT) ? 0 : i + 1;
277 bytes_written = simple_read_from_buffer(ubuf, count, ppos, buf,
278 bytes_in_buf);
279 kfree(buf);
280 diag_dbgfs_dci_finished = 1;
281 return bytes_written;
282}
283
Dixon Petersond6a20a92012-09-27 15:58:50 -0700284static ssize_t diag_dbgfs_read_workpending(struct file *file,
285 char __user *ubuf, size_t count, loff_t *ppos)
286{
287 char *buf;
288 int ret;
289
290 buf = kzalloc(sizeof(char) * DEBUG_BUF_SIZE, GFP_KERNEL);
291 if (!buf) {
292 pr_err("diag: %s, Error allocating memory\n", __func__);
293 return -ENOMEM;
294 }
295
296 ret = scnprintf(buf, DEBUG_BUF_SIZE,
297 "Pending status for work_stucts:\n"
298 "diag_drain_work: %d\n"
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800299 "Modem data diag_read_smd_work: %d\n"
300 "LPASS data diag_read_smd_work: %d\n"
301 "RIVA data diag_read_smd_work: %d\n"
302 "Modem cntl diag_read_smd_work: %d\n"
303 "LPASS cntl diag_read_smd_work: %d\n"
304 "RIVA cntl diag_read_smd_work: %d\n"
305 "Modem dci diag_read_smd_work: %d\n"
306 "Modem data diag_notify_update_smd_work: %d\n"
307 "LPASS data diag_notify_update_smd_work: %d\n"
308 "RIVA data diag_notify_update_smd_work: %d\n"
309 "Modem cntl diag_notify_update_smd_work: %d\n"
310 "LPASS cntl diag_notify_update_smd_work: %d\n"
311 "RIVA cntl diag_notify_update_smd_work: %d\n"
312 "Modem dci diag_notify_update_smd_work: %d\n",
Dixon Petersond6a20a92012-09-27 15:58:50 -0700313 work_pending(&(driver->diag_drain_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800314 work_pending(&(driver->smd_data[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800315 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800316 work_pending(&(driver->smd_data[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800317 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800318 work_pending(&(driver->smd_data[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800319 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800320 work_pending(&(driver->smd_cntl[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800321 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800322 work_pending(&(driver->smd_cntl[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800323 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800324 work_pending(&(driver->smd_cntl[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800325 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800326 work_pending(&(driver->smd_dci[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800327 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800328 work_pending(&(driver->smd_data[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800329 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800330 work_pending(&(driver->smd_data[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800331 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800332 work_pending(&(driver->smd_data[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800333 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800334 work_pending(&(driver->smd_cntl[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800335 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800336 work_pending(&(driver->smd_cntl[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800337 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800338 work_pending(&(driver->smd_cntl[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800339 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800340 work_pending(&(driver->smd_dci[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800341 diag_notify_update_smd_work)));
Dixon Petersond6a20a92012-09-27 15:58:50 -0700342
343#ifdef CONFIG_DIAG_OVER_USB
344 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE,
345 "diag_proc_hdlc_work: %d\n"
346 "diag_read_work: %d\n",
347 work_pending(&(driver->diag_proc_hdlc_work)),
348 work_pending(&(driver->diag_read_work)));
349#endif
350 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
351
352 kfree(buf);
353 return ret;
354}
355
356static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf,
357 size_t count, loff_t *ppos)
358{
359 char *buf;
360 int ret = 0;
361 int i;
362 int bytes_remaining;
363 int bytes_in_buffer = 0;
364 int bytes_written;
365 int buf_size = (DEBUG_BUF_SIZE < count) ? DEBUG_BUF_SIZE : count;
366
367 if (diag_dbgfs_table_index >= diag_max_reg) {
368 /* Done. Reset to prepare for future requests */
369 diag_dbgfs_table_index = 0;
370 return 0;
371 }
372
373 buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL);
Ashay Jaiswalf7e265a2013-06-05 13:24:38 +0530374 if (ZERO_OR_NULL_PTR(buf)) {
Dixon Petersond6a20a92012-09-27 15:58:50 -0700375 pr_err("diag: %s, Error allocating memory\n", __func__);
376 return -ENOMEM;
377 }
378
379 bytes_remaining = buf_size;
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800380
381 if (diag_dbgfs_table_index == 0) {
382 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
383 "Client ids: Modem: %d, LPASS: %d, "
384 "WCNSS: %d, APPS: %d\n",
385 MODEM_DATA, LPASS_DATA, WCNSS_DATA, APPS_DATA);
386 bytes_in_buffer += bytes_written;
387 }
388
Dixon Petersond6a20a92012-09-27 15:58:50 -0700389 for (i = diag_dbgfs_table_index; i < diag_max_reg; i++) {
390 /* Do not process empty entries in the table */
391 if (driver->table[i].process_id == 0)
392 continue;
393
394 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
395 "i: %3d, cmd_code: %4x, subsys_id: %4x, "
396 "client: %2d, cmd_code_lo: %4x, "
Ravi Aravamudhan8081a132013-08-02 12:19:28 -0700397 "cmd_code_hi: %4x, process_id: %5d %s\n",
Dixon Petersond6a20a92012-09-27 15:58:50 -0700398 i,
399 driver->table[i].cmd_code,
400 driver->table[i].subsys_id,
401 driver->table[i].client_id,
402 driver->table[i].cmd_code_lo,
403 driver->table[i].cmd_code_hi,
Ravi Aravamudhan8081a132013-08-02 12:19:28 -0700404 driver->table[i].process_id,
405 (diag_find_polling_reg(i) ? "<- Polling cmd reg" : ""));
Dixon Petersond6a20a92012-09-27 15:58:50 -0700406
407 bytes_in_buffer += bytes_written;
408
409 /* Check if there is room to add another table entry */
410 bytes_remaining = buf_size - bytes_in_buffer;
Ravi Aravamudhan8081a132013-08-02 12:19:28 -0700411
Dixon Petersond6a20a92012-09-27 15:58:50 -0700412 if (bytes_remaining < bytes_written)
413 break;
414 }
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800415 diag_dbgfs_table_index = i+1;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700416
417 *ppos = 0;
418 ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer);
419
420 kfree(buf);
421 return ret;
422}
423
Shalabh Jain737fca72012-11-14 21:53:43 -0800424#ifdef CONFIG_DIAGFWD_BRIDGE_CODE
Ravi Aravamudhan46df7d22013-06-12 11:57:07 -0700425static ssize_t diag_dbgfs_read_mempool(struct file *file, char __user *ubuf,
426 size_t count, loff_t *ppos)
427{
428 char *buf = NULL;
429 int ret = 0, i = 0;
430
431 buf = kzalloc(sizeof(char) * DEBUG_BUF_SIZE, GFP_KERNEL);
432 if (ZERO_OR_NULL_PTR(buf)) {
433 pr_err("diag: %s, Error allocating memory\n", __func__);
434 return -ENOMEM;
435 }
436
437 ret = scnprintf(buf, DEBUG_BUF_SIZE,
438 "POOL_TYPE_COPY: [0x%p : 0x%p] count = %d\n"
439 "POOL_TYPE_HDLC: [0x%p : 0x%p] count = %d\n"
440 "POOL_TYPE_USER: [0x%p : 0x%p] count = %d\n"
441 "POOL_TYPE_WRITE_STRUCT: [0x%p : 0x%p] count = %d\n",
442 driver->diagpool,
443 diag_pools_array[POOL_COPY_IDX],
444 driver->count,
445 driver->diag_hdlc_pool,
446 diag_pools_array[POOL_HDLC_IDX],
447 driver->count_hdlc_pool,
448 driver->diag_user_pool,
449 diag_pools_array[POOL_USER_IDX],
450 driver->count_user_pool,
451 driver->diag_write_struct_pool,
452 diag_pools_array[POOL_WRITE_STRUCT_IDX],
453 driver->count_write_struct_pool);
454
455 for (i = 0; i < MAX_HSIC_CH; i++) {
456 if (!diag_hsic[i].hsic_inited)
457 continue;
458 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE-ret,
459 "POOL_TYPE_HSIC_%d: [0x%p : 0x%p] count = %d\n",
460 i+1,
461 diag_hsic[i].diag_hsic_pool,
462 diag_pools_array[POOL_HSIC_IDX + i],
463 diag_hsic[i].count_hsic_pool);
464 }
465
466 for (i = 0; i < MAX_HSIC_CH; i++) {
467 if (!diag_hsic[i].hsic_inited)
468 continue;
469 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE-ret,
470 "POOL_TYPE_HSIC_%d_WRITE: [0x%p : 0x%p] count = %d\n",
471 i+1,
472 diag_hsic[i].diag_hsic_write_pool,
473 diag_pools_array[POOL_HSIC_WRITE_IDX + i],
474 diag_hsic[i].count_hsic_write_pool);
475 }
476
477 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
478
479 kfree(buf);
480 return ret;
481}
482#else
483static ssize_t diag_dbgfs_read_mempool(struct file *file, char __user *ubuf,
484 size_t count, loff_t *ppos)
485{
486 char *buf = NULL;
487 int ret = 0;
488
489 buf = kzalloc(sizeof(char) * DEBUG_BUF_SIZE, GFP_KERNEL);
490 if (ZERO_OR_NULL_PTR(buf)) {
491 pr_err("diag: %s, Error allocating memory\n", __func__);
492 return -ENOMEM;
493 }
494
495 ret = scnprintf(buf, DEBUG_BUF_SIZE,
496 "POOL_TYPE_COPY: [0x%p : 0x%p] count = %d\n"
497 "POOL_TYPE_HDLC: [0x%p : 0x%p] count = %d\n"
498 "POOL_TYPE_USER: [0x%p : 0x%p] count = %d\n"
499 "POOL_TYPE_WRITE_STRUCT: [0x%p : 0x%p] count = %d\n",
500 driver->diagpool,
501 diag_pools_array[POOL_COPY_IDX],
502 driver->count,
503 driver->diag_hdlc_pool,
504 diag_pools_array[POOL_HDLC_IDX],
505 driver->count_hdlc_pool,
506 driver->diag_user_pool,
507 diag_pools_array[POOL_USER_IDX],
508 driver->count_user_pool,
509 driver->diag_write_struct_pool,
510 diag_pools_array[POOL_WRITE_STRUCT_IDX],
511 driver->count_write_struct_pool);
512
513 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
514
515 kfree(buf);
516 return ret;
517}
518#endif
519
520#ifdef CONFIG_DIAGFWD_BRIDGE_CODE
Shalabh Jain737fca72012-11-14 21:53:43 -0800521static ssize_t diag_dbgfs_read_bridge(struct file *file, char __user *ubuf,
Dixon Petersond6a20a92012-09-27 15:58:50 -0700522 size_t count, loff_t *ppos)
523{
524 char *buf;
525 int ret;
Dixon Petersonf90f3582013-01-26 18:14:17 -0800526 int i;
527 int bytes_remaining;
528 int bytes_in_buffer = 0;
529 int bytes_written;
530 int buf_size = (DEBUG_BUF_SIZE < count) ? DEBUG_BUF_SIZE : count;
531 int bytes_hsic_inited = 45;
532 int bytes_hsic_not_inited = 410;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700533
Dixon Petersonf90f3582013-01-26 18:14:17 -0800534 if (diag_dbgfs_finished) {
535 diag_dbgfs_finished = 0;
536 return 0;
537 }
538
539 buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL);
Ashay Jaiswalf7e265a2013-06-05 13:24:38 +0530540 if (ZERO_OR_NULL_PTR(buf)) {
Dixon Petersond6a20a92012-09-27 15:58:50 -0700541 pr_err("diag: %s, Error allocating memory\n", __func__);
542 return -ENOMEM;
543 }
544
Dixon Petersonf90f3582013-01-26 18:14:17 -0800545 bytes_remaining = buf_size;
546
547 /* Only one smux for now */
548 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
549 "Values for SMUX instance: 0\n"
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800550 "smux ch: %d\n"
551 "smux enabled %d\n"
552 "smux in busy %d\n"
Dixon Petersonf90f3582013-01-26 18:14:17 -0800553 "smux connected %d\n\n",
Shalabh Jain737fca72012-11-14 21:53:43 -0800554 driver->lcid,
555 driver->diag_smux_enabled,
556 driver->in_busy_smux,
557 driver->smux_connected);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700558
Dixon Petersonf90f3582013-01-26 18:14:17 -0800559 bytes_in_buffer += bytes_written;
560 bytes_remaining = buf_size - bytes_in_buffer;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700561
Dixon Petersonf90f3582013-01-26 18:14:17 -0800562 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
563 "HSIC diag_disconnect_work: %d\n",
564 work_pending(&(driver->diag_disconnect_work)));
565
566 bytes_in_buffer += bytes_written;
567 bytes_remaining = buf_size - bytes_in_buffer;
568
569 for (i = 0; i < MAX_HSIC_CH; i++) {
570 if (diag_hsic[i].hsic_inited) {
571 /* Check if there is room to add another HSIC entry */
572 if (bytes_remaining < bytes_hsic_inited)
573 break;
574 bytes_written = scnprintf(buf+bytes_in_buffer,
575 bytes_remaining,
576 "Values for HSIC Instance: %d\n"
577 "hsic ch: %d\n"
578 "hsic_inited: %d\n"
579 "hsic enabled: %d\n"
580 "hsic_opened: %d\n"
581 "hsic_suspend: %d\n"
582 "in_busy_hsic_read_on_device: %d\n"
583 "in_busy_hsic_write: %d\n"
584 "count_hsic_pool: %d\n"
585 "count_hsic_write_pool: %d\n"
586 "diag_hsic_pool: %x\n"
587 "diag_hsic_write_pool: %x\n"
588 "HSIC write_len: %d\n"
589 "num_hsic_buf_tbl_entries: %d\n"
590 "HSIC usb_connected: %d\n"
591 "HSIC diag_read_work: %d\n"
592 "diag_read_hsic_work: %d\n"
593 "diag_usb_read_complete_work: %d\n\n",
594 i,
595 diag_hsic[i].hsic_ch,
596 diag_hsic[i].hsic_inited,
597 diag_hsic[i].hsic_device_enabled,
598 diag_hsic[i].hsic_device_opened,
599 diag_hsic[i].hsic_suspend,
600 diag_hsic[i].in_busy_hsic_read_on_device,
601 diag_hsic[i].in_busy_hsic_write,
602 diag_hsic[i].count_hsic_pool,
603 diag_hsic[i].count_hsic_write_pool,
604 (unsigned int)diag_hsic[i].diag_hsic_pool,
605 (unsigned int)diag_hsic[i].diag_hsic_write_pool,
606 diag_bridge[i].write_len,
607 diag_hsic[i].num_hsic_buf_tbl_entries,
608 diag_bridge[i].usb_connected,
609 work_pending(&(diag_bridge[i].diag_read_work)),
610 work_pending(&(diag_hsic[i].diag_read_hsic_work)),
611 work_pending(&(diag_bridge[i].usb_read_complete_work)));
612 if (bytes_written > bytes_hsic_inited)
613 bytes_hsic_inited = bytes_written;
614 } else {
615 /* Check if there is room to add another HSIC entry */
616 if (bytes_remaining < bytes_hsic_not_inited)
617 break;
618 bytes_written = scnprintf(buf+bytes_in_buffer,
619 bytes_remaining,
620 "HSIC Instance: %d has not been initialized\n\n",
621 i);
622 if (bytes_written > bytes_hsic_not_inited)
623 bytes_hsic_not_inited = bytes_written;
624 }
625
626 bytes_in_buffer += bytes_written;
627
628 bytes_remaining = buf_size - bytes_in_buffer;
629 }
630
631 *ppos = 0;
632 ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer);
633
634 diag_dbgfs_finished = 1;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700635 kfree(buf);
636 return ret;
637}
638
Shalabh Jain737fca72012-11-14 21:53:43 -0800639const struct file_operations diag_dbgfs_bridge_ops = {
640 .read = diag_dbgfs_read_bridge,
Dixon Petersond6a20a92012-09-27 15:58:50 -0700641};
642#endif
643
644const struct file_operations diag_dbgfs_status_ops = {
645 .read = diag_dbgfs_read_status,
646};
647
648const struct file_operations diag_dbgfs_table_ops = {
649 .read = diag_dbgfs_read_table,
650};
651
652const struct file_operations diag_dbgfs_workpending_ops = {
653 .read = diag_dbgfs_read_workpending,
654};
655
Ravi Aravamudhan46df7d22013-06-12 11:57:07 -0700656const struct file_operations diag_dbgfs_mempool_ops = {
657 .read = diag_dbgfs_read_mempool,
658};
659
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700660const struct file_operations diag_dbgfs_dcistats_ops = {
661 .read = diag_dbgfs_read_dcistats,
662};
663
Dixon Petersond6a20a92012-09-27 15:58:50 -0700664void diag_debugfs_init(void)
665{
666 diag_dbgfs_dent = debugfs_create_dir("diag", 0);
667 if (IS_ERR(diag_dbgfs_dent))
668 return;
669
670 debugfs_create_file("status", 0444, diag_dbgfs_dent, 0,
671 &diag_dbgfs_status_ops);
672
673 debugfs_create_file("table", 0444, diag_dbgfs_dent, 0,
674 &diag_dbgfs_table_ops);
675
676 debugfs_create_file("work_pending", 0444, diag_dbgfs_dent, 0,
677 &diag_dbgfs_workpending_ops);
678
Ravi Aravamudhan46df7d22013-06-12 11:57:07 -0700679 debugfs_create_file("mempool", 0444, diag_dbgfs_dent, 0,
680 &diag_dbgfs_mempool_ops);
681
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700682 debugfs_create_file("dci_stats", 0444, diag_dbgfs_dent, 0,
683 &diag_dbgfs_dcistats_ops);
684
Shalabh Jain737fca72012-11-14 21:53:43 -0800685#ifdef CONFIG_DIAGFWD_BRIDGE_CODE
686 debugfs_create_file("bridge", 0444, diag_dbgfs_dent, 0,
687 &diag_dbgfs_bridge_ops);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700688#endif
689
690 diag_dbgfs_table_index = 0;
Dixon Petersonf90f3582013-01-26 18:14:17 -0800691 diag_dbgfs_finished = 0;
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700692 diag_dbgfs_dci_data_index = 0;
693 diag_dbgfs_dci_finished = 0;
694
695 /* DCI related structures */
696 dci_data_smd = kzalloc(sizeof(struct diag_dci_data_info) *
697 DIAG_DCI_DEBUG_CNT, GFP_KERNEL);
698 if (ZERO_OR_NULL_PTR(dci_data_smd))
699 pr_warn("diag: could not allocate memory for dci debug info\n");
700
701 mutex_init(&dci_stat_mutex);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700702}
703
704void diag_debugfs_cleanup(void)
705{
706 if (diag_dbgfs_dent) {
707 debugfs_remove_recursive(diag_dbgfs_dent);
708 diag_dbgfs_dent = NULL;
709 }
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700710
711 kfree(dci_data_smd);
712 mutex_destroy(&dci_stat_mutex);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700713}
714#else
715void diag_debugfs_init(void) { }
716void diag_debugfs_cleanup(void) { }
717#endif