bfa_log.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /*
  2. * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
  3. * All rights reserved
  4. * www.brocade.com
  5. *
  6. * Linux driver for Brocade Fibre Channel Host Bus Adapter.
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License (GPL) Version 2 as
  10. * published by the Free Software Foundation
  11. *
  12. * This program is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * General Public License for more details.
  16. */
  17. /**
  18. * bfa_log.c BFA log library
  19. */
  20. #include <bfa_os_inc.h>
  21. #include <cs/bfa_log.h>
  22. /*
  23. * global log info structure
  24. */
  25. struct bfa_log_info_s {
  26. u32 start_idx; /* start index for a module */
  27. u32 total_count; /* total count for a module */
  28. enum bfa_log_severity level; /* global log level */
  29. bfa_log_cb_t cbfn; /* callback function */
  30. };
  31. static struct bfa_log_info_s bfa_log_info[BFA_LOG_MODULE_ID_MAX + 1];
  32. static u32 bfa_log_msg_total_count;
  33. static int bfa_log_initialized;
  34. static char *bfa_log_severity[] =
  35. { "[none]", "[critical]", "[error]", "[warn]", "[info]", "" };
  36. /**
  37. * BFA log library initialization
  38. *
  39. * The log library initialization includes the following,
  40. * - set log instance name and callback function
  41. * - read the message array generated from xml files
  42. * - calculate start index for each module
  43. * - calculate message count for each module
  44. * - perform error checking
  45. *
  46. * @param[in] log_mod - log module info
  47. * @param[in] instance_name - instance name
  48. * @param[in] cbfn - callback function
  49. *
  50. * It return 0 on success, or -1 on failure
  51. */
  52. int
  53. bfa_log_init(struct bfa_log_mod_s *log_mod, char *instance_name,
  54. bfa_log_cb_t cbfn)
  55. {
  56. struct bfa_log_msgdef_s *msg;
  57. u32 pre_mod_id = 0;
  58. u32 cur_mod_id = 0;
  59. u32 i, pre_idx, idx, msg_id;
  60. /*
  61. * set instance name
  62. */
  63. if (log_mod) {
  64. strncpy(log_mod->instance_info, instance_name,
  65. sizeof(log_mod->instance_info));
  66. log_mod->cbfn = cbfn;
  67. for (i = 0; i <= BFA_LOG_MODULE_ID_MAX; i++)
  68. log_mod->log_level[i] = BFA_LOG_WARNING;
  69. }
  70. if (bfa_log_initialized)
  71. return 0;
  72. for (i = 0; i <= BFA_LOG_MODULE_ID_MAX; i++) {
  73. bfa_log_info[i].start_idx = 0;
  74. bfa_log_info[i].total_count = 0;
  75. bfa_log_info[i].level = BFA_LOG_WARNING;
  76. bfa_log_info[i].cbfn = cbfn;
  77. }
  78. pre_idx = 0;
  79. idx = 0;
  80. msg = bfa_log_msg_array;
  81. msg_id = BFA_LOG_GET_MSG_ID(msg);
  82. pre_mod_id = BFA_LOG_GET_MOD_ID(msg_id);
  83. while (msg_id != 0) {
  84. cur_mod_id = BFA_LOG_GET_MOD_ID(msg_id);
  85. if (cur_mod_id > BFA_LOG_MODULE_ID_MAX) {
  86. cbfn(log_mod, msg_id,
  87. "%s%s log: module id %u out of range\n",
  88. BFA_LOG_CAT_NAME,
  89. bfa_log_severity[BFA_LOG_ERROR],
  90. cur_mod_id);
  91. return -1;
  92. }
  93. if (pre_mod_id > BFA_LOG_MODULE_ID_MAX) {
  94. cbfn(log_mod, msg_id,
  95. "%s%s log: module id %u out of range\n",
  96. BFA_LOG_CAT_NAME,
  97. bfa_log_severity[BFA_LOG_ERROR],
  98. pre_mod_id);
  99. return -1;
  100. }
  101. if (cur_mod_id != pre_mod_id) {
  102. bfa_log_info[pre_mod_id].start_idx = pre_idx;
  103. bfa_log_info[pre_mod_id].total_count = idx - pre_idx;
  104. pre_mod_id = cur_mod_id;
  105. pre_idx = idx;
  106. }
  107. idx++;
  108. msg++;
  109. msg_id = BFA_LOG_GET_MSG_ID(msg);
  110. }
  111. bfa_log_info[cur_mod_id].start_idx = pre_idx;
  112. bfa_log_info[cur_mod_id].total_count = idx - pre_idx;
  113. bfa_log_msg_total_count = idx;
  114. cbfn(log_mod, msg_id, "%s%s log: init OK, msg total count %u\n",
  115. BFA_LOG_CAT_NAME,
  116. bfa_log_severity[BFA_LOG_INFO], bfa_log_msg_total_count);
  117. bfa_log_initialized = 1;
  118. return 0;
  119. }
  120. /**
  121. * BFA log set log level for a module
  122. *
  123. * @param[in] log_mod - log module info
  124. * @param[in] mod_id - module id
  125. * @param[in] log_level - log severity level
  126. *
  127. * It return BFA_STATUS_OK on success, or > 0 on failure
  128. */
  129. bfa_status_t
  130. bfa_log_set_level(struct bfa_log_mod_s *log_mod, int mod_id,
  131. enum bfa_log_severity log_level)
  132. {
  133. if (mod_id <= BFA_LOG_UNUSED_ID || mod_id > BFA_LOG_MODULE_ID_MAX)
  134. return BFA_STATUS_EINVAL;
  135. if (log_level <= BFA_LOG_INVALID || log_level > BFA_LOG_LEVEL_MAX)
  136. return BFA_STATUS_EINVAL;
  137. if (log_mod)
  138. log_mod->log_level[mod_id] = log_level;
  139. else
  140. bfa_log_info[mod_id].level = log_level;
  141. return BFA_STATUS_OK;
  142. }
  143. /**
  144. * BFA log set log level for all modules
  145. *
  146. * @param[in] log_mod - log module info
  147. * @param[in] log_level - log severity level
  148. *
  149. * It return BFA_STATUS_OK on success, or > 0 on failure
  150. */
  151. bfa_status_t
  152. bfa_log_set_level_all(struct bfa_log_mod_s *log_mod,
  153. enum bfa_log_severity log_level)
  154. {
  155. int mod_id = BFA_LOG_UNUSED_ID + 1;
  156. if (log_level <= BFA_LOG_INVALID || log_level > BFA_LOG_LEVEL_MAX)
  157. return BFA_STATUS_EINVAL;
  158. if (log_mod) {
  159. for (; mod_id <= BFA_LOG_MODULE_ID_MAX; mod_id++)
  160. log_mod->log_level[mod_id] = log_level;
  161. } else {
  162. for (; mod_id <= BFA_LOG_MODULE_ID_MAX; mod_id++)
  163. bfa_log_info[mod_id].level = log_level;
  164. }
  165. return BFA_STATUS_OK;
  166. }
  167. /**
  168. * BFA log set log level for all aen sub-modules
  169. *
  170. * @param[in] log_mod - log module info
  171. * @param[in] log_level - log severity level
  172. *
  173. * It return BFA_STATUS_OK on success, or > 0 on failure
  174. */
  175. bfa_status_t
  176. bfa_log_set_level_aen(struct bfa_log_mod_s *log_mod,
  177. enum bfa_log_severity log_level)
  178. {
  179. int mod_id = BFA_LOG_AEN_MIN + 1;
  180. if (log_mod) {
  181. for (; mod_id <= BFA_LOG_AEN_MAX; mod_id++)
  182. log_mod->log_level[mod_id] = log_level;
  183. } else {
  184. for (; mod_id <= BFA_LOG_AEN_MAX; mod_id++)
  185. bfa_log_info[mod_id].level = log_level;
  186. }
  187. return BFA_STATUS_OK;
  188. }
  189. /**
  190. * BFA log get log level for a module
  191. *
  192. * @param[in] log_mod - log module info
  193. * @param[in] mod_id - module id
  194. *
  195. * It returns log level or -1 on error
  196. */
  197. enum bfa_log_severity
  198. bfa_log_get_level(struct bfa_log_mod_s *log_mod, int mod_id)
  199. {
  200. if (mod_id <= BFA_LOG_UNUSED_ID || mod_id > BFA_LOG_MODULE_ID_MAX)
  201. return BFA_LOG_INVALID;
  202. if (log_mod)
  203. return log_mod->log_level[mod_id];
  204. else
  205. return bfa_log_info[mod_id].level;
  206. }
  207. enum bfa_log_severity
  208. bfa_log_get_msg_level(struct bfa_log_mod_s *log_mod, u32 msg_id)
  209. {
  210. struct bfa_log_msgdef_s *msg;
  211. u32 mod = BFA_LOG_GET_MOD_ID(msg_id);
  212. u32 idx = BFA_LOG_GET_MSG_IDX(msg_id) - 1;
  213. if (!bfa_log_initialized)
  214. return BFA_LOG_INVALID;
  215. if (mod > BFA_LOG_MODULE_ID_MAX)
  216. return BFA_LOG_INVALID;
  217. if (idx >= bfa_log_info[mod].total_count) {
  218. bfa_log_info[mod].cbfn(log_mod, msg_id,
  219. "%s%s log: inconsistent idx %u vs. total count %u\n",
  220. BFA_LOG_CAT_NAME, bfa_log_severity[BFA_LOG_ERROR], idx,
  221. bfa_log_info[mod].total_count);
  222. return BFA_LOG_INVALID;
  223. }
  224. msg = bfa_log_msg_array + bfa_log_info[mod].start_idx + idx;
  225. if (msg_id != BFA_LOG_GET_MSG_ID(msg)) {
  226. bfa_log_info[mod].cbfn(log_mod, msg_id,
  227. "%s%s log: inconsistent msg id %u array msg id %u\n",
  228. BFA_LOG_CAT_NAME, bfa_log_severity[BFA_LOG_ERROR],
  229. msg_id, BFA_LOG_GET_MSG_ID(msg));
  230. return BFA_LOG_INVALID;
  231. }
  232. return BFA_LOG_GET_SEVERITY(msg);
  233. }
  234. /**
  235. * BFA log message handling
  236. *
  237. * BFA log message handling finds the message based on message id and prints
  238. * out the message based on its format and arguments. It also does prefix
  239. * the severity etc.
  240. *
  241. * @param[in] log_mod - log module info
  242. * @param[in] msg_id - message id
  243. * @param[in] ... - message arguments
  244. *
  245. * It return 0 on success, or -1 on errors
  246. */
  247. int
  248. bfa_log(struct bfa_log_mod_s *log_mod, u32 msg_id, ...)
  249. {
  250. va_list ap;
  251. char buf[256];
  252. struct bfa_log_msgdef_s *msg;
  253. int log_level;
  254. u32 mod = BFA_LOG_GET_MOD_ID(msg_id);
  255. u32 idx = BFA_LOG_GET_MSG_IDX(msg_id) - 1;
  256. if (!bfa_log_initialized)
  257. return -1;
  258. if (mod > BFA_LOG_MODULE_ID_MAX)
  259. return -1;
  260. if (idx >= bfa_log_info[mod].total_count) {
  261. bfa_log_info[mod].
  262. cbfn
  263. (log_mod, msg_id,
  264. "%s%s log: inconsistent idx %u vs. total count %u\n",
  265. BFA_LOG_CAT_NAME, bfa_log_severity[BFA_LOG_ERROR], idx,
  266. bfa_log_info[mod].total_count);
  267. return -1;
  268. }
  269. msg = bfa_log_msg_array + bfa_log_info[mod].start_idx + idx;
  270. if (msg_id != BFA_LOG_GET_MSG_ID(msg)) {
  271. bfa_log_info[mod].
  272. cbfn
  273. (log_mod, msg_id,
  274. "%s%s log: inconsistent msg id %u array msg id %u\n",
  275. BFA_LOG_CAT_NAME, bfa_log_severity[BFA_LOG_ERROR],
  276. msg_id, BFA_LOG_GET_MSG_ID(msg));
  277. return -1;
  278. }
  279. log_level = log_mod ? log_mod->log_level[mod] : bfa_log_info[mod].level;
  280. if ((BFA_LOG_GET_SEVERITY(msg) > log_level) &&
  281. (msg->attributes != BFA_LOG_ATTR_NONE))
  282. return 0;
  283. va_start(ap, msg_id);
  284. bfa_os_vsprintf(buf, BFA_LOG_GET_MSG_FMT_STRING(msg), ap);
  285. va_end(ap);
  286. if (log_mod)
  287. log_mod->cbfn(log_mod, msg_id, "%s[%s]%s%s %s: %s\n",
  288. BFA_LOG_CAT_NAME, log_mod->instance_info,
  289. bfa_log_severity[BFA_LOG_GET_SEVERITY(msg)],
  290. (msg->attributes & BFA_LOG_ATTR_AUDIT)
  291. ? " (audit) " : "", msg->msg_value, buf);
  292. else
  293. bfa_log_info[mod].cbfn(log_mod, msg_id, "%s%s%s %s: %s\n",
  294. BFA_LOG_CAT_NAME,
  295. bfa_log_severity[BFA_LOG_GET_SEVERITY(msg)],
  296. (msg->attributes & BFA_LOG_ATTR_AUDIT) ?
  297. " (audit) " : "", msg->msg_value, buf);
  298. return 0;
  299. }