blob: 3d1a6cd387de422eb1a4a412ea778599decaf927 [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"
Ravi Aravamudhan6a2da562013-06-17 16:01:34 -070084 "logging_mode: %d\n"
85 "real_time_mode: %d\n",
Dixon Petersoneecbadb2012-12-10 21:59:28 -080086 (unsigned int)driver->smd_data[MODEM_DATA].ch,
87 (unsigned int)driver->smd_data[LPASS_DATA].ch,
88 (unsigned int)driver->smd_data[WCNSS_DATA].ch,
89 (unsigned int)driver->smd_dci[MODEM_DATA].ch,
90 (unsigned int)driver->smd_cntl[MODEM_DATA].ch,
91 (unsigned int)driver->smd_cntl[LPASS_DATA].ch,
92 (unsigned int)driver->smd_cntl[WCNSS_DATA].ch,
Dixon Peterson3ff84ea2012-12-21 20:16:18 -080093 (unsigned int)driver->smd_cmd[MODEM_DATA].ch,
94 (unsigned int)driver->smd_dci_cmd[MODEM_DATA].ch,
Dixon Petersond6a20a92012-09-27 15:58:50 -070095 chk_config_get_id(),
96 chk_apps_only(),
97 chk_apps_master(),
98 chk_polling_response(),
99 driver->polling_reg_flag,
100 driver->use_device_tree,
Dixon Peterson3ff84ea2012-12-21 20:16:18 -0800101 driver->supports_separate_cmdrsp,
102 driver->separate_cmdrsp[MODEM_DATA],
103 driver->separate_cmdrsp[LPASS_DATA],
104 driver->separate_cmdrsp[WCNSS_DATA],
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800105 driver->smd_data[MODEM_DATA].in_busy_1,
106 driver->smd_data[MODEM_DATA].in_busy_2,
107 driver->smd_data[LPASS_DATA].in_busy_1,
108 driver->smd_data[LPASS_DATA].in_busy_2,
109 driver->smd_data[WCNSS_DATA].in_busy_1,
110 driver->smd_data[WCNSS_DATA].in_busy_2,
111 driver->smd_dci[MODEM_DATA].in_busy_1,
Dixon Peterson3ff84ea2012-12-21 20:16:18 -0800112 driver->smd_cmd[MODEM_DATA].in_busy_1,
113 driver->smd_cmd[MODEM_DATA].in_busy_2,
114 driver->smd_dci_cmd[MODEM_DATA].in_busy_1,
Dixon Peterson15a6ecb2013-06-25 12:36:33 -0700115 driver->peripheral_supports_stm[MODEM_DATA],
116 driver->peripheral_supports_stm[LPASS_DATA],
117 driver->peripheral_supports_stm[WCNSS_DATA],
118 driver->stm_state[MODEM_DATA],
119 driver->stm_state[LPASS_DATA],
120 driver->stm_state[WCNSS_DATA],
121 driver->stm_state[APPS_DATA],
122 driver->stm_state_requested[MODEM_DATA],
123 driver->stm_state_requested[LPASS_DATA],
124 driver->stm_state_requested[WCNSS_DATA],
125 driver->stm_state_requested[APPS_DATA],
Ravi Aravamudhan6a2da562013-06-17 16:01:34 -0700126 driver->logging_mode,
127 driver->real_time_mode);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700128
129#ifdef CONFIG_DIAG_OVER_USB
130 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE,
131 "usb_connected: %d\n",
132 driver->usb_connected);
133#endif
134 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
135
136 kfree(buf);
137 return ret;
138}
139
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700140static ssize_t diag_dbgfs_read_dcistats(struct file *file,
141 char __user *ubuf, size_t count, loff_t *ppos)
142{
143 char *buf = NULL;
144 int bytes_remaining, bytes_written = 0, bytes_in_buf = 0, i = 0;
145 struct diag_dci_data_info *temp_data = dci_data_smd;
146 int buf_size = (DEBUG_BUF_SIZE < count) ? DEBUG_BUF_SIZE : count;
147
148 if (diag_dbgfs_dci_finished) {
149 diag_dbgfs_dci_finished = 0;
150 return 0;
151 }
152
153 buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL);
154 if (ZERO_OR_NULL_PTR(buf)) {
155 pr_err("diag: %s, Error allocating memory\n", __func__);
156 return -ENOMEM;
157 }
158
159 bytes_remaining = buf_size;
160
161 if (diag_dbgfs_dci_data_index == 0) {
162 bytes_written =
163 scnprintf(buf, buf_size,
Ravi Aravamudhan6a2da562013-06-17 16:01:34 -0700164 "number of clients: %d\n"
165 "dci proc active: %d\n"
166 "dci real time vote: %d\n",
167 driver->num_dci_client,
168 (driver->proc_active_mask & DIAG_PROC_DCI) ? 1 : 0,
169 (driver->proc_rt_vote_mask & DIAG_PROC_DCI) ? 1 : 0);
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700170 bytes_in_buf += bytes_written;
171 bytes_remaining -= bytes_written;
172#ifdef CONFIG_DIAG_OVER_USB
173 bytes_written = scnprintf(buf+bytes_in_buf, bytes_remaining,
174 "usb_connected: %d\n",
175 driver->usb_connected);
176 bytes_in_buf += bytes_written;
177 bytes_remaining -= bytes_written;
178#endif
Ravi Aravamudhan37903fe2013-06-03 12:35:05 -0700179 if (driver->dci_device) {
180 bytes_written = scnprintf(buf+bytes_in_buf,
181 bytes_remaining,
182 "dci power active, relax: %lu, %lu\n",
183 driver->dci_device->power.wakeup->active_count,
184 driver->dci_device->power.wakeup->relax_count);
185 bytes_in_buf += bytes_written;
186 bytes_remaining -= bytes_written;
187 }
188 if (driver->dci_cmd_device) {
189 bytes_written = scnprintf(buf+bytes_in_buf,
190 bytes_remaining,
191 "dci cmd power active, relax: %lu, %lu\n",
192 driver->dci_cmd_device->power.wakeup->
193 active_count,
194 driver->dci_cmd_device->power.wakeup->
195 relax_count);
196 bytes_in_buf += bytes_written;
197 bytes_remaining -= bytes_written;
198 }
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700199 }
200 temp_data += diag_dbgfs_dci_data_index;
201 for (i = diag_dbgfs_dci_data_index; i < DIAG_DCI_DEBUG_CNT; i++) {
202 if (temp_data->iteration != 0) {
203 bytes_written = scnprintf(
204 buf + bytes_in_buf, bytes_remaining,
205 "i %-20ld\t"
206 "s %-20d\t"
207 "t %-20s\n",
208 temp_data->iteration,
209 temp_data->data_size,
210 temp_data->time_stamp);
211 bytes_in_buf += bytes_written;
212 bytes_remaining -= bytes_written;
213 /* Check if there is room for another entry */
214 if (bytes_remaining < bytes_written)
215 break;
216 }
217 temp_data++;
218 }
219
220 diag_dbgfs_dci_data_index = (i >= DIAG_DCI_DEBUG_CNT) ? 0 : i + 1;
221 bytes_written = simple_read_from_buffer(ubuf, count, ppos, buf,
222 bytes_in_buf);
223 kfree(buf);
224 diag_dbgfs_dci_finished = 1;
225 return bytes_written;
226}
227
Dixon Petersond6a20a92012-09-27 15:58:50 -0700228static ssize_t diag_dbgfs_read_workpending(struct file *file,
229 char __user *ubuf, size_t count, loff_t *ppos)
230{
231 char *buf;
232 int ret;
233
234 buf = kzalloc(sizeof(char) * DEBUG_BUF_SIZE, GFP_KERNEL);
235 if (!buf) {
236 pr_err("diag: %s, Error allocating memory\n", __func__);
237 return -ENOMEM;
238 }
239
240 ret = scnprintf(buf, DEBUG_BUF_SIZE,
241 "Pending status for work_stucts:\n"
242 "diag_drain_work: %d\n"
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800243 "Modem data diag_read_smd_work: %d\n"
244 "LPASS data diag_read_smd_work: %d\n"
245 "RIVA data diag_read_smd_work: %d\n"
246 "Modem cntl diag_read_smd_work: %d\n"
247 "LPASS cntl diag_read_smd_work: %d\n"
248 "RIVA cntl diag_read_smd_work: %d\n"
249 "Modem dci diag_read_smd_work: %d\n"
250 "Modem data diag_notify_update_smd_work: %d\n"
251 "LPASS data diag_notify_update_smd_work: %d\n"
252 "RIVA data diag_notify_update_smd_work: %d\n"
253 "Modem cntl diag_notify_update_smd_work: %d\n"
254 "LPASS cntl diag_notify_update_smd_work: %d\n"
255 "RIVA cntl diag_notify_update_smd_work: %d\n"
256 "Modem dci diag_notify_update_smd_work: %d\n",
Dixon Petersond6a20a92012-09-27 15:58:50 -0700257 work_pending(&(driver->diag_drain_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800258 work_pending(&(driver->smd_data[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800259 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800260 work_pending(&(driver->smd_data[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800261 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800262 work_pending(&(driver->smd_data[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800263 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800264 work_pending(&(driver->smd_cntl[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800265 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800266 work_pending(&(driver->smd_cntl[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800267 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800268 work_pending(&(driver->smd_cntl[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800269 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800270 work_pending(&(driver->smd_dci[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800271 diag_read_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800272 work_pending(&(driver->smd_data[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800273 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800274 work_pending(&(driver->smd_data[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800275 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800276 work_pending(&(driver->smd_data[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800277 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800278 work_pending(&(driver->smd_cntl[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800279 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800280 work_pending(&(driver->smd_cntl[LPASS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800281 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800282 work_pending(&(driver->smd_cntl[WCNSS_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800283 diag_notify_update_smd_work)),
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800284 work_pending(&(driver->smd_dci[MODEM_DATA].
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800285 diag_notify_update_smd_work)));
Dixon Petersond6a20a92012-09-27 15:58:50 -0700286
287#ifdef CONFIG_DIAG_OVER_USB
288 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE,
289 "diag_proc_hdlc_work: %d\n"
290 "diag_read_work: %d\n",
291 work_pending(&(driver->diag_proc_hdlc_work)),
292 work_pending(&(driver->diag_read_work)));
293#endif
294 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
295
296 kfree(buf);
297 return ret;
298}
299
300static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf,
301 size_t count, loff_t *ppos)
302{
303 char *buf;
304 int ret = 0;
305 int i;
306 int bytes_remaining;
307 int bytes_in_buffer = 0;
308 int bytes_written;
309 int buf_size = (DEBUG_BUF_SIZE < count) ? DEBUG_BUF_SIZE : count;
310
311 if (diag_dbgfs_table_index >= diag_max_reg) {
312 /* Done. Reset to prepare for future requests */
313 diag_dbgfs_table_index = 0;
314 return 0;
315 }
316
317 buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL);
Ashay Jaiswalf7e265a2013-06-05 13:24:38 +0530318 if (ZERO_OR_NULL_PTR(buf)) {
Dixon Petersond6a20a92012-09-27 15:58:50 -0700319 pr_err("diag: %s, Error allocating memory\n", __func__);
320 return -ENOMEM;
321 }
322
323 bytes_remaining = buf_size;
Dixon Petersoneecbadb2012-12-10 21:59:28 -0800324
325 if (diag_dbgfs_table_index == 0) {
326 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
327 "Client ids: Modem: %d, LPASS: %d, "
328 "WCNSS: %d, APPS: %d\n",
329 MODEM_DATA, LPASS_DATA, WCNSS_DATA, APPS_DATA);
330 bytes_in_buffer += bytes_written;
331 }
332
Dixon Petersond6a20a92012-09-27 15:58:50 -0700333 for (i = diag_dbgfs_table_index; i < diag_max_reg; i++) {
334 /* Do not process empty entries in the table */
335 if (driver->table[i].process_id == 0)
336 continue;
337
338 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
339 "i: %3d, cmd_code: %4x, subsys_id: %4x, "
340 "client: %2d, cmd_code_lo: %4x, "
341 "cmd_code_hi: %4x, process_id: %5d\n",
342 i,
343 driver->table[i].cmd_code,
344 driver->table[i].subsys_id,
345 driver->table[i].client_id,
346 driver->table[i].cmd_code_lo,
347 driver->table[i].cmd_code_hi,
348 driver->table[i].process_id);
349
350 bytes_in_buffer += bytes_written;
351
352 /* Check if there is room to add another table entry */
353 bytes_remaining = buf_size - bytes_in_buffer;
354 if (bytes_remaining < bytes_written)
355 break;
356 }
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800357 diag_dbgfs_table_index = i+1;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700358
359 *ppos = 0;
360 ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer);
361
362 kfree(buf);
363 return ret;
364}
365
Shalabh Jain737fca72012-11-14 21:53:43 -0800366#ifdef CONFIG_DIAGFWD_BRIDGE_CODE
Ravi Aravamudhan46df7d22013-06-12 11:57:07 -0700367static ssize_t diag_dbgfs_read_mempool(struct file *file, char __user *ubuf,
368 size_t count, loff_t *ppos)
369{
370 char *buf = NULL;
371 int ret = 0, i = 0;
372
373 buf = kzalloc(sizeof(char) * DEBUG_BUF_SIZE, GFP_KERNEL);
374 if (ZERO_OR_NULL_PTR(buf)) {
375 pr_err("diag: %s, Error allocating memory\n", __func__);
376 return -ENOMEM;
377 }
378
379 ret = scnprintf(buf, DEBUG_BUF_SIZE,
380 "POOL_TYPE_COPY: [0x%p : 0x%p] count = %d\n"
381 "POOL_TYPE_HDLC: [0x%p : 0x%p] count = %d\n"
382 "POOL_TYPE_USER: [0x%p : 0x%p] count = %d\n"
383 "POOL_TYPE_WRITE_STRUCT: [0x%p : 0x%p] count = %d\n",
384 driver->diagpool,
385 diag_pools_array[POOL_COPY_IDX],
386 driver->count,
387 driver->diag_hdlc_pool,
388 diag_pools_array[POOL_HDLC_IDX],
389 driver->count_hdlc_pool,
390 driver->diag_user_pool,
391 diag_pools_array[POOL_USER_IDX],
392 driver->count_user_pool,
393 driver->diag_write_struct_pool,
394 diag_pools_array[POOL_WRITE_STRUCT_IDX],
395 driver->count_write_struct_pool);
396
397 for (i = 0; i < MAX_HSIC_CH; i++) {
398 if (!diag_hsic[i].hsic_inited)
399 continue;
400 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE-ret,
401 "POOL_TYPE_HSIC_%d: [0x%p : 0x%p] count = %d\n",
402 i+1,
403 diag_hsic[i].diag_hsic_pool,
404 diag_pools_array[POOL_HSIC_IDX + i],
405 diag_hsic[i].count_hsic_pool);
406 }
407
408 for (i = 0; i < MAX_HSIC_CH; i++) {
409 if (!diag_hsic[i].hsic_inited)
410 continue;
411 ret += scnprintf(buf+ret, DEBUG_BUF_SIZE-ret,
412 "POOL_TYPE_HSIC_%d_WRITE: [0x%p : 0x%p] count = %d\n",
413 i+1,
414 diag_hsic[i].diag_hsic_write_pool,
415 diag_pools_array[POOL_HSIC_WRITE_IDX + i],
416 diag_hsic[i].count_hsic_write_pool);
417 }
418
419 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
420
421 kfree(buf);
422 return ret;
423}
424#else
425static 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;
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 ret = simple_read_from_buffer(ubuf, count, ppos, buf, ret);
456
457 kfree(buf);
458 return ret;
459}
460#endif
461
462#ifdef CONFIG_DIAGFWD_BRIDGE_CODE
Shalabh Jain737fca72012-11-14 21:53:43 -0800463static ssize_t diag_dbgfs_read_bridge(struct file *file, char __user *ubuf,
Dixon Petersond6a20a92012-09-27 15:58:50 -0700464 size_t count, loff_t *ppos)
465{
466 char *buf;
467 int ret;
Dixon Petersonf90f3582013-01-26 18:14:17 -0800468 int i;
469 int bytes_remaining;
470 int bytes_in_buffer = 0;
471 int bytes_written;
472 int buf_size = (DEBUG_BUF_SIZE < count) ? DEBUG_BUF_SIZE : count;
473 int bytes_hsic_inited = 45;
474 int bytes_hsic_not_inited = 410;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700475
Dixon Petersonf90f3582013-01-26 18:14:17 -0800476 if (diag_dbgfs_finished) {
477 diag_dbgfs_finished = 0;
478 return 0;
479 }
480
481 buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL);
Ashay Jaiswalf7e265a2013-06-05 13:24:38 +0530482 if (ZERO_OR_NULL_PTR(buf)) {
Dixon Petersond6a20a92012-09-27 15:58:50 -0700483 pr_err("diag: %s, Error allocating memory\n", __func__);
484 return -ENOMEM;
485 }
486
Dixon Petersonf90f3582013-01-26 18:14:17 -0800487 bytes_remaining = buf_size;
488
489 /* Only one smux for now */
490 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
491 "Values for SMUX instance: 0\n"
Dixon Peterson66fb11b2012-12-04 20:30:54 -0800492 "smux ch: %d\n"
493 "smux enabled %d\n"
494 "smux in busy %d\n"
Dixon Petersonf90f3582013-01-26 18:14:17 -0800495 "smux connected %d\n\n",
Shalabh Jain737fca72012-11-14 21:53:43 -0800496 driver->lcid,
497 driver->diag_smux_enabled,
498 driver->in_busy_smux,
499 driver->smux_connected);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700500
Dixon Petersonf90f3582013-01-26 18:14:17 -0800501 bytes_in_buffer += bytes_written;
502 bytes_remaining = buf_size - bytes_in_buffer;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700503
Dixon Petersonf90f3582013-01-26 18:14:17 -0800504 bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining,
505 "HSIC diag_disconnect_work: %d\n",
506 work_pending(&(driver->diag_disconnect_work)));
507
508 bytes_in_buffer += bytes_written;
509 bytes_remaining = buf_size - bytes_in_buffer;
510
511 for (i = 0; i < MAX_HSIC_CH; i++) {
512 if (diag_hsic[i].hsic_inited) {
513 /* Check if there is room to add another HSIC entry */
514 if (bytes_remaining < bytes_hsic_inited)
515 break;
516 bytes_written = scnprintf(buf+bytes_in_buffer,
517 bytes_remaining,
518 "Values for HSIC Instance: %d\n"
519 "hsic ch: %d\n"
520 "hsic_inited: %d\n"
521 "hsic enabled: %d\n"
522 "hsic_opened: %d\n"
523 "hsic_suspend: %d\n"
524 "in_busy_hsic_read_on_device: %d\n"
525 "in_busy_hsic_write: %d\n"
526 "count_hsic_pool: %d\n"
527 "count_hsic_write_pool: %d\n"
528 "diag_hsic_pool: %x\n"
529 "diag_hsic_write_pool: %x\n"
530 "HSIC write_len: %d\n"
531 "num_hsic_buf_tbl_entries: %d\n"
532 "HSIC usb_connected: %d\n"
533 "HSIC diag_read_work: %d\n"
534 "diag_read_hsic_work: %d\n"
535 "diag_usb_read_complete_work: %d\n\n",
536 i,
537 diag_hsic[i].hsic_ch,
538 diag_hsic[i].hsic_inited,
539 diag_hsic[i].hsic_device_enabled,
540 diag_hsic[i].hsic_device_opened,
541 diag_hsic[i].hsic_suspend,
542 diag_hsic[i].in_busy_hsic_read_on_device,
543 diag_hsic[i].in_busy_hsic_write,
544 diag_hsic[i].count_hsic_pool,
545 diag_hsic[i].count_hsic_write_pool,
546 (unsigned int)diag_hsic[i].diag_hsic_pool,
547 (unsigned int)diag_hsic[i].diag_hsic_write_pool,
548 diag_bridge[i].write_len,
549 diag_hsic[i].num_hsic_buf_tbl_entries,
550 diag_bridge[i].usb_connected,
551 work_pending(&(diag_bridge[i].diag_read_work)),
552 work_pending(&(diag_hsic[i].diag_read_hsic_work)),
553 work_pending(&(diag_bridge[i].usb_read_complete_work)));
554 if (bytes_written > bytes_hsic_inited)
555 bytes_hsic_inited = bytes_written;
556 } else {
557 /* Check if there is room to add another HSIC entry */
558 if (bytes_remaining < bytes_hsic_not_inited)
559 break;
560 bytes_written = scnprintf(buf+bytes_in_buffer,
561 bytes_remaining,
562 "HSIC Instance: %d has not been initialized\n\n",
563 i);
564 if (bytes_written > bytes_hsic_not_inited)
565 bytes_hsic_not_inited = bytes_written;
566 }
567
568 bytes_in_buffer += bytes_written;
569
570 bytes_remaining = buf_size - bytes_in_buffer;
571 }
572
573 *ppos = 0;
574 ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer);
575
576 diag_dbgfs_finished = 1;
Dixon Petersond6a20a92012-09-27 15:58:50 -0700577 kfree(buf);
578 return ret;
579}
580
Shalabh Jain737fca72012-11-14 21:53:43 -0800581const struct file_operations diag_dbgfs_bridge_ops = {
582 .read = diag_dbgfs_read_bridge,
Dixon Petersond6a20a92012-09-27 15:58:50 -0700583};
584#endif
585
586const struct file_operations diag_dbgfs_status_ops = {
587 .read = diag_dbgfs_read_status,
588};
589
590const struct file_operations diag_dbgfs_table_ops = {
591 .read = diag_dbgfs_read_table,
592};
593
594const struct file_operations diag_dbgfs_workpending_ops = {
595 .read = diag_dbgfs_read_workpending,
596};
597
Ravi Aravamudhan46df7d22013-06-12 11:57:07 -0700598const struct file_operations diag_dbgfs_mempool_ops = {
599 .read = diag_dbgfs_read_mempool,
600};
601
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700602const struct file_operations diag_dbgfs_dcistats_ops = {
603 .read = diag_dbgfs_read_dcistats,
604};
605
Dixon Petersond6a20a92012-09-27 15:58:50 -0700606void diag_debugfs_init(void)
607{
608 diag_dbgfs_dent = debugfs_create_dir("diag", 0);
609 if (IS_ERR(diag_dbgfs_dent))
610 return;
611
612 debugfs_create_file("status", 0444, diag_dbgfs_dent, 0,
613 &diag_dbgfs_status_ops);
614
615 debugfs_create_file("table", 0444, diag_dbgfs_dent, 0,
616 &diag_dbgfs_table_ops);
617
618 debugfs_create_file("work_pending", 0444, diag_dbgfs_dent, 0,
619 &diag_dbgfs_workpending_ops);
620
Ravi Aravamudhan46df7d22013-06-12 11:57:07 -0700621 debugfs_create_file("mempool", 0444, diag_dbgfs_dent, 0,
622 &diag_dbgfs_mempool_ops);
623
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700624 debugfs_create_file("dci_stats", 0444, diag_dbgfs_dent, 0,
625 &diag_dbgfs_dcistats_ops);
626
Shalabh Jain737fca72012-11-14 21:53:43 -0800627#ifdef CONFIG_DIAGFWD_BRIDGE_CODE
628 debugfs_create_file("bridge", 0444, diag_dbgfs_dent, 0,
629 &diag_dbgfs_bridge_ops);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700630#endif
631
632 diag_dbgfs_table_index = 0;
Dixon Petersonf90f3582013-01-26 18:14:17 -0800633 diag_dbgfs_finished = 0;
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700634 diag_dbgfs_dci_data_index = 0;
635 diag_dbgfs_dci_finished = 0;
636
637 /* DCI related structures */
638 dci_data_smd = kzalloc(sizeof(struct diag_dci_data_info) *
639 DIAG_DCI_DEBUG_CNT, GFP_KERNEL);
640 if (ZERO_OR_NULL_PTR(dci_data_smd))
641 pr_warn("diag: could not allocate memory for dci debug info\n");
642
643 mutex_init(&dci_stat_mutex);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700644}
645
646void diag_debugfs_cleanup(void)
647{
648 if (diag_dbgfs_dent) {
649 debugfs_remove_recursive(diag_dbgfs_dent);
650 diag_dbgfs_dent = NULL;
651 }
Ravi Aravamudhan3dc66352013-06-14 10:46:19 -0700652
653 kfree(dci_data_smd);
654 mutex_destroy(&dci_stat_mutex);
Dixon Petersond6a20a92012-09-27 15:58:50 -0700655}
656#else
657void diag_debugfs_init(void) { }
658void diag_debugfs_cleanup(void) { }
659#endif