debug.c 12 KB

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