xref: /openbmc/ipmitool/src/plugins/free/free.c (revision 6d4e2bb632636115400c9d2de1e61c340d9e2111)
1c18ec02fSPetter Reinholdtsen /*
2c18ec02fSPetter Reinholdtsen  * Copyright (c) 2003 Sun Microsystems, Inc.  All Rights Reserved.
3c18ec02fSPetter Reinholdtsen  *
4c18ec02fSPetter Reinholdtsen  * Redistribution and use in source and binary forms, with or without
5c18ec02fSPetter Reinholdtsen  * modification, are permitted provided that the following conditions
6c18ec02fSPetter Reinholdtsen  * are met:
7c18ec02fSPetter Reinholdtsen  *
8c18ec02fSPetter Reinholdtsen  * Redistribution of source code must retain the above copyright
9c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer.
10c18ec02fSPetter Reinholdtsen  *
11c18ec02fSPetter Reinholdtsen  * Redistribution in binary form must reproduce the above copyright
12c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer in the
13c18ec02fSPetter Reinholdtsen  * documentation and/or other materials provided with the distribution.
14c18ec02fSPetter Reinholdtsen  *
15c18ec02fSPetter Reinholdtsen  * Neither the name of Sun Microsystems, Inc. or the names of
16c18ec02fSPetter Reinholdtsen  * contributors may be used to endorse or promote products derived
17c18ec02fSPetter Reinholdtsen  * from this software without specific prior written permission.
18c18ec02fSPetter Reinholdtsen  *
19c18ec02fSPetter Reinholdtsen  * This software is provided "AS IS," without a warranty of any kind.
20c18ec02fSPetter Reinholdtsen  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
21c18ec02fSPetter Reinholdtsen  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
22c18ec02fSPetter Reinholdtsen  * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
23c18ec02fSPetter Reinholdtsen  * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
24c18ec02fSPetter Reinholdtsen  * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
25c18ec02fSPetter Reinholdtsen  * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
26c18ec02fSPetter Reinholdtsen  * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
27c18ec02fSPetter Reinholdtsen  * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
28c18ec02fSPetter Reinholdtsen  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
29c18ec02fSPetter Reinholdtsen  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
30c18ec02fSPetter Reinholdtsen  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
31c18ec02fSPetter Reinholdtsen  *
32c18ec02fSPetter Reinholdtsen  * You acknowledge that this software is not designed or intended for use
33c18ec02fSPetter Reinholdtsen  * in the design, construction, operation or maintenance of any nuclear
34c18ec02fSPetter Reinholdtsen  * facility.
35c18ec02fSPetter Reinholdtsen  */
36c18ec02fSPetter Reinholdtsen 
37c18ec02fSPetter Reinholdtsen #if defined(HAVE_CONFIG_H)
38c18ec02fSPetter Reinholdtsen # include <config.h>
39c18ec02fSPetter Reinholdtsen #endif
40c18ec02fSPetter Reinholdtsen 
41c18ec02fSPetter Reinholdtsen #include <stdio.h>
42c18ec02fSPetter Reinholdtsen #include <stdlib.h>
43c18ec02fSPetter Reinholdtsen #include <string.h>
44c18ec02fSPetter Reinholdtsen #include <sys/types.h>
45c18ec02fSPetter Reinholdtsen 
46c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi.h>
47c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_intf.h>
48c18ec02fSPetter Reinholdtsen 
49c18ec02fSPetter Reinholdtsen #include <freeipmi/freeipmi.h>
50c18ec02fSPetter Reinholdtsen #if IPMI_INTF_FREE_0_3_0 || IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0
51c18ec02fSPetter Reinholdtsen #include <freeipmi/udm/ipmi-udm.h>
52c18ec02fSPetter Reinholdtsen #endif
53c18ec02fSPetter Reinholdtsen 
54c18ec02fSPetter Reinholdtsen #if IPMI_INTF_FREE_0_6_0
55c18ec02fSPetter Reinholdtsen ipmi_ctx_t dev = NULL;
56c18ec02fSPetter Reinholdtsen #else  /* !IPMI_INTF_FREE_0_6_0 */
57c18ec02fSPetter Reinholdtsen ipmi_device_t dev = NULL;
58c18ec02fSPetter Reinholdtsen #endif  /* !IPMI_INTF_FREE_0_6_0 */
59c18ec02fSPetter Reinholdtsen 
60c18ec02fSPetter Reinholdtsen extern int verbose;
61c18ec02fSPetter Reinholdtsen 
ipmi_free_open(struct ipmi_intf * intf)62c18ec02fSPetter Reinholdtsen static int ipmi_free_open(struct ipmi_intf * intf)
63c18ec02fSPetter Reinholdtsen {
64c18ec02fSPetter Reinholdtsen         int kcs_ret = -1, ssif_ret = -1;
65c18ec02fSPetter Reinholdtsen 
66c18ec02fSPetter Reinholdtsen         if (getuid() != 0) {
67c18ec02fSPetter Reinholdtsen                 fprintf(stderr, "Permission denied, must be root\n");
68c18ec02fSPetter Reinholdtsen                 return -1;
69c18ec02fSPetter Reinholdtsen         }
70c18ec02fSPetter Reinholdtsen 
71c18ec02fSPetter Reinholdtsen #if IPMI_INTF_FREE_0_3_0
72c18ec02fSPetter Reinholdtsen         if (!(dev = ipmi_open_inband (IPMI_DEVICE_KCS,
73c18ec02fSPetter Reinholdtsen                                       0,
74c18ec02fSPetter Reinholdtsen                                       0,
75c18ec02fSPetter Reinholdtsen                                       0,
76c18ec02fSPetter Reinholdtsen                                       NULL,
77c18ec02fSPetter Reinholdtsen                                       IPMI_FLAGS_DEFAULT))) {
78c18ec02fSPetter Reinholdtsen                 if (!(dev = ipmi_open_inband (IPMI_DEVICE_SSIF,
79c18ec02fSPetter Reinholdtsen                                               0,
80c18ec02fSPetter Reinholdtsen                                               0,
81c18ec02fSPetter Reinholdtsen                                               0,
82c18ec02fSPetter Reinholdtsen                                               NULL,
83c18ec02fSPetter Reinholdtsen                                               IPMI_FLAGS_DEFAULT))) {
84c18ec02fSPetter Reinholdtsen                         perror("ipmi_open_inband()");
85c18ec02fSPetter Reinholdtsen                         goto cleanup;
86c18ec02fSPetter Reinholdtsen                 }
87c18ec02fSPetter Reinholdtsen         }
88c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_4_0
89c18ec02fSPetter Reinholdtsen         if (!(dev = ipmi_device_create())) {
90c18ec02fSPetter Reinholdtsen                 perror("ipmi_device_create");
91c18ec02fSPetter Reinholdtsen                 goto cleanup;
92c18ec02fSPetter Reinholdtsen         }
93c18ec02fSPetter Reinholdtsen         if (ipmi_open_inband (dev,
94c18ec02fSPetter Reinholdtsen                               IPMI_DEVICE_KCS,
95c18ec02fSPetter Reinholdtsen                               0,
96c18ec02fSPetter Reinholdtsen                               0,
97c18ec02fSPetter Reinholdtsen                               0,
98c18ec02fSPetter Reinholdtsen                               NULL,
99c18ec02fSPetter Reinholdtsen                               IPMI_FLAGS_DEFAULT) < 0) {
100c18ec02fSPetter Reinholdtsen                 if (ipmi_open_inband (dev,
101c18ec02fSPetter Reinholdtsen                                       IPMI_DEVICE_SSIF,
102c18ec02fSPetter Reinholdtsen                                       0,
103c18ec02fSPetter Reinholdtsen                                       0,
104c18ec02fSPetter Reinholdtsen                                       0,
105c18ec02fSPetter Reinholdtsen                                       NULL,
106c18ec02fSPetter Reinholdtsen                                       IPMI_FLAGS_DEFAULT) < 0) {
107c18ec02fSPetter Reinholdtsen                        fprintf(stderr,
108c18ec02fSPetter Reinholdtsen                                "ipmi_open_inband(): %s\n",
109c18ec02fSPetter Reinholdtsen                                ipmi_device_strerror(ipmi_device_errnum(dev)));
110c18ec02fSPetter Reinholdtsen                        goto cleanup;
111c18ec02fSPetter Reinholdtsen                 }
112c18ec02fSPetter Reinholdtsen         }
113c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_5_0
114c18ec02fSPetter Reinholdtsen         if (!(dev = ipmi_device_create())) {
115c18ec02fSPetter Reinholdtsen                 perror("ipmi_device_create");
116c18ec02fSPetter Reinholdtsen                 goto cleanup;
117c18ec02fSPetter Reinholdtsen         }
118c18ec02fSPetter Reinholdtsen         if (ipmi_open_inband (dev,
119c18ec02fSPetter Reinholdtsen                               IPMI_DEVICE_KCS,
120c18ec02fSPetter Reinholdtsen                               0,
121c18ec02fSPetter Reinholdtsen                               0,
122c18ec02fSPetter Reinholdtsen                               0,
123c18ec02fSPetter Reinholdtsen                               NULL,
124c18ec02fSPetter Reinholdtsen                               0,
125c18ec02fSPetter Reinholdtsen                               IPMI_FLAGS_DEFAULT) < 0) {
126c18ec02fSPetter Reinholdtsen                 if (ipmi_open_inband (dev,
127c18ec02fSPetter Reinholdtsen                                       IPMI_DEVICE_SSIF,
128c18ec02fSPetter Reinholdtsen                                       0,
129c18ec02fSPetter Reinholdtsen                                       0,
130c18ec02fSPetter Reinholdtsen                                       0,
131c18ec02fSPetter Reinholdtsen                                       NULL,
132c18ec02fSPetter Reinholdtsen                                       0,
133c18ec02fSPetter Reinholdtsen                                       IPMI_FLAGS_DEFAULT) < 0) {
134c18ec02fSPetter Reinholdtsen                        fprintf(stderr,
135c18ec02fSPetter Reinholdtsen                                "ipmi_open_inband(): %s\n",
136c18ec02fSPetter Reinholdtsen                                ipmi_device_strerror(ipmi_device_errnum(dev)));
137c18ec02fSPetter Reinholdtsen                        goto cleanup;
138c18ec02fSPetter Reinholdtsen                 }
139c18ec02fSPetter Reinholdtsen         }
140c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_6_0
141c18ec02fSPetter Reinholdtsen         if (!(dev = ipmi_ctx_create())) {
142c18ec02fSPetter Reinholdtsen                 perror("ipmi_ctx_create");
143c18ec02fSPetter Reinholdtsen                 goto cleanup;
144c18ec02fSPetter Reinholdtsen         }
145c18ec02fSPetter Reinholdtsen         if (ipmi_ctx_open_inband (dev,
146c18ec02fSPetter Reinholdtsen                                   IPMI_DEVICE_KCS,
147c18ec02fSPetter Reinholdtsen                                   0,
148c18ec02fSPetter Reinholdtsen                                   0,
149c18ec02fSPetter Reinholdtsen                                   0,
150c18ec02fSPetter Reinholdtsen                                   NULL,
151c18ec02fSPetter Reinholdtsen                                   0,
152c18ec02fSPetter Reinholdtsen                                   IPMI_FLAGS_DEFAULT) < 0) {
153c18ec02fSPetter Reinholdtsen                 if (ipmi_ctx_open_inband (dev,
154c18ec02fSPetter Reinholdtsen                                           IPMI_DEVICE_SSIF,
155c18ec02fSPetter Reinholdtsen                                           0,
156c18ec02fSPetter Reinholdtsen                                           0,
157c18ec02fSPetter Reinholdtsen                                           0,
158c18ec02fSPetter Reinholdtsen                                           NULL,
159c18ec02fSPetter Reinholdtsen                                           0,
160c18ec02fSPetter Reinholdtsen                                           IPMI_FLAGS_DEFAULT) < 0) {
161c18ec02fSPetter Reinholdtsen                        fprintf(stderr,
162c18ec02fSPetter Reinholdtsen                                "ipmi_open_inband(): %s\n",
163c18ec02fSPetter Reinholdtsen                                ipmi_ctx_strerror(ipmi_ctx_errnum(dev)));
164c18ec02fSPetter Reinholdtsen                        goto cleanup;
165c18ec02fSPetter Reinholdtsen                 }
166c18ec02fSPetter Reinholdtsen         }
167c18ec02fSPetter Reinholdtsen #endif
168c18ec02fSPetter Reinholdtsen 
169c18ec02fSPetter Reinholdtsen 	intf->opened = 1;
170c18ec02fSPetter Reinholdtsen 	intf->manufacturer_id = ipmi_get_oem(intf);
171c18ec02fSPetter Reinholdtsen 	return 0;
172c18ec02fSPetter Reinholdtsen  cleanup:
173c18ec02fSPetter Reinholdtsen         if (dev) {
174c18ec02fSPetter Reinholdtsen #if IPMI_INTF_FREE_0_3_0
175c18ec02fSPetter Reinholdtsen                 ipmi_close_device(dev);
176c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0
177c18ec02fSPetter Reinholdtsen                 ipmi_close_device(dev);
178c18ec02fSPetter Reinholdtsen                 ipmi_device_destroy(dev);
179c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_6_0
180c18ec02fSPetter Reinholdtsen                 ipmi_ctx_close(dev);
181c18ec02fSPetter Reinholdtsen                 ipmi_ctx_destroy(dev);
182c18ec02fSPetter Reinholdtsen #endif
183c18ec02fSPetter Reinholdtsen         }
184c18ec02fSPetter Reinholdtsen         return -1;
185c18ec02fSPetter Reinholdtsen }
186c18ec02fSPetter Reinholdtsen 
ipmi_free_close(struct ipmi_intf * intf)187c18ec02fSPetter Reinholdtsen static void ipmi_free_close(struct ipmi_intf * intf)
188c18ec02fSPetter Reinholdtsen {
189c18ec02fSPetter Reinholdtsen         if (dev) {
190c18ec02fSPetter Reinholdtsen #if IPMI_INTF_FREE_0_3_0
191c18ec02fSPetter Reinholdtsen                 ipmi_close_device(dev);
192c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0
193c18ec02fSPetter Reinholdtsen                 ipmi_close_device(dev);
194c18ec02fSPetter Reinholdtsen                 ipmi_device_destroy(dev);
195c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_6_0
196c18ec02fSPetter Reinholdtsen                 ipmi_ctx_close(dev);
197c18ec02fSPetter Reinholdtsen                 ipmi_ctx_destroy(dev);
198c18ec02fSPetter Reinholdtsen #endif
199c18ec02fSPetter Reinholdtsen         }
200c18ec02fSPetter Reinholdtsen 	intf->opened = 0;
201c18ec02fSPetter Reinholdtsen 	intf->manufacturer_id = IPMI_OEM_UNKNOWN;
202c18ec02fSPetter Reinholdtsen }
203c18ec02fSPetter Reinholdtsen 
ipmi_free_send_cmd(struct ipmi_intf * intf,struct ipmi_rq * req)204c18ec02fSPetter Reinholdtsen static struct ipmi_rs * ipmi_free_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
205c18ec02fSPetter Reinholdtsen {
206*6d4e2bb6SZdenek Styblik         uint8_t lun = req->msg.lun;
207*6d4e2bb6SZdenek Styblik         uint8_t cmd = req->msg.cmd;
208*6d4e2bb6SZdenek Styblik         uint8_t netfn = req->msg.netfn;
209*6d4e2bb6SZdenek Styblik         uint8_t rq_buf[IPMI_BUF_SIZE];
210*6d4e2bb6SZdenek Styblik         uint8_t rs_buf[IPMI_BUF_SIZE];
211*6d4e2bb6SZdenek Styblik         uint32_t rs_buf_len = IPMI_BUF_SIZE;
212c18ec02fSPetter Reinholdtsen         int32_t rs_len;
213c18ec02fSPetter Reinholdtsen 
214c18ec02fSPetter Reinholdtsen 	static struct ipmi_rs rsp;
215c18ec02fSPetter Reinholdtsen 
216c18ec02fSPetter Reinholdtsen         /* achu: FreeIPMI requests have the cmd as the first byte of
217c18ec02fSPetter Reinholdtsen          * the data.  Responses have cmd as the first byte and
218c18ec02fSPetter Reinholdtsen          * completion code as the second byte.  This differs from some
219c18ec02fSPetter Reinholdtsen          * other APIs, so it must be compensated for within the ipmitool
220c18ec02fSPetter Reinholdtsen          * interface.
221c18ec02fSPetter Reinholdtsen          */
222c18ec02fSPetter Reinholdtsen 
223c18ec02fSPetter Reinholdtsen 	if (!intf || !req)
224c18ec02fSPetter Reinholdtsen 		return NULL;
225c18ec02fSPetter Reinholdtsen 
226c18ec02fSPetter Reinholdtsen 	if (!intf->opened && intf->open && intf->open(intf) < 0)
227c18ec02fSPetter Reinholdtsen 		return NULL;
228c18ec02fSPetter Reinholdtsen 
229c18ec02fSPetter Reinholdtsen         if (req->msg.data_len > IPMI_BUF_SIZE)
230c18ec02fSPetter Reinholdtsen                 return NULL;
231c18ec02fSPetter Reinholdtsen 
232c18ec02fSPetter Reinholdtsen         memset(rq_buf, '\0', IPMI_BUF_SIZE);
233c18ec02fSPetter Reinholdtsen         memset(rs_buf, '\0', IPMI_BUF_SIZE);
234c18ec02fSPetter Reinholdtsen         memcpy(rq_buf, &cmd, 1);
235c18ec02fSPetter Reinholdtsen 
236c18ec02fSPetter Reinholdtsen         if (req->msg.data)
237c18ec02fSPetter Reinholdtsen                memcpy(rq_buf + 1, req->msg.data, req->msg.data_len);
238c18ec02fSPetter Reinholdtsen 
239c18ec02fSPetter Reinholdtsen         if (intf->target_addr != 0
240c18ec02fSPetter Reinholdtsen             && intf->target_addr != IPMI_BMC_SLAVE_ADDR) {
241c18ec02fSPetter Reinholdtsen #if IPMI_INTF_FREE_BRIDGING
242c18ec02fSPetter Reinholdtsen                 if ((rs_len = ipmi_cmd_raw_ipmb(dev,
243c18ec02fSPetter Reinholdtsen                                                 intf->target_channel,
244c18ec02fSPetter Reinholdtsen                                                 intf->target_addr,
245c18ec02fSPetter Reinholdtsen                                                 lun,
246c18ec02fSPetter Reinholdtsen                                                 netfn,
247c18ec02fSPetter Reinholdtsen                                                 rq_buf,
248c18ec02fSPetter Reinholdtsen                                                 req->msg.data_len + 1,
249c18ec02fSPetter Reinholdtsen                                                 rs_buf,
250c18ec02fSPetter Reinholdtsen                                                 rs_buf_len)) < 0) {
251c18ec02fSPetter Reinholdtsen 			if (verbose > 3)
252c18ec02fSPetter Reinholdtsen                       	        fprintf(stderr,
253c18ec02fSPetter Reinholdtsen                                 	"ipmi_cmd_raw_ipmb: %s\n",
254c18ec02fSPetter Reinholdtsen                                 	ipmi_ctx_strerror(ipmi_ctx_errnum(dev)));
255c18ec02fSPetter Reinholdtsen 			/* Compared to FreeIPMI, user is expected to input
256c18ec02fSPetter Reinholdtsen 			 * the target channel on the command line, it is not automatically
257c18ec02fSPetter Reinholdtsen 			 * discovered.  So that is the likely cause of an error.
258c18ec02fSPetter Reinholdtsen 			 *
259c18ec02fSPetter Reinholdtsen 			 * Instead of returning an error, return a bad response so output
260c18ec02fSPetter Reinholdtsen 			 * of ipmitool commands looks like other interfaces
261c18ec02fSPetter Reinholdtsen 			 */
262c18ec02fSPetter Reinholdtsen 			rs_len = 2;
263c18ec02fSPetter Reinholdtsen 			rs_buf[0] = 0;
264c18ec02fSPetter Reinholdtsen 			rs_buf[1] = 0xC1; /* invalid command */
265c18ec02fSPetter Reinholdtsen                 }
266c18ec02fSPetter Reinholdtsen #else  /* !IPMI_INTF_FREE_BRIDGING */
267c18ec02fSPetter Reinholdtsen                 if (verbose > 3)
268c18ec02fSPetter Reinholdtsen                         fprintf(stderr, "sensor bridging not supported in this driver version");
269c18ec02fSPetter Reinholdtsen 		/* instead of returning an error, return a bad response so output
270c18ec02fSPetter Reinholdtsen 	 	 * of ipmitool commands looks like other interfaces
271c18ec02fSPetter Reinholdtsen 		 */
272c18ec02fSPetter Reinholdtsen 		rs_len = 2;
273c18ec02fSPetter Reinholdtsen 		rs_buf[0] = 0;
274c18ec02fSPetter Reinholdtsen 		rs_buf[1] = 0xC1; /* invalid command */
275c18ec02fSPetter Reinholdtsen #endif  /* !IPMI_INTF_FREE_BRIDGING */
276c18ec02fSPetter Reinholdtsen         }
277c18ec02fSPetter Reinholdtsen         else {
278c18ec02fSPetter Reinholdtsen                 if ((rs_len = ipmi_cmd_raw(dev,
279c18ec02fSPetter Reinholdtsen                                            lun,
280c18ec02fSPetter Reinholdtsen                                            netfn,
281c18ec02fSPetter Reinholdtsen                                            rq_buf,
282c18ec02fSPetter Reinholdtsen                                            req->msg.data_len + 1,
283c18ec02fSPetter Reinholdtsen                                            rs_buf,
284c18ec02fSPetter Reinholdtsen                                            rs_buf_len)) < 0) {
285c18ec02fSPetter Reinholdtsen #if IPMI_INTF_FREE_0_3_0
286c18ec02fSPetter Reinholdtsen                         perror("ipmi_cmd_raw");
287c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_4_0 || IPMI_INTF_FREE_0_5_0
288c18ec02fSPetter Reinholdtsen                         fprintf(stderr,
289c18ec02fSPetter Reinholdtsen                                 "ipmi_cmd_raw: %s\n",
290c18ec02fSPetter Reinholdtsen                                 ipmi_device_strerror(ipmi_device_errnum(dev)));
291c18ec02fSPetter Reinholdtsen #elif IPMI_INTF_FREE_0_6_0
292c18ec02fSPetter Reinholdtsen                         fprintf(stderr,
293c18ec02fSPetter Reinholdtsen                                 "ipmi_cmd_raw: %s\n",
294c18ec02fSPetter Reinholdtsen                                 ipmi_ctx_strerror(ipmi_ctx_errnum(dev)));
295c18ec02fSPetter Reinholdtsen #endif
296c18ec02fSPetter Reinholdtsen                         return NULL;
297c18ec02fSPetter Reinholdtsen                 }
298c18ec02fSPetter Reinholdtsen         }
299c18ec02fSPetter Reinholdtsen 
300c18ec02fSPetter Reinholdtsen         memset(&rsp, 0, sizeof(struct ipmi_rs));
301c18ec02fSPetter Reinholdtsen 	rsp.ccode = (unsigned char)rs_buf[1];
302c18ec02fSPetter Reinholdtsen 	rsp.data_len = (int)rs_len - 2;
303c18ec02fSPetter Reinholdtsen 
304c18ec02fSPetter Reinholdtsen 	if (!rsp.ccode && rsp.data_len)
305c18ec02fSPetter Reinholdtsen 		memcpy(rsp.data, rs_buf + 2, rsp.data_len);
306c18ec02fSPetter Reinholdtsen 
307c18ec02fSPetter Reinholdtsen 	return &rsp;
308c18ec02fSPetter Reinholdtsen }
309c18ec02fSPetter Reinholdtsen 
310c18ec02fSPetter Reinholdtsen struct ipmi_intf ipmi_free_intf = {
311c18ec02fSPetter Reinholdtsen 	name:		"free",
312c18ec02fSPetter Reinholdtsen 	desc:		"FreeIPMI IPMI Interface",
313c18ec02fSPetter Reinholdtsen 	open:		ipmi_free_open,
314c18ec02fSPetter Reinholdtsen 	close:		ipmi_free_close,
315c18ec02fSPetter Reinholdtsen 	sendrecv:	ipmi_free_send_cmd,
316c18ec02fSPetter Reinholdtsen 	target_addr:	IPMI_BMC_SLAVE_ADDR,
317c18ec02fSPetter Reinholdtsen };
318c18ec02fSPetter Reinholdtsen 
319