aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/ipmi.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/ipmi.h')
-rw-r--r--include/linux/ipmi.h153
1 files changed, 96 insertions, 57 deletions
diff --git a/include/linux/ipmi.h b/include/linux/ipmi.h
index 8b0626cec980..41f5c086f670 100644
--- a/include/linux/ipmi.h
+++ b/include/linux/ipmi.h
@@ -23,8 +23,10 @@
23struct module; 23struct module;
24struct device; 24struct device;
25 25
26/* Opaque type for a IPMI message user. One of these is needed to 26/*
27 send and receive messages. */ 27 * Opaque type for a IPMI message user. One of these is needed to
28 * send and receive messages.
29 */
28typedef struct ipmi_user *ipmi_user_t; 30typedef struct ipmi_user *ipmi_user_t;
29 31
30/* 32/*
@@ -37,28 +39,36 @@ typedef struct ipmi_user *ipmi_user_t;
37struct ipmi_recv_msg { 39struct ipmi_recv_msg {
38 struct list_head link; 40 struct list_head link;
39 41
40 /* The type of message as defined in the "Receive Types" 42 /*
41 defines above. */ 43 * The type of message as defined in the "Receive Types"
44 * defines above.
45 */
42 int recv_type; 46 int recv_type;
43 47
44 ipmi_user_t user; 48 struct ipmi_user *user;
45 struct ipmi_addr addr; 49 struct ipmi_addr addr;
46 long msgid; 50 long msgid;
47 struct kernel_ipmi_msg msg; 51 struct kernel_ipmi_msg msg;
48 52
49 /* The user_msg_data is the data supplied when a message was 53 /*
50 sent, if this is a response to a sent message. If this is 54 * The user_msg_data is the data supplied when a message was
51 not a response to a sent message, then user_msg_data will 55 * sent, if this is a response to a sent message. If this is
52 be NULL. If the user above is NULL, then this will be the 56 * not a response to a sent message, then user_msg_data will
53 intf. */ 57 * be NULL. If the user above is NULL, then this will be the
58 * intf.
59 */
54 void *user_msg_data; 60 void *user_msg_data;
55 61
56 /* Call this when done with the message. It will presumably free 62 /*
57 the message and do any other necessary cleanup. */ 63 * Call this when done with the message. It will presumably free
64 * the message and do any other necessary cleanup.
65 */
58 void (*done)(struct ipmi_recv_msg *msg); 66 void (*done)(struct ipmi_recv_msg *msg);
59 67
60 /* Place-holder for the data, don't make any assumptions about 68 /*
61 the size or existence of this, since it may change. */ 69 * Place-holder for the data, don't make any assumptions about
70 * the size or existence of this, since it may change.
71 */
62 unsigned char msg_data[IPMI_MAX_MSG_LENGTH]; 72 unsigned char msg_data[IPMI_MAX_MSG_LENGTH];
63}; 73};
64 74
@@ -66,54 +76,77 @@ struct ipmi_recv_msg {
66void ipmi_free_recv_msg(struct ipmi_recv_msg *msg); 76void ipmi_free_recv_msg(struct ipmi_recv_msg *msg);
67 77
68struct ipmi_user_hndl { 78struct ipmi_user_hndl {
69 /* Routine type to call when a message needs to be routed to 79 /*
70 the upper layer. This will be called with some locks held, 80 * Routine type to call when a message needs to be routed to
71 the only IPMI routines that can be called are ipmi_request 81 * the upper layer. This will be called with some locks held,
72 and the alloc/free operations. The handler_data is the 82 * the only IPMI routines that can be called are ipmi_request
73 variable supplied when the receive handler was registered. */ 83 * and the alloc/free operations. The handler_data is the
84 * variable supplied when the receive handler was registered.
85 */
74 void (*ipmi_recv_hndl)(struct ipmi_recv_msg *msg, 86 void (*ipmi_recv_hndl)(struct ipmi_recv_msg *msg,
75 void *user_msg_data); 87 void *user_msg_data);
76 88
77 /* Called when the interface detects a watchdog pre-timeout. If 89 /*
78 this is NULL, it will be ignored for the user. */ 90 * Called when the interface detects a watchdog pre-timeout. If
91 * this is NULL, it will be ignored for the user.
92 */
79 void (*ipmi_watchdog_pretimeout)(void *handler_data); 93 void (*ipmi_watchdog_pretimeout)(void *handler_data);
94
95 /*
96 * If not NULL, called at panic time after the interface has
97 * been set up to handle run to completion.
98 */
99 void (*ipmi_panic_handler)(void *handler_data);
100
101 /*
102 * Called when the interface has been removed. After this returns
103 * the user handle will be invalid. The interface may or may
104 * not be usable when this is called, but it will return errors
105 * if it is not usable.
106 */
107 void (*shutdown)(void *handler_data);
80}; 108};
81 109
82/* Create a new user of the IPMI layer on the given interface number. */ 110/* Create a new user of the IPMI layer on the given interface number. */
83int ipmi_create_user(unsigned int if_num, 111int ipmi_create_user(unsigned int if_num,
84 const struct ipmi_user_hndl *handler, 112 const struct ipmi_user_hndl *handler,
85 void *handler_data, 113 void *handler_data,
86 ipmi_user_t *user); 114 struct ipmi_user **user);
87 115
88/* Destroy the given user of the IPMI layer. Note that after this 116/*
89 function returns, the system is guaranteed to not call any 117 * Destroy the given user of the IPMI layer. Note that after this
90 callbacks for the user. Thus as long as you destroy all the users 118 * function returns, the system is guaranteed to not call any
91 before you unload a module, you will be safe. And if you destroy 119 * callbacks for the user. Thus as long as you destroy all the users
92 the users before you destroy the callback structures, it should be 120 * before you unload a module, you will be safe. And if you destroy
93 safe, too. */ 121 * the users before you destroy the callback structures, it should be
94int ipmi_destroy_user(ipmi_user_t user); 122 * safe, too.
123 */
124int ipmi_destroy_user(struct ipmi_user *user);
95 125
96/* Get the IPMI version of the BMC we are talking to. */ 126/* Get the IPMI version of the BMC we are talking to. */
97int ipmi_get_version(ipmi_user_t user, 127int ipmi_get_version(struct ipmi_user *user,
98 unsigned char *major, 128 unsigned char *major,
99 unsigned char *minor); 129 unsigned char *minor);
100 130
101/* Set and get the slave address and LUN that we will use for our 131/*
102 source messages. Note that this affects the interface, not just 132 * Set and get the slave address and LUN that we will use for our
103 this user, so it will affect all users of this interface. This is 133 * source messages. Note that this affects the interface, not just
104 so some initialization code can come in and do the OEM-specific 134 * this user, so it will affect all users of this interface. This is
105 things it takes to determine your address (if not the BMC) and set 135 * so some initialization code can come in and do the OEM-specific
106 it for everyone else. Note that each channel can have its own address. */ 136 * things it takes to determine your address (if not the BMC) and set
107int ipmi_set_my_address(ipmi_user_t user, 137 * it for everyone else. Note that each channel can have its own
138 * address.
139 */
140int ipmi_set_my_address(struct ipmi_user *user,
108 unsigned int channel, 141 unsigned int channel,
109 unsigned char address); 142 unsigned char address);
110int ipmi_get_my_address(ipmi_user_t user, 143int ipmi_get_my_address(struct ipmi_user *user,
111 unsigned int channel, 144 unsigned int channel,
112 unsigned char *address); 145 unsigned char *address);
113int ipmi_set_my_LUN(ipmi_user_t user, 146int ipmi_set_my_LUN(struct ipmi_user *user,
114 unsigned int channel, 147 unsigned int channel,
115 unsigned char LUN); 148 unsigned char LUN);
116int ipmi_get_my_LUN(ipmi_user_t user, 149int ipmi_get_my_LUN(struct ipmi_user *user,
117 unsigned int channel, 150 unsigned int channel,
118 unsigned char *LUN); 151 unsigned char *LUN);
119 152
@@ -130,7 +163,7 @@ int ipmi_get_my_LUN(ipmi_user_t user,
130 * it makes no sense to do it here. However, this can be used if you 163 * it makes no sense to do it here. However, this can be used if you
131 * have unusual requirements. 164 * have unusual requirements.
132 */ 165 */
133int ipmi_request_settime(ipmi_user_t user, 166int ipmi_request_settime(struct ipmi_user *user,
134 struct ipmi_addr *addr, 167 struct ipmi_addr *addr,
135 long msgid, 168 long msgid,
136 struct kernel_ipmi_msg *msg, 169 struct kernel_ipmi_msg *msg,
@@ -148,7 +181,7 @@ int ipmi_request_settime(ipmi_user_t user,
148 * change as the system changes, so don't use it unless you REALLY 181 * change as the system changes, so don't use it unless you REALLY
149 * have to. 182 * have to.
150 */ 183 */
151int ipmi_request_supply_msgs(ipmi_user_t user, 184int ipmi_request_supply_msgs(struct ipmi_user *user,
152 struct ipmi_addr *addr, 185 struct ipmi_addr *addr,
153 long msgid, 186 long msgid,
154 struct kernel_ipmi_msg *msg, 187 struct kernel_ipmi_msg *msg,
@@ -164,7 +197,7 @@ int ipmi_request_supply_msgs(ipmi_user_t user,
164 * way. This is useful if you need to spin waiting for something to 197 * way. This is useful if you need to spin waiting for something to
165 * happen in the IPMI driver. 198 * happen in the IPMI driver.
166 */ 199 */
167void ipmi_poll_interface(ipmi_user_t user); 200void ipmi_poll_interface(struct ipmi_user *user);
168 201
169/* 202/*
170 * When commands come in to the SMS, the user can register to receive 203 * When commands come in to the SMS, the user can register to receive
@@ -175,11 +208,11 @@ void ipmi_poll_interface(ipmi_user_t user);
175 * error. Channels are specified as a bitfield, use IPMI_CHAN_ALL to 208 * error. Channels are specified as a bitfield, use IPMI_CHAN_ALL to
176 * mean all channels. 209 * mean all channels.
177 */ 210 */
178int ipmi_register_for_cmd(ipmi_user_t user, 211int ipmi_register_for_cmd(struct ipmi_user *user,
179 unsigned char netfn, 212 unsigned char netfn,
180 unsigned char cmd, 213 unsigned char cmd,
181 unsigned int chans); 214 unsigned int chans);
182int ipmi_unregister_for_cmd(ipmi_user_t user, 215int ipmi_unregister_for_cmd(struct ipmi_user *user,
183 unsigned char netfn, 216 unsigned char netfn,
184 unsigned char cmd, 217 unsigned char cmd,
185 unsigned int chans); 218 unsigned int chans);
@@ -210,8 +243,8 @@ int ipmi_unregister_for_cmd(ipmi_user_t user,
210 * 243 *
211 * See the IPMI_MAINTENANCE_MODE_xxx defines for what the mode means. 244 * See the IPMI_MAINTENANCE_MODE_xxx defines for what the mode means.
212 */ 245 */
213int ipmi_get_maintenance_mode(ipmi_user_t user); 246int ipmi_get_maintenance_mode(struct ipmi_user *user);
214int ipmi_set_maintenance_mode(ipmi_user_t user, int mode); 247int ipmi_set_maintenance_mode(struct ipmi_user *user, int mode);
215 248
216/* 249/*
217 * When the user is created, it will not receive IPMI events by 250 * When the user is created, it will not receive IPMI events by
@@ -219,7 +252,7 @@ int ipmi_set_maintenance_mode(ipmi_user_t user, int mode);
219 * The first user that sets this to TRUE will receive all events that 252 * The first user that sets this to TRUE will receive all events that
220 * have been queued while no one was waiting for events. 253 * have been queued while no one was waiting for events.
221 */ 254 */
222int ipmi_set_gets_events(ipmi_user_t user, bool val); 255int ipmi_set_gets_events(struct ipmi_user *user, bool val);
223 256
224/* 257/*
225 * Called when a new SMI is registered. This will also be called on 258 * Called when a new SMI is registered. This will also be called on
@@ -229,14 +262,18 @@ int ipmi_set_gets_events(ipmi_user_t user, bool val);
229struct ipmi_smi_watcher { 262struct ipmi_smi_watcher {
230 struct list_head link; 263 struct list_head link;
231 264
232 /* You must set the owner to the current module, if you are in 265 /*
233 a module (generally just set it to "THIS_MODULE"). */ 266 * You must set the owner to the current module, if you are in
267 * a module (generally just set it to "THIS_MODULE").
268 */
234 struct module *owner; 269 struct module *owner;
235 270
236 /* These two are called with read locks held for the interface 271 /*
237 the watcher list. So you can add and remove users from the 272 * These two are called with read locks held for the interface
238 IPMI interface, send messages, etc., but you cannot add 273 * the watcher list. So you can add and remove users from the
239 or remove SMI watchers or SMI interfaces. */ 274 * IPMI interface, send messages, etc., but you cannot add
275 * or remove SMI watchers or SMI interfaces.
276 */
240 void (*new_smi)(int if_num, struct device *dev); 277 void (*new_smi)(int if_num, struct device *dev);
241 void (*smi_gone)(int if_num); 278 void (*smi_gone)(int if_num);
242}; 279};
@@ -244,8 +281,10 @@ struct ipmi_smi_watcher {
244int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher); 281int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher);
245int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher); 282int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher);
246 283
247/* The following are various helper functions for dealing with IPMI 284/*
248 addresses. */ 285 * The following are various helper functions for dealing with IPMI
286 * addresses.
287 */
249 288
250/* Return the maximum length of an IPMI address given it's type. */ 289/* Return the maximum length of an IPMI address given it's type. */
251unsigned int ipmi_addr_length(int addr_type); 290unsigned int ipmi_addr_length(int addr_type);
@@ -291,7 +330,7 @@ struct ipmi_smi_info {
291 union ipmi_smi_info_union addr_info; 330 union ipmi_smi_info_union addr_info;
292}; 331};
293 332
294/* This is to get the private info of ipmi_smi_t */ 333/* This is to get the private info of struct ipmi_smi */
295extern int ipmi_get_smi_info(int if_num, struct ipmi_smi_info *data); 334extern int ipmi_get_smi_info(int if_num, struct ipmi_smi_info *data);
296 335
297#endif /* __LINUX_IPMI_H */ 336#endif /* __LINUX_IPMI_H */