xref: /illumos-gate/usr/src/uts/common/io/1394/t1394_errmsg.c (revision 3299f39fdcbdab4be7a9c70daa3873f2b78a398d)
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 #pragma	ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * t1394_errmsg.c
31  *    Utility function that targets can use to convert an error code into a
32  *    printable string.
33  */
34 
35 #include <sys/tnf_probe.h>
36 
37 #include <sys/1394/t1394.h>
38 #include <sys/1394/s1394.h>
39 #include <sys/1394/cmd1394.h>
40 #include <sys/1394/ixl1394.h>
41 
42 static const char *error_string[] = {
43 	"CMD1394_CMDSUCCESS:  Command Success",			/* 0 */
44 	"",							/* -1 */
45 	"",							/* -2 */
46 	"",							/* -3 */
47 	"",							/* -4 */
48 	"",							/* -5 */
49 	"",							/* -6 */
50 	"",							/* -7 */
51 	"",							/* -8 */
52 	"",							/* -9 */
53 	"CMD1394_ENULL_MBLK:  NULL mblk pointer",		/* -10 */
54 	"CMD1394_EMBLK_TOO_SMALL:  Mblk too small",		/* -11 */
55 	"CMD1394_ESTALE_GENERATION:  Stale generation",		/* -12 */
56 	"CMD1394_EDEVICE_REMOVED:  Device removed",		/* -13 */
57 	"CMD1394_EINVALID_CONTEXT:  Invalid context",		/* -14 */
58 	"CMD1394_EINVALID_COMMAND:  Invalid command",		/* -15 */
59 	"CMD1394_EUNKNOWN_ERROR:  Unknown error",		/* -16 */
60 	"CMD1394_NOSTATUS:  No status",				/* -17 */
61 	"CMD1394_EFATAL_ERROR:  Fatal error",			/* -18 */
62 	"CMD1394_ENO_ATREQ:  Unable to send ATREQ",		/* -19 */
63 	"CMD1394_EDEVICE_ERROR:  Device error",			/* -20 */
64 	"",							/* -21 */
65 	"",							/* -22 */
66 	"",							/* -23 */
67 	"",							/* -24 */
68 	"",							/* -25 */
69 	"",							/* -26 */
70 	"",							/* -27 */
71 	"",							/* -28 */
72 	"",							/* -29 */
73 	"CMD1394_EDEVICE_BUSY:  Device busy",			/* -30 */
74 	"CMD1394_ERETRIES_EXCEEDED:  Too many retries",		/* -31 */
75 	"CMD1394_ETYPE_ERROR:  Resp/ack type error",		/* -32 */
76 	"CMD1394_EDATA_ERROR:  Resp/ack data error",		/* -33 */
77 	"CMD1394_EBUSRESET:  Bus reset",			/* -34 */
78 	"CMD1394_EADDRESS_ERROR:  Address error",		/* -35 */
79 	"CMD1394_ETIMEOUT:  Command timed out",			/* -36 */
80 	"CMD1394_ERSRC_CONFLICT:  Resource conflict"		/* -37 */
81 };
82 
83 static const char *ixl_compilation_error_string[] = {
84 	"IXL1394_EMEM_ALLOC_FAIL:  Memory allocation failed",	/* -301 */
85 	"IXL1394_EBAD_IXL_OPCODE:  Bad opcode",			/* -302 */
86 	"IXL1394_EFRAGMENT_OFLO:  Descriptor block overflow",	/* -303 */
87 	"IXL1394_ENO_DATA_PKTS:  No descriptor blocks",		/* -304 */
88 	"IXL1394_EMISPLACED_RECV:  Misplaced receive",		/* -305 */
89 	"IXL1394_EMISPLACED_SEND:  Misplaced send",		/* -306 */
90 	"IXL1394_EPKT_HDR_MISSING:  Packet header missing",	/* -307 */
91 	"IXL1394_ENULL_BUFFER_ADDR:  NULL buffer address",	/* -308 */
92 	"IXL1394_EPKTSIZE_MAX_OFLO:  Packet > 0xFFFF bytes",	/* -309 */
93 	"IXL1394_EPKTSIZE_RATIO:  Improper packet length/count", /* -310 */
94 	"IXL1394_EUNAPPLIED_SET_CMD:  Unused set command",	/* -311 */
95 	"IXL1394_EDUPLICATE_SET_CMD:  Multiple set commands",	/* -312 */
96 	"IXL1394_EJUMP_NOT_TO_LABEL:  Jump destination not a label", /* -313 */
97 	"IXL1394_EUPDATE_DISALLOWED:  Update not allowed ",	/* -314 */
98 	"IXL1394_EBAD_SKIPMODE:  Invalid skip mode",		/* -315 */
99 	"IXL1394_EWRONG_XR_CMD_MODE:  Inapproriate xmit/recv mode", /* -316 */
100 	"IXL1394_EINTERNAL_ERROR:  Internal error",		/* -317 */
101 	"IXL1394_ENOT_IMPLEMENTED:  Unimplemented error",	/* -318 */
102 	"IXL1394_EOPCODE_MISMATCH:  Opcode mismatch",		/* -319 */
103 	"IXL1394_EOPCODE_DISALLOWED:  Opcode disallowed for update", /* -320 */
104 	"IXL1394_EBAD_SKIP_LABEL:  Skip label destination not a label",
105 	"IXL1394_EXFER_BUF_MISSING:  Missing buffer in transfer command",
106 	"IXL1394_EXFER_BUF_CNT_DIFF:  Packet count differs in new buffer",
107 	"IXL1394_EORIG_IXL_CORRUPTED:  Original IXL program corrupted",
108 	"IXL1394_ECOUNT_MISMATCH:  IXL command count difference", /* -325 */
109 	"IXL1394_EPRE_UPD_DMALOST:  DMA path lost before update", /* -326 */
110 	"IXL1394_EPOST_UPD_DMALOST:  DMA path lost after update", /* -327 */
111 	"IXL1394_ERISK_PROHIBITS_UPD:  Risk prohibits update"	/* -328 */
112 };
113 
114 static const char *addr_error_string[] = {
115 	"T1394_EALLOC_ADDR:  Unable to alloc 1394 address block", /* -400 */
116 };
117 
118 static const char *cec_error_string[] = {
119 	"T1394_ENO_BANDWIDTH:  Bandwidth allocation failed",	/* -500	*/
120 	"T1394_ENO_CHANNEL:  Channel allocation failed",	/* -501	*/
121 	"T1394_ETARGET:  One or more callbacks failed in isoch setup" /* -502 */
122 };
123 
124 static const char *idma_error_string[] = {
125 	"T1394_EIDMA_NO_RESRCS:  No DMA resources",		/* -600 */
126 	"T1394_EIDMA_CONFLICT:  Conflicting arguments"		/* -601 */
127 };
128 
129 static const char *cfgrom_error_string[] = {
130 	"T1394_ECFGROM_FULL:  Config ROM is full",		/* -700	*/
131 	"T1394_EINVALID_PARAM:  Invalid parameter in call",	/* -701	*/
132 	"T1394_EINVALID_CONTEXT:  Invalid context for call",	/* -702 */
133 	"T1394_NOERROR:  No error"				/* -703 */
134 };
135 
136 #define	T1394_ERRMSG_EMPTY_STRING		""
137 
138 /*
139  * Function:    t1394_errmsg()
140  * Input(s):    result			Result code
141  *		flags			The flags parameter is unused (for now)
142  *
143  * Output(s):	const string; empty string if invalid result code is passed in
144  *
145  * Description:	t1394_errmsg() returns a string corresponding the error code
146  */
147 /* ARGSUSED */
148 const char *
149 t1394_errmsg(int result, uint_t flags)
150 {
151 	int err;
152 	const char *msg = T1394_ERRMSG_EMPTY_STRING;
153 
154 	TNF_PROBE_1_DEBUG(t1394_errmsg_enter, S1394_TNF_SL_STACK, "",
155 	    tnf_int, argument, result);
156 
157 	if (result > 0) {
158 		TNF_PROBE_2(t1394_errmsg, S1394_TNF_SL_ERROR, "",
159 		    tnf_string, msg, "invalid result argument",
160 		    tnf_int, result, result);
161 		TNF_PROBE_0_DEBUG(t1394_errmsg_exit, S1394_TNF_SL_STACK, "");
162 		return (T1394_ERRMSG_EMPTY_STRING);
163 	}
164 
165 	result = -result;
166 
167 	if ((result >= -CMD1394_ERR_FIRST) && (result <= -CMD1394_ERR_LAST)) {
168 		err = result - (-CMD1394_ERR_FIRST);
169 		msg = error_string[err];
170 	} else if ((result >= -IXL1394_COMP_ERR_FIRST) &&
171 	    (result <= -IXL1394_COMP_ERR_LAST)) {
172 		err = result - (-IXL1394_COMP_ERR_FIRST);
173 		msg = ixl_compilation_error_string[err];
174 	} else if ((result >= -T1394_EADDR_FIRST) &&
175 	    (result <= -T1394_EADDR_LAST)) {
176 		err = result - (-T1394_EADDR_FIRST);
177 		msg = addr_error_string[err];
178 	} else if ((result >= -T1394_CEC_ERR_FIRST) &&
179 	    (result <= -T1394_CEC_ERR_LAST)) {
180 		err = result - (-T1394_CEC_ERR_FIRST);
181 		msg = cec_error_string[err];
182 	} else if ((result >= -T1394_IDMA_ERR_FIRST) &&
183 	    (result <= -T1394_IDMA_ERR_LAST)) {
184 		err = result - (-T1394_IDMA_ERR_FIRST);
185 		msg = idma_error_string[err];
186 	} else if ((result >= -T1394_ECFG_FIRST) &&
187 	    (result <= -T1394_ECFG_LAST)) {
188 		err = result - (-T1394_ECFG_FIRST);
189 		msg = cfgrom_error_string[err];
190 	} else {
191 		TNF_PROBE_2(t1394_errmsg, S1394_TNF_SL_ERROR, "",
192 		    tnf_string, msg, "invalid result argument",
193 		    tnf_int, result, result);
194 	}
195 
196 	TNF_PROBE_0_DEBUG(t1394_errmsg_exit, S1394_TNF_SL_STACK, "");
197 
198 	return (msg);
199 }
200