scsierrs.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:27k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)scsierrs.c 2.21 99/05/13 Copyright 1987-1996 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)scsierrs.c 2.21 99/05/13 Copyright 1987-1996 J. Schilling";
  5. #endif
  6. /*
  7.  * Error printing for scsitransp.c
  8.  *
  9.  * Copyright (c) 1987-1996 J. Schilling
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2, or (at your option)
  15.  * any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; see the file COPYING.  If not, write to
  24.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  */
  26. #include <mconfig.h>
  27. #include <stdio.h>
  28. #include <standard.h>
  29. #include <scg/scsireg.h>
  30. #include <scg/scsidefs.h>
  31. #include <scg/scgcmd.h> /*XXX JS wird eigentlich nicht benoetigt!! */
  32. /*XXX JS kommt weg, wenn struct sense und status */
  33. /*XXX JS von scgio.h nach scsireg.h kommen */
  34. #include <scg/scsitransp.h>
  35. #define CTYPE_CCS 0
  36. #define CTYPE_MD21 1
  37. #define CTYPE_ACB4000 2
  38. #define CTYPE_SMO_C501 3
  39. #define SMO_C501
  40. EXPORT const char *scsisensemsg __PR((int, int, int,
  41. const char **, char *));
  42. EXPORT void scsierrmsg __PR((SCSI *scgp, struct scsi_sense *,
  43. struct scsi_status *,
  44. int, const char **));
  45. /*
  46.  * Map old non extended sense to sense key.
  47.  */
  48. static u_char sd_adaptec_keys[] = {
  49. 0, 4, 4, 4,  2, 2, 4, 4, /* 0x00-0x07 */
  50. 4, 4, 4, 4,  4, 4, 4, 4, /* 0x08-0x0f */
  51. 4, 3, 3, 3,  3, 4, 3, 1, /* 0x10-0x17 */
  52. 1, 1, 3, 4,  3, 4, 3, 3, /* 0x18-0x1f */
  53. 5, 5, 5, 5,  5, 5, 5, 7, /* 0x20-0x27 */
  54. 6, 6, 6, 5,  4,11,11,11 /* 0x28-0x2f */
  55. };
  56. #define MAX_ADAPTEC_KEYS (sizeof (sd_adaptec_keys))
  57. /*
  58.  * Deviations to CCS found on old pre CCS devices
  59.  */
  60. static const char *sd_adaptec_error_str[] = {
  61. "3100ECC error during verify", /* 0x19 */
  62. "3200interleave error", /* 0x1a */
  63. "3400bad format on drive", /* 0x1c */
  64. "3500self test failed", /* 0x1d */
  65. "3600defective track", /* 0x1e */
  66. "4300volume overflow", /* 0x23 */
  67. "5300set limit violation", /* 0x2b */
  68. "5400error counter overflow", /* 0x2c */
  69. "5500initiator detected error", /* 0x2d */
  70. "5600scsi parity error", /* 0x2e */
  71. "5700adapter parity error", /* 0x2f */
  72. NULL
  73. };
  74. /*
  75.  * The sense codes of SCSI-1/CCS, SCSI-2 and SCSI-3 devices.
  76.  */
  77. static const char *sd_ccs_error_str[] = {
  78. "0000no additional sense information", /* 00 00 */
  79. "0001filemark detected", /* 00 01 */
  80. "0002end-of-partition/medium detected", /* 00 02 */
  81. "0003setmark detected", /* 00 03 */
  82. "0004beginning-of-partition/medium detected", /* 00 04 */
  83. "0005end-of-data detected", /* 00 05 */
  84. "0006i/o process terminated", /* 00 06 */
  85. "0021audio play operation in progress", /* 00 11 */
  86. "0022audio play operation paused", /* 00 12 */
  87. "0023audio play operation successfully completed", /* 00 13 */
  88. "0024audio play operation stopped due to error", /* 00 14 */
  89. "0025no current audio status to return", /* 00 15 */
  90. "0026operation in progress", /* 00 16 */
  91. "0027cleaning requested", /* 00 17 */
  92. "0100no index/sector signal", /* 01 00 */
  93. "0200no seek complete", /* 02 00 */
  94. "0300peripheral device write fault", /* 03 00 */
  95. "0301no write current", /* 03 01 */
  96. "0302excessive write errors", /* 03 02 */
  97. "0400logical unit not ready, cause not reportable", /* 04 00 */
  98. "0401logical unit is in process of becoming ready", /* 04 01 */
  99. "0402logical unit not ready, initializing cmd. required", /* 04 02 */
  100. "0403logical unit not ready, manual intervention required", /* 04 03 */
  101. "0404logical unit not ready, format in progress", /* 04 04 */
  102. "0405logical unit not ready, rebuild in progress", /* 04 05 */
  103. "0406logical unit not ready, recalculation in progress", /* 04 06 */
  104. "0407logical unit not ready, operation in progress",/* 04 07 */
  105. "0410logical unit not ready, long write in progress", /* 04 08 */
  106. "0500logical unit does not respond to selection", /* 05 00 */
  107. "0600no reference position found", /* 06 00 */
  108. "0700multiple peripheral devices selected", /* 07 00 */
  109. "1000logical unit communication failure", /* 08 00 */
  110. "1001logical unit communication time-out", /* 08 01 */
  111. "1002logical unit communication parity error", /* 08 02 */
  112. "1003logical unit communication crc error (ultra-dma/32)", /* 08 03 */
  113. "1100track following error", /* 09 00 */
  114. "1101tracking servo failure", /* 09 01 */
  115. "1102focus servo failure", /* 09 02 */
  116. "1103spindle servo failure", /* 09 03 */
  117. "1104head select fault", /* 09 04 */
  118. "1200error log overflow", /* 0A 00 */
  119. "1300warning", /* 0B 00 */
  120. "1301warning - specified temperature exceeded", /* 0B 01 */
  121. "1302warning - enclosure degraded", /* 0B 02 */
  122. "1400write error", /* 0C 00 */
  123. "1401write error - recovered with auto reallocation", /* 0C 01 */
  124. "1402write error - auto reallocation failed", /* 0C 02 */
  125. "1403write error - recommend reassignment", /* 0C 03 */
  126. "1404compression check miscompare error", /* 0C 04 */
  127. "1405data expansion occurred during compression", /* 0C 05 */
  128. "1406block not compressible", /* 0C 06 */
  129. "1407write error - recovery needed", /* 0C 07 */
  130. "1410write error - recovery failed", /* 0C 08 */
  131. "1411write error - loss of streaming", /* 0C 09 */
  132. "1412write error - padding blocks added", /* 0C 0A */
  133. "2000id crc or ecc error", /* 10 00 */
  134. "2100unrecovered read error", /* 11 00 */
  135. "2101read retries exhausted", /* 11 01 */
  136. "2102error too long to correct", /* 11 02 */
  137. "2103multiple read errors", /* 11 03 */
  138. "2104unrecovered read error - auto reallocate failed", /* 11 04 */
  139. "2105l-ec uncorrectable error", /* 11 05 */
  140. "2106circ unrecovered error", /* 11 06 */
  141. "2107data re-synchronization error", /* 11 07 */
  142. "2110incomplete block read", /* 11 08 */
  143. "2111no gap found", /* 11 09 */
  144. "2112miscorrected error", /* 11 0A */
  145. "2113unrecovered read error - recommend reassignment", /* 11 0B */
  146. "2114unrecovered read error - recommend rewrite the data", /* 11 0C */
  147. "2115de-compression crc error", /* 11 0D */
  148. "2116cannot decompress using declared algorithm", /* 11 0E */
  149. "2117error reading upc/ean number", /* 11 0F */
  150. "2120error reading isrc number", /* 11 10 */
  151. "2121read error - loss of streaming", /* 11 11 */
  152. "2200address mark not found for id field", /* 12 00 */
  153. "2300address mark not found for data field", /* 13 00 */
  154. "2400recorded entity not found", /* 14 00 */
  155. "2401record not found", /* 14 01 */
  156. "2402filemark or setmark not found", /* 14 02 */
  157. "2403end-of-data not found", /* 14 03 */
  158. "2404block sequence error", /* 14 04 */
  159. "2405record not found - recommend reassignment", /* 14 05 */
  160. "2406record not found - data auto-reallocated", /* 14 06 */
  161. "2500random positioning error", /* 15 00 */
  162. "2501mechanical positioning error", /* 15 01 */
  163. "2502positioning error detected by read of medium", /* 15 02 */
  164. "2600data synchronization mark error", /* 16 00 */
  165. "2601data sync error - data rewritten", /* 16 01 */
  166. "2602data sync error - recommend rewrite", /* 16 02 */
  167. "2603data sync error - data auto-reallocated", /* 16 03 */
  168. "2604data sync error - recommend reassignment", /* 16 04 */
  169. "2700recovered data with no error correction applied", /* 17 00 */
  170. "2701recovered data with retries", /* 17 01 */
  171. "2702recovered data with positive head offset", /* 17 02 */
  172. "2703recovered data with negative head offset", /* 17 03 */
  173. "2704recovered data with retries and/or circ applied", /* 17 04 */
  174. "2705recovered data using previous sector id", /* 17 05 */
  175. "2706recovered data without ecc - data auto-reallocated", /* 17 06 */
  176. "2707recovered data without ecc - recommend reassignment", /* 17 07 */
  177. "2710recovered data without ecc - recommend rewrite", /* 17 08 */
  178. "2711recovered data without ecc - data rewritten", /* 17 09 */
  179. "3000recovered data with error correction applied", /* 18 00 */
  180. "3001recovered data with error corr. & retries applied", /* 18 01 */
  181. "3002recovered data - data auto-reallocated", /* 18 02 */
  182. "3003recovered data with circ", /* 18 03 */
  183. "3004recovered data with l-ec", /* 18 04 */
  184. "3005recovered data - recommend reassignment", /* 18 05 */
  185. "3006recovered data - recommend rewrite", /* 18 06 */
  186. "3007recovered data with ecc - data rewritten", /* 18 07 */
  187. "3100defect list error", /* 19 00 */
  188. "3101defect list not available", /* 19 01 */
  189. "3102defect list error in primary list", /* 19 02 */
  190. "3103defect list error in grown list", /* 19 03 */
  191. "3200parameter list length error", /* 1A 00 */
  192. "3300synchronous data transfer error", /* 1B 00 */
  193. "3400defect list not found", /* 1C 00 */
  194. "3401primary defect list not found", /* 1C 01 */
  195. "3402grown defect list not found", /* 1C 02 */
  196. "3500miscompare during verify operation", /* 1D 00 */
  197. "3600recovered id with ecc correction", /* 1E 00 */
  198. "3700partial defect list transfer", /* 1F 00 */
  199. "4000invalid command operation code", /* 20 00 */
  200. "4100logical block address out of range", /* 21 00 */
  201. "4101invalid element address", /* 21 01 */
  202. "4200illegal function (use 20 00, 24 00, or 26 00)",/* 22 00 */
  203. "4400invalid field in cdb", /* 24 00 */
  204. "4500logical unit not supported", /* 25 00 */
  205. "4600invalid field in parameter list", /* 26 00 */
  206. "4601parameter not supported", /* 26 01 */
  207. "4602parameter value invalid", /* 26 02 */
  208. "4603threshold parameters not supported", /* 26 03 */
  209. "4604invalid release of active persistent reservation", /* 26 04 */
  210. "4700write protected", /* 27 00 */
  211. "4701hardware write protected", /* 27 01 */
  212. "4702logical unit software write protected", /* 27 02 */
  213. "4703associated write protect", /* 27 03 */
  214. "4704persistent write protect", /* 27 04 */
  215. "4705permanent write protect", /* 27 05 */
  216. "5000not ready to ready change, medium may have changed", /* 28 00 */
  217. "5001import or export element accessed", /* 28 01 */
  218. "5100power on, reset, or bus device reset occurred",/* 29 00 */
  219. "5101power on occurred", /* 29 01 */
  220. "5102scsi bus reset occurred", /* 29 02 */
  221. "5103bus device reset function occurred", /* 29 03 */
  222. "5104device internal reset", /* 29 04 */
  223. "5105transceiver mode changed to single-ended", /* 29 05 */
  224. "5106transceiver mode changed to lvd", /* 29 06 */
  225. "5200parameters changed", /* 2A 00 */
  226. "5201mode parameters changed", /* 2A 01 */
  227. "5202log parameters changed", /* 2A 02 */
  228. "5203reservations preempted", /* 2A 03 */
  229. "5300copy cannot execute since host cannot disconnect", /* 2B 00 */
  230. "5400command sequence error", /* 2C 00 */
  231. "5401too many windows specified", /* 2C 01 */
  232. "5402invalid combination of windows specified", /* 2C 02 */
  233. "5403current program area is not empty", /* 2C 03 */
  234. "5404current program area is empty", /* 2C 04 */
  235. "5500overwrite error on update in place", /* 2D 00 */
  236. "5700commands cleared by another initiator", /* 2F 00 */
  237. "6000incompatible medium installed", /* 30 00 */
  238. "6001cannot read medium - unknown format", /* 30 01 */
  239. "6002cannot read medium - incompatible format", /* 30 02 */
  240. "6003cleaning cartridge installed", /* 30 03 */
  241. "6004cannot write medium - unknown format", /* 30 04 */
  242. "6005cannot write medium - incompatible format", /* 30 05 */
  243. "6006cannot format medium - incompatible medium", /* 30 06 */
  244. "6007cleaning failure", /* 30 07 */
  245. "6010cannot write - application code mismatch", /* 30 08 */
  246. "6011current session not fixated for append", /* 30 09 */
  247. "6100medium format corrupted", /* 31 00 */
  248. "6101format command failed", /* 31 01 */
  249. "6200no defect spare location available", /* 32 00 */
  250. "6201defect list update failure", /* 32 01 */
  251. "6300tape length error", /* 33 00 */
  252. "6400enclosure failure", /* 34 00 */
  253. "6500enclosure services failure", /* 35 00 */
  254. "6501unsupported enclosure function", /* 35 01 */
  255. "6502enclosure services unavailable", /* 35 02 */
  256. "6503enclosure services transfer failure", /* 35 03 */
  257. "6504enclosure services transfer refused", /* 35 04 */
  258. "6600ribbon, ink, or toner failure", /* 36 00 */
  259. "6700rounded parameter", /* 37 00 */
  260. "7100saving parameters not supported", /* 39 00 */
  261. "7200medium not present", /* 3A 00 */
  262. "7201medium not present - tray closed", /* 3A 01 */
  263. "7202medium not present - tray open", /* 3A 02 */
  264. "7300sequential positioning error", /* 3B 00 */
  265. "7301tape position error at beginning-of-medium", /* 3B 01 */
  266. "7302tape position error at end-of-medium", /* 3B 02 */
  267. "7303tape or electronic vertical forms unit not ready", /* 3B 03 */
  268. "7304slew failure", /* 3B 04 */
  269. "7305paper jam", /* 3B 05 */
  270. "7306failed to sense top-of-form", /* 3B 06 */
  271. "7307failed to sense bottom-of-form", /* 3B 07 */
  272. "7310reposition error", /* 3B 08 */
  273. "7311read past end of medium", /* 3B 09 */
  274. "7312read past beginning of medium", /* 3B 0A */
  275. "7313position past end of medium", /* 3B 0B */
  276. "7314position past beginning of medium", /* 3B 0C */
  277. "7315medium destination element full", /* 3B 0D */
  278. "7316medium source element empty", /* 3B 0E */
  279. "7317end of medium reached", /* 3B 0F */
  280. "7321medium magazine not accessible", /* 3B 11 */
  281. "7322medium magazine removed", /* 3B 12 */
  282. "7323medium magazine inserted", /* 3B 13 */
  283. "7324medium magazine locked", /* 3B 14 */
  284. "7325medium magazine unlocked", /* 3B 15 */
  285. "7500invalid bits in identify message", /* 3D 00 */
  286. "7600logical unit has not self-configured yet", /* 3E 00 */
  287. "7601logical unit failure", /* 3E 01 */
  288. "7602timeout on logical unit", /* 3E 02 */
  289. "7700target operating conditions have changed", /* 3F 00 */
  290. "7701microcode has been changed", /* 3F 01 */
  291. "7702changed operating definition", /* 3F 02 */
  292. "7703inquiry data has changed", /* 3F 03 */
  293. "10000ram failure (should use 40 nn)", /* 40 00 */
  294. #ifdef XXX
  295. "10000nn diagnostic failure on component nn (80h-ffh)", /* 40 00 */
  296. #endif
  297. "10100data path failure (should use 40 nn)", /* 41 00 */
  298. "10200power-on or self-test failure (should use 40 nn)", /* 42 00 */
  299. "10300message error", /* 43 00 */
  300. "10400internal target failure", /* 44 00 */
  301. "10500select or reselect failure", /* 45 00 */
  302. "10600unsuccessful soft reset", /* 46 00 */
  303. "10700scsi parity error", /* 47 00 */
  304. "11000initiator detected error message received", /* 48 00 */
  305. "11100invalid message error", /* 49 00 */
  306. "11200command phase error", /* 4A 00 */
  307. "11300data phase error", /* 4B 00 */
  308. "11400logical unit failed self-configuration", /* 4C 00 */
  309. #ifdef XXX
  310. "11500nn tagged overlapped commands (nn = queue tag)", /* 4D 00 */
  311. #endif
  312. "11600overlapped commands attempted", /* 4E 00 */
  313. "12000write append error", /* 50 00 */
  314. "12001write append position error", /* 50 01 */
  315. "12002position error related to timing", /* 50 02 */
  316. "12100erase failure", /* 51 00 */
  317. "12200cartridge fault", /* 52 00 */
  318. "12300media load or eject failed", /* 53 00 */
  319. "12301unload tape failure", /* 53 01 */
  320. "12302medium removal prevented", /* 53 02 */
  321. "12400scsi to host system interface failure", /* 54 00 */
  322. "12500system resource failure", /* 55 00 */
  323. "12501system buffer full", /* 55 01 */
  324. "12700unable to recover table-of-contents", /* 57 00 */
  325. "13000generation does not exist", /* 58 00 */
  326. "13100updated block read", /* 59 00 */
  327. "13200operator request or state change input", /* 5A 00 */
  328. "13201operator medium removal request", /* 5A 01 */
  329. "13202operator selected write protect", /* 5A 02 */
  330. "13203operator selected write permit", /* 5A 03 */
  331. "13300log exception", /* 5B 00 */
  332. "13301threshold condition met", /* 5B 01 */
  333. "13302log counter at maximum", /* 5B 02 */
  334. "13303log list codes exhausted", /* 5B 03 */
  335. "13400rpl status change", /* 5C 00 */
  336. "13401spindles synchronized", /* 5C 01 */
  337. "13402spindles not synchronized", /* 5C 02 */
  338. "13500failure prediction threshold exceeded", /* 5D 00 */
  339. "135377failure prediction threshold exceeded (false)",/* 5D FF */
  340. "13600low power condition on", /* 5E 00 */
  341. "13601idle condition activated by timer", /* 5E 01 */
  342. "13602standby condition activated by timer", /* 5E 02 */
  343. "13603idle condition activated by command", /* 5E 03 */
  344. "13604standby condition activated by command", /* 5E 04 */
  345. "14000lamp failure", /* 60 00 */
  346. "14100video acquisition error", /* 61 00 */
  347. "14101unable to acquire video", /* 61 01 */
  348. "14102out of focus", /* 61 02 */
  349. "14200scan head positioning error", /* 62 00 */
  350. "14300end of user area encountered on this track", /* 63 00 */
  351. "14301packet does not fit in available space", /* 63 01 */
  352. "14400illegal mode for this track", /* 64 00 */
  353. "14401invalid packet size", /* 64 01 */
  354. "14500voltage fault", /* 65 00 */
  355. "14600automatic document feeder cover up", /* 66 00 */
  356. "14601automatic document feeder lift up", /* 66 01 */
  357. "14602document jam in automatic document feeder", /* 66 02 */
  358. "14603document miss feed automatic in document feeder", /* 66 03 */
  359. "14700configuration failure", /* 67 00 */
  360. "14701configuration of incapable logical units failed", /* 67 01 */
  361. "14702add logical unit failed", /* 67 02 */
  362. "14703modification of logical unit failed", /* 67 03 */
  363. "14704exchange of logical unit failed", /* 67 04 */
  364. "14705remove of logical unit failed", /* 67 05 */
  365. "14706attachment of logical unit failed", /* 67 06 */
  366. "14707creation of logical unit failed", /* 67 07 */
  367. "15000logical unit not configured", /* 68 00 */
  368. "15100data loss on logical unit", /* 69 00 */
  369. "15101multiple logical unit failures", /* 69 01 */
  370. "15102parity/data mismatch", /* 69 02 */
  371. "15200informational, refer to log", /* 6A 00 */
  372. "15300state change has occurred", /* 6B 00 */
  373. "15301redundancy level got better", /* 6B 01 */
  374. "15302redundancy level got worse", /* 6B 02 */
  375. "15400rebuild failure occurred", /* 6C 00 */
  376. "15500recalculate failure occurred", /* 6D 00 */
  377. "15600command to logical unit failed", /* 6E 00 */
  378. #ifdef XXX
  379. "16000nn decompression exception short algorithm id of nn", /* 70 00 */
  380. #endif
  381. "16100decompression exception long algorithm id", /* 71 00 */
  382. "16200session fixation error", /* 72 00 */
  383. "16201session fixation error writing lead-in", /* 72 01 */
  384. "16202session fixation error writing lead-out", /* 72 02 */
  385. "16203session fixation error - incomplete track in session", /* 72 03 */
  386. "16204empty or partially written reserved track", /* 72 04 */
  387. "16300cd control error", /* 73 00 */
  388. "16301power calibration area almost full", /* 73 01 */
  389. "16302power calibration area is full", /* 73 02 */
  390. "16303power calibration area error", /* 73 03 */
  391. "16304program memory area update failure", /* 73 04 */
  392. "16305program memory area is full", /* 73 05 */
  393. #ifdef XXX
  394. "20000start vendor unique", /* 80 00 */
  395. #endif
  396. NULL
  397. };
  398. #ifdef SMO_C501
  399. static const char *sd_smo_c501_error_str[] = {
  400. "1200disk not inserted", /* 0x0a */
  401. "1300load/unload failure", /* 0x0b */
  402. "1400spindle failure", /* 0x0c */
  403. "1500focus failure", /* 0x0d */
  404. "1600tracking failure", /* 0x0e */
  405. "1700bias magnet failure", /* 0x0f */
  406. "4300illegal function for medium type", /* 0x23 */
  407. /*XXX*/ "7000recoverable write error", /* 0x38 */
  408. /*XXX*/ "7100write error recovery failed", /* 0x39 */
  409. "7200defect list update failed", /* 0x3a */
  410. "7500defect list not available", /* 0x3d */
  411. "20000limited laser life", /* 0x80 */
  412. "20100laser focus coil over-current", /* 0x81 */
  413. "20200laser tracking coil over-current", /* 0x82 */
  414. "20300temperature alarm", /* 0x83 */
  415. NULL
  416. };
  417. #endif
  418. static char *sd_sense_keys[] = {
  419. "No Additional Sense", /* 0x00 */
  420. "Recovered Error", /* 0x01 */
  421. "Not Ready", /* 0x02 */
  422. "Medium Error", /* 0x03 */
  423. "Hardware Error", /* 0x04 */
  424. "Illegal Request", /* 0x05 */
  425. "Unit Attention", /* 0x06 */
  426. "Data Protect", /* 0x07 */
  427. "Blank Check", /* 0x08 */
  428. "Vendor Unique", /* 0x09 */
  429. "Copy Aborted", /* 0x0a */
  430. "Aborted Command", /* 0x0b */
  431. "Equal", /* 0x0c */
  432. "Volume Overflow", /* 0x0d */
  433. "Miscompare", /* 0x0e */
  434. "Reserved" /* 0x0f */
  435. };
  436. static char *sd_cmds[] = {
  437. "00test unit ready", /* 0x00 */
  438. "01rezero", /* 0x01 */
  439. "03request sense", /* 0x03 */
  440. "04format", /* 0x04 */
  441. "07reassign", /* 0x07 */
  442. "10read", /* 0x08 */
  443. "12write", /* 0x0a */
  444. "13seek", /* 0x0b */
  445. "22inquiry", /* 0x12 */
  446. "25mode select", /* 0x15 */
  447. "26reserve", /* 0x16 */
  448. "27release", /* 0x17 */
  449. "30copy", /* 0x18 */
  450. "32mode sense", /* 0x1a */
  451. "33start/stop", /* 0x1b */
  452. "36door lock", /* 0x1e */
  453. "67read defect data", /* 0x37 */
  454. NULL
  455. };
  456. EXPORT
  457. const char *
  458. scsisensemsg(ctype, code, qual, vec, sbuf)
  459. register  int ctype;
  460. register  int code;
  461. register  int qual;
  462. register const char **vec;
  463. char *sbuf;
  464. {
  465. register int i;
  466. /*
  467.  * Ignore controller type if error vec is supplied.
  468.  */
  469. if (vec == (const char **)NULL) switch (ctype) {
  470. case DEV_MD21:
  471. vec = sd_ccs_error_str;
  472. break;
  473. case DEV_ACB40X0:
  474. case DEV_ACB4000:
  475. case DEV_ACB4010:
  476. case DEV_ACB4070:
  477. case DEV_ACB5500:
  478. vec = sd_adaptec_error_str;
  479. break;
  480. #ifdef SMO_C501
  481. case DEV_SONY_SMO:
  482. vec = sd_smo_c501_error_str;
  483. break;
  484. #endif
  485. default:
  486. vec = sd_ccs_error_str;
  487. }
  488. if (vec == (const char **)NULL)
  489. return ("");
  490. for (i = 0; i < 2; i++) {
  491. while (*vec != (char *) NULL) {
  492. if (code == (u_char)(*vec)[0] &&
  493. qual == (u_char)(*vec)[1]) {
  494. return (&(*vec)[2]);
  495. } else {
  496. vec++; /* Next entry */
  497. }
  498. }
  499. if (*vec == (char *) NULL) /* End of List: switch over */
  500. vec = sd_ccs_error_str;
  501. }
  502. if (code == 0x40) {
  503. sprintf(sbuf, "diagnostic failure on component 0x%X", qual);
  504. return (sbuf);
  505. }
  506. if (code == 0x4D) {
  507. sprintf(sbuf, "tagged overlapped commands, queue tag is 0x%X",
  508. qual);
  509. return (sbuf);
  510. }
  511. if (code == 0x70) {
  512. sprintf(sbuf,
  513. "decompression exception short algorithm id of 0x%X",
  514. qual);
  515. return (sbuf);
  516. }
  517. if (qual != 0)
  518. return ((char *)NULL);
  519. if (code < 0x80) {
  520. sprintf(sbuf, "invalid sense code 0x%X", code);
  521. return (sbuf);
  522. }
  523. sprintf(sbuf, "vendor unique sense code 0x%X", code);
  524. return (sbuf);
  525. }
  526. #undef sense /*XXX JS Hack, solange scgio.h noch nicht fertig ist */
  527. EXPORT void
  528. scsierrmsg(scgp, sense, status, sense_code, errvec)
  529. SCSI *scgp;
  530. register struct scsi_sense *sense;
  531. register struct scsi_status *status;
  532. int sense_code;
  533. const char  **errvec;
  534. {
  535. char sbuf[80];
  536. const char *sensemsg, *cmdname, *sensekey;
  537. #define ext_sense ((struct scsi_ext_sense* ) sense)
  538. register int blkno = 0;
  539. register int code;
  540. int badqual = 0;
  541. int qual = 0;
  542. int fru = 0;
  543. int key = 0;
  544. int segment = 0;
  545. int blkvalid = 0;
  546. int fm = 0;
  547. int eom = 0;
  548. int ili = 0;
  549. int sksv = 0;
  550. sensekey = sensemsg = "[]";
  551. if (sense->code >= 0x70) {
  552. if (sense_code >= 0)
  553. code = sense_code;
  554. else
  555. code = ext_sense->sense_code;
  556. segment = ext_sense->seg_num;
  557. qual = ext_sense->qual_code;
  558. fru = ext_sense->fru_code;
  559. sksv = ext_sense->sksv;
  560. } else {
  561. code = sense->code;
  562. }
  563. if (status->chk == 0) {
  564. sensemsg = "no sense";
  565. } else {
  566. if (sense->code >= 0x70) {
  567. key = ext_sense->key;
  568. if (key < 0x10)
  569. sensekey = sd_sense_keys[ext_sense->key];
  570. else
  571. sensekey = "invalid sensekey";
  572. blkno = (ext_sense->info_1 << 24) |
  573. (ext_sense->info_2 << 16) |
  574. (ext_sense->info_3 << 8) |
  575. ext_sense->info_4;
  576. fm = ext_sense->fil_mk;
  577. eom = ext_sense->eom;
  578. ili = ext_sense->ili;
  579. } else {
  580. key = -1;
  581. sensekey = "[]";
  582. blkno = (sense->high_addr << 16) |
  583. (sense->mid_addr << 8) |
  584. sense->low_addr;
  585. fm = eom = 0;
  586. }
  587. blkvalid = sense->adr_val;
  588. sensemsg = scsisensemsg(scgp->dev, code, qual, errvec, sbuf);
  589. if (sensemsg == NULL) {
  590. sensemsg = scsisensemsg(scgp->dev, code, 0, errvec, sbuf);
  591. badqual = 1;
  592. }
  593. }
  594. /*
  595. if (un->un_cmd < sizeof(scsi_cmds)) {
  596. cmdname = scsi_cmds[un->un_cmd];
  597. } else {
  598. cmdname = "unknown cmd";
  599. }
  600. */
  601. cmdname = "";
  602. printf("%sSense Key: 0x%X %s%s, Segment %dn",
  603. cmdname, key, sensekey,
  604. (sense->code == 0x71)?", deferred error":"",
  605. segment);
  606. printf("Sense Code: 0x%02X Qual 0x%02X %s%s%s%s Fru 0x%Xn",
  607. code, qual, *sensemsg?"(":"", sensemsg, *sensemsg?")":"",
  608. badqual? " [No matching qualifier]":"",
  609. fru);
  610. printf("Sense flags: Blk %d %s%s%s%s",
  611. blkno, blkvalid?"(valid) ":"(not valid) ",
  612. fm?"file mark detected ":"",
  613. eom?"end of medium ":"",
  614. ili?"illegal block length ":"");
  615. if (!sksv) {
  616. printf("n");
  617. return;
  618. }
  619. switch (key) {
  620. case SC_ILLEGAL_REQUEST:
  621. printf("error refers to %s part, bit ptr %d %s field ptr %d",
  622. ext_sense->cd? "command":"data",
  623. ext_sense->bptr,
  624. ext_sense->bpv? "(valid)":"(not valid)",
  625. ext_sense->field_ptr[0] << 8 |
  626. ext_sense->field_ptr[1]);
  627. break;
  628. case SC_RECOVERABLE_ERROR:
  629. case SC_HARDWARE_ERROR:
  630. case SC_MEDIUM_ERROR:
  631. printf("actual retry count %d",
  632. ext_sense->field_ptr[0] << 8 |
  633. ext_sense->field_ptr[1]);
  634. break;
  635. case SC_NOT_READY:
  636. printf("operation %d%% done",
  637. (100*(ext_sense->field_ptr[0] << 8 |
  638.       ext_sense->field_ptr[1]))/(unsigned)65536);
  639. break;
  640. }
  641. printf("n");
  642. }
  643. #ifdef DEBUG
  644. print_err(code, ctype)
  645. {
  646. register int i;
  647. register char **vec  = (char **)NULL;
  648. switch (ctype) {
  649. case CTYPE_MD21:
  650. case CTYPE_CCS:
  651. vec = sd_ccs_error_str;
  652. break;
  653. case CTYPE_ACB4000:
  654. vec = sd_adaptec_error_str;
  655. break;
  656. #ifdef SMO_C501
  657. case CTYPE_SMO_C501:
  658. vec = sd_smo_c501_error_str;
  659. break;
  660. #endif
  661. #ifdef CDD_521
  662. case DEV_CDD_521:
  663. vec = sd_cdd_521_error_str;
  664. break;
  665. #endif
  666. }
  667. printf("error code: 0x%x", code);
  668. if (vec == (char **)NULL)
  669. return;
  670. for (i = 0; i < 2; i++) {
  671. while (*vec != (char *) NULL) {
  672. if (code == (u_char)*vec[0]) {
  673. printf(" (%s)", (char *)((int)(*vec)+1));
  674. return;
  675. } else
  676. vec++;
  677. }
  678. if (*vec == (char *) NULL)
  679. vec = sd_ccs_error_str;
  680. }
  681. }
  682. main()
  683. {
  684. int i;
  685. #ifdef ACB
  686. for (i = 0; i < 0x30; i++) {
  687. /* printf("Code: 0x%x Key: 0x%x ", i, sd_adaptec_keys[i]);*/
  688. printf("Key: 0x%x %-16s ", sd_adaptec_keys[i],
  689. sd_sense_keys[sd_adaptec_keys[i]] );
  690. print_err(i, CTYPE_ACB4000);
  691. printf("n");
  692. }
  693. #else
  694. /* for (i = 0; i < 0x84; i++) {*/
  695. for (i = 0; i < 0xd8; i++) {
  696. /* print_err(i, CTYPE_SMO_C501);*/
  697. print_err(i, DEV_CDD_521);
  698. printf("n");
  699. }
  700. #endif
  701. }
  702. #endif