1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 /*
28  * t1394_errmsg.c
29  *    Utility function that targets can use to convert an error code into a
30  *    printable string.
31  */
32 
33 #include <sys/1394/t1394.h>
34 #include <sys/1394/s1394.h>
35 #include <sys/1394/cmd1394.h>
36 #include <sys/1394/ixl1394.h>
37 
38 static const char *error_string[] = {
39 	"CMD1394_CMDSUCCESS:  Command Success",			/* 0 */
40 	"",							/* -1 */
41 	"",							/* -2 */
42 	"",							/* -3 */
43 	"",							/* -4 */
44 	"",							/* -5 */
45 	"",							/* -6 */
46 	"",							/* -7 */
47 	"",							/* -8 */
48 	"",							/* -9 */
49 	"CMD1394_ENULL_MBLK:  NULL mblk pointer",		/* -10 */
50 	"CMD1394_EMBLK_TOO_SMALL:  Mblk too small",		/* -11 */
51 	"CMD1394_ESTALE_GENERATION:  Stale generation",		/* -12 */
52 	"CMD1394_EDEVICE_REMOVED:  Device removed",		/* -13 */
53 	"CMD1394_EINVALID_CONTEXT:  Invalid context",		/* -14 */
54 	"CMD1394_EINVALID_COMMAND:  Invalid command",		/* -15 */
55 	"CMD1394_EUNKNOWN_ERROR:  Unknown error",		/* -16 */
56 	"CMD1394_NOSTATUS:  No status",				/* -17 */
57 	"CMD1394_EFATAL_ERROR:  Fatal error",			/* -18 */
58 	"CMD1394_ENO_ATREQ:  Unable to send ATREQ",		/* -19 */
59 	"CMD1394_EDEVICE_ERROR:  Device error",			/* -20 */
60 	"",							/* -21 */
61 	"",							/* -22 */
62 	"",							/* -23 */
63 	"",							/* -24 */
64 	"",							/* -25 */
65 	"",							/* -26 */
66 	"",							/* -27 */
67 	"",							/* -28 */
68 	"",							/* -29 */
69 	"CMD1394_EDEVICE_BUSY:  Device busy",			/* -30 */
70 	"CMD1394_ERETRIES_EXCEEDED:  Too many retries",		/* -31 */
71 	"CMD1394_ETYPE_ERROR:  Resp/ack type error",		/* -32 */
72 	"CMD1394_EDATA_ERROR:  Resp/ack data error",		/* -33 */
73 	"CMD1394_EBUSRESET:  Bus reset",			/* -34 */
74 	"CMD1394_EADDRESS_ERROR:  Address error",		/* -35 */
75 	"CMD1394_ETIMEOUT:  Command timed out",			/* -36 */
76 	"CMD1394_ERSRC_CONFLICT:  Resource conflict"		/* -37 */
77 };
78 
79 static const char *ixl_compilation_error_string[] = {
80 	"IXL1394_EMEM_ALLOC_FAIL:  Memory allocation failed",	/* -301 */
81 	"IXL1394_EBAD_IXL_OPCODE:  Bad opcode",			/* -302 */
82 	"IXL1394_EFRAGMENT_OFLO:  Descriptor block overflow",	/* -303 */
83 	"IXL1394_ENO_DATA_PKTS:  No descriptor blocks",		/* -304 */
84 	"IXL1394_EMISPLACED_RECV:  Misplaced receive",		/* -305 */
85 	"IXL1394_EMISPLACED_SEND:  Misplaced send",		/* -306 */
86 	"IXL1394_EPKT_HDR_MISSING:  Packet header missing",	/* -307 */
87 	"IXL1394_ENULL_BUFFER_ADDR:  NULL buffer address",	/* -308 */
88 	"IXL1394_EPKTSIZE_MAX_OFLO:  Packet > 0xFFFF bytes",	/* -309 */
89 	"IXL1394_EPKTSIZE_RATIO:  Improper packet length/count", /* -310 */
90 	"IXL1394_EUNAPPLIED_SET_CMD:  Unused set command",	/* -311 */
91 	"IXL1394_EDUPLICATE_SET_CMD:  Multiple set commands",	/* -312 */
92 	"IXL1394_EJUMP_NOT_TO_LABEL:  Jump destination not a label", /* -313 */
93 	"IXL1394_EUPDATE_DISALLOWED:  Update not allowed ",	/* -314 */
94 	"IXL1394_EBAD_SKIPMODE:  Invalid skip mode",		/* -315 */
95 	"IXL1394_EWRONG_XR_CMD_MODE:  Inapproriate xmit/recv mode", /* -316 */
96 	"IXL1394_EINTERNAL_ERROR:  Internal error",		/* -317 */
97 	"IXL1394_ENOT_IMPLEMENTED:  Unimplemented error",	/* -318 */
98 	"IXL1394_EOPCODE_MISMATCH:  Opcode mismatch",		/* -319 */
99 	"IXL1394_EOPCODE_DISALLOWED:  Opcode disallowed for update", /* -320 */
100 	"IXL1394_EBAD_SKIP_LABEL:  Skip label destination not a label",
101 	"IXL1394_EXFER_BUF_MISSING:  Missing buffer in transfer command",
102 	"IXL1394_EXFER_BUF_CNT_DIFF:  Packet count differs in new buffer",
103 	"IXL1394_EORIG_IXL_CORRUPTED:  Original IXL program corrupted",
104 	"IXL1394_ECOUNT_MISMATCH:  IXL command count difference", /* -325 */
105 	"IXL1394_EPRE_UPD_DMALOST:  DMA path lost before update", /* -326 */
106 	"IXL1394_EPOST_UPD_DMALOST:  DMA path lost after update", /* -327 */
107 	"IXL1394_ERISK_PROHIBITS_UPD:  Risk prohibits update"	/* -328 */
108 };
109 
110 static const char *addr_error_string[] = {
111 	"T1394_EALLOC_ADDR:  Unable to alloc 1394 address block", /* -400 */
112 };
113 
114 static const char *cec_error_string[] = {
115 	"T1394_ENO_BANDWIDTH:  Bandwidth allocation failed",	/* -500	*/
116 	"T1394_ENO_CHANNEL:  Channel allocation failed",	/* -501	*/
117 	"T1394_ETARGET:  One or more callbacks failed in isoch setup" /* -502 */
118 };
119 
120 static const char *idma_error_string[] = {
121 	"T1394_EIDMA_NO_RESRCS:  No DMA resources",		/* -600 */
122 	"T1394_EIDMA_CONFLICT:  Conflicting arguments"		/* -601 */
123 };
124 
125 static const char *cfgrom_error_string[] = {
126 	"T1394_ECFGROM_FULL:  Config ROM is full",		/* -700	*/
127 	"T1394_EINVALID_PARAM:  Invalid parameter in call",	/* -701	*/
128 	"T1394_EINVALID_CONTEXT:  Invalid context for call",	/* -702 */
129 	"T1394_NOERROR:  No error"				/* -703 */
130 };
131 
132 #define	T1394_ERRMSG_EMPTY_STRING		""
133 
134 /*
135  * Function:    t1394_errmsg()
136  * Input(s):    result			Result code
137  *		flags			The flags parameter is unused (for now)
138  *
139  * Output(s):	const string; empty string if invalid result code is passed in
140  *
141  * Description:	t1394_errmsg() returns a string corresponding the error code
142  */
143 /* ARGSUSED */
144 const char *
t1394_errmsg(int result,uint_t flags)145 t1394_errmsg(int result, uint_t flags)
146 {
147 	int err;
148 	const char *msg = T1394_ERRMSG_EMPTY_STRING;
149 
150 	if (result > 0) {
151 		return (T1394_ERRMSG_EMPTY_STRING);
152 	}
153 
154 	result = -result;
155 
156 	if ((result >= -CMD1394_ERR_FIRST) && (result <= -CMD1394_ERR_LAST)) {
157 		err = result - (-CMD1394_ERR_FIRST);
158 		msg = error_string[err];
159 	} else if ((result >= -IXL1394_COMP_ERR_FIRST) &&
160 	    (result <= -IXL1394_COMP_ERR_LAST)) {
161 		err = result - (-IXL1394_COMP_ERR_FIRST);
162 		msg = ixl_compilation_error_string[err];
163 	} else if ((result >= -T1394_EADDR_FIRST) &&
164 	    (result <= -T1394_EADDR_LAST)) {
165 		err = result - (-T1394_EADDR_FIRST);
166 		msg = addr_error_string[err];
167 	} else if ((result >= -T1394_CEC_ERR_FIRST) &&
168 	    (result <= -T1394_CEC_ERR_LAST)) {
169 		err = result - (-T1394_CEC_ERR_FIRST);
170 		msg = cec_error_string[err];
171 	} else if ((result >= -T1394_IDMA_ERR_FIRST) &&
172 	    (result <= -T1394_IDMA_ERR_LAST)) {
173 		err = result - (-T1394_IDMA_ERR_FIRST);
174 		msg = idma_error_string[err];
175 	} else if ((result >= -T1394_ECFG_FIRST) &&
176 	    (result <= -T1394_ECFG_LAST)) {
177 		err = result - (-T1394_ECFG_FIRST);
178 		msg = cfgrom_error_string[err];
179 	}
180 
181 	return (msg);
182 }
183