debug.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. #include <linux/config.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/pci.h>
  5. #include <linux/i2o.h>
  6. static void i2o_report_util_cmd(u8 cmd);
  7. static void i2o_report_exec_cmd(u8 cmd);
  8. static void i2o_report_fail_status(u8 req_status, u32 * msg);
  9. static void i2o_report_common_status(u8 req_status);
  10. static void i2o_report_common_dsc(u16 detailed_status);
  11. /*
  12. * Used for error reporting/debugging purposes.
  13. * Report Cmd name, Request status, Detailed Status.
  14. */
  15. void i2o_report_status(const char *severity, const char *str,
  16. struct i2o_message *m)
  17. {
  18. u32 *msg = (u32 *) m;
  19. u8 cmd = (msg[1] >> 24) & 0xFF;
  20. u8 req_status = (msg[4] >> 24) & 0xFF;
  21. u16 detailed_status = msg[4] & 0xFFFF;
  22. if (cmd == I2O_CMD_UTIL_EVT_REGISTER)
  23. return; // No status in this reply
  24. printk(KERN_DEBUG "%s%s: ", severity, str);
  25. if (cmd < 0x1F) // Utility cmd
  26. i2o_report_util_cmd(cmd);
  27. else if (cmd >= 0xA0 && cmd <= 0xEF) // Executive cmd
  28. i2o_report_exec_cmd(cmd);
  29. else
  30. printk(KERN_DEBUG "Cmd = %0#2x, ", cmd); // Other cmds
  31. if (msg[0] & MSG_FAIL) {
  32. i2o_report_fail_status(req_status, msg);
  33. return;
  34. }
  35. i2o_report_common_status(req_status);
  36. if (cmd < 0x1F || (cmd >= 0xA0 && cmd <= 0xEF))
  37. i2o_report_common_dsc(detailed_status);
  38. else
  39. printk(KERN_DEBUG " / DetailedStatus = %0#4x.\n",
  40. detailed_status);
  41. }
  42. /* Used to dump a message to syslog during debugging */
  43. void i2o_dump_message(struct i2o_message *m)
  44. {
  45. #ifdef DEBUG
  46. u32 *msg = (u32 *) m;
  47. int i;
  48. printk(KERN_INFO "Dumping I2O message size %d @ %p\n",
  49. msg[0] >> 16 & 0xffff, msg);
  50. for (i = 0; i < ((msg[0] >> 16) & 0xffff); i++)
  51. printk(KERN_INFO " msg[%d] = %0#10x\n", i, msg[i]);
  52. #endif
  53. }
  54. /*
  55. * Used for error reporting/debugging purposes.
  56. * Following fail status are common to all classes.
  57. * The preserved message must be handled in the reply handler.
  58. */
  59. static void i2o_report_fail_status(u8 req_status, u32 * msg)
  60. {
  61. static char *FAIL_STATUS[] = {
  62. "0x80", /* not used */
  63. "SERVICE_SUSPENDED", /* 0x81 */
  64. "SERVICE_TERMINATED", /* 0x82 */
  65. "CONGESTION",
  66. "FAILURE",
  67. "STATE_ERROR",
  68. "TIME_OUT",
  69. "ROUTING_FAILURE",
  70. "INVALID_VERSION",
  71. "INVALID_OFFSET",
  72. "INVALID_MSG_FLAGS",
  73. "FRAME_TOO_SMALL",
  74. "FRAME_TOO_LARGE",
  75. "INVALID_TARGET_ID",
  76. "INVALID_INITIATOR_ID",
  77. "INVALID_INITIATOR_CONTEX", /* 0x8F */
  78. "UNKNOWN_FAILURE" /* 0xFF */
  79. };
  80. if (req_status == I2O_FSC_TRANSPORT_UNKNOWN_FAILURE)
  81. printk(KERN_DEBUG "TRANSPORT_UNKNOWN_FAILURE (%0#2x)\n.",
  82. req_status);
  83. else
  84. printk(KERN_DEBUG "TRANSPORT_%s.\n",
  85. FAIL_STATUS[req_status & 0x0F]);
  86. /* Dump some details */
  87. printk(KERN_ERR " InitiatorId = %d, TargetId = %d\n",
  88. (msg[1] >> 12) & 0xFFF, msg[1] & 0xFFF);
  89. printk(KERN_ERR " LowestVersion = 0x%02X, HighestVersion = 0x%02X\n",
  90. (msg[4] >> 8) & 0xFF, msg[4] & 0xFF);
  91. printk(KERN_ERR " FailingHostUnit = 0x%04X, FailingIOP = 0x%03X\n",
  92. msg[5] >> 16, msg[5] & 0xFFF);
  93. printk(KERN_ERR " Severity: 0x%02X ", (msg[4] >> 16) & 0xFF);
  94. if (msg[4] & (1 << 16))
  95. printk(KERN_DEBUG "(FormatError), "
  96. "this msg can never be delivered/processed.\n");
  97. if (msg[4] & (1 << 17))
  98. printk(KERN_DEBUG "(PathError), "
  99. "this msg can no longer be delivered/processed.\n");
  100. if (msg[4] & (1 << 18))
  101. printk(KERN_DEBUG "(PathState), "
  102. "the system state does not allow delivery.\n");
  103. if (msg[4] & (1 << 19))
  104. printk(KERN_DEBUG
  105. "(Congestion), resources temporarily not available;"
  106. "do not retry immediately.\n");
  107. }
  108. /*
  109. * Used for error reporting/debugging purposes.
  110. * Following reply status are common to all classes.
  111. */
  112. static void i2o_report_common_status(u8 req_status)
  113. {
  114. static char *REPLY_STATUS[] = {
  115. "SUCCESS",
  116. "ABORT_DIRTY",
  117. "ABORT_NO_DATA_TRANSFER",
  118. "ABORT_PARTIAL_TRANSFER",
  119. "ERROR_DIRTY",
  120. "ERROR_NO_DATA_TRANSFER",
  121. "ERROR_PARTIAL_TRANSFER",
  122. "PROCESS_ABORT_DIRTY",
  123. "PROCESS_ABORT_NO_DATA_TRANSFER",
  124. "PROCESS_ABORT_PARTIAL_TRANSFER",
  125. "TRANSACTION_ERROR",
  126. "PROGRESS_REPORT"
  127. };
  128. if (req_status >= ARRAY_SIZE(REPLY_STATUS))
  129. printk(KERN_DEBUG "RequestStatus = %0#2x", req_status);
  130. else
  131. printk(KERN_DEBUG "%s", REPLY_STATUS[req_status]);
  132. }
  133. /*
  134. * Used for error reporting/debugging purposes.
  135. * Following detailed status are valid for executive class,
  136. * utility class, DDM class and for transaction error replies.
  137. */
  138. static void i2o_report_common_dsc(u16 detailed_status)
  139. {
  140. static char *COMMON_DSC[] = {
  141. "SUCCESS",
  142. "0x01", // not used
  143. "BAD_KEY",
  144. "TCL_ERROR",
  145. "REPLY_BUFFER_FULL",
  146. "NO_SUCH_PAGE",
  147. "INSUFFICIENT_RESOURCE_SOFT",
  148. "INSUFFICIENT_RESOURCE_HARD",
  149. "0x08", // not used
  150. "CHAIN_BUFFER_TOO_LARGE",
  151. "UNSUPPORTED_FUNCTION",
  152. "DEVICE_LOCKED",
  153. "DEVICE_RESET",
  154. "INAPPROPRIATE_FUNCTION",
  155. "INVALID_INITIATOR_ADDRESS",
  156. "INVALID_MESSAGE_FLAGS",
  157. "INVALID_OFFSET",
  158. "INVALID_PARAMETER",
  159. "INVALID_REQUEST",
  160. "INVALID_TARGET_ADDRESS",
  161. "MESSAGE_TOO_LARGE",
  162. "MESSAGE_TOO_SMALL",
  163. "MISSING_PARAMETER",
  164. "TIMEOUT",
  165. "UNKNOWN_ERROR",
  166. "UNKNOWN_FUNCTION",
  167. "UNSUPPORTED_VERSION",
  168. "DEVICE_BUSY",
  169. "DEVICE_NOT_AVAILABLE"
  170. };
  171. if (detailed_status > I2O_DSC_DEVICE_NOT_AVAILABLE)
  172. printk(KERN_DEBUG " / DetailedStatus = %0#4x.\n",
  173. detailed_status);
  174. else
  175. printk(KERN_DEBUG " / %s.\n", COMMON_DSC[detailed_status]);
  176. }
  177. /*
  178. * Used for error reporting/debugging purposes
  179. */
  180. static void i2o_report_util_cmd(u8 cmd)
  181. {
  182. switch (cmd) {
  183. case I2O_CMD_UTIL_NOP:
  184. printk(KERN_DEBUG "UTIL_NOP, ");
  185. break;
  186. case I2O_CMD_UTIL_ABORT:
  187. printk(KERN_DEBUG "UTIL_ABORT, ");
  188. break;
  189. case I2O_CMD_UTIL_CLAIM:
  190. printk(KERN_DEBUG "UTIL_CLAIM, ");
  191. break;
  192. case I2O_CMD_UTIL_RELEASE:
  193. printk(KERN_DEBUG "UTIL_CLAIM_RELEASE, ");
  194. break;
  195. case I2O_CMD_UTIL_CONFIG_DIALOG:
  196. printk(KERN_DEBUG "UTIL_CONFIG_DIALOG, ");
  197. break;
  198. case I2O_CMD_UTIL_DEVICE_RESERVE:
  199. printk(KERN_DEBUG "UTIL_DEVICE_RESERVE, ");
  200. break;
  201. case I2O_CMD_UTIL_DEVICE_RELEASE:
  202. printk(KERN_DEBUG "UTIL_DEVICE_RELEASE, ");
  203. break;
  204. case I2O_CMD_UTIL_EVT_ACK:
  205. printk(KERN_DEBUG "UTIL_EVENT_ACKNOWLEDGE, ");
  206. break;
  207. case I2O_CMD_UTIL_EVT_REGISTER:
  208. printk(KERN_DEBUG "UTIL_EVENT_REGISTER, ");
  209. break;
  210. case I2O_CMD_UTIL_LOCK:
  211. printk(KERN_DEBUG "UTIL_LOCK, ");
  212. break;
  213. case I2O_CMD_UTIL_LOCK_RELEASE:
  214. printk(KERN_DEBUG "UTIL_LOCK_RELEASE, ");
  215. break;
  216. case I2O_CMD_UTIL_PARAMS_GET:
  217. printk(KERN_DEBUG "UTIL_PARAMS_GET, ");
  218. break;
  219. case I2O_CMD_UTIL_PARAMS_SET:
  220. printk(KERN_DEBUG "UTIL_PARAMS_SET, ");
  221. break;
  222. case I2O_CMD_UTIL_REPLY_FAULT_NOTIFY:
  223. printk(KERN_DEBUG "UTIL_REPLY_FAULT_NOTIFY, ");
  224. break;
  225. default:
  226. printk(KERN_DEBUG "Cmd = %0#2x, ", cmd);
  227. }
  228. }
  229. /*
  230. * Used for error reporting/debugging purposes
  231. */
  232. static void i2o_report_exec_cmd(u8 cmd)
  233. {
  234. switch (cmd) {
  235. case I2O_CMD_ADAPTER_ASSIGN:
  236. printk(KERN_DEBUG "EXEC_ADAPTER_ASSIGN, ");
  237. break;
  238. case I2O_CMD_ADAPTER_READ:
  239. printk(KERN_DEBUG "EXEC_ADAPTER_READ, ");
  240. break;
  241. case I2O_CMD_ADAPTER_RELEASE:
  242. printk(KERN_DEBUG "EXEC_ADAPTER_RELEASE, ");
  243. break;
  244. case I2O_CMD_BIOS_INFO_SET:
  245. printk(KERN_DEBUG "EXEC_BIOS_INFO_SET, ");
  246. break;
  247. case I2O_CMD_BOOT_DEVICE_SET:
  248. printk(KERN_DEBUG "EXEC_BOOT_DEVICE_SET, ");
  249. break;
  250. case I2O_CMD_CONFIG_VALIDATE:
  251. printk(KERN_DEBUG "EXEC_CONFIG_VALIDATE, ");
  252. break;
  253. case I2O_CMD_CONN_SETUP:
  254. printk(KERN_DEBUG "EXEC_CONN_SETUP, ");
  255. break;
  256. case I2O_CMD_DDM_DESTROY:
  257. printk(KERN_DEBUG "EXEC_DDM_DESTROY, ");
  258. break;
  259. case I2O_CMD_DDM_ENABLE:
  260. printk(KERN_DEBUG "EXEC_DDM_ENABLE, ");
  261. break;
  262. case I2O_CMD_DDM_QUIESCE:
  263. printk(KERN_DEBUG "EXEC_DDM_QUIESCE, ");
  264. break;
  265. case I2O_CMD_DDM_RESET:
  266. printk(KERN_DEBUG "EXEC_DDM_RESET, ");
  267. break;
  268. case I2O_CMD_DDM_SUSPEND:
  269. printk(KERN_DEBUG "EXEC_DDM_SUSPEND, ");
  270. break;
  271. case I2O_CMD_DEVICE_ASSIGN:
  272. printk(KERN_DEBUG "EXEC_DEVICE_ASSIGN, ");
  273. break;
  274. case I2O_CMD_DEVICE_RELEASE:
  275. printk(KERN_DEBUG "EXEC_DEVICE_RELEASE, ");
  276. break;
  277. case I2O_CMD_HRT_GET:
  278. printk(KERN_DEBUG "EXEC_HRT_GET, ");
  279. break;
  280. case I2O_CMD_ADAPTER_CLEAR:
  281. printk(KERN_DEBUG "EXEC_IOP_CLEAR, ");
  282. break;
  283. case I2O_CMD_ADAPTER_CONNECT:
  284. printk(KERN_DEBUG "EXEC_IOP_CONNECT, ");
  285. break;
  286. case I2O_CMD_ADAPTER_RESET:
  287. printk(KERN_DEBUG "EXEC_IOP_RESET, ");
  288. break;
  289. case I2O_CMD_LCT_NOTIFY:
  290. printk(KERN_DEBUG "EXEC_LCT_NOTIFY, ");
  291. break;
  292. case I2O_CMD_OUTBOUND_INIT:
  293. printk(KERN_DEBUG "EXEC_OUTBOUND_INIT, ");
  294. break;
  295. case I2O_CMD_PATH_ENABLE:
  296. printk(KERN_DEBUG "EXEC_PATH_ENABLE, ");
  297. break;
  298. case I2O_CMD_PATH_QUIESCE:
  299. printk(KERN_DEBUG "EXEC_PATH_QUIESCE, ");
  300. break;
  301. case I2O_CMD_PATH_RESET:
  302. printk(KERN_DEBUG "EXEC_PATH_RESET, ");
  303. break;
  304. case I2O_CMD_STATIC_MF_CREATE:
  305. printk(KERN_DEBUG "EXEC_STATIC_MF_CREATE, ");
  306. break;
  307. case I2O_CMD_STATIC_MF_RELEASE:
  308. printk(KERN_DEBUG "EXEC_STATIC_MF_RELEASE, ");
  309. break;
  310. case I2O_CMD_STATUS_GET:
  311. printk(KERN_DEBUG "EXEC_STATUS_GET, ");
  312. break;
  313. case I2O_CMD_SW_DOWNLOAD:
  314. printk(KERN_DEBUG "EXEC_SW_DOWNLOAD, ");
  315. break;
  316. case I2O_CMD_SW_UPLOAD:
  317. printk(KERN_DEBUG "EXEC_SW_UPLOAD, ");
  318. break;
  319. case I2O_CMD_SW_REMOVE:
  320. printk(KERN_DEBUG "EXEC_SW_REMOVE, ");
  321. break;
  322. case I2O_CMD_SYS_ENABLE:
  323. printk(KERN_DEBUG "EXEC_SYS_ENABLE, ");
  324. break;
  325. case I2O_CMD_SYS_MODIFY:
  326. printk(KERN_DEBUG "EXEC_SYS_MODIFY, ");
  327. break;
  328. case I2O_CMD_SYS_QUIESCE:
  329. printk(KERN_DEBUG "EXEC_SYS_QUIESCE, ");
  330. break;
  331. case I2O_CMD_SYS_TAB_SET:
  332. printk(KERN_DEBUG "EXEC_SYS_TAB_SET, ");
  333. break;
  334. default:
  335. printk(KERN_DEBUG "Cmd = %#02x, ", cmd);
  336. }
  337. }
  338. void i2o_debug_state(struct i2o_controller *c)
  339. {
  340. printk(KERN_INFO "%s: State = ", c->name);
  341. switch (((i2o_status_block *) c->status_block.virt)->iop_state) {
  342. case 0x01:
  343. printk(KERN_DEBUG "INIT\n");
  344. break;
  345. case 0x02:
  346. printk(KERN_DEBUG "RESET\n");
  347. break;
  348. case 0x04:
  349. printk(KERN_DEBUG "HOLD\n");
  350. break;
  351. case 0x05:
  352. printk(KERN_DEBUG "READY\n");
  353. break;
  354. case 0x08:
  355. printk(KERN_DEBUG "OPERATIONAL\n");
  356. break;
  357. case 0x10:
  358. printk(KERN_DEBUG "FAILED\n");
  359. break;
  360. case 0x11:
  361. printk(KERN_DEBUG "FAULTED\n");
  362. break;
  363. default:
  364. printk(KERN_DEBUG "%x (unknown !!)\n",
  365. ((i2o_status_block *) c->status_block.virt)->iop_state);
  366. }
  367. };
  368. void i2o_dump_hrt(struct i2o_controller *c)
  369. {
  370. u32 *rows = (u32 *) c->hrt.virt;
  371. u8 *p = (u8 *) c->hrt.virt;
  372. u8 *d;
  373. int count;
  374. int length;
  375. int i;
  376. int state;
  377. if (p[3] != 0) {
  378. printk(KERN_ERR
  379. "%s: HRT table for controller is too new a version.\n",
  380. c->name);
  381. return;
  382. }
  383. count = p[0] | (p[1] << 8);
  384. length = p[2];
  385. printk(KERN_INFO "%s: HRT has %d entries of %d bytes each.\n",
  386. c->name, count, length << 2);
  387. rows += 2;
  388. for (i = 0; i < count; i++) {
  389. printk(KERN_INFO "Adapter %08X: ", rows[0]);
  390. p = (u8 *) (rows + 1);
  391. d = (u8 *) (rows + 2);
  392. state = p[1] << 8 | p[0];
  393. printk(KERN_DEBUG "TID %04X:[", state & 0xFFF);
  394. state >>= 12;
  395. if (state & (1 << 0))
  396. printk(KERN_DEBUG "H"); /* Hidden */
  397. if (state & (1 << 2)) {
  398. printk(KERN_DEBUG "P"); /* Present */
  399. if (state & (1 << 1))
  400. printk(KERN_DEBUG "C"); /* Controlled */
  401. }
  402. if (state > 9)
  403. printk(KERN_DEBUG "*"); /* Hard */
  404. printk(KERN_DEBUG "]:");
  405. switch (p[3] & 0xFFFF) {
  406. case 0:
  407. /* Adapter private bus - easy */
  408. printk(KERN_DEBUG
  409. "Local bus %d: I/O at 0x%04X Mem 0x%08X", p[2],
  410. d[1] << 8 | d[0], *(u32 *) (d + 4));
  411. break;
  412. case 1:
  413. /* ISA bus */
  414. printk(KERN_DEBUG
  415. "ISA %d: CSN %d I/O at 0x%04X Mem 0x%08X", p[2],
  416. d[2], d[1] << 8 | d[0], *(u32 *) (d + 4));
  417. break;
  418. case 2: /* EISA bus */
  419. printk(KERN_DEBUG
  420. "EISA %d: Slot %d I/O at 0x%04X Mem 0x%08X",
  421. p[2], d[3], d[1] << 8 | d[0], *(u32 *) (d + 4));
  422. break;
  423. case 3: /* MCA bus */
  424. printk(KERN_DEBUG
  425. "MCA %d: Slot %d I/O at 0x%04X Mem 0x%08X", p[2],
  426. d[3], d[1] << 8 | d[0], *(u32 *) (d + 4));
  427. break;
  428. case 4: /* PCI bus */
  429. printk(KERN_DEBUG
  430. "PCI %d: Bus %d Device %d Function %d", p[2],
  431. d[2], d[1], d[0]);
  432. break;
  433. case 0x80: /* Other */
  434. default:
  435. printk(KERN_DEBUG "Unsupported bus type.");
  436. break;
  437. }
  438. printk(KERN_DEBUG "\n");
  439. rows += length;
  440. }
  441. }
  442. EXPORT_SYMBOL(i2o_dump_message);