Imported Upstream version 1.1.11
[platform/upstream/cdrkit.git] / libusal / scsierrs.c
1 /*
2  * This file has been modified for the cdrkit suite.
3  *
4  * The behaviour and appearence of the program code below can differ to a major
5  * extent from the version distributed by the original author(s).
6  *
7  * For details, see Changelog file distributed with the cdrkit package. If you
8  * received this file from another source then ask the distributing person for
9  * a log of modifications.
10  *
11  */
12
13 /* @(#)scsierrs.c       2.29 04/06/17 Copyright 1987-1996 J. Schilling */
14 /*
15  *      Error printing for scsitransp.c
16  *
17  *      Copyright (c) 1987-1996 J. Schilling
18  */
19 /*
20  * This program is free software; you can redistribute it and/or modify
21  * it under the terms of the GNU General Public License version 2
22  * as published by the Free Software Foundation.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License along with
30  * this program; see the file COPYING.  If not, write to the Free Software
31  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
32  */
33
34 #include <mconfig.h>
35
36 #include <stdio.h>
37 #include <unixstd.h>    /* for sys/types.h needed in schily.h for sprintf() */
38 #include <standard.h>
39 #include <schily.h>
40
41 #include <usal/scsireg.h>
42 #include <usal/scsidefs.h>
43 #include <usal/usalcmd.h>       /*XXX JS wird eigentlich nicht benoetigt!!      */
44                         /*XXX JS kommt weg, wenn struct sense und status */
45                         /*XXX JS von usalio.h nach scsireg.h kommen     */
46 #include <usal/scsitransp.h>
47
48 #define CTYPE_CCS       0
49 #define CTYPE_MD21      1
50 #define CTYPE_ACB4000   2
51 #define CTYPE_SMO_C501  3
52
53 #define SMO_C501
54
55 const char      *usal_sensemsg(int, int, int, const char **, char *, int maxcnt);
56 int usal__errmsg(SCSI *usalp, char *obuf, int maxcnt, struct scsi_sense *, 
57                                          struct scsi_status *, int);
58 #if 0
59 /*
60  * Map old non extended sense to sense key.
61  */
62 static Uchar sd_adaptec_keys[] = {
63         0, 4, 4, 4,  2, 2, 4, 4,                /* 0x00-0x07 */
64         4, 4, 4, 4,  4, 4, 4, 4,                /* 0x08-0x0f */
65         4, 3, 3, 3,  3, 4, 3, 1,                /* 0x10-0x17 */
66         1, 1, 3, 4,  3, 4, 3, 3,                /* 0x18-0x1f */
67         5, 5, 5, 5,  5, 5, 5, 7,                /* 0x20-0x27 */
68         6, 6, 6, 5,  4,11,11,11                 /* 0x28-0x2f */
69 };
70 #define MAX_ADAPTEC_KEYS (sizeof (sd_adaptec_keys))
71 #endif
72
73 /*
74  * Deviations to CCS found on old pre CCS devices
75  */
76 static const char *sd_adaptec_error_str[] = {
77         "\031\000ECC error during verify",              /* 0x19 */
78         "\032\000interleave error",                     /* 0x1a */
79         "\034\000bad format on drive",                  /* 0x1c */
80         "\035\000self test failed",                     /* 0x1d */
81         "\036\000defective track",                      /* 0x1e */
82         "\043\000volume overflow",                      /* 0x23 */
83         "\053\000set limit violation",                  /* 0x2b */
84         "\054\000error counter overflow",               /* 0x2c */
85         "\055\000initiator detected error",             /* 0x2d */
86         "\056\000scsi parity error",                    /* 0x2e */
87         "\057\000adapter parity error",                 /* 0x2f */
88         NULL
89 };
90
91 /*
92  * The sense codes of SCSI-1/CCS, SCSI-2 and SCSI-3 devices.
93  */
94 static const char *sd_ccs_error_str[] = {
95         "\000\000no additional sense information",              /* 00 00 */
96         "\000\001filemark detected",                            /* 00 01 */
97         "\000\002end-of-partition/medium detected",             /* 00 02 */
98         "\000\003setmark detected",                             /* 00 03 */
99         "\000\004beginning-of-partition/medium detected",       /* 00 04 */
100         "\000\005end-of-data detected",                         /* 00 05 */
101         "\000\006i/o process terminated",                       /* 00 06 */
102         "\000\021audio play operation in progress",             /* 00 11 */
103         "\000\022audio play operation paused",                  /* 00 12 */
104         "\000\023audio play operation successfully completed",  /* 00 13 */
105         "\000\024audio play operation stopped due to error",    /* 00 14 */
106         "\000\025no current audio status to return",            /* 00 15 */
107         "\000\026operation in progress",                        /* 00 16 */
108         "\000\027cleaning requested",                           /* 00 17 */
109         "\001\000no index/sector signal",                       /* 01 00 */
110         "\002\000no seek complete",                             /* 02 00 */
111         "\003\000peripheral device write fault",                /* 03 00 */
112         "\003\001no write current",                             /* 03 01 */
113         "\003\002excessive write errors",                       /* 03 02 */
114         "\004\000logical unit not ready, cause not reportable", /* 04 00 */
115         "\004\001logical unit is in process of becoming ready", /* 04 01 */
116         "\004\002logical unit not ready, initializing cmd. required",   /* 04 02 */
117         "\004\003logical unit not ready, manual intervention required", /* 04 03 */
118         "\004\004logical unit not ready, format in progress",   /* 04 04 */
119         "\004\005logical unit not ready, rebuild in progress",  /* 04 05 */
120         "\004\006logical unit not ready, recalculation in progress",    /* 04 06 */
121         "\004\007logical unit not ready, operation in progress",/* 04 07 */
122         "\004\010logical unit not ready, long write in progress",       /* 04 08 */
123         "\004\011logical unit not ready, self-test in progress",/* 04 09 */
124         "\004\012asymmetric access code 3 (00-232) [proposed]", /* 04 0A */
125         "\004\013asymmetric access code 1 (00-232) [proposed]", /* 04 0B */
126         "\004\014asymmetric access code 2 (00-232) [proposed]", /* 04 0C */
127         "\004\020auxiliary memory code 2 (99-148) [proposed]",  /* 04 10 */
128         "\005\000logical unit does not respond to selection",   /* 05 00 */
129         "\006\000no reference position found",                  /* 06 00 */
130         "\007\000multiple peripheral devices selected",         /* 07 00 */
131         "\010\000logical unit communication failure",           /* 08 00 */
132         "\010\001logical unit communication time-out",          /* 08 01 */
133         "\010\002logical unit communication parity error",      /* 08 02 */
134         "\010\003logical unit communication crc error (ultra-dma/32)",  /* 08 03 */
135         "\010\004unreachable copy target",                      /* 08 04 */
136         "\011\000track following error",                        /* 09 00 */
137         "\011\001tracking servo failure",                       /* 09 01 */
138         "\011\002focus servo failure",                          /* 09 02 */
139         "\011\003spindle servo failure",                        /* 09 03 */
140         "\011\004head select fault",                            /* 09 04 */
141         "\012\000error log overflow",                           /* 0A 00 */
142         "\013\000warning",                                      /* 0B 00 */
143         "\013\001warning - specified temperature exceeded",     /* 0B 01 */
144         "\013\002warning - enclosure degraded",                 /* 0B 02 */
145         "\014\000write error",                                  /* 0C 00 */
146         "\014\001write error - recovered with auto reallocation",       /* 0C 01 */
147         "\014\002write error - auto reallocation failed",       /* 0C 02 */
148         "\014\003write error - recommend reassignment",         /* 0C 03 */
149         "\014\004compression check miscompare error",           /* 0C 04 */
150         "\014\005data expansion occurred during compression",   /* 0C 05 */
151         "\014\006block not compressible",                       /* 0C 06 */
152         "\014\007write error - recovery needed",                /* 0C 07 */
153         "\014\010write error - recovery failed",                /* 0C 08 */
154         "\014\011write error - loss of streaming",              /* 0C 09 */
155         "\014\012write error - padding blocks added",           /* 0C 0A */
156         "\014\013auxiliary memory code 4 (99-148) [proposed]",  /* 0C 0B */
157         "\015\000error detected by third party temporary initiator",    /* 0D 00 */
158         "\015\001third party device failure",                   /* 0D 01 */
159         "\015\002copy target device not reachable",             /* 0D 02 */
160         "\015\003incorrect copy target device type",            /* 0D 03 */
161         "\015\004copy target device data underrun",             /* 0D 04 */
162         "\015\005copy target device data overrun",              /* 0D 05 */
163 #ifdef  __used__
164         "\016\000",                                             /* 0E 00 */
165         "\017\000",                                             /* 0F 00 */
166 #endif
167         "\020\000id crc or ecc error",                          /* 10 00 */
168         "\021\000unrecovered read error",                       /* 11 00 */
169         "\021\001read retries exhausted",                       /* 11 01 */
170         "\021\002error too long to correct",                    /* 11 02 */
171         "\021\003multiple read errors",                         /* 11 03 */
172         "\021\004unrecovered read error - auto reallocate failed",      /* 11 04 */
173         "\021\005l-ec uncorrectable error",                     /* 11 05 */
174         "\021\006circ unrecovered error",                       /* 11 06 */
175         "\021\007data re-synchronization error",                /* 11 07 */
176         "\021\010incomplete block read",                        /* 11 08 */
177         "\021\011no gap found",                                 /* 11 09 */
178         "\021\012miscorrected error",                           /* 11 0A */
179         "\021\013unrecovered read error - recommend reassignment",      /* 11 0B */
180         "\021\014unrecovered read error - recommend rewrite the data",  /* 11 0C */
181         "\021\015de-compression crc error",                     /* 11 0D */
182         "\021\016cannot decompress using declared algorithm",   /* 11 0E */
183         "\021\017error reading upc/ean number",                 /* 11 0F */
184         "\021\020error reading isrc number",                    /* 11 10 */
185         "\021\021read error - loss of streaming",               /* 11 11 */
186         "\021\022auxiliary memory code 3 (99-148) [proposed]",  /* 11 12 */
187         "\022\000address mark not found for id field",          /* 12 00 */
188         "\023\000address mark not found for data field",        /* 13 00 */
189         "\024\000recorded entity not found",                    /* 14 00 */
190         "\024\001record not found",                             /* 14 01 */
191         "\024\002filemark or setmark not found",                /* 14 02 */
192         "\024\003end-of-data not found",                        /* 14 03 */
193         "\024\004block sequence error",                         /* 14 04 */
194         "\024\005record not found - recommend reassignment",    /* 14 05 */
195         "\024\006record not found - data auto-reallocated",     /* 14 06 */
196         "\025\000random positioning error",                     /* 15 00 */
197         "\025\001mechanical positioning error",                 /* 15 01 */
198         "\025\002positioning error detected by read of medium", /* 15 02 */
199         "\026\000data synchronization mark error",              /* 16 00 */
200         "\026\001data sync error - data rewritten",             /* 16 01 */
201         "\026\002data sync error - recommend rewrite",          /* 16 02 */
202         "\026\003data sync error - data auto-reallocated",      /* 16 03 */
203         "\026\004data sync error - recommend reassignment",     /* 16 04 */
204         "\027\000recovered data with no error correction applied",      /* 17 00 */
205         "\027\001recovered data with retries",                  /* 17 01 */
206         "\027\002recovered data with positive head offset",     /* 17 02 */
207         "\027\003recovered data with negative head offset",     /* 17 03 */
208         "\027\004recovered data with retries and/or circ applied",      /* 17 04 */
209         "\027\005recovered data using previous sector id",      /* 17 05 */
210         "\027\006recovered data without ecc - data auto-reallocated",   /* 17 06 */
211         "\027\007recovered data without ecc - recommend reassignment",  /* 17 07 */
212         "\027\010recovered data without ecc - recommend rewrite",       /* 17 08 */
213         "\027\011recovered data without ecc - data rewritten",  /* 17 09 */
214         "\030\000recovered data with error correction applied", /* 18 00 */
215         "\030\001recovered data with error corr. & retries applied",    /* 18 01 */
216         "\030\002recovered data - data auto-reallocated",       /* 18 02 */
217         "\030\003recovered data with circ",                     /* 18 03 */
218         "\030\004recovered data with l-ec",                     /* 18 04 */
219         "\030\005recovered data - recommend reassignment",      /* 18 05 */
220         "\030\006recovered data - recommend rewrite",           /* 18 06 */
221         "\030\007recovered data with ecc - data rewritten",     /* 18 07 */
222         "\030\010recovered data with linking",                  /* 18 08 */
223         "\031\000defect list error",                            /* 19 00 */
224         "\031\001defect list not available",                    /* 19 01 */
225         "\031\002defect list error in primary list",            /* 19 02 */
226         "\031\003defect list error in grown list",              /* 19 03 */
227         "\032\000parameter list length error",                  /* 1A 00 */
228         "\033\000synchronous data transfer error",              /* 1B 00 */
229         "\034\000defect list not found",                        /* 1C 00 */
230         "\034\001primary defect list not found",                /* 1C 01 */
231         "\034\002grown defect list not found",                  /* 1C 02 */
232         "\035\000miscompare during verify operation",           /* 1D 00 */
233         "\036\000recovered id with ecc correction",             /* 1E 00 */
234         "\037\000partial defect list transfer",                 /* 1F 00 */
235         "\040\000invalid command operation code",               /* 20 00 */
236         "\040\001access controls code 1 (99-314) [proposed]",   /* 20 01 */
237         "\040\002access controls code 2 (99-314) [proposed]",   /* 20 02 */
238         "\040\003access controls code 3 (99-314) [proposed]",   /* 20 03 */
239         "\040\004read type operation while in write capable state",     /* 20 04 */
240         "\040\005write type operation while in read capable state",     /* 20 05 */
241         "\040\006illegal command while in explicit address model",      /* 20 06 */
242         "\040\007illegal command while in implicit address model",      /* 20 07 */
243         "\040\010access controls code 5 (99-245) [proposed]",   /* 20 08 */
244         "\040\011access controls code 6 (99-245) [proposed]",   /* 20 09 */
245         "\040\012access controls code 7 (99-245) [proposed]",   /* 20 0A */
246         "\040\013access controls code 8 (99-245) [proposed]",   /* 20 0B */
247         "\041\000logical block address out of range",           /* 21 00 */
248         "\041\001invalid element address",                      /* 21 01 */
249         "\041\002invalid address for write",                    /* 21 02 */
250         "\042\000illegal function (use 20 00, 24 00, or 26 00)",/* 22 00 */
251 #ifdef  __used__
252         "\043\000",                                             /* 23 00 */
253 #endif
254         "\044\000invalid field in cdb",                         /* 24 00 */
255         "\044\001cdb decryption error",                         /* 24 01 */
256         "\044\002invalid cdb field while in explicit block address model",      /* 24 02 */
257         "\044\003invalid cdb field while in implicit block address model",      /* 24 03 */
258         "\045\000logical unit not supported",                   /* 25 00 */
259         "\046\000invalid field in parameter list",              /* 26 00 */
260         "\046\001parameter not supported",                      /* 26 01 */
261         "\046\002parameter value invalid",                      /* 26 02 */
262         "\046\003threshold parameters not supported",           /* 26 03 */
263         "\046\004invalid release of persistent reservation",    /* 26 04 */
264         "\046\005data decryption error",                        /* 26 05 */
265         "\046\006too many target descriptors",                  /* 26 06 */
266         "\046\007unsupported target descriptor type code",      /* 26 07 */
267         "\046\010too many segment descriptors",                 /* 26 08 */
268         "\046\011unsupported segment descriptor type code",     /* 26 09 */
269         "\046\012unexpected inexact segment",                   /* 26 0A */
270         "\046\013inline data length exceeded",                  /* 26 0B */
271         "\046\014invalid operation for copy source or destination",     /* 26 0C */
272         "\046\015copy segment granularity violation",           /* 26 0D */
273         "\047\000write protected",                              /* 27 00 */
274         "\047\001hardware write protected",                     /* 27 01 */
275         "\047\002logical unit software write protected",        /* 27 02 */
276         "\047\003associated write protect",                     /* 27 03 */
277         "\047\004persistent write protect",                     /* 27 04 */
278         "\047\005permanent write protect",                      /* 27 05 */
279         "\047\006conditional write protect",                    /* 27 06 */
280         "\050\000not ready to ready change, medium may have changed",   /* 28 00 */
281         "\050\001import or export element accessed",            /* 28 01 */
282         "\051\000power on, reset, or bus device reset occurred",/* 29 00 */
283         "\051\001power on occurred",                            /* 29 01 */
284         "\051\002scsi bus reset occurred",                      /* 29 02 */
285         "\051\003bus device reset function occurred",           /* 29 03 */
286         "\051\004device internal reset",                        /* 29 04 */
287         "\051\005transceiver mode changed to single-ended",     /* 29 05 */
288         "\051\006transceiver mode changed to lvd",              /* 29 06 */
289         "\052\000parameters changed",                           /* 2A 00 */
290         "\052\001mode parameters changed",                      /* 2A 01 */
291         "\052\002log parameters changed",                       /* 2A 02 */
292         "\052\003reservations preempted",                       /* 2A 03 */
293         "\052\004reservations released",                        /* 2A 04 */
294         "\052\005registrations preempted",                      /* 2A 05 */
295         "\052\006asymmetric access code 6 (00-232) [proposed]", /* 2A 06 */
296         "\052\007asymmetric access code 7 (00-232) [proposed]", /* 2A 07 */
297         "\053\000copy cannot execute since host cannot disconnect",     /* 2B 00 */
298         "\054\000command sequence error",                       /* 2C 00 */
299         "\054\001too many windows specified",                   /* 2C 01 */
300         "\054\002invalid combination of windows specified",     /* 2C 02 */
301         "\054\003current program area is not empty",            /* 2C 03 */
302         "\054\004current program area is empty",                /* 2C 04 */
303         "\054\005illegal power condition request",              /* 2C 05 */
304         "\054\006persistent prevent conflict",                  /* 2C 06 */
305         "\055\000overwrite error on update in place",           /* 2D 00 */
306         "\056\000insufficient time for operation",              /* 2E 00 */
307         "\057\000commands cleared by another initiator",        /* 2F 00 */
308         "\060\000incompatible medium installed",                /* 30 00 */
309         "\060\001cannot read medium - unknown format",          /* 30 01 */
310         "\060\002cannot read medium - incompatible format",     /* 30 02 */
311         "\060\003cleaning cartridge installed",                 /* 30 03 */
312         "\060\004cannot write medium - unknown format",         /* 30 04 */
313         "\060\005cannot write medium - incompatible format",    /* 30 05 */
314         "\060\006cannot format medium - incompatible medium",   /* 30 06 */
315         "\060\007cleaning failure",                             /* 30 07 */
316         "\060\010cannot write - application code mismatch",     /* 30 08 */
317         "\060\011current session not fixated for append",       /* 30 09 */
318         "\060\020medium not formatted",                         /* 30 10 */
319         "\061\000medium format corrupted",                      /* 31 00 */
320         "\061\001format command failed",                        /* 31 01 */
321         "\061\002zoned formatting failed due to spare linking", /* 31 02 */
322         "\062\000no defect spare location available",           /* 32 00 */
323         "\062\001defect list update failure",                   /* 32 01 */
324         "\063\000tape length error",                            /* 33 00 */
325         "\064\000enclosure failure",                            /* 34 00 */
326         "\065\000enclosure services failure",                   /* 35 00 */
327         "\065\001unsupported enclosure function",               /* 35 01 */
328         "\065\002enclosure services unavailable",               /* 35 02 */
329         "\065\003enclosure services transfer failure",          /* 35 03 */
330         "\065\004enclosure services transfer refused",          /* 35 04 */
331         "\066\000ribbon, ink, or toner failure",                /* 36 00 */
332         "\067\000rounded parameter",                            /* 37 00 */
333         "\070\000event status notification",                    /* 38 00 */
334         "\070\002esn - power management class event",           /* 38 02 */
335         "\070\004esn - media class event",                      /* 38 04 */
336         "\070\006esn - device busy class event",                /* 38 06 */
337         "\071\000saving parameters not supported",              /* 39 00 */
338         "\072\000medium not present",                           /* 3A 00 */
339         "\072\001medium not present - tray closed",             /* 3A 01 */
340         "\072\002medium not present - tray open",               /* 3A 02 */
341         "\072\003medium not present - loadable",                /* 3A 03 */
342         "\072\004medium not present - medium auxiliary memory accessible",      /* 3A 04 */
343         "\073\000sequential positioning error",                 /* 3B 00 */
344         "\073\001tape position error at beginning-of-medium",   /* 3B 01 */
345         "\073\002tape position error at end-of-medium",         /* 3B 02 */
346         "\073\003tape or electronic vertical forms unit not ready",     /* 3B 03 */
347         "\073\004slew failure",                                 /* 3B 04 */
348         "\073\005paper jam",                                    /* 3B 05 */
349         "\073\006failed to sense top-of-form",                  /* 3B 06 */
350         "\073\007failed to sense bottom-of-form",               /* 3B 07 */
351         "\073\010reposition error",                             /* 3B 08 */
352         "\073\011read past end of medium",                      /* 3B 09 */
353         "\073\012read past beginning of medium",                /* 3B 0A */
354         "\073\013position past end of medium",                  /* 3B 0B */
355         "\073\014position past beginning of medium",            /* 3B 0C */
356         "\073\015medium destination element full",              /* 3B 0D */
357         "\073\016medium source element empty",                  /* 3B 0E */
358         "\073\017end of medium reached",                        /* 3B 0F */
359         "\073\021medium magazine not accessible",               /* 3B 11 */
360         "\073\022medium magazine removed",                      /* 3B 12 */
361         "\073\023medium magazine inserted",                     /* 3B 13 */
362         "\073\024medium magazine locked",                       /* 3B 14 */
363         "\073\025medium magazine unlocked",                     /* 3B 15 */
364         "\073\026mechanical positioning or changer error",      /* 3B 16 */
365 #ifdef  __used__
366         "\074\000",                                             /* 3C 00 */
367 #endif
368         "\075\000invalid bits in identify message",             /* 3D 00 */
369         "\076\000logical unit has not self-configured yet",     /* 3E 00 */
370         "\076\001logical unit failure",                         /* 3E 01 */
371         "\076\002timeout on logical unit",                      /* 3E 02 */
372         "\076\003logical unit failed self-test",                /* 3E 03 */
373         "\076\004logical unit unable to update self-test log",  /* 3E 04 */
374         "\077\000target operating conditions have changed",     /* 3F 00 */
375         "\077\001microcode has been changed",                   /* 3F 01 */
376         "\077\002changed operating definition",                 /* 3F 02 */
377         "\077\003inquiry data has changed",                     /* 3F 03 */
378         "\077\004component device attached",                    /* 3F 04 */
379         "\077\005device identifier changed",                    /* 3F 05 */
380         "\077\006redundancy group created or modified",         /* 3F 06 */
381         "\077\007redundancy group deleted",                     /* 3F 07 */
382         "\077\010spare created or modified",                    /* 3F 08 */
383         "\077\011spare deleted",                                /* 3F 09 */
384         "\077\012volume set created or modified",               /* 3F 0A */
385         "\077\013volume set deleted",                           /* 3F 0B */
386         "\077\014volume set deassigned",                        /* 3F 0C */
387         "\077\015volume set reassigned",                        /* 3F 0D */
388         "\077\016reported luns data has changed",               /* 3F 0E */
389         "\077\017echo buffer overwritten",                      /* 3F 0F */
390         "\077\020medium loadable",                              /* 3F 10 */
391         "\077\021medium auxiliary memory accessible",           /* 3F 11 */
392         "\100\000ram failure (should use 40 nn)",               /* 40 00 */
393 #ifdef  XXX
394         "\100\000nn diagnostic failure on component nn (80h-ffh)",      /* 40 00 */
395 #endif
396         "\100\000diagnostic failure on component nn (80h-ffh)", /* 40 00 */
397         "\101\000data path failure (should use 40 nn)",         /* 41 00 */
398         "\102\000power-on or self-test failure (should use 40 nn)",     /* 42 00 */
399         "\103\000message error",                                /* 43 00 */
400         "\104\000internal target failure",                      /* 44 00 */
401         "\105\000select or reselect failure",                   /* 45 00 */
402         "\106\000unsuccessful soft reset",                      /* 46 00 */
403         "\107\000scsi parity error",                            /* 47 00 */
404         "\107\001data phase crc error detected",                /* 47 01 */
405         "\107\002scsi parity error detected during st data phase",      /* 47 02 */
406         "\107\003information unit crc error detected",          /* 47 03 */
407         "\107\004asynchronous information protection error detected",   /* 47 04 */
408         "\110\000initiator detected error message received",    /* 48 00 */
409         "\111\000invalid message error",                        /* 49 00 */
410         "\112\000command phase error",                          /* 4A 00 */
411         "\113\000data phase error",                             /* 4B 00 */
412         "\114\000logical unit failed self-configuration",       /* 4C 00 */
413 #ifdef  XXX
414         "\115\000nn tagged overlapped commands (nn = queue tag)",       /* 4D 00 */
415 #endif
416         "\115\000tagged overlapped commands (nn = queue tag)",  /* 4D 00 */
417         "\116\000overlapped commands attempted",                /* 4E 00 */
418 #ifdef  __used__
419         "\117\000",                                             /* 4F 00 */
420 #endif
421         "\120\000write append error",                           /* 50 00 */
422         "\120\001write append position error",                  /* 50 01 */
423         "\120\002position error related to timing",             /* 50 02 */
424         "\121\000erase failure",                                /* 51 00 */
425         "\121\001erase failure - incomplete erase operation detected",  /* 51 01 */
426         "\122\000cartridge fault",                              /* 52 00 */
427         "\123\000media load or eject failed",                   /* 53 00 */
428         "\123\001unload tape failure",                          /* 53 01 */
429         "\123\002medium removal prevented",                     /* 53 02 */
430         "\124\000scsi to host system interface failure",        /* 54 00 */
431         "\125\000system resource failure",                      /* 55 00 */
432         "\125\001system buffer full",                           /* 55 01 */
433         "\125\002insufficient reservation resources",           /* 55 02 */
434         "\125\003insufficient resources",                       /* 55 03 */
435         "\125\004insufficient registration resources",          /* 55 04 */
436         "\125\005access controls code 4 (99-314) [proposed]",   /* 55 05 */
437         "\125\006auxiliary memory code 1 (99-148) [proposed]",  /* 55 06 */
438 #ifdef  __used__
439         "\126\000",                                             /* 56 00 */
440 #endif
441         "\127\000unable to recover table-of-contents",          /* 57 00 */
442         "\130\000generation does not exist",                    /* 58 00 */
443         "\131\000updated block read",                           /* 59 00 */
444         "\132\000operator request or state change input",       /* 5A 00 */
445         "\132\001operator medium removal request",              /* 5A 01 */
446         "\132\002operator selected write protect",              /* 5A 02 */
447         "\132\003operator selected write permit",               /* 5A 03 */
448         "\133\000log exception",                                /* 5B 00 */
449         "\133\001threshold condition met",                      /* 5B 01 */
450         "\133\002log counter at maximum",                       /* 5B 02 */
451         "\133\003log list codes exhausted",                     /* 5B 03 */
452         "\134\000rpl status change",                            /* 5C 00 */
453         "\134\001spindles synchronized",                        /* 5C 01 */
454         "\134\002spindles not synchronized",                    /* 5C 02 */
455         "\135\000failure prediction threshold exceeded",        /* 5D 00 */
456         "\135\001media failure prediction threshold exceeded",  /* 5D 01 */
457         "\135\002logical unit failure prediction threshold exceeded",   /* 5D 02 */
458         "\135\003spare area exhaustion prediction threshold exceeded",  /* 5D 03 */
459         "\135\020hardware impending failure general hard drive failure",/* 5D 10 */
460         "\135\021hardware impending failure drive error rate too high", /* 5D 11 */
461         "\135\022hardware impending failure data error rate too high",  /* 5D 12 */
462         "\135\023hardware impending failure seek error rate too high",  /* 5D 13 */
463         "\135\024hardware impending failure too many block reassigns",  /* 5D 14 */
464         "\135\025hardware impending failure access times too high",     /* 5D 15 */
465         "\135\026hardware impending failure start unit times too high", /* 5D 16 */
466         "\135\027hardware impending failure channel parametrics",/* 5D 17 */
467         "\135\030hardware impending failure controller detected",/* 5D 18 */
468         "\135\031hardware impending failure throughput performance",    /* 5D 19 */
469         "\135\032hardware impending failure seek time performance",     /* 5D 1A */
470         "\135\033hardware impending failure spin-up retry count",       /* 5D 1B */
471         "\135\034hardware impending failure drive calibration retry count",     /* 5D 1C */
472         "\135\040controller impending failure general hard drive failure",      /* 5D 20 */
473         "\135\041controller impending failure drive error rate too high",       /* 5D 21 */
474         "\135\042controller impending failure data error rate too high",/* 5D 22 */
475         "\135\043controller impending failure seek error rate too high",/* 5D 23 */
476         "\135\044controller impending failure too many block reassigns",/* 5D 24 */
477         "\135\045controller impending failure access times too high",   /* 5D 25 */
478         "\135\046controller impending failure start unit times too high",       /* 5D 26 */
479         "\135\047controller impending failure channel parametrics",     /* 5D 27 */
480         "\135\050controller impending failure controller detected",     /* 5D 28 */
481         "\135\051controller impending failure throughput performance",  /* 5D 29 */
482         "\135\052controller impending failure seek time performance",   /* 5D 2A */
483         "\135\053controller impending failure spin-up retry count",     /* 5D 2B */
484         "\135\054controller impending failure drive calibration retry count",   /* 5D 2C */
485         "\135\060data channel impending failure general hard drive failure",    /* 5D 30 */
486         "\135\061data channel impending failure drive error rate too high",     /* 5D 31 */
487         "\135\062data channel impending failure data error rate too high",      /* 5D 32 */
488         "\135\063data channel impending failure seek error rate too high",      /* 5D 33 */
489         "\135\064data channel impending failure too many block reassigns",      /* 5D 34 */
490         "\135\065data channel impending failure access times too high", /* 5D 35 */
491         "\135\066data channel impending failure start unit times too high",     /* 5D 36 */
492         "\135\067data channel impending failure channel parametrics",   /* 5D 37 */
493         "\135\070data channel impending failure controller detected",   /* 5D 38 */
494         "\135\071data channel impending failure throughput performance",/* 5D 39 */
495         "\135\072data channel impending failure seek time performance", /* 5D 3A */
496         "\135\073data channel impending failure spin-up retry count",   /* 5D 3B */
497         "\135\074data channel impending failure drive calibration retry count", /* 5D 3C */
498         "\135\100servo impending failure general hard drive failure",   /* 5D 40 */
499         "\135\101servo impending failure drive error rate too high",    /* 5D 41 */
500         "\135\102servo impending failure data error rate too high",     /* 5D 42 */
501         "\135\103servo impending failure seek error rate too high",     /* 5D 43 */
502         "\135\104servo impending failure too many block reassigns",     /* 5D 44 */
503         "\135\105servo impending failure access times too high",/* 5D 45 */
504         "\135\106servo impending failure start unit times too high",    /* 5D 46 */
505         "\135\107servo impending failure channel parametrics",  /* 5D 47 */
506         "\135\110servo impending failure controller detected",  /* 5D 48 */
507         "\135\111servo impending failure throughput performance",       /* 5D 49 */
508         "\135\112servo impending failure seek time performance",/* 5D 4A */
509         "\135\113servo impending failure spin-up retry count",  /* 5D 4B */
510         "\135\114servo impending failure drive calibration retry count",/* 5D 4C */
511         "\135\120spindle impending failure general hard drive failure", /* 5D 50 */
512         "\135\121spindle impending failure drive error rate too high",  /* 5D 51 */
513         "\135\122spindle impending failure data error rate too high",   /* 5D 52 */
514         "\135\123spindle impending failure seek error rate too high",   /* 5D 53 */
515         "\135\124spindle impending failure too many block reassigns",   /* 5D 54 */
516         "\135\125spindle impending failure access times too high",      /* 5D 55 */
517         "\135\126spindle impending failure start unit times too high",  /* 5D 56 */
518         "\135\127spindle impending failure channel parametrics",/* 5D 57 */
519         "\135\130spindle impending failure controller detected",/* 5D 58 */
520         "\135\131spindle impending failure throughput performance",     /* 5D 59 */
521         "\135\132spindle impending failure seek time performance",      /* 5D 5A */
522         "\135\133spindle impending failure spin-up retry count",/* 5D 5B */
523         "\135\134spindle impending failure drive calibration retry count",      /* 5D 5C */
524         "\135\140firmware impending failure general hard drive failure",/* 5D 60 */
525         "\135\141firmware impending failure drive error rate too high", /* 5D 61 */
526         "\135\142firmware impending failure data error rate too high",  /* 5D 62 */
527         "\135\143firmware impending failure seek error rate too high",  /* 5D 63 */
528         "\135\144firmware impending failure too many block reassigns",  /* 5D 64 */
529         "\135\145firmware impending failure access times too high",     /* 5D 65 */
530         "\135\146firmware impending failure start unit times too high", /* 5D 66 */
531         "\135\147firmware impending failure channel parametrics",       /* 5D 67 */
532         "\135\150firmware impending failure controller detected",       /* 5D 68 */
533         "\135\151firmware impending failure throughput performance",    /* 5D 69 */
534         "\135\152firmware impending failure seek time performance",     /* 5D 6A */
535         "\135\153firmware impending failure spin-up retry count",       /* 5D 6B */
536         "\135\154firmware impending failure drive calibration retry count",     /* 5D 6C */
537         "\135\377failure prediction threshold exceeded (false)",/* 5D FF */
538         "\136\000low power condition on",                       /* 5E 00 */
539         "\136\001idle condition activated by timer",            /* 5E 01 */
540         "\136\002standby condition activated by timer",         /* 5E 02 */
541         "\136\003idle condition activated by command",          /* 5E 03 */
542         "\136\004standby condition activated by command",       /* 5E 04 */
543         "\136\101power state change to active",                 /* 5E 41 */
544         "\136\102power state change to idle",                   /* 5E 42 */
545         "\136\103power state change to standby",                /* 5E 43 */
546         "\136\105power state change to sleep",                  /* 5E 45 */
547         "\136\107power state change to device control",         /* 5E 47 */
548 #ifdef  __used__
549         "\137\000",                                             /* 5F 00 */
550 #endif
551         "\140\000lamp failure",                                 /* 60 00 */
552         "\141\000video acquisition error",                      /* 61 00 */
553         "\141\001unable to acquire video",                      /* 61 01 */
554         "\141\002out of focus",                                 /* 61 02 */
555         "\142\000scan head positioning error",                  /* 62 00 */
556         "\143\000end of user area encountered on this track",   /* 63 00 */
557         "\143\001packet does not fit in available space",       /* 63 01 */
558         "\144\000illegal mode for this track",                  /* 64 00 */
559         "\144\001invalid packet size",                          /* 64 01 */
560         "\145\000voltage fault",                                /* 65 00 */
561         "\146\000automatic document feeder cover up",           /* 66 00 */
562         "\146\001automatic document feeder lift up",            /* 66 01 */
563         "\146\002document jam in automatic document feeder",    /* 66 02 */
564         "\146\003document miss feed automatic in document feeder",      /* 66 03 */
565         "\147\000configuration failure",                        /* 67 00 */
566         "\147\001configuration of incapable logical units failed",      /* 67 01 */
567         "\147\002add logical unit failed",                      /* 67 02 */
568         "\147\003modification of logical unit failed",          /* 67 03 */
569         "\147\004exchange of logical unit failed",              /* 67 04 */
570         "\147\005remove of logical unit failed",                /* 67 05 */
571         "\147\006attachment of logical unit failed",            /* 67 06 */
572         "\147\007creation of logical unit failed",              /* 67 07 */
573         "\147\010assign failure occurred",                      /* 67 08 */
574         "\147\011multiply assigned logical unit",               /* 67 09 */
575         "\147\012asymmetric access code 4 (00-232) [proposed]", /* 67 0A */
576         "\147\013asymmetric access code 5 (00-232) [proposed]", /* 67 0B */
577         "\150\000logical unit not configured",                  /* 68 00 */
578         "\151\000data loss on logical unit",                    /* 69 00 */
579         "\151\001multiple logical unit failures",               /* 69 01 */
580         "\151\002parity/data mismatch",                         /* 69 02 */
581         "\152\000informational, refer to log",                  /* 6A 00 */
582         "\153\000state change has occurred",                    /* 6B 00 */
583         "\153\001redundancy level got better",                  /* 6B 01 */
584         "\153\002redundancy level got worse",                   /* 6B 02 */
585         "\154\000rebuild failure occurred",                     /* 6C 00 */
586         "\155\000recalculate failure occurred",                 /* 6D 00 */
587         "\156\000command to logical unit failed",               /* 6E 00 */
588         "\157\000copy protection key exchange failure - authentication failure",/* 6F 00 */
589         "\157\001copy protection key exchange failure - key not present",       /* 6F 01 */
590         "\157\002copy protection key exchange failure - key not established",   /* 6F 02 */
591         "\157\003read of scrambled sector without authentication",      /* 6F 03 */
592         "\157\004media region code is mismatched to logical unit region",       /* 6F 04 */
593         "\157\005drive region must be permanent/region reset count error",      /* 6F 05 */
594 #ifdef  XXX
595         "\160\000nn decompression exception short algorithm id of nn",  /* 70 00 */
596 #endif
597         "\160\000decompression exception short algorithm id of nn",     /* 70 00 */
598         "\161\000decompression exception long algorithm id",    /* 71 00 */
599         "\162\000session fixation error",                       /* 72 00 */
600         "\162\001session fixation error writing lead-in",       /* 72 01 */
601         "\162\002session fixation error writing lead-out",      /* 72 02 */
602         "\162\003session fixation error - incomplete track in session", /* 72 03 */
603         "\162\004empty or partially written reserved track",    /* 72 04 */
604         "\162\005no more track reservations allowed",           /* 72 05 */
605         "\163\000cd control error",                             /* 73 00 */
606         "\163\001power calibration area almost full",           /* 73 01 */
607         "\163\002power calibration area is full",               /* 73 02 */
608         "\163\003power calibration area error",                 /* 73 03 */
609         "\163\004program memory area update failure",           /* 73 04 */
610         "\163\005program memory area is full",                  /* 73 05 */
611         "\163\006rma/pma is almost full",                       /* 73 06 */
612 #ifdef  __used__
613         "\164\000",                                             /* 74 00 */
614         "\165\000",                                             /* 75 00 */
615         "\166\000",                                             /* 76 00 */
616         "\167\000",                                             /* 77 00 */
617         "\170\000",                                             /* 78 00 */
618         "\171\000",                                             /* 79 00 */
619         "\172\000",                                             /* 7A 00 */
620         "\173\000",                                             /* 7B 00 */
621         "\174\000",                                             /* 7C 00 */
622         "\175\000",                                             /* 7D 00 */
623         "\176\000",                                             /* 7E 00 */
624         "\177\000",                                             /* 7F 00 */
625 #endif
626 #ifdef  XXX
627         "\200\000start vendor unique",                          /* 80 00 */
628 #endif
629         NULL
630 };
631
632 #ifdef SMO_C501
633 static const char *sd_smo_c501_error_str[] = {
634         "\012\000disk not inserted",                    /* 0x0a */
635         "\013\000load/unload failure",                  /* 0x0b */
636         "\014\000spindle failure",                      /* 0x0c */
637         "\015\000focus failure",                        /* 0x0d */
638         "\016\000tracking failure",                     /* 0x0e */
639         "\017\000bias magnet failure",                  /* 0x0f */
640         "\043\000illegal function for medium type",     /* 0x23 */
641 /*XXX*/ "\070\000recoverable write error",              /* 0x38 */
642 /*XXX*/ "\071\000write error recovery failed",          /* 0x39 */
643         "\072\000defect list update failed",            /* 0x3a */
644         "\075\000defect list not available",            /* 0x3d */
645         "\200\000limited laser life",                   /* 0x80 */
646         "\201\000laser focus coil over-current",        /* 0x81 */
647         "\202\000laser tracking coil over-current",     /* 0x82 */
648         "\203\000temperature alarm",                    /* 0x83 */
649         NULL
650 };
651 #endif
652
653 static char *sd_sense_keys[] = {
654         "No Additional Sense",          /* 0x00 */
655         "Recovered Error",              /* 0x01 */
656         "Not Ready",                    /* 0x02 */
657         "Medium Error",                 /* 0x03 */
658         "Hardware Error",               /* 0x04 */
659         "Illegal Request",              /* 0x05 */
660         "Unit Attention",               /* 0x06 */
661         "Data Protect",                 /* 0x07 */
662         "Blank Check",                  /* 0x08 */
663         "Vendor Unique",                /* 0x09 */
664         "Copy Aborted",                 /* 0x0a */
665         "Aborted Command",              /* 0x0b */
666         "Equal",                        /* 0x0c */
667         "Volume Overflow",              /* 0x0d */
668         "Miscompare",                   /* 0x0e */
669         "Reserved"                      /* 0x0f */
670 };
671
672 #if 0
673 static char *sd_cmds[] = {
674         "\000test unit ready",          /* 0x00 */
675         "\001rezero",                   /* 0x01 */
676         "\003request sense",            /* 0x03 */
677         "\004format",                   /* 0x04 */
678         "\007reassign",                 /* 0x07 */
679         "\010read",                     /* 0x08 */
680         "\012write",                    /* 0x0a */
681         "\013seek",                     /* 0x0b */
682         "\022inquiry",                  /* 0x12 */
683         "\025mode select",              /* 0x15 */
684         "\026reserve",                  /* 0x16 */
685         "\027release",                  /* 0x17 */
686         "\030copy",                     /* 0x18 */
687         "\032mode sense",               /* 0x1a */
688         "\033start/stop",               /* 0x1b */
689         "\036door lock",                /* 0x1e */
690         "\067read defect data",         /* 0x37 */
691         NULL
692 };
693 #endif
694
695
696 const char *
697 usal_sensemsg(register int ctype, register int code, register int qual, 
698                                  register const char **vec, char *sbuf, int maxcnt)
699 {
700         register int i;
701
702         /*
703          * Ignore controller type if error vec is supplied.
704          */
705         if (vec == (const char **)NULL) switch (ctype) {
706         case DEV_MD21:
707                 vec = sd_ccs_error_str;
708                 break;
709
710         case DEV_ACB40X0:
711         case DEV_ACB4000:
712         case DEV_ACB4010:
713         case DEV_ACB4070:
714         case DEV_ACB5500:
715                 vec = sd_adaptec_error_str;
716                 break;
717
718 #ifdef  SMO_C501
719         case DEV_SONY_SMO:
720                 vec = sd_smo_c501_error_str;
721                 break;
722 #endif
723
724         default:
725                 vec = sd_ccs_error_str;
726         }
727         if (vec == (const char **)NULL)
728                 return ("");
729
730         for (i = 0; i < 2; i++) {
731                 while (*vec != (char *) NULL) {
732                         if (code == (Uchar)(*vec)[0] &&
733                                         qual == (Uchar)(*vec)[1]) {
734                                 return (&(*vec)[2]);
735                         } else {
736                                 vec++;          /* Next entry */
737                         }
738                 }
739                 if (*vec == (char *) NULL)      /* End of List: switch over */
740                         vec = sd_ccs_error_str;
741         }
742         if (code == 0x40) {
743                 snprintf(sbuf, maxcnt,
744                         "diagnostic failure on component 0x%X", qual);
745                 return (sbuf);
746         }
747         if (code == 0x4D) {
748                 snprintf(sbuf, maxcnt,
749                         "tagged overlapped commands, queue tag is 0x%X",
750                                                                         qual);
751                 return (sbuf);
752         }
753         if (code == 0x70) {
754                 snprintf(sbuf, maxcnt,
755                         "decompression exception short algorithm id of 0x%X",
756                                                                         qual);
757                 return (sbuf);
758         }
759         if (qual != 0)
760                 return ((char *)NULL);
761
762         if (code < 0x80) {
763                 snprintf(sbuf, maxcnt, "invalid sense code 0x%X", code);
764                 return (sbuf);
765         }
766         snprintf(sbuf, maxcnt, "vendor unique sense code 0x%X", code);
767         return (sbuf);
768 }
769
770 #undef  sense   /*XXX JS Hack, solange usalio.h noch nicht fertig ist */
771 int
772 usal__errmsg(SCSI *usalp, char *obuf, int maxcnt, 
773                                 register struct scsi_sense *sense, 
774                                 register struct scsi_status *status, int sense_code)
775 {
776         char    sbuf[80];
777         const char *sensemsg, *cmdname, *sensekey;
778 #define ext_sense       ((struct scsi_ext_sense* ) sense)
779         register int blkno = 0;
780         register int code;
781         int     badqual = 0;
782         int     qual = 0;
783         int     fru = 0;
784         int     key = 0;
785         int     segment = 0;
786         int     blkvalid = 0;
787         int     fm = 0;
788         int     eom = 0;
789         int     ili = 0;
790         int     sksv = 0;
791         int     n;
792         int     sizeleft = maxcnt;
793
794         sensekey = sensemsg = "[]";
795         if (sense->code >= 0x70) {
796                 if (sense_code >= 0)
797                         code = sense_code;
798                 else
799                         code = ext_sense->sense_code;
800                 segment = ext_sense->seg_num;
801                 qual = ext_sense->qual_code;
802                 fru = ext_sense->fru_code;
803                 sksv = ext_sense->sksv;
804         } else {
805                 code = sense->code;
806         }
807         if (status->chk == 0) {
808                 sensemsg = "no sense";
809         } else {
810                 if (sense->code >= 0x70) {
811                         key = ext_sense->key;
812                         if (key < 0x10)
813                                 sensekey = sd_sense_keys[ext_sense->key];
814                         else
815                                 sensekey = "invalid sensekey";
816                         blkno = (ext_sense->info_1 << 24) |
817                                 (ext_sense->info_2 << 16) |
818                                 (ext_sense->info_3 << 8) |
819                                 ext_sense->info_4;
820                         fm = ext_sense->fil_mk;
821                         eom = ext_sense->eom;
822                         ili = ext_sense->ili;
823                 } else {
824                         key = -1;
825                         sensekey = "[]";
826                         blkno = (sense->high_addr << 16) |
827                                 (sense->mid_addr << 8) |
828                                 sense->low_addr;
829                         fm = eom = 0;
830                 }
831                 blkvalid = sense->adr_val;
832
833                 sensemsg = usal_sensemsg(usalp->dev, code, qual, usalp->nonstderrs, sbuf, sizeof(sbuf));
834                 if (sensemsg == NULL) {
835                         sensemsg = usal_sensemsg(usalp->dev, code, 0, usalp->nonstderrs, sbuf, sizeof(sbuf));
836                         badqual = 1;
837                 }
838         }
839 /*
840         if (un->un_cmd < sizeof(scsi_cmds)) {
841                 cmdname = scsi_cmds[un->un_cmd];
842         } else {
843                 cmdname = "unknown cmd";
844         }
845 */
846         cmdname = "";
847         n = snprintf(obuf, sizeleft, "%sSense Key: 0x%X %s%s, Segment %d\n",
848                 cmdname, key, sensekey,
849                 (sense->code == 0x71)?", deferred error":"",
850                 segment);
851         if (n <= 0) {
852                 obuf[0] = '\0';
853                 return (maxcnt - sizeleft);
854         }
855         obuf += n;
856         sizeleft -= n;
857         n = snprintf(obuf, sizeleft, "Sense Code: 0x%02X Qual 0x%02X %s%s%s%s Fru 0x%X\n",
858                 code, qual, *sensemsg?"(":"", sensemsg, *sensemsg?")":"",
859                 badqual? " [No matching qualifier]":"",
860                 fru);
861         if (n <= 0) {
862                 obuf[0] = '\0';
863                 return (maxcnt - sizeleft);
864         }
865         obuf += n;
866         sizeleft -= n;
867         n = snprintf(obuf, sizeleft, "Sense flags: Blk %d %s%s%s%s",
868                 blkno, blkvalid?"(valid) ":"(not valid) ",
869                 fm?"file mark detected ":"",
870                 eom?"end of medium ":"",
871                 ili?"illegal block length ":"");
872         if (n <= 0) {
873                 obuf[0] = '\0';
874                 return (maxcnt - sizeleft);
875         }
876         obuf += n;
877         sizeleft -= n;
878         if (!sksv) {
879                 n = snprintf(obuf, sizeleft, "\n");
880                 if (n <= 0) {
881                         obuf[0] = '\0';
882                         return (maxcnt - sizeleft);
883                 }
884                 obuf += n;
885                 sizeleft -= n;
886                 return (maxcnt - sizeleft);
887         }
888         switch (key) {
889
890         case SC_ILLEGAL_REQUEST:
891                 n = snprintf(obuf, sizeleft, "error refers to %s part, bit ptr %d %s field ptr %d",
892                         ext_sense->cd? "command":"data",
893                         (int)ext_sense->bptr,
894                         ext_sense->bpv? "(valid)":"(not valid)",
895                         ext_sense->field_ptr[0] << 8 |
896                         ext_sense->field_ptr[1]);
897                 if (n <= 0) {
898                         obuf[0] = '\0';
899                         return (maxcnt - sizeleft);
900                 }
901                 obuf += n;
902                 sizeleft -= n;
903                 break;
904
905         case SC_RECOVERABLE_ERROR:
906         case SC_HARDWARE_ERROR:
907         case SC_MEDIUM_ERROR:
908                 n = snprintf(obuf, sizeleft, "actual retry count %d",
909                         ext_sense->field_ptr[0] << 8 |
910                         ext_sense->field_ptr[1]);
911                 if (n <= 0) {
912                         obuf[0] = '\0';
913                         return (maxcnt - sizeleft);
914                 }
915                 obuf += n;
916                 sizeleft -= n;
917                 break;
918
919         case SC_NOT_READY:
920                 n = snprintf(obuf, sizeleft, "operation %d%% done",
921                         (100*(ext_sense->field_ptr[0] << 8 |
922                               ext_sense->field_ptr[1]))/(unsigned)65536);
923                 if (n < 0) {
924                         obuf[0] = '\0';
925                         return (maxcnt - sizeleft);
926                 }
927                 obuf += n;
928                 sizeleft -= n;
929                 break;
930         }
931         n = snprintf(obuf, sizeleft, "\n");
932         if (n <= 0) {
933                 obuf[0] = '\0';
934                 return (maxcnt - sizeleft);
935         }
936         obuf += n;
937         sizeleft -= n;
938         return (maxcnt - sizeleft);
939 }
940
941 #ifdef  DEBUG
942 print_err(code, ctype)
943 {
944         register int i;
945         register char **vec  = (char **)NULL;
946
947         switch (ctype) {
948         case CTYPE_MD21:
949         case CTYPE_CCS:
950                 vec = sd_ccs_error_str;
951                 break;
952
953         case CTYPE_ACB4000:
954                 vec = sd_adaptec_error_str;
955                 break;
956
957 #ifdef  SMO_C501
958         case CTYPE_SMO_C501:
959                 vec = sd_smo_c501_error_str;
960                 break;
961 #endif
962
963 #ifdef  CDD_521
964         case DEV_CDD_521:
965                 vec = sd_cdd_521_error_str;
966                 break;
967 #endif
968         }
969         printf("error code: 0x%x", code);
970         if (vec == (char **)NULL)
971                 return;
972
973         for (i = 0; i < 2; i++) {
974                 while (*vec != (char *) NULL) {
975                         if (code == (Uchar)*vec[0]) {
976                                 printf(" (%s)", (char *)((int)(*vec)+1));
977                                 return;
978                         } else
979                                 vec++;
980                 }
981                 if (*vec == (char *) NULL)
982                         vec = sd_ccs_error_str;
983         }
984 }
985
986
987 int main(int argc, char *argv[])
988 {
989         int     i;
990
991 #ifdef ACB
992         for (i = 0; i < 0x30; i++) {
993 /*              printf("Code: 0x%x      Key: 0x%x       ", i, sd_adaptec_keys[i]);*/
994                 printf("Key: 0x%x %-16s ", sd_adaptec_keys[i],
995                                         sd_sense_keys[sd_adaptec_keys[i]] );
996                 js_print_err(i, CTYPE_ACB4000);
997                 printf("\n");
998         }
999 #else
1000 /*      for (i = 0; i < 0x84; i++) {*/
1001         for (i = 0; i < 0xd8; i++) {
1002 /*              print_err(i, CTYPE_SMO_C501);*/
1003                 print_err(i, DEV_CDD_521);
1004                 printf("\n");
1005         }
1006 #endif
1007 }
1008 #endif