import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / conn_md / conn_md_dump.c
1
2
3 #define DFT_TAG "[CONN_MD_DMP]"
4
5 #include "conn_md_log.h"
6 #include "conn_md_dump.h"
7
8
9 P_CONN_MD_DMP_MSG_LOG conn_md_dmp_init(void)
10 {
11 uint32 msg_log_size = sizeof(CONN_MD_DMP_MSG_LOG);
12 P_CONN_MD_DMP_MSG_LOG p_msg_log = vmalloc(msg_log_size);
13 if (NULL != p_msg_log) {
14 CONN_MD_INFO_FUNC("alloc memory for msg log system done, size:0x%08x\n",
15 msg_log_size);
16 memset(p_msg_log, 0, msg_log_size);
17
18 mutex_init(&p_msg_log->lock);
19
20 } else {
21 CONN_MD_ERR_FUNC("alloc memory for msg log system failed\n");
22 }
23 return p_msg_log;
24 }
25
26 int conn_md_dmp_deinit(P_CONN_MD_DMP_MSG_LOG p_log)
27 {
28 int i_ret = -1;
29 if (NULL != p_log) {
30 CONN_MD_INFO_FUNC("vaild log buffer pointer:0x%08x, free it.\n", p_log);
31 mutex_destroy(&p_log->lock);
32 vfree(p_log);
33 i_ret = 0;
34 } else {
35 CONN_MD_WARN_FUNC("invalid log buffer pointer\n");
36 i_ret = CONN_MD_ERR_INVALID_PARAM;
37 }
38 return 0;
39 }
40
41 int __conn_md_dmp_in(ipc_ilm_t *p_ilm, CONN_MD_MSG_TYPE msg_type, P_CONN_MD_DMP_MSG_LOG p_msg_log)
42 {
43 struct timeval now;
44 P_CONN_MD_DMP_MSG_STR p_msg = NULL;
45
46 /*get current time */
47 do_gettimeofday(&now);
48
49 mutex_lock(&p_msg_log->lock);
50
51 p_msg = &p_msg_log->msg[p_msg_log->in];
52
53 /*Log timestamp */
54 p_msg->sec = now.tv_sec;
55 p_msg->usec = now.tv_usec;
56 p_msg->type = msg_type;
57
58 /*Log p_ilm */
59 memcpy(&p_msg->ilm, p_ilm, sizeof(ipc_ilm_t));
60
61 /*Log msg length */
62 p_msg->msg_len = p_ilm->local_para_ptr->msg_len;
63
64 /*Log msg content */
65 memcpy(&p_msg->data, p_ilm->local_para_ptr->data,
66 p_msg->msg_len > LENGTH_PER_PACKAGE ? LENGTH_PER_PACKAGE : p_msg->msg_len);
67
68 /*update in size and index */
69
70 if (NUMBER_OF_MSG_LOGGED <= p_msg_log->size)
71 p_msg_log->size = NUMBER_OF_MSG_LOGGED;
72 else
73 p_msg_log->size++;
74
75 p_msg_log->in++;
76 p_msg_log->in %= NUMBER_OF_MSG_LOGGED;
77
78 mutex_unlock(&p_msg_log->lock);
79 CONN_MD_WARN_FUNC("msg type:%d enqueued succeed\n", msg_type);
80 return 0;
81 }
82
83
84 int conn_md_dmp_in(ipc_ilm_t *p_ilm, CONN_MD_MSG_TYPE msg_type, P_CONN_MD_DMP_MSG_LOG p_msg_log)
85 {
86 int i_ret = -1;
87
88 if (NULL == p_ilm ||
89 NULL == p_ilm->local_para_ptr ||
90 0 == p_ilm->local_para_ptr->msg_len ||
91 (msg_type != MSG_ENQUEUE && msg_type != MSG_DEQUEUE)) {
92 CONN_MD_WARN_FUNC("invalid parameter\n");
93 i_ret = CONN_MD_ERR_INVALID_PARAM;
94 } else {
95 i_ret = __conn_md_dmp_in(p_ilm, msg_type, p_msg_log);
96 }
97 return i_ret;
98 }
99
100 int __conn_md_dmp_msg_filter(P_CONN_MD_DMP_MSG_STR p_msg, uint32 src_id, uint32 dst_id)
101 {
102 ipc_ilm_t *p_ilm = &p_msg->ilm;
103 int i = 0;
104
105 if (((0 == src_id) || (src_id == p_ilm->src_mod_id)) &&
106 ((0 == dst_id) || (dst_id == p_ilm->dest_mod_id))) {
107 __conn_md_log_print(DFT_TAG
108 "%d.%d s, <%s> src_id:0x%08x, dst_id:0x%08x, msg_len:%d, dump_len:%d:\n",
109 p_msg->sec, p_msg->usec,
110 (MSG_ENQUEUE == p_msg->type ? "enqueue" : "dequeue"),
111 p_msg->ilm.src_mod_id, p_msg->ilm.dest_mod_id, p_msg->msg_len,
112 (LENGTH_PER_PACKAGE >=
113 p_msg->msg_len ? p_msg->msg_len : LENGTH_PER_PACKAGE));
114
115 for (i = 0; (i < p_msg->msg_len) && (i < LENGTH_PER_PACKAGE); i++) {
116 __conn_md_log_print("%02x ", p_msg->data[i]);
117 if (7 == (i % 8))
118 __conn_md_log_print("\n");
119 }
120 __conn_md_log_print("\n");
121 }
122 return 0;
123 }
124
125
126 int conn_md_dmp_out(P_CONN_MD_DMP_MSG_LOG p_msg_log, uint32 src_id, uint32 dst_id)
127 {
128 int i_ret = 0;
129 int size = 0;
130 int in = 0;
131 int out = 0;
132 P_CONN_MD_DMP_MSG_STR p_msg = NULL;
133
134 mutex_lock(&p_msg_log->lock);
135
136 size = p_msg_log->size;
137
138 if (NULL == p_msg_log) {
139 mutex_unlock(&p_msg_log->lock);
140
141 CONN_MD_WARN_FUNC("invalid parameter, p_msg_log:0x%08x\n", p_msg_log);
142 return CONN_MD_ERR_INVALID_PARAM;
143 }
144 CONN_MD_INFO_FUNC("dump msg for <src_id:0x%08x, dst_id:0x%08x> start\n", src_id, dst_id);
145 if (NUMBER_OF_MSG_LOGGED == size) {
146 out = in;
147 } else {
148 out = 0;
149 }
150
151 while (size--) {
152 p_msg = &p_msg_log->msg[out];
153
154 __conn_md_dmp_msg_filter(p_msg, src_id, dst_id);
155
156 out++;
157 out %= NUMBER_OF_MSG_LOGGED;
158 }
159 mutex_unlock(&p_msg_log->lock);
160 CONN_MD_INFO_FUNC("dump msg for <src_id:0x%08x, dst_id:0x%08x> finished\n", src_id, dst_id);
161 return i_ret;
162 }