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