RT-AC66 3.0.0.4.374.130 core
[tomato.git] / release / src-rt-6.x / linux / linux-2.6 / drivers / char / ipmi / ipmi_msghandler.c
blobf7ae86d791d962395321bad6b0606a0780abc102
1 /*
2 * ipmi_msghandler.c
4 * Incoming and outgoing message routing for an IPMI interface.
6 * Author: MontaVista Software, Inc.
7 * Corey Minyard <minyard@mvista.com>
8 * source@mvista.com
10 * Copyright 2002 MontaVista Software Inc.
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version.
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
19 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
24 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
26 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
27 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 * You should have received a copy of the GNU General Public License along
30 * with this program; if not, write to the Free Software Foundation, Inc.,
31 * 675 Mass Ave, Cambridge, MA 02139, USA.
34 #include <linux/module.h>
35 #include <linux/errno.h>
36 #include <asm/system.h>
37 #include <linux/poll.h>
38 #include <linux/spinlock.h>
39 #include <linux/mutex.h>
40 #include <linux/slab.h>
41 #include <linux/ipmi.h>
42 #include <linux/ipmi_smi.h>
43 #include <linux/notifier.h>
44 #include <linux/init.h>
45 #include <linux/proc_fs.h>
46 #include <linux/rcupdate.h>
48 #define PFX "IPMI message handler: "
50 #define IPMI_DRIVER_VERSION "39.1"
52 static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void);
53 static int ipmi_init_msghandler(void);
55 static int initialized;
57 #ifdef CONFIG_PROC_FS
58 static struct proc_dir_entry *proc_ipmi_root;
59 #endif /* CONFIG_PROC_FS */
61 /* Remain in auto-maintenance mode for this amount of time (in ms). */
62 #define IPMI_MAINTENANCE_MODE_TIMEOUT 30000
64 #define MAX_EVENTS_IN_QUEUE 25
66 /* Don't let a message sit in a queue forever, always time it with at lest
67 the max message timer. This is in milliseconds. */
68 #define MAX_MSG_TIMEOUT 60000
72 * The main "user" data structure.
74 struct ipmi_user
76 struct list_head link;
78 /* Set to "0" when the user is destroyed. */
79 int valid;
81 struct kref refcount;
83 /* The upper layer that handles receive messages. */
84 struct ipmi_user_hndl *handler;
85 void *handler_data;
87 /* The interface this user is bound to. */
88 ipmi_smi_t intf;
90 /* Does this interface receive IPMI events? */
91 int gets_events;
94 struct cmd_rcvr
96 struct list_head link;
98 ipmi_user_t user;
99 unsigned char netfn;
100 unsigned char cmd;
101 unsigned int chans;
104 * This is used to form a linked lised during mass deletion.
105 * Since this is in an RCU list, we cannot use the link above
106 * or change any data until the RCU period completes. So we
107 * use this next variable during mass deletion so we can have
108 * a list and don't have to wait and restart the search on
109 * every individual deletion of a command. */
110 struct cmd_rcvr *next;
113 struct seq_table
115 unsigned int inuse : 1;
116 unsigned int broadcast : 1;
118 unsigned long timeout;
119 unsigned long orig_timeout;
120 unsigned int retries_left;
122 /* To verify on an incoming send message response that this is
123 the message that the response is for, we keep a sequence id
124 and increment it every time we send a message. */
125 long seqid;
127 /* This is held so we can properly respond to the message on a
128 timeout, and it is used to hold the temporary data for
129 retransmission, too. */
130 struct ipmi_recv_msg *recv_msg;
133 /* Store the information in a msgid (long) to allow us to find a
134 sequence table entry from the msgid. */
135 #define STORE_SEQ_IN_MSGID(seq, seqid) (((seq&0xff)<<26) | (seqid&0x3ffffff))
137 #define GET_SEQ_FROM_MSGID(msgid, seq, seqid) \
138 do { \
139 seq = ((msgid >> 26) & 0x3f); \
140 seqid = (msgid & 0x3fffff); \
141 } while (0)
143 #define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3fffff)
145 struct ipmi_channel
147 unsigned char medium;
148 unsigned char protocol;
150 /* My slave address. This is initialized to IPMI_BMC_SLAVE_ADDR,
151 but may be changed by the user. */
152 unsigned char address;
154 /* My LUN. This should generally stay the SMS LUN, but just in
155 case... */
156 unsigned char lun;
159 #ifdef CONFIG_PROC_FS
160 struct ipmi_proc_entry
162 char *name;
163 struct ipmi_proc_entry *next;
165 #endif
167 struct bmc_device
169 struct platform_device *dev;
170 struct ipmi_device_id id;
171 unsigned char guid[16];
172 int guid_set;
174 struct kref refcount;
176 /* bmc device attributes */
177 struct device_attribute device_id_attr;
178 struct device_attribute provides_dev_sdrs_attr;
179 struct device_attribute revision_attr;
180 struct device_attribute firmware_rev_attr;
181 struct device_attribute version_attr;
182 struct device_attribute add_dev_support_attr;
183 struct device_attribute manufacturer_id_attr;
184 struct device_attribute product_id_attr;
185 struct device_attribute guid_attr;
186 struct device_attribute aux_firmware_rev_attr;
189 #define IPMI_IPMB_NUM_SEQ 64
190 #define IPMI_MAX_CHANNELS 16
191 struct ipmi_smi
193 /* What interface number are we? */
194 int intf_num;
196 struct kref refcount;
198 /* Used for a list of interfaces. */
199 struct list_head link;
201 /* The list of upper layers that are using me. seq_lock
202 * protects this. */
203 struct list_head users;
205 /* Information to supply to users. */
206 unsigned char ipmi_version_major;
207 unsigned char ipmi_version_minor;
209 /* Used for wake ups at startup. */
210 wait_queue_head_t waitq;
212 struct bmc_device *bmc;
213 char *my_dev_name;
214 char *sysfs_name;
216 /* This is the lower-layer's sender routine. Note that you
217 * must either be holding the ipmi_interfaces_mutex or be in
218 * an umpreemptible region to use this. You must fetch the
219 * value into a local variable and make sure it is not NULL. */
220 struct ipmi_smi_handlers *handlers;
221 void *send_info;
223 #ifdef CONFIG_PROC_FS
224 /* A list of proc entries for this interface. This does not
225 need a lock, only one thread creates it and only one thread
226 destroys it. */
227 spinlock_t proc_entry_lock;
228 struct ipmi_proc_entry *proc_entries;
229 #endif
231 /* Driver-model device for the system interface. */
232 struct device *si_dev;
234 /* A table of sequence numbers for this interface. We use the
235 sequence numbers for IPMB messages that go out of the
236 interface to match them up with their responses. A routine
237 is called periodically to time the items in this list. */
238 spinlock_t seq_lock;
239 struct seq_table seq_table[IPMI_IPMB_NUM_SEQ];
240 int curr_seq;
242 /* Messages that were delayed for some reason (out of memory,
243 for instance), will go in here to be processed later in a
244 periodic timer interrupt. */
245 spinlock_t waiting_msgs_lock;
246 struct list_head waiting_msgs;
248 /* The list of command receivers that are registered for commands
249 on this interface. */
250 struct mutex cmd_rcvrs_mutex;
251 struct list_head cmd_rcvrs;
253 /* Events that were queues because no one was there to receive
254 them. */
255 spinlock_t events_lock; /* For dealing with event stuff. */
256 struct list_head waiting_events;
257 unsigned int waiting_events_count; /* How many events in queue? */
258 int delivering_events;
260 /* The event receiver for my BMC, only really used at panic
261 shutdown as a place to store this. */
262 unsigned char event_receiver;
263 unsigned char event_receiver_lun;
264 unsigned char local_sel_device;
265 unsigned char local_event_generator;
267 /* For handling of maintenance mode. */
268 int maintenance_mode;
269 int maintenance_mode_enable;
270 int auto_maintenance_timeout;
271 spinlock_t maintenance_mode_lock; /* Used in a timer... */
273 /* A cheap hack, if this is non-null and a message to an
274 interface comes in with a NULL user, call this routine with
275 it. Note that the message will still be freed by the
276 caller. This only works on the system interface. */
277 void (*null_user_handler)(ipmi_smi_t intf, struct ipmi_recv_msg *msg);
279 /* When we are scanning the channels for an SMI, this will
280 tell which channel we are scanning. */
281 int curr_channel;
283 /* Channel information */
284 struct ipmi_channel channels[IPMI_MAX_CHANNELS];
286 /* Proc FS stuff. */
287 struct proc_dir_entry *proc_dir;
288 char proc_dir_name[10];
290 spinlock_t counter_lock; /* For making counters atomic. */
292 /* Commands we got that were invalid. */
293 unsigned int sent_invalid_commands;
295 /* Commands we sent to the MC. */
296 unsigned int sent_local_commands;
297 /* Responses from the MC that were delivered to a user. */
298 unsigned int handled_local_responses;
299 /* Responses from the MC that were not delivered to a user. */
300 unsigned int unhandled_local_responses;
302 /* Commands we sent out to the IPMB bus. */
303 unsigned int sent_ipmb_commands;
304 /* Commands sent on the IPMB that had errors on the SEND CMD */
305 unsigned int sent_ipmb_command_errs;
306 /* Each retransmit increments this count. */
307 unsigned int retransmitted_ipmb_commands;
308 /* When a message times out (runs out of retransmits) this is
309 incremented. */
310 unsigned int timed_out_ipmb_commands;
312 /* This is like above, but for broadcasts. Broadcasts are
313 *not* included in the above count (they are expected to
314 time out). */
315 unsigned int timed_out_ipmb_broadcasts;
317 /* Responses I have sent to the IPMB bus. */
318 unsigned int sent_ipmb_responses;
320 /* The response was delivered to the user. */
321 unsigned int handled_ipmb_responses;
322 /* The response had invalid data in it. */
323 unsigned int invalid_ipmb_responses;
324 /* The response didn't have anyone waiting for it. */
325 unsigned int unhandled_ipmb_responses;
327 /* Commands we sent out to the IPMB bus. */
328 unsigned int sent_lan_commands;
329 /* Commands sent on the IPMB that had errors on the SEND CMD */
330 unsigned int sent_lan_command_errs;
331 /* Each retransmit increments this count. */
332 unsigned int retransmitted_lan_commands;
333 /* When a message times out (runs out of retransmits) this is
334 incremented. */
335 unsigned int timed_out_lan_commands;
337 /* Responses I have sent to the IPMB bus. */
338 unsigned int sent_lan_responses;
340 /* The response was delivered to the user. */
341 unsigned int handled_lan_responses;
342 /* The response had invalid data in it. */
343 unsigned int invalid_lan_responses;
344 /* The response didn't have anyone waiting for it. */
345 unsigned int unhandled_lan_responses;
347 /* The command was delivered to the user. */
348 unsigned int handled_commands;
349 /* The command had invalid data in it. */
350 unsigned int invalid_commands;
351 /* The command didn't have anyone waiting for it. */
352 unsigned int unhandled_commands;
354 /* Invalid data in an event. */
355 unsigned int invalid_events;
356 /* Events that were received with the proper format. */
357 unsigned int events;
359 #define to_si_intf_from_dev(device) container_of(device, struct ipmi_smi, dev)
362 * The driver model view of the IPMI messaging driver.
364 static struct device_driver ipmidriver = {
365 .name = "ipmi",
366 .bus = &platform_bus_type
368 static DEFINE_MUTEX(ipmidriver_mutex);
370 static struct list_head ipmi_interfaces = LIST_HEAD_INIT(ipmi_interfaces);
371 static DEFINE_MUTEX(ipmi_interfaces_mutex);
373 /* List of watchers that want to know when smi's are added and
374 deleted. */
375 static struct list_head smi_watchers = LIST_HEAD_INIT(smi_watchers);
376 static DEFINE_MUTEX(smi_watchers_mutex);
379 static void free_recv_msg_list(struct list_head *q)
381 struct ipmi_recv_msg *msg, *msg2;
383 list_for_each_entry_safe(msg, msg2, q, link) {
384 list_del(&msg->link);
385 ipmi_free_recv_msg(msg);
389 static void free_smi_msg_list(struct list_head *q)
391 struct ipmi_smi_msg *msg, *msg2;
393 list_for_each_entry_safe(msg, msg2, q, link) {
394 list_del(&msg->link);
395 ipmi_free_smi_msg(msg);
399 static void clean_up_interface_data(ipmi_smi_t intf)
401 int i;
402 struct cmd_rcvr *rcvr, *rcvr2;
403 struct list_head list;
405 free_smi_msg_list(&intf->waiting_msgs);
406 free_recv_msg_list(&intf->waiting_events);
409 * Wholesale remove all the entries from the list in the
410 * interface and wait for RCU to know that none are in use.
412 mutex_lock(&intf->cmd_rcvrs_mutex);
413 INIT_LIST_HEAD(&list);
414 list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu);
415 mutex_unlock(&intf->cmd_rcvrs_mutex);
417 list_for_each_entry_safe(rcvr, rcvr2, &list, link)
418 kfree(rcvr);
420 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {
421 if ((intf->seq_table[i].inuse)
422 && (intf->seq_table[i].recv_msg))
424 ipmi_free_recv_msg(intf->seq_table[i].recv_msg);
429 static void intf_free(struct kref *ref)
431 ipmi_smi_t intf = container_of(ref, struct ipmi_smi, refcount);
433 clean_up_interface_data(intf);
434 kfree(intf);
437 struct watcher_entry {
438 int intf_num;
439 ipmi_smi_t intf;
440 struct list_head link;
443 int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher)
445 ipmi_smi_t intf;
446 struct list_head to_deliver = LIST_HEAD_INIT(to_deliver);
447 struct watcher_entry *e, *e2;
449 mutex_lock(&smi_watchers_mutex);
451 mutex_lock(&ipmi_interfaces_mutex);
453 /* Build a list of things to deliver. */
454 list_for_each_entry(intf, &ipmi_interfaces, link) {
455 if (intf->intf_num == -1)
456 continue;
457 e = kmalloc(sizeof(*e), GFP_KERNEL);
458 if (!e)
459 goto out_err;
460 kref_get(&intf->refcount);
461 e->intf = intf;
462 e->intf_num = intf->intf_num;
463 list_add_tail(&e->link, &to_deliver);
466 /* We will succeed, so add it to the list. */
467 list_add(&watcher->link, &smi_watchers);
469 mutex_unlock(&ipmi_interfaces_mutex);
471 list_for_each_entry_safe(e, e2, &to_deliver, link) {
472 list_del(&e->link);
473 watcher->new_smi(e->intf_num, e->intf->si_dev);
474 kref_put(&e->intf->refcount, intf_free);
475 kfree(e);
478 mutex_unlock(&smi_watchers_mutex);
480 return 0;
482 out_err:
483 mutex_unlock(&ipmi_interfaces_mutex);
484 mutex_unlock(&smi_watchers_mutex);
485 list_for_each_entry_safe(e, e2, &to_deliver, link) {
486 list_del(&e->link);
487 kref_put(&e->intf->refcount, intf_free);
488 kfree(e);
490 return -ENOMEM;
493 int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher)
495 mutex_lock(&smi_watchers_mutex);
496 list_del(&(watcher->link));
497 mutex_unlock(&smi_watchers_mutex);
498 return 0;
502 * Must be called with smi_watchers_mutex held.
504 static void
505 call_smi_watchers(int i, struct device *dev)
507 struct ipmi_smi_watcher *w;
509 list_for_each_entry(w, &smi_watchers, link) {
510 if (try_module_get(w->owner)) {
511 w->new_smi(i, dev);
512 module_put(w->owner);
517 static int
518 ipmi_addr_equal(struct ipmi_addr *addr1, struct ipmi_addr *addr2)
520 if (addr1->addr_type != addr2->addr_type)
521 return 0;
523 if (addr1->channel != addr2->channel)
524 return 0;
526 if (addr1->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {
527 struct ipmi_system_interface_addr *smi_addr1
528 = (struct ipmi_system_interface_addr *) addr1;
529 struct ipmi_system_interface_addr *smi_addr2
530 = (struct ipmi_system_interface_addr *) addr2;
531 return (smi_addr1->lun == smi_addr2->lun);
534 if ((addr1->addr_type == IPMI_IPMB_ADDR_TYPE)
535 || (addr1->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
537 struct ipmi_ipmb_addr *ipmb_addr1
538 = (struct ipmi_ipmb_addr *) addr1;
539 struct ipmi_ipmb_addr *ipmb_addr2
540 = (struct ipmi_ipmb_addr *) addr2;
542 return ((ipmb_addr1->slave_addr == ipmb_addr2->slave_addr)
543 && (ipmb_addr1->lun == ipmb_addr2->lun));
546 if (addr1->addr_type == IPMI_LAN_ADDR_TYPE) {
547 struct ipmi_lan_addr *lan_addr1
548 = (struct ipmi_lan_addr *) addr1;
549 struct ipmi_lan_addr *lan_addr2
550 = (struct ipmi_lan_addr *) addr2;
552 return ((lan_addr1->remote_SWID == lan_addr2->remote_SWID)
553 && (lan_addr1->local_SWID == lan_addr2->local_SWID)
554 && (lan_addr1->session_handle
555 == lan_addr2->session_handle)
556 && (lan_addr1->lun == lan_addr2->lun));
559 return 1;
562 int ipmi_validate_addr(struct ipmi_addr *addr, int len)
564 if (len < sizeof(struct ipmi_system_interface_addr)) {
565 return -EINVAL;
568 if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {
569 if (addr->channel != IPMI_BMC_CHANNEL)
570 return -EINVAL;
571 return 0;
574 if ((addr->channel == IPMI_BMC_CHANNEL)
575 || (addr->channel >= IPMI_MAX_CHANNELS)
576 || (addr->channel < 0))
577 return -EINVAL;
579 if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE)
580 || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
582 if (len < sizeof(struct ipmi_ipmb_addr)) {
583 return -EINVAL;
585 return 0;
588 if (addr->addr_type == IPMI_LAN_ADDR_TYPE) {
589 if (len < sizeof(struct ipmi_lan_addr)) {
590 return -EINVAL;
592 return 0;
595 return -EINVAL;
598 unsigned int ipmi_addr_length(int addr_type)
600 if (addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
601 return sizeof(struct ipmi_system_interface_addr);
603 if ((addr_type == IPMI_IPMB_ADDR_TYPE)
604 || (addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
606 return sizeof(struct ipmi_ipmb_addr);
609 if (addr_type == IPMI_LAN_ADDR_TYPE)
610 return sizeof(struct ipmi_lan_addr);
612 return 0;
615 static void deliver_response(struct ipmi_recv_msg *msg)
617 if (!msg->user) {
618 ipmi_smi_t intf = msg->user_msg_data;
619 unsigned long flags;
621 /* Special handling for NULL users. */
622 if (intf->null_user_handler) {
623 intf->null_user_handler(intf, msg);
624 spin_lock_irqsave(&intf->counter_lock, flags);
625 intf->handled_local_responses++;
626 spin_unlock_irqrestore(&intf->counter_lock, flags);
627 } else {
628 /* No handler, so give up. */
629 spin_lock_irqsave(&intf->counter_lock, flags);
630 intf->unhandled_local_responses++;
631 spin_unlock_irqrestore(&intf->counter_lock, flags);
633 ipmi_free_recv_msg(msg);
634 } else {
635 ipmi_user_t user = msg->user;
636 user->handler->ipmi_recv_hndl(msg, user->handler_data);
640 static void
641 deliver_err_response(struct ipmi_recv_msg *msg, int err)
643 msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
644 msg->msg_data[0] = err;
645 msg->msg.netfn |= 1; /* Convert to a response. */
646 msg->msg.data_len = 1;
647 msg->msg.data = msg->msg_data;
648 deliver_response(msg);
651 /* Find the next sequence number not being used and add the given
652 message with the given timeout to the sequence table. This must be
653 called with the interface's seq_lock held. */
654 static int intf_next_seq(ipmi_smi_t intf,
655 struct ipmi_recv_msg *recv_msg,
656 unsigned long timeout,
657 int retries,
658 int broadcast,
659 unsigned char *seq,
660 long *seqid)
662 int rv = 0;
663 unsigned int i;
665 for (i = intf->curr_seq;
666 (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq;
667 i = (i+1)%IPMI_IPMB_NUM_SEQ)
669 if (!intf->seq_table[i].inuse)
670 break;
673 if (!intf->seq_table[i].inuse) {
674 intf->seq_table[i].recv_msg = recv_msg;
676 /* Start with the maximum timeout, when the send response
677 comes in we will start the real timer. */
678 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT;
679 intf->seq_table[i].orig_timeout = timeout;
680 intf->seq_table[i].retries_left = retries;
681 intf->seq_table[i].broadcast = broadcast;
682 intf->seq_table[i].inuse = 1;
683 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid);
684 *seq = i;
685 *seqid = intf->seq_table[i].seqid;
686 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ;
687 } else {
688 rv = -EAGAIN;
691 return rv;
694 /* Return the receive message for the given sequence number and
695 release the sequence number so it can be reused. Some other data
696 is passed in to be sure the message matches up correctly (to help
697 guard against message coming in after their timeout and the
698 sequence number being reused). */
699 static int intf_find_seq(ipmi_smi_t intf,
700 unsigned char seq,
701 short channel,
702 unsigned char cmd,
703 unsigned char netfn,
704 struct ipmi_addr *addr,
705 struct ipmi_recv_msg **recv_msg)
707 int rv = -ENODEV;
708 unsigned long flags;
710 if (seq >= IPMI_IPMB_NUM_SEQ)
711 return -EINVAL;
713 spin_lock_irqsave(&(intf->seq_lock), flags);
714 if (intf->seq_table[seq].inuse) {
715 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg;
717 if ((msg->addr.channel == channel)
718 && (msg->msg.cmd == cmd)
719 && (msg->msg.netfn == netfn)
720 && (ipmi_addr_equal(addr, &(msg->addr))))
722 *recv_msg = msg;
723 intf->seq_table[seq].inuse = 0;
724 rv = 0;
727 spin_unlock_irqrestore(&(intf->seq_lock), flags);
729 return rv;
733 /* Start the timer for a specific sequence table entry. */
734 static int intf_start_seq_timer(ipmi_smi_t intf,
735 long msgid)
737 int rv = -ENODEV;
738 unsigned long flags;
739 unsigned char seq;
740 unsigned long seqid;
743 GET_SEQ_FROM_MSGID(msgid, seq, seqid);
745 spin_lock_irqsave(&(intf->seq_lock), flags);
746 /* We do this verification because the user can be deleted
747 while a message is outstanding. */
748 if ((intf->seq_table[seq].inuse)
749 && (intf->seq_table[seq].seqid == seqid))
751 struct seq_table *ent = &(intf->seq_table[seq]);
752 ent->timeout = ent->orig_timeout;
753 rv = 0;
755 spin_unlock_irqrestore(&(intf->seq_lock), flags);
757 return rv;
760 /* Got an error for the send message for a specific sequence number. */
761 static int intf_err_seq(ipmi_smi_t intf,
762 long msgid,
763 unsigned int err)
765 int rv = -ENODEV;
766 unsigned long flags;
767 unsigned char seq;
768 unsigned long seqid;
769 struct ipmi_recv_msg *msg = NULL;
772 GET_SEQ_FROM_MSGID(msgid, seq, seqid);
774 spin_lock_irqsave(&(intf->seq_lock), flags);
775 /* We do this verification because the user can be deleted
776 while a message is outstanding. */
777 if ((intf->seq_table[seq].inuse)
778 && (intf->seq_table[seq].seqid == seqid))
780 struct seq_table *ent = &(intf->seq_table[seq]);
782 ent->inuse = 0;
783 msg = ent->recv_msg;
784 rv = 0;
786 spin_unlock_irqrestore(&(intf->seq_lock), flags);
788 if (msg)
789 deliver_err_response(msg, err);
791 return rv;
795 int ipmi_create_user(unsigned int if_num,
796 struct ipmi_user_hndl *handler,
797 void *handler_data,
798 ipmi_user_t *user)
800 unsigned long flags;
801 ipmi_user_t new_user;
802 int rv = 0;
803 ipmi_smi_t intf;
805 /* There is no module usecount here, because it's not
806 required. Since this can only be used by and called from
807 other modules, they will implicitly use this module, and
808 thus this can't be removed unless the other modules are
809 removed. */
811 if (handler == NULL)
812 return -EINVAL;
814 /* Make sure the driver is actually initialized, this handles
815 problems with initialization order. */
816 if (!initialized) {
817 rv = ipmi_init_msghandler();
818 if (rv)
819 return rv;
821 /* The init code doesn't return an error if it was turned
822 off, but it won't initialize. Check that. */
823 if (!initialized)
824 return -ENODEV;
827 new_user = kmalloc(sizeof(*new_user), GFP_KERNEL);
828 if (!new_user)
829 return -ENOMEM;
831 mutex_lock(&ipmi_interfaces_mutex);
832 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
833 if (intf->intf_num == if_num)
834 goto found;
836 /* Not found, return an error */
837 rv = -EINVAL;
838 goto out_kfree;
840 found:
841 /* Note that each existing user holds a refcount to the interface. */
842 kref_get(&intf->refcount);
844 kref_init(&new_user->refcount);
845 new_user->handler = handler;
846 new_user->handler_data = handler_data;
847 new_user->intf = intf;
848 new_user->gets_events = 0;
850 if (!try_module_get(intf->handlers->owner)) {
851 rv = -ENODEV;
852 goto out_kref;
855 if (intf->handlers->inc_usecount) {
856 rv = intf->handlers->inc_usecount(intf->send_info);
857 if (rv) {
858 module_put(intf->handlers->owner);
859 goto out_kref;
863 /* Hold the lock so intf->handlers is guaranteed to be good
864 * until now */
865 mutex_unlock(&ipmi_interfaces_mutex);
867 new_user->valid = 1;
868 spin_lock_irqsave(&intf->seq_lock, flags);
869 list_add_rcu(&new_user->link, &intf->users);
870 spin_unlock_irqrestore(&intf->seq_lock, flags);
871 *user = new_user;
872 return 0;
874 out_kref:
875 kref_put(&intf->refcount, intf_free);
876 out_kfree:
877 mutex_unlock(&ipmi_interfaces_mutex);
878 kfree(new_user);
879 return rv;
882 static void free_user(struct kref *ref)
884 ipmi_user_t user = container_of(ref, struct ipmi_user, refcount);
885 kfree(user);
888 int ipmi_destroy_user(ipmi_user_t user)
890 ipmi_smi_t intf = user->intf;
891 int i;
892 unsigned long flags;
893 struct cmd_rcvr *rcvr;
894 struct cmd_rcvr *rcvrs = NULL;
896 user->valid = 0;
898 /* Remove the user from the interface's sequence table. */
899 spin_lock_irqsave(&intf->seq_lock, flags);
900 list_del_rcu(&user->link);
902 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {
903 if (intf->seq_table[i].inuse
904 && (intf->seq_table[i].recv_msg->user == user))
906 intf->seq_table[i].inuse = 0;
907 ipmi_free_recv_msg(intf->seq_table[i].recv_msg);
910 spin_unlock_irqrestore(&intf->seq_lock, flags);
913 * Remove the user from the command receiver's table. First
914 * we build a list of everything (not using the standard link,
915 * since other things may be using it till we do
916 * synchronize_rcu()) then free everything in that list.
918 mutex_lock(&intf->cmd_rcvrs_mutex);
919 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
920 if (rcvr->user == user) {
921 list_del_rcu(&rcvr->link);
922 rcvr->next = rcvrs;
923 rcvrs = rcvr;
926 mutex_unlock(&intf->cmd_rcvrs_mutex);
927 synchronize_rcu();
928 while (rcvrs) {
929 rcvr = rcvrs;
930 rcvrs = rcvr->next;
931 kfree(rcvr);
934 mutex_lock(&ipmi_interfaces_mutex);
935 if (intf->handlers) {
936 module_put(intf->handlers->owner);
937 if (intf->handlers->dec_usecount)
938 intf->handlers->dec_usecount(intf->send_info);
940 mutex_unlock(&ipmi_interfaces_mutex);
942 kref_put(&intf->refcount, intf_free);
944 kref_put(&user->refcount, free_user);
946 return 0;
949 void ipmi_get_version(ipmi_user_t user,
950 unsigned char *major,
951 unsigned char *minor)
953 *major = user->intf->ipmi_version_major;
954 *minor = user->intf->ipmi_version_minor;
957 int ipmi_set_my_address(ipmi_user_t user,
958 unsigned int channel,
959 unsigned char address)
961 if (channel >= IPMI_MAX_CHANNELS)
962 return -EINVAL;
963 user->intf->channels[channel].address = address;
964 return 0;
967 int ipmi_get_my_address(ipmi_user_t user,
968 unsigned int channel,
969 unsigned char *address)
971 if (channel >= IPMI_MAX_CHANNELS)
972 return -EINVAL;
973 *address = user->intf->channels[channel].address;
974 return 0;
977 int ipmi_set_my_LUN(ipmi_user_t user,
978 unsigned int channel,
979 unsigned char LUN)
981 if (channel >= IPMI_MAX_CHANNELS)
982 return -EINVAL;
983 user->intf->channels[channel].lun = LUN & 0x3;
984 return 0;
987 int ipmi_get_my_LUN(ipmi_user_t user,
988 unsigned int channel,
989 unsigned char *address)
991 if (channel >= IPMI_MAX_CHANNELS)
992 return -EINVAL;
993 *address = user->intf->channels[channel].lun;
994 return 0;
997 int ipmi_get_maintenance_mode(ipmi_user_t user)
999 int mode;
1000 unsigned long flags;
1002 spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags);
1003 mode = user->intf->maintenance_mode;
1004 spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags);
1006 return mode;
1008 EXPORT_SYMBOL(ipmi_get_maintenance_mode);
1010 static void maintenance_mode_update(ipmi_smi_t intf)
1012 if (intf->handlers->set_maintenance_mode)
1013 intf->handlers->set_maintenance_mode(
1014 intf->send_info, intf->maintenance_mode_enable);
1017 int ipmi_set_maintenance_mode(ipmi_user_t user, int mode)
1019 int rv = 0;
1020 unsigned long flags;
1021 ipmi_smi_t intf = user->intf;
1023 spin_lock_irqsave(&intf->maintenance_mode_lock, flags);
1024 if (intf->maintenance_mode != mode) {
1025 switch (mode) {
1026 case IPMI_MAINTENANCE_MODE_AUTO:
1027 intf->maintenance_mode = mode;
1028 intf->maintenance_mode_enable
1029 = (intf->auto_maintenance_timeout > 0);
1030 break;
1032 case IPMI_MAINTENANCE_MODE_OFF:
1033 intf->maintenance_mode = mode;
1034 intf->maintenance_mode_enable = 0;
1035 break;
1037 case IPMI_MAINTENANCE_MODE_ON:
1038 intf->maintenance_mode = mode;
1039 intf->maintenance_mode_enable = 1;
1040 break;
1042 default:
1043 rv = -EINVAL;
1044 goto out_unlock;
1047 maintenance_mode_update(intf);
1049 out_unlock:
1050 spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags);
1052 return rv;
1054 EXPORT_SYMBOL(ipmi_set_maintenance_mode);
1056 int ipmi_set_gets_events(ipmi_user_t user, int val)
1058 unsigned long flags;
1059 ipmi_smi_t intf = user->intf;
1060 struct ipmi_recv_msg *msg, *msg2;
1061 struct list_head msgs;
1063 INIT_LIST_HEAD(&msgs);
1065 spin_lock_irqsave(&intf->events_lock, flags);
1066 user->gets_events = val;
1068 if (intf->delivering_events)
1070 * Another thread is delivering events for this, so
1071 * let it handle any new events.
1073 goto out;
1075 /* Deliver any queued events. */
1076 while (user->gets_events && !list_empty(&intf->waiting_events)) {
1077 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link)
1078 list_move_tail(&msg->link, &msgs);
1079 intf->waiting_events_count = 0;
1081 intf->delivering_events = 1;
1082 spin_unlock_irqrestore(&intf->events_lock, flags);
1084 list_for_each_entry_safe(msg, msg2, &msgs, link) {
1085 msg->user = user;
1086 kref_get(&user->refcount);
1087 deliver_response(msg);
1090 spin_lock_irqsave(&intf->events_lock, flags);
1091 intf->delivering_events = 0;
1094 out:
1095 spin_unlock_irqrestore(&intf->events_lock, flags);
1097 return 0;
1100 static struct cmd_rcvr *find_cmd_rcvr(ipmi_smi_t intf,
1101 unsigned char netfn,
1102 unsigned char cmd,
1103 unsigned char chan)
1105 struct cmd_rcvr *rcvr;
1107 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
1108 if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)
1109 && (rcvr->chans & (1 << chan)))
1110 return rcvr;
1112 return NULL;
1115 static int is_cmd_rcvr_exclusive(ipmi_smi_t intf,
1116 unsigned char netfn,
1117 unsigned char cmd,
1118 unsigned int chans)
1120 struct cmd_rcvr *rcvr;
1122 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
1123 if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)
1124 && (rcvr->chans & chans))
1125 return 0;
1127 return 1;
1130 int ipmi_register_for_cmd(ipmi_user_t user,
1131 unsigned char netfn,
1132 unsigned char cmd,
1133 unsigned int chans)
1135 ipmi_smi_t intf = user->intf;
1136 struct cmd_rcvr *rcvr;
1137 int rv = 0;
1140 rcvr = kmalloc(sizeof(*rcvr), GFP_KERNEL);
1141 if (!rcvr)
1142 return -ENOMEM;
1143 rcvr->cmd = cmd;
1144 rcvr->netfn = netfn;
1145 rcvr->chans = chans;
1146 rcvr->user = user;
1148 mutex_lock(&intf->cmd_rcvrs_mutex);
1149 /* Make sure the command/netfn is not already registered. */
1150 if (!is_cmd_rcvr_exclusive(intf, netfn, cmd, chans)) {
1151 rv = -EBUSY;
1152 goto out_unlock;
1155 list_add_rcu(&rcvr->link, &intf->cmd_rcvrs);
1157 out_unlock:
1158 mutex_unlock(&intf->cmd_rcvrs_mutex);
1159 if (rv)
1160 kfree(rcvr);
1162 return rv;
1165 int ipmi_unregister_for_cmd(ipmi_user_t user,
1166 unsigned char netfn,
1167 unsigned char cmd,
1168 unsigned int chans)
1170 ipmi_smi_t intf = user->intf;
1171 struct cmd_rcvr *rcvr;
1172 struct cmd_rcvr *rcvrs = NULL;
1173 int i, rv = -ENOENT;
1175 mutex_lock(&intf->cmd_rcvrs_mutex);
1176 for (i = 0; i < IPMI_NUM_CHANNELS; i++) {
1177 if (((1 << i) & chans) == 0)
1178 continue;
1179 rcvr = find_cmd_rcvr(intf, netfn, cmd, i);
1180 if (rcvr == NULL)
1181 continue;
1182 if (rcvr->user == user) {
1183 rv = 0;
1184 rcvr->chans &= ~chans;
1185 if (rcvr->chans == 0) {
1186 list_del_rcu(&rcvr->link);
1187 rcvr->next = rcvrs;
1188 rcvrs = rcvr;
1192 mutex_unlock(&intf->cmd_rcvrs_mutex);
1193 synchronize_rcu();
1194 while (rcvrs) {
1195 rcvr = rcvrs;
1196 rcvrs = rcvr->next;
1197 kfree(rcvr);
1199 return rv;
1202 void ipmi_user_set_run_to_completion(ipmi_user_t user, int val)
1204 ipmi_smi_t intf = user->intf;
1205 if (intf->handlers)
1206 intf->handlers->set_run_to_completion(intf->send_info, val);
1209 static unsigned char
1210 ipmb_checksum(unsigned char *data, int size)
1212 unsigned char csum = 0;
1214 for (; size > 0; size--, data++)
1215 csum += *data;
1217 return -csum;
1220 static inline void format_ipmb_msg(struct ipmi_smi_msg *smi_msg,
1221 struct kernel_ipmi_msg *msg,
1222 struct ipmi_ipmb_addr *ipmb_addr,
1223 long msgid,
1224 unsigned char ipmb_seq,
1225 int broadcast,
1226 unsigned char source_address,
1227 unsigned char source_lun)
1229 int i = broadcast;
1231 /* Format the IPMB header data. */
1232 smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
1233 smi_msg->data[1] = IPMI_SEND_MSG_CMD;
1234 smi_msg->data[2] = ipmb_addr->channel;
1235 if (broadcast)
1236 smi_msg->data[3] = 0;
1237 smi_msg->data[i+3] = ipmb_addr->slave_addr;
1238 smi_msg->data[i+4] = (msg->netfn << 2) | (ipmb_addr->lun & 0x3);
1239 smi_msg->data[i+5] = ipmb_checksum(&(smi_msg->data[i+3]), 2);
1240 smi_msg->data[i+6] = source_address;
1241 smi_msg->data[i+7] = (ipmb_seq << 2) | source_lun;
1242 smi_msg->data[i+8] = msg->cmd;
1244 /* Now tack on the data to the message. */
1245 if (msg->data_len > 0)
1246 memcpy(&(smi_msg->data[i+9]), msg->data,
1247 msg->data_len);
1248 smi_msg->data_size = msg->data_len + 9;
1250 /* Now calculate the checksum and tack it on. */
1251 smi_msg->data[i+smi_msg->data_size]
1252 = ipmb_checksum(&(smi_msg->data[i+6]),
1253 smi_msg->data_size-6);
1255 /* Add on the checksum size and the offset from the
1256 broadcast. */
1257 smi_msg->data_size += 1 + i;
1259 smi_msg->msgid = msgid;
1262 static inline void format_lan_msg(struct ipmi_smi_msg *smi_msg,
1263 struct kernel_ipmi_msg *msg,
1264 struct ipmi_lan_addr *lan_addr,
1265 long msgid,
1266 unsigned char ipmb_seq,
1267 unsigned char source_lun)
1269 /* Format the IPMB header data. */
1270 smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
1271 smi_msg->data[1] = IPMI_SEND_MSG_CMD;
1272 smi_msg->data[2] = lan_addr->channel;
1273 smi_msg->data[3] = lan_addr->session_handle;
1274 smi_msg->data[4] = lan_addr->remote_SWID;
1275 smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3);
1276 smi_msg->data[6] = ipmb_checksum(&(smi_msg->data[4]), 2);
1277 smi_msg->data[7] = lan_addr->local_SWID;
1278 smi_msg->data[8] = (ipmb_seq << 2) | source_lun;
1279 smi_msg->data[9] = msg->cmd;
1281 /* Now tack on the data to the message. */
1282 if (msg->data_len > 0)
1283 memcpy(&(smi_msg->data[10]), msg->data,
1284 msg->data_len);
1285 smi_msg->data_size = msg->data_len + 10;
1287 /* Now calculate the checksum and tack it on. */
1288 smi_msg->data[smi_msg->data_size]
1289 = ipmb_checksum(&(smi_msg->data[7]),
1290 smi_msg->data_size-7);
1292 /* Add on the checksum size and the offset from the
1293 broadcast. */
1294 smi_msg->data_size += 1;
1296 smi_msg->msgid = msgid;
1299 /* Separate from ipmi_request so that the user does not have to be
1300 supplied in certain circumstances (mainly at panic time). If
1301 messages are supplied, they will be freed, even if an error
1302 occurs. */
1303 static int i_ipmi_request(ipmi_user_t user,
1304 ipmi_smi_t intf,
1305 struct ipmi_addr *addr,
1306 long msgid,
1307 struct kernel_ipmi_msg *msg,
1308 void *user_msg_data,
1309 void *supplied_smi,
1310 struct ipmi_recv_msg *supplied_recv,
1311 int priority,
1312 unsigned char source_address,
1313 unsigned char source_lun,
1314 int retries,
1315 unsigned int retry_time_ms)
1317 int rv = 0;
1318 struct ipmi_smi_msg *smi_msg;
1319 struct ipmi_recv_msg *recv_msg;
1320 unsigned long flags;
1321 struct ipmi_smi_handlers *handlers;
1324 if (supplied_recv) {
1325 recv_msg = supplied_recv;
1326 } else {
1327 recv_msg = ipmi_alloc_recv_msg();
1328 if (recv_msg == NULL) {
1329 return -ENOMEM;
1332 recv_msg->user_msg_data = user_msg_data;
1334 if (supplied_smi) {
1335 smi_msg = (struct ipmi_smi_msg *) supplied_smi;
1336 } else {
1337 smi_msg = ipmi_alloc_smi_msg();
1338 if (smi_msg == NULL) {
1339 ipmi_free_recv_msg(recv_msg);
1340 return -ENOMEM;
1344 rcu_read_lock();
1345 handlers = intf->handlers;
1346 if (!handlers) {
1347 rv = -ENODEV;
1348 goto out_err;
1351 recv_msg->user = user;
1352 if (user)
1353 kref_get(&user->refcount);
1354 recv_msg->msgid = msgid;
1355 /* Store the message to send in the receive message so timeout
1356 responses can get the proper response data. */
1357 recv_msg->msg = *msg;
1359 if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {
1360 struct ipmi_system_interface_addr *smi_addr;
1362 if (msg->netfn & 1) {
1363 /* Responses are not allowed to the SMI. */
1364 rv = -EINVAL;
1365 goto out_err;
1368 smi_addr = (struct ipmi_system_interface_addr *) addr;
1369 if (smi_addr->lun > 3) {
1370 spin_lock_irqsave(&intf->counter_lock, flags);
1371 intf->sent_invalid_commands++;
1372 spin_unlock_irqrestore(&intf->counter_lock, flags);
1373 rv = -EINVAL;
1374 goto out_err;
1377 memcpy(&recv_msg->addr, smi_addr, sizeof(*smi_addr));
1379 if ((msg->netfn == IPMI_NETFN_APP_REQUEST)
1380 && ((msg->cmd == IPMI_SEND_MSG_CMD)
1381 || (msg->cmd == IPMI_GET_MSG_CMD)
1382 || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD)))
1384 /* We don't let the user do these, since we manage
1385 the sequence numbers. */
1386 spin_lock_irqsave(&intf->counter_lock, flags);
1387 intf->sent_invalid_commands++;
1388 spin_unlock_irqrestore(&intf->counter_lock, flags);
1389 rv = -EINVAL;
1390 goto out_err;
1393 if (((msg->netfn == IPMI_NETFN_APP_REQUEST)
1394 && ((msg->cmd == IPMI_COLD_RESET_CMD)
1395 || (msg->cmd == IPMI_WARM_RESET_CMD)))
1396 || (msg->netfn == IPMI_NETFN_FIRMWARE_REQUEST))
1398 spin_lock_irqsave(&intf->maintenance_mode_lock, flags);
1399 intf->auto_maintenance_timeout
1400 = IPMI_MAINTENANCE_MODE_TIMEOUT;
1401 if (!intf->maintenance_mode
1402 && !intf->maintenance_mode_enable)
1404 intf->maintenance_mode_enable = 1;
1405 maintenance_mode_update(intf);
1407 spin_unlock_irqrestore(&intf->maintenance_mode_lock,
1408 flags);
1411 if ((msg->data_len + 2) > IPMI_MAX_MSG_LENGTH) {
1412 spin_lock_irqsave(&intf->counter_lock, flags);
1413 intf->sent_invalid_commands++;
1414 spin_unlock_irqrestore(&intf->counter_lock, flags);
1415 rv = -EMSGSIZE;
1416 goto out_err;
1419 smi_msg->data[0] = (msg->netfn << 2) | (smi_addr->lun & 0x3);
1420 smi_msg->data[1] = msg->cmd;
1421 smi_msg->msgid = msgid;
1422 smi_msg->user_data = recv_msg;
1423 if (msg->data_len > 0)
1424 memcpy(&(smi_msg->data[2]), msg->data, msg->data_len);
1425 smi_msg->data_size = msg->data_len + 2;
1426 spin_lock_irqsave(&intf->counter_lock, flags);
1427 intf->sent_local_commands++;
1428 spin_unlock_irqrestore(&intf->counter_lock, flags);
1429 } else if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE)
1430 || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
1432 struct ipmi_ipmb_addr *ipmb_addr;
1433 unsigned char ipmb_seq;
1434 long seqid;
1435 int broadcast = 0;
1437 if (addr->channel >= IPMI_MAX_CHANNELS) {
1438 spin_lock_irqsave(&intf->counter_lock, flags);
1439 intf->sent_invalid_commands++;
1440 spin_unlock_irqrestore(&intf->counter_lock, flags);
1441 rv = -EINVAL;
1442 goto out_err;
1445 if (intf->channels[addr->channel].medium
1446 != IPMI_CHANNEL_MEDIUM_IPMB)
1448 spin_lock_irqsave(&intf->counter_lock, flags);
1449 intf->sent_invalid_commands++;
1450 spin_unlock_irqrestore(&intf->counter_lock, flags);
1451 rv = -EINVAL;
1452 goto out_err;
1455 if (retries < 0) {
1456 if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)
1457 retries = 0; /* Don't retry broadcasts. */
1458 else
1459 retries = 4;
1461 if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) {
1462 /* Broadcasts add a zero at the beginning of the
1463 message, but otherwise is the same as an IPMB
1464 address. */
1465 addr->addr_type = IPMI_IPMB_ADDR_TYPE;
1466 broadcast = 1;
1470 /* Default to 1 second retries. */
1471 if (retry_time_ms == 0)
1472 retry_time_ms = 1000;
1474 /* 9 for the header and 1 for the checksum, plus
1475 possibly one for the broadcast. */
1476 if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) {
1477 spin_lock_irqsave(&intf->counter_lock, flags);
1478 intf->sent_invalid_commands++;
1479 spin_unlock_irqrestore(&intf->counter_lock, flags);
1480 rv = -EMSGSIZE;
1481 goto out_err;
1484 ipmb_addr = (struct ipmi_ipmb_addr *) addr;
1485 if (ipmb_addr->lun > 3) {
1486 spin_lock_irqsave(&intf->counter_lock, flags);
1487 intf->sent_invalid_commands++;
1488 spin_unlock_irqrestore(&intf->counter_lock, flags);
1489 rv = -EINVAL;
1490 goto out_err;
1493 memcpy(&recv_msg->addr, ipmb_addr, sizeof(*ipmb_addr));
1495 if (recv_msg->msg.netfn & 0x1) {
1496 /* It's a response, so use the user's sequence
1497 from msgid. */
1498 spin_lock_irqsave(&intf->counter_lock, flags);
1499 intf->sent_ipmb_responses++;
1500 spin_unlock_irqrestore(&intf->counter_lock, flags);
1501 format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid,
1502 msgid, broadcast,
1503 source_address, source_lun);
1505 /* Save the receive message so we can use it
1506 to deliver the response. */
1507 smi_msg->user_data = recv_msg;
1508 } else {
1509 /* It's a command, so get a sequence for it. */
1511 spin_lock_irqsave(&(intf->seq_lock), flags);
1513 spin_lock(&intf->counter_lock);
1514 intf->sent_ipmb_commands++;
1515 spin_unlock(&intf->counter_lock);
1517 /* Create a sequence number with a 1 second
1518 timeout and 4 retries. */
1519 rv = intf_next_seq(intf,
1520 recv_msg,
1521 retry_time_ms,
1522 retries,
1523 broadcast,
1524 &ipmb_seq,
1525 &seqid);
1526 if (rv) {
1527 /* We have used up all the sequence numbers,
1528 probably, so abort. */
1529 spin_unlock_irqrestore(&(intf->seq_lock),
1530 flags);
1531 goto out_err;
1534 /* Store the sequence number in the message,
1535 so that when the send message response
1536 comes back we can start the timer. */
1537 format_ipmb_msg(smi_msg, msg, ipmb_addr,
1538 STORE_SEQ_IN_MSGID(ipmb_seq, seqid),
1539 ipmb_seq, broadcast,
1540 source_address, source_lun);
1542 /* Copy the message into the recv message data, so we
1543 can retransmit it later if necessary. */
1544 memcpy(recv_msg->msg_data, smi_msg->data,
1545 smi_msg->data_size);
1546 recv_msg->msg.data = recv_msg->msg_data;
1547 recv_msg->msg.data_len = smi_msg->data_size;
1549 /* We don't unlock until here, because we need
1550 to copy the completed message into the
1551 recv_msg before we release the lock.
1552 Otherwise, race conditions may bite us. I
1553 know that's pretty paranoid, but I prefer
1554 to be correct. */
1555 spin_unlock_irqrestore(&(intf->seq_lock), flags);
1557 } else if (addr->addr_type == IPMI_LAN_ADDR_TYPE) {
1558 struct ipmi_lan_addr *lan_addr;
1559 unsigned char ipmb_seq;
1560 long seqid;
1562 if (addr->channel >= IPMI_MAX_CHANNELS) {
1563 spin_lock_irqsave(&intf->counter_lock, flags);
1564 intf->sent_invalid_commands++;
1565 spin_unlock_irqrestore(&intf->counter_lock, flags);
1566 rv = -EINVAL;
1567 goto out_err;
1570 if ((intf->channels[addr->channel].medium
1571 != IPMI_CHANNEL_MEDIUM_8023LAN)
1572 && (intf->channels[addr->channel].medium
1573 != IPMI_CHANNEL_MEDIUM_ASYNC))
1575 spin_lock_irqsave(&intf->counter_lock, flags);
1576 intf->sent_invalid_commands++;
1577 spin_unlock_irqrestore(&intf->counter_lock, flags);
1578 rv = -EINVAL;
1579 goto out_err;
1582 retries = 4;
1584 /* Default to 1 second retries. */
1585 if (retry_time_ms == 0)
1586 retry_time_ms = 1000;
1588 /* 11 for the header and 1 for the checksum. */
1589 if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) {
1590 spin_lock_irqsave(&intf->counter_lock, flags);
1591 intf->sent_invalid_commands++;
1592 spin_unlock_irqrestore(&intf->counter_lock, flags);
1593 rv = -EMSGSIZE;
1594 goto out_err;
1597 lan_addr = (struct ipmi_lan_addr *) addr;
1598 if (lan_addr->lun > 3) {
1599 spin_lock_irqsave(&intf->counter_lock, flags);
1600 intf->sent_invalid_commands++;
1601 spin_unlock_irqrestore(&intf->counter_lock, flags);
1602 rv = -EINVAL;
1603 goto out_err;
1606 memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr));
1608 if (recv_msg->msg.netfn & 0x1) {
1609 /* It's a response, so use the user's sequence
1610 from msgid. */
1611 spin_lock_irqsave(&intf->counter_lock, flags);
1612 intf->sent_lan_responses++;
1613 spin_unlock_irqrestore(&intf->counter_lock, flags);
1614 format_lan_msg(smi_msg, msg, lan_addr, msgid,
1615 msgid, source_lun);
1617 /* Save the receive message so we can use it
1618 to deliver the response. */
1619 smi_msg->user_data = recv_msg;
1620 } else {
1621 /* It's a command, so get a sequence for it. */
1623 spin_lock_irqsave(&(intf->seq_lock), flags);
1625 spin_lock(&intf->counter_lock);
1626 intf->sent_lan_commands++;
1627 spin_unlock(&intf->counter_lock);
1629 /* Create a sequence number with a 1 second
1630 timeout and 4 retries. */
1631 rv = intf_next_seq(intf,
1632 recv_msg,
1633 retry_time_ms,
1634 retries,
1636 &ipmb_seq,
1637 &seqid);
1638 if (rv) {
1639 /* We have used up all the sequence numbers,
1640 probably, so abort. */
1641 spin_unlock_irqrestore(&(intf->seq_lock),
1642 flags);
1643 goto out_err;
1646 /* Store the sequence number in the message,
1647 so that when the send message response
1648 comes back we can start the timer. */
1649 format_lan_msg(smi_msg, msg, lan_addr,
1650 STORE_SEQ_IN_MSGID(ipmb_seq, seqid),
1651 ipmb_seq, source_lun);
1653 /* Copy the message into the recv message data, so we
1654 can retransmit it later if necessary. */
1655 memcpy(recv_msg->msg_data, smi_msg->data,
1656 smi_msg->data_size);
1657 recv_msg->msg.data = recv_msg->msg_data;
1658 recv_msg->msg.data_len = smi_msg->data_size;
1660 /* We don't unlock until here, because we need
1661 to copy the completed message into the
1662 recv_msg before we release the lock.
1663 Otherwise, race conditions may bite us. I
1664 know that's pretty paranoid, but I prefer
1665 to be correct. */
1666 spin_unlock_irqrestore(&(intf->seq_lock), flags);
1668 } else {
1669 /* Unknown address type. */
1670 spin_lock_irqsave(&intf->counter_lock, flags);
1671 intf->sent_invalid_commands++;
1672 spin_unlock_irqrestore(&intf->counter_lock, flags);
1673 rv = -EINVAL;
1674 goto out_err;
1677 #ifdef DEBUG_MSGING
1679 int m;
1680 for (m = 0; m < smi_msg->data_size; m++)
1681 printk(" %2.2x", smi_msg->data[m]);
1682 printk("\n");
1684 #endif
1686 handlers->sender(intf->send_info, smi_msg, priority);
1687 rcu_read_unlock();
1689 return 0;
1691 out_err:
1692 rcu_read_unlock();
1693 ipmi_free_smi_msg(smi_msg);
1694 ipmi_free_recv_msg(recv_msg);
1695 return rv;
1698 static int check_addr(ipmi_smi_t intf,
1699 struct ipmi_addr *addr,
1700 unsigned char *saddr,
1701 unsigned char *lun)
1703 if (addr->channel >= IPMI_MAX_CHANNELS)
1704 return -EINVAL;
1705 *lun = intf->channels[addr->channel].lun;
1706 *saddr = intf->channels[addr->channel].address;
1707 return 0;
1710 int ipmi_request_settime(ipmi_user_t user,
1711 struct ipmi_addr *addr,
1712 long msgid,
1713 struct kernel_ipmi_msg *msg,
1714 void *user_msg_data,
1715 int priority,
1716 int retries,
1717 unsigned int retry_time_ms)
1719 unsigned char saddr, lun;
1720 int rv;
1722 if (!user)
1723 return -EINVAL;
1724 rv = check_addr(user->intf, addr, &saddr, &lun);
1725 if (rv)
1726 return rv;
1727 return i_ipmi_request(user,
1728 user->intf,
1729 addr,
1730 msgid,
1731 msg,
1732 user_msg_data,
1733 NULL, NULL,
1734 priority,
1735 saddr,
1736 lun,
1737 retries,
1738 retry_time_ms);
1741 int ipmi_request_supply_msgs(ipmi_user_t user,
1742 struct ipmi_addr *addr,
1743 long msgid,
1744 struct kernel_ipmi_msg *msg,
1745 void *user_msg_data,
1746 void *supplied_smi,
1747 struct ipmi_recv_msg *supplied_recv,
1748 int priority)
1750 unsigned char saddr, lun;
1751 int rv;
1753 if (!user)
1754 return -EINVAL;
1755 rv = check_addr(user->intf, addr, &saddr, &lun);
1756 if (rv)
1757 return rv;
1758 return i_ipmi_request(user,
1759 user->intf,
1760 addr,
1761 msgid,
1762 msg,
1763 user_msg_data,
1764 supplied_smi,
1765 supplied_recv,
1766 priority,
1767 saddr,
1768 lun,
1769 -1, 0);
1772 #ifdef CONFIG_PROC_FS
1773 static int ipmb_file_read_proc(char *page, char **start, off_t off,
1774 int count, int *eof, void *data)
1776 char *out = (char *) page;
1777 ipmi_smi_t intf = data;
1778 int i;
1779 int rv = 0;
1781 for (i = 0; i < IPMI_MAX_CHANNELS; i++)
1782 rv += sprintf(out+rv, "%x ", intf->channels[i].address);
1783 out[rv-1] = '\n'; /* Replace the final space with a newline */
1784 out[rv] = '\0';
1785 rv++;
1786 return rv;
1789 static int version_file_read_proc(char *page, char **start, off_t off,
1790 int count, int *eof, void *data)
1792 char *out = (char *) page;
1793 ipmi_smi_t intf = data;
1795 return sprintf(out, "%d.%d\n",
1796 ipmi_version_major(&intf->bmc->id),
1797 ipmi_version_minor(&intf->bmc->id));
1800 static int stat_file_read_proc(char *page, char **start, off_t off,
1801 int count, int *eof, void *data)
1803 char *out = (char *) page;
1804 ipmi_smi_t intf = data;
1806 out += sprintf(out, "sent_invalid_commands: %d\n",
1807 intf->sent_invalid_commands);
1808 out += sprintf(out, "sent_local_commands: %d\n",
1809 intf->sent_local_commands);
1810 out += sprintf(out, "handled_local_responses: %d\n",
1811 intf->handled_local_responses);
1812 out += sprintf(out, "unhandled_local_responses: %d\n",
1813 intf->unhandled_local_responses);
1814 out += sprintf(out, "sent_ipmb_commands: %d\n",
1815 intf->sent_ipmb_commands);
1816 out += sprintf(out, "sent_ipmb_command_errs: %d\n",
1817 intf->sent_ipmb_command_errs);
1818 out += sprintf(out, "retransmitted_ipmb_commands: %d\n",
1819 intf->retransmitted_ipmb_commands);
1820 out += sprintf(out, "timed_out_ipmb_commands: %d\n",
1821 intf->timed_out_ipmb_commands);
1822 out += sprintf(out, "timed_out_ipmb_broadcasts: %d\n",
1823 intf->timed_out_ipmb_broadcasts);
1824 out += sprintf(out, "sent_ipmb_responses: %d\n",
1825 intf->sent_ipmb_responses);
1826 out += sprintf(out, "handled_ipmb_responses: %d\n",
1827 intf->handled_ipmb_responses);
1828 out += sprintf(out, "invalid_ipmb_responses: %d\n",
1829 intf->invalid_ipmb_responses);
1830 out += sprintf(out, "unhandled_ipmb_responses: %d\n",
1831 intf->unhandled_ipmb_responses);
1832 out += sprintf(out, "sent_lan_commands: %d\n",
1833 intf->sent_lan_commands);
1834 out += sprintf(out, "sent_lan_command_errs: %d\n",
1835 intf->sent_lan_command_errs);
1836 out += sprintf(out, "retransmitted_lan_commands: %d\n",
1837 intf->retransmitted_lan_commands);
1838 out += sprintf(out, "timed_out_lan_commands: %d\n",
1839 intf->timed_out_lan_commands);
1840 out += sprintf(out, "sent_lan_responses: %d\n",
1841 intf->sent_lan_responses);
1842 out += sprintf(out, "handled_lan_responses: %d\n",
1843 intf->handled_lan_responses);
1844 out += sprintf(out, "invalid_lan_responses: %d\n",
1845 intf->invalid_lan_responses);
1846 out += sprintf(out, "unhandled_lan_responses: %d\n",
1847 intf->unhandled_lan_responses);
1848 out += sprintf(out, "handled_commands: %d\n",
1849 intf->handled_commands);
1850 out += sprintf(out, "invalid_commands: %d\n",
1851 intf->invalid_commands);
1852 out += sprintf(out, "unhandled_commands: %d\n",
1853 intf->unhandled_commands);
1854 out += sprintf(out, "invalid_events: %d\n",
1855 intf->invalid_events);
1856 out += sprintf(out, "events: %d\n",
1857 intf->events);
1859 return (out - ((char *) page));
1861 #endif /* CONFIG_PROC_FS */
1863 int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name,
1864 read_proc_t *read_proc, write_proc_t *write_proc,
1865 void *data, struct module *owner)
1867 int rv = 0;
1868 #ifdef CONFIG_PROC_FS
1869 struct proc_dir_entry *file;
1870 struct ipmi_proc_entry *entry;
1872 /* Create a list element. */
1873 entry = kmalloc(sizeof(*entry), GFP_KERNEL);
1874 if (!entry)
1875 return -ENOMEM;
1876 entry->name = kmalloc(strlen(name)+1, GFP_KERNEL);
1877 if (!entry->name) {
1878 kfree(entry);
1879 return -ENOMEM;
1881 strcpy(entry->name, name);
1883 file = create_proc_entry(name, 0, smi->proc_dir);
1884 if (!file) {
1885 kfree(entry->name);
1886 kfree(entry);
1887 rv = -ENOMEM;
1888 } else {
1889 file->data = data;
1890 file->read_proc = read_proc;
1891 file->write_proc = write_proc;
1892 file->owner = owner;
1894 spin_lock(&smi->proc_entry_lock);
1895 /* Stick it on the list. */
1896 entry->next = smi->proc_entries;
1897 smi->proc_entries = entry;
1898 spin_unlock(&smi->proc_entry_lock);
1900 #endif /* CONFIG_PROC_FS */
1902 return rv;
1905 static int add_proc_entries(ipmi_smi_t smi, int num)
1907 int rv = 0;
1909 #ifdef CONFIG_PROC_FS
1910 sprintf(smi->proc_dir_name, "%d", num);
1911 smi->proc_dir = proc_mkdir(smi->proc_dir_name, proc_ipmi_root);
1912 if (!smi->proc_dir)
1913 rv = -ENOMEM;
1914 else {
1915 smi->proc_dir->owner = THIS_MODULE;
1918 if (rv == 0)
1919 rv = ipmi_smi_add_proc_entry(smi, "stats",
1920 stat_file_read_proc, NULL,
1921 smi, THIS_MODULE);
1923 if (rv == 0)
1924 rv = ipmi_smi_add_proc_entry(smi, "ipmb",
1925 ipmb_file_read_proc, NULL,
1926 smi, THIS_MODULE);
1928 if (rv == 0)
1929 rv = ipmi_smi_add_proc_entry(smi, "version",
1930 version_file_read_proc, NULL,
1931 smi, THIS_MODULE);
1932 #endif /* CONFIG_PROC_FS */
1934 return rv;
1937 static void remove_proc_entries(ipmi_smi_t smi)
1939 #ifdef CONFIG_PROC_FS
1940 struct ipmi_proc_entry *entry;
1942 spin_lock(&smi->proc_entry_lock);
1943 while (smi->proc_entries) {
1944 entry = smi->proc_entries;
1945 smi->proc_entries = entry->next;
1947 remove_proc_entry(entry->name, smi->proc_dir);
1948 kfree(entry->name);
1949 kfree(entry);
1951 spin_unlock(&smi->proc_entry_lock);
1952 remove_proc_entry(smi->proc_dir_name, proc_ipmi_root);
1953 #endif /* CONFIG_PROC_FS */
1956 static int __find_bmc_guid(struct device *dev, void *data)
1958 unsigned char *id = data;
1959 struct bmc_device *bmc = dev_get_drvdata(dev);
1960 return memcmp(bmc->guid, id, 16) == 0;
1963 static struct bmc_device *ipmi_find_bmc_guid(struct device_driver *drv,
1964 unsigned char *guid)
1966 struct device *dev;
1968 dev = driver_find_device(drv, NULL, guid, __find_bmc_guid);
1969 if (dev)
1970 return dev_get_drvdata(dev);
1971 else
1972 return NULL;
1975 struct prod_dev_id {
1976 unsigned int product_id;
1977 unsigned char device_id;
1980 static int __find_bmc_prod_dev_id(struct device *dev, void *data)
1982 struct prod_dev_id *id = data;
1983 struct bmc_device *bmc = dev_get_drvdata(dev);
1985 return (bmc->id.product_id == id->product_id
1986 && bmc->id.device_id == id->device_id);
1989 static struct bmc_device *ipmi_find_bmc_prod_dev_id(
1990 struct device_driver *drv,
1991 unsigned int product_id, unsigned char device_id)
1993 struct prod_dev_id id = {
1994 .product_id = product_id,
1995 .device_id = device_id,
1997 struct device *dev;
1999 dev = driver_find_device(drv, NULL, &id, __find_bmc_prod_dev_id);
2000 if (dev)
2001 return dev_get_drvdata(dev);
2002 else
2003 return NULL;
2006 static ssize_t device_id_show(struct device *dev,
2007 struct device_attribute *attr,
2008 char *buf)
2010 struct bmc_device *bmc = dev_get_drvdata(dev);
2012 return snprintf(buf, 10, "%u\n", bmc->id.device_id);
2015 static ssize_t provides_dev_sdrs_show(struct device *dev,
2016 struct device_attribute *attr,
2017 char *buf)
2019 struct bmc_device *bmc = dev_get_drvdata(dev);
2021 return snprintf(buf, 10, "%u\n",
2022 (bmc->id.device_revision & 0x80) >> 7);
2025 static ssize_t revision_show(struct device *dev, struct device_attribute *attr,
2026 char *buf)
2028 struct bmc_device *bmc = dev_get_drvdata(dev);
2030 return snprintf(buf, 20, "%u\n",
2031 bmc->id.device_revision & 0x0F);
2034 static ssize_t firmware_rev_show(struct device *dev,
2035 struct device_attribute *attr,
2036 char *buf)
2038 struct bmc_device *bmc = dev_get_drvdata(dev);
2040 return snprintf(buf, 20, "%u.%x\n", bmc->id.firmware_revision_1,
2041 bmc->id.firmware_revision_2);
2044 static ssize_t ipmi_version_show(struct device *dev,
2045 struct device_attribute *attr,
2046 char *buf)
2048 struct bmc_device *bmc = dev_get_drvdata(dev);
2050 return snprintf(buf, 20, "%u.%u\n",
2051 ipmi_version_major(&bmc->id),
2052 ipmi_version_minor(&bmc->id));
2055 static ssize_t add_dev_support_show(struct device *dev,
2056 struct device_attribute *attr,
2057 char *buf)
2059 struct bmc_device *bmc = dev_get_drvdata(dev);
2061 return snprintf(buf, 10, "0x%02x\n",
2062 bmc->id.additional_device_support);
2065 static ssize_t manufacturer_id_show(struct device *dev,
2066 struct device_attribute *attr,
2067 char *buf)
2069 struct bmc_device *bmc = dev_get_drvdata(dev);
2071 return snprintf(buf, 20, "0x%6.6x\n", bmc->id.manufacturer_id);
2074 static ssize_t product_id_show(struct device *dev,
2075 struct device_attribute *attr,
2076 char *buf)
2078 struct bmc_device *bmc = dev_get_drvdata(dev);
2080 return snprintf(buf, 10, "0x%4.4x\n", bmc->id.product_id);
2083 static ssize_t aux_firmware_rev_show(struct device *dev,
2084 struct device_attribute *attr,
2085 char *buf)
2087 struct bmc_device *bmc = dev_get_drvdata(dev);
2089 return snprintf(buf, 21, "0x%02x 0x%02x 0x%02x 0x%02x\n",
2090 bmc->id.aux_firmware_revision[3],
2091 bmc->id.aux_firmware_revision[2],
2092 bmc->id.aux_firmware_revision[1],
2093 bmc->id.aux_firmware_revision[0]);
2096 static ssize_t guid_show(struct device *dev, struct device_attribute *attr,
2097 char *buf)
2099 struct bmc_device *bmc = dev_get_drvdata(dev);
2101 return snprintf(buf, 100, "%Lx%Lx\n",
2102 (long long) bmc->guid[0],
2103 (long long) bmc->guid[8]);
2106 static void remove_files(struct bmc_device *bmc)
2108 if (!bmc->dev)
2109 return;
2111 device_remove_file(&bmc->dev->dev,
2112 &bmc->device_id_attr);
2113 device_remove_file(&bmc->dev->dev,
2114 &bmc->provides_dev_sdrs_attr);
2115 device_remove_file(&bmc->dev->dev,
2116 &bmc->revision_attr);
2117 device_remove_file(&bmc->dev->dev,
2118 &bmc->firmware_rev_attr);
2119 device_remove_file(&bmc->dev->dev,
2120 &bmc->version_attr);
2121 device_remove_file(&bmc->dev->dev,
2122 &bmc->add_dev_support_attr);
2123 device_remove_file(&bmc->dev->dev,
2124 &bmc->manufacturer_id_attr);
2125 device_remove_file(&bmc->dev->dev,
2126 &bmc->product_id_attr);
2128 if (bmc->id.aux_firmware_revision_set)
2129 device_remove_file(&bmc->dev->dev,
2130 &bmc->aux_firmware_rev_attr);
2131 if (bmc->guid_set)
2132 device_remove_file(&bmc->dev->dev,
2133 &bmc->guid_attr);
2136 static void
2137 cleanup_bmc_device(struct kref *ref)
2139 struct bmc_device *bmc;
2141 bmc = container_of(ref, struct bmc_device, refcount);
2143 remove_files(bmc);
2144 platform_device_unregister(bmc->dev);
2145 kfree(bmc);
2148 static void ipmi_bmc_unregister(ipmi_smi_t intf)
2150 struct bmc_device *bmc = intf->bmc;
2152 if (intf->sysfs_name) {
2153 sysfs_remove_link(&intf->si_dev->kobj, intf->sysfs_name);
2154 kfree(intf->sysfs_name);
2155 intf->sysfs_name = NULL;
2157 if (intf->my_dev_name) {
2158 sysfs_remove_link(&bmc->dev->dev.kobj, intf->my_dev_name);
2159 kfree(intf->my_dev_name);
2160 intf->my_dev_name = NULL;
2163 mutex_lock(&ipmidriver_mutex);
2164 kref_put(&bmc->refcount, cleanup_bmc_device);
2165 intf->bmc = NULL;
2166 mutex_unlock(&ipmidriver_mutex);
2169 static int create_files(struct bmc_device *bmc)
2171 int err;
2173 bmc->device_id_attr.attr.name = "device_id";
2174 bmc->device_id_attr.attr.owner = THIS_MODULE;
2175 bmc->device_id_attr.attr.mode = S_IRUGO;
2176 bmc->device_id_attr.show = device_id_show;
2178 bmc->provides_dev_sdrs_attr.attr.name = "provides_device_sdrs";
2179 bmc->provides_dev_sdrs_attr.attr.owner = THIS_MODULE;
2180 bmc->provides_dev_sdrs_attr.attr.mode = S_IRUGO;
2181 bmc->provides_dev_sdrs_attr.show = provides_dev_sdrs_show;
2183 bmc->revision_attr.attr.name = "revision";
2184 bmc->revision_attr.attr.owner = THIS_MODULE;
2185 bmc->revision_attr.attr.mode = S_IRUGO;
2186 bmc->revision_attr.show = revision_show;
2188 bmc->firmware_rev_attr.attr.name = "firmware_revision";
2189 bmc->firmware_rev_attr.attr.owner = THIS_MODULE;
2190 bmc->firmware_rev_attr.attr.mode = S_IRUGO;
2191 bmc->firmware_rev_attr.show = firmware_rev_show;
2193 bmc->version_attr.attr.name = "ipmi_version";
2194 bmc->version_attr.attr.owner = THIS_MODULE;
2195 bmc->version_attr.attr.mode = S_IRUGO;
2196 bmc->version_attr.show = ipmi_version_show;
2198 bmc->add_dev_support_attr.attr.name = "additional_device_support";
2199 bmc->add_dev_support_attr.attr.owner = THIS_MODULE;
2200 bmc->add_dev_support_attr.attr.mode = S_IRUGO;
2201 bmc->add_dev_support_attr.show = add_dev_support_show;
2203 bmc->manufacturer_id_attr.attr.name = "manufacturer_id";
2204 bmc->manufacturer_id_attr.attr.owner = THIS_MODULE;
2205 bmc->manufacturer_id_attr.attr.mode = S_IRUGO;
2206 bmc->manufacturer_id_attr.show = manufacturer_id_show;
2208 bmc->product_id_attr.attr.name = "product_id";
2209 bmc->product_id_attr.attr.owner = THIS_MODULE;
2210 bmc->product_id_attr.attr.mode = S_IRUGO;
2211 bmc->product_id_attr.show = product_id_show;
2213 bmc->guid_attr.attr.name = "guid";
2214 bmc->guid_attr.attr.owner = THIS_MODULE;
2215 bmc->guid_attr.attr.mode = S_IRUGO;
2216 bmc->guid_attr.show = guid_show;
2218 bmc->aux_firmware_rev_attr.attr.name = "aux_firmware_revision";
2219 bmc->aux_firmware_rev_attr.attr.owner = THIS_MODULE;
2220 bmc->aux_firmware_rev_attr.attr.mode = S_IRUGO;
2221 bmc->aux_firmware_rev_attr.show = aux_firmware_rev_show;
2223 err = device_create_file(&bmc->dev->dev,
2224 &bmc->device_id_attr);
2225 if (err) goto out;
2226 err = device_create_file(&bmc->dev->dev,
2227 &bmc->provides_dev_sdrs_attr);
2228 if (err) goto out_devid;
2229 err = device_create_file(&bmc->dev->dev,
2230 &bmc->revision_attr);
2231 if (err) goto out_sdrs;
2232 err = device_create_file(&bmc->dev->dev,
2233 &bmc->firmware_rev_attr);
2234 if (err) goto out_rev;
2235 err = device_create_file(&bmc->dev->dev,
2236 &bmc->version_attr);
2237 if (err) goto out_firm;
2238 err = device_create_file(&bmc->dev->dev,
2239 &bmc->add_dev_support_attr);
2240 if (err) goto out_version;
2241 err = device_create_file(&bmc->dev->dev,
2242 &bmc->manufacturer_id_attr);
2243 if (err) goto out_add_dev;
2244 err = device_create_file(&bmc->dev->dev,
2245 &bmc->product_id_attr);
2246 if (err) goto out_manu;
2247 if (bmc->id.aux_firmware_revision_set) {
2248 err = device_create_file(&bmc->dev->dev,
2249 &bmc->aux_firmware_rev_attr);
2250 if (err) goto out_prod_id;
2252 if (bmc->guid_set) {
2253 err = device_create_file(&bmc->dev->dev,
2254 &bmc->guid_attr);
2255 if (err) goto out_aux_firm;
2258 return 0;
2260 out_aux_firm:
2261 if (bmc->id.aux_firmware_revision_set)
2262 device_remove_file(&bmc->dev->dev,
2263 &bmc->aux_firmware_rev_attr);
2264 out_prod_id:
2265 device_remove_file(&bmc->dev->dev,
2266 &bmc->product_id_attr);
2267 out_manu:
2268 device_remove_file(&bmc->dev->dev,
2269 &bmc->manufacturer_id_attr);
2270 out_add_dev:
2271 device_remove_file(&bmc->dev->dev,
2272 &bmc->add_dev_support_attr);
2273 out_version:
2274 device_remove_file(&bmc->dev->dev,
2275 &bmc->version_attr);
2276 out_firm:
2277 device_remove_file(&bmc->dev->dev,
2278 &bmc->firmware_rev_attr);
2279 out_rev:
2280 device_remove_file(&bmc->dev->dev,
2281 &bmc->revision_attr);
2282 out_sdrs:
2283 device_remove_file(&bmc->dev->dev,
2284 &bmc->provides_dev_sdrs_attr);
2285 out_devid:
2286 device_remove_file(&bmc->dev->dev,
2287 &bmc->device_id_attr);
2288 out:
2289 return err;
2292 static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum,
2293 const char *sysfs_name)
2295 int rv;
2296 struct bmc_device *bmc = intf->bmc;
2297 struct bmc_device *old_bmc;
2298 int size;
2299 char dummy[1];
2301 mutex_lock(&ipmidriver_mutex);
2304 * Try to find if there is an bmc_device struct
2305 * representing the interfaced BMC already
2307 if (bmc->guid_set)
2308 old_bmc = ipmi_find_bmc_guid(&ipmidriver, bmc->guid);
2309 else
2310 old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver,
2311 bmc->id.product_id,
2312 bmc->id.device_id);
2315 * If there is already an bmc_device, free the new one,
2316 * otherwise register the new BMC device
2318 if (old_bmc) {
2319 kfree(bmc);
2320 intf->bmc = old_bmc;
2321 bmc = old_bmc;
2323 kref_get(&bmc->refcount);
2324 mutex_unlock(&ipmidriver_mutex);
2326 printk(KERN_INFO
2327 "ipmi: interfacing existing BMC (man_id: 0x%6.6x,"
2328 " prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",
2329 bmc->id.manufacturer_id,
2330 bmc->id.product_id,
2331 bmc->id.device_id);
2332 } else {
2333 char name[14];
2334 unsigned char orig_dev_id = bmc->id.device_id;
2335 int warn_printed = 0;
2337 snprintf(name, sizeof(name),
2338 "ipmi_bmc.%4.4x", bmc->id.product_id);
2340 while (ipmi_find_bmc_prod_dev_id(&ipmidriver,
2341 bmc->id.product_id,
2342 bmc->id.device_id)) {
2343 if (!warn_printed) {
2344 printk(KERN_WARNING PFX
2345 "This machine has two different BMCs"
2346 " with the same product id and device"
2347 " id. This is an error in the"
2348 " firmware, but incrementing the"
2349 " device id to work around the problem."
2350 " Prod ID = 0x%x, Dev ID = 0x%x\n",
2351 bmc->id.product_id, bmc->id.device_id);
2352 warn_printed = 1;
2354 bmc->id.device_id++; /* Wraps at 255 */
2355 if (bmc->id.device_id == orig_dev_id) {
2356 printk(KERN_ERR PFX
2357 "Out of device ids!\n");
2358 break;
2362 bmc->dev = platform_device_alloc(name, bmc->id.device_id);
2363 if (!bmc->dev) {
2364 mutex_unlock(&ipmidriver_mutex);
2365 printk(KERN_ERR
2366 "ipmi_msghandler:"
2367 " Unable to allocate platform device\n");
2368 return -ENOMEM;
2370 bmc->dev->dev.driver = &ipmidriver;
2371 dev_set_drvdata(&bmc->dev->dev, bmc);
2372 kref_init(&bmc->refcount);
2374 rv = platform_device_add(bmc->dev);
2375 mutex_unlock(&ipmidriver_mutex);
2376 if (rv) {
2377 platform_device_put(bmc->dev);
2378 bmc->dev = NULL;
2379 printk(KERN_ERR
2380 "ipmi_msghandler:"
2381 " Unable to register bmc device: %d\n",
2382 rv);
2383 /* Don't go to out_err, you can only do that if
2384 the device is registered already. */
2385 return rv;
2388 rv = create_files(bmc);
2389 if (rv) {
2390 mutex_lock(&ipmidriver_mutex);
2391 platform_device_unregister(bmc->dev);
2392 mutex_unlock(&ipmidriver_mutex);
2394 return rv;
2397 printk(KERN_INFO
2398 "ipmi: Found new BMC (man_id: 0x%6.6x, "
2399 " prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",
2400 bmc->id.manufacturer_id,
2401 bmc->id.product_id,
2402 bmc->id.device_id);
2406 * create symlink from system interface device to bmc device
2407 * and back.
2409 intf->sysfs_name = kstrdup(sysfs_name, GFP_KERNEL);
2410 if (!intf->sysfs_name) {
2411 rv = -ENOMEM;
2412 printk(KERN_ERR
2413 "ipmi_msghandler: allocate link to BMC: %d\n",
2414 rv);
2415 goto out_err;
2418 rv = sysfs_create_link(&intf->si_dev->kobj,
2419 &bmc->dev->dev.kobj, intf->sysfs_name);
2420 if (rv) {
2421 kfree(intf->sysfs_name);
2422 intf->sysfs_name = NULL;
2423 printk(KERN_ERR
2424 "ipmi_msghandler: Unable to create bmc symlink: %d\n",
2425 rv);
2426 goto out_err;
2429 size = snprintf(dummy, 0, "ipmi%d", ifnum);
2430 intf->my_dev_name = kmalloc(size+1, GFP_KERNEL);
2431 if (!intf->my_dev_name) {
2432 kfree(intf->sysfs_name);
2433 intf->sysfs_name = NULL;
2434 rv = -ENOMEM;
2435 printk(KERN_ERR
2436 "ipmi_msghandler: allocate link from BMC: %d\n",
2437 rv);
2438 goto out_err;
2440 snprintf(intf->my_dev_name, size+1, "ipmi%d", ifnum);
2442 rv = sysfs_create_link(&bmc->dev->dev.kobj, &intf->si_dev->kobj,
2443 intf->my_dev_name);
2444 if (rv) {
2445 kfree(intf->sysfs_name);
2446 intf->sysfs_name = NULL;
2447 kfree(intf->my_dev_name);
2448 intf->my_dev_name = NULL;
2449 printk(KERN_ERR
2450 "ipmi_msghandler:"
2451 " Unable to create symlink to bmc: %d\n",
2452 rv);
2453 goto out_err;
2456 return 0;
2458 out_err:
2459 ipmi_bmc_unregister(intf);
2460 return rv;
2463 static int
2464 send_guid_cmd(ipmi_smi_t intf, int chan)
2466 struct kernel_ipmi_msg msg;
2467 struct ipmi_system_interface_addr si;
2469 si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
2470 si.channel = IPMI_BMC_CHANNEL;
2471 si.lun = 0;
2473 msg.netfn = IPMI_NETFN_APP_REQUEST;
2474 msg.cmd = IPMI_GET_DEVICE_GUID_CMD;
2475 msg.data = NULL;
2476 msg.data_len = 0;
2477 return i_ipmi_request(NULL,
2478 intf,
2479 (struct ipmi_addr *) &si,
2481 &msg,
2482 intf,
2483 NULL,
2484 NULL,
2486 intf->channels[0].address,
2487 intf->channels[0].lun,
2488 -1, 0);
2491 static void
2492 guid_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
2494 if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
2495 || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE)
2496 || (msg->msg.cmd != IPMI_GET_DEVICE_GUID_CMD))
2497 /* Not for me */
2498 return;
2500 if (msg->msg.data[0] != 0) {
2501 /* Error from getting the GUID, the BMC doesn't have one. */
2502 intf->bmc->guid_set = 0;
2503 goto out;
2506 if (msg->msg.data_len < 17) {
2507 intf->bmc->guid_set = 0;
2508 printk(KERN_WARNING PFX
2509 "guid_handler: The GUID response from the BMC was too"
2510 " short, it was %d but should have been 17. Assuming"
2511 " GUID is not available.\n",
2512 msg->msg.data_len);
2513 goto out;
2516 memcpy(intf->bmc->guid, msg->msg.data, 16);
2517 intf->bmc->guid_set = 1;
2518 out:
2519 wake_up(&intf->waitq);
2522 static void
2523 get_guid(ipmi_smi_t intf)
2525 int rv;
2527 intf->bmc->guid_set = 0x2;
2528 intf->null_user_handler = guid_handler;
2529 rv = send_guid_cmd(intf, 0);
2530 if (rv)
2531 /* Send failed, no GUID available. */
2532 intf->bmc->guid_set = 0;
2533 wait_event(intf->waitq, intf->bmc->guid_set != 2);
2534 intf->null_user_handler = NULL;
2537 static int
2538 send_channel_info_cmd(ipmi_smi_t intf, int chan)
2540 struct kernel_ipmi_msg msg;
2541 unsigned char data[1];
2542 struct ipmi_system_interface_addr si;
2544 si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
2545 si.channel = IPMI_BMC_CHANNEL;
2546 si.lun = 0;
2548 msg.netfn = IPMI_NETFN_APP_REQUEST;
2549 msg.cmd = IPMI_GET_CHANNEL_INFO_CMD;
2550 msg.data = data;
2551 msg.data_len = 1;
2552 data[0] = chan;
2553 return i_ipmi_request(NULL,
2554 intf,
2555 (struct ipmi_addr *) &si,
2557 &msg,
2558 intf,
2559 NULL,
2560 NULL,
2562 intf->channels[0].address,
2563 intf->channels[0].lun,
2564 -1, 0);
2567 static void
2568 channel_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
2570 int rv = 0;
2571 int chan;
2573 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
2574 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE)
2575 && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD))
2577 /* It's the one we want */
2578 if (msg->msg.data[0] != 0) {
2579 /* Got an error from the channel, just go on. */
2581 if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) {
2582 /* If the MC does not support this
2583 command, that is legal. We just
2584 assume it has one IPMB at channel
2585 zero. */
2586 intf->channels[0].medium
2587 = IPMI_CHANNEL_MEDIUM_IPMB;
2588 intf->channels[0].protocol
2589 = IPMI_CHANNEL_PROTOCOL_IPMB;
2590 rv = -ENOSYS;
2592 intf->curr_channel = IPMI_MAX_CHANNELS;
2593 wake_up(&intf->waitq);
2594 goto out;
2596 goto next_channel;
2598 if (msg->msg.data_len < 4) {
2599 /* Message not big enough, just go on. */
2600 goto next_channel;
2602 chan = intf->curr_channel;
2603 intf->channels[chan].medium = msg->msg.data[2] & 0x7f;
2604 intf->channels[chan].protocol = msg->msg.data[3] & 0x1f;
2606 next_channel:
2607 intf->curr_channel++;
2608 if (intf->curr_channel >= IPMI_MAX_CHANNELS)
2609 wake_up(&intf->waitq);
2610 else
2611 rv = send_channel_info_cmd(intf, intf->curr_channel);
2613 if (rv) {
2614 /* Got an error somehow, just give up. */
2615 intf->curr_channel = IPMI_MAX_CHANNELS;
2616 wake_up(&intf->waitq);
2618 printk(KERN_WARNING PFX
2619 "Error sending channel information: %d\n",
2620 rv);
2623 out:
2624 return;
2627 int ipmi_register_smi(struct ipmi_smi_handlers *handlers,
2628 void *send_info,
2629 struct ipmi_device_id *device_id,
2630 struct device *si_dev,
2631 const char *sysfs_name,
2632 unsigned char slave_addr)
2634 int i, j;
2635 int rv;
2636 ipmi_smi_t intf;
2637 ipmi_smi_t tintf;
2638 struct list_head *link;
2640 /* Make sure the driver is actually initialized, this handles
2641 problems with initialization order. */
2642 if (!initialized) {
2643 rv = ipmi_init_msghandler();
2644 if (rv)
2645 return rv;
2646 /* The init code doesn't return an error if it was turned
2647 off, but it won't initialize. Check that. */
2648 if (!initialized)
2649 return -ENODEV;
2652 intf = kzalloc(sizeof(*intf), GFP_KERNEL);
2653 if (!intf)
2654 return -ENOMEM;
2656 intf->ipmi_version_major = ipmi_version_major(device_id);
2657 intf->ipmi_version_minor = ipmi_version_minor(device_id);
2659 intf->bmc = kzalloc(sizeof(*intf->bmc), GFP_KERNEL);
2660 if (!intf->bmc) {
2661 kfree(intf);
2662 return -ENOMEM;
2664 intf->intf_num = -1; /* Mark it invalid for now. */
2665 kref_init(&intf->refcount);
2666 intf->bmc->id = *device_id;
2667 intf->si_dev = si_dev;
2668 for (j = 0; j < IPMI_MAX_CHANNELS; j++) {
2669 intf->channels[j].address = IPMI_BMC_SLAVE_ADDR;
2670 intf->channels[j].lun = 2;
2672 if (slave_addr != 0)
2673 intf->channels[0].address = slave_addr;
2674 INIT_LIST_HEAD(&intf->users);
2675 intf->handlers = handlers;
2676 intf->send_info = send_info;
2677 spin_lock_init(&intf->seq_lock);
2678 for (j = 0; j < IPMI_IPMB_NUM_SEQ; j++) {
2679 intf->seq_table[j].inuse = 0;
2680 intf->seq_table[j].seqid = 0;
2682 intf->curr_seq = 0;
2683 #ifdef CONFIG_PROC_FS
2684 spin_lock_init(&intf->proc_entry_lock);
2685 #endif
2686 spin_lock_init(&intf->waiting_msgs_lock);
2687 INIT_LIST_HEAD(&intf->waiting_msgs);
2688 spin_lock_init(&intf->events_lock);
2689 INIT_LIST_HEAD(&intf->waiting_events);
2690 intf->waiting_events_count = 0;
2691 mutex_init(&intf->cmd_rcvrs_mutex);
2692 spin_lock_init(&intf->maintenance_mode_lock);
2693 INIT_LIST_HEAD(&intf->cmd_rcvrs);
2694 init_waitqueue_head(&intf->waitq);
2696 spin_lock_init(&intf->counter_lock);
2697 intf->proc_dir = NULL;
2699 mutex_lock(&smi_watchers_mutex);
2700 mutex_lock(&ipmi_interfaces_mutex);
2701 /* Look for a hole in the numbers. */
2702 i = 0;
2703 link = &ipmi_interfaces;
2704 list_for_each_entry_rcu(tintf, &ipmi_interfaces, link) {
2705 if (tintf->intf_num != i) {
2706 link = &tintf->link;
2707 break;
2709 i++;
2711 /* Add the new interface in numeric order. */
2712 if (i == 0)
2713 list_add_rcu(&intf->link, &ipmi_interfaces);
2714 else
2715 list_add_tail_rcu(&intf->link, link);
2717 rv = handlers->start_processing(send_info, intf);
2718 if (rv)
2719 goto out;
2721 get_guid(intf);
2723 if ((intf->ipmi_version_major > 1)
2724 || ((intf->ipmi_version_major == 1)
2725 && (intf->ipmi_version_minor >= 5)))
2727 /* Start scanning the channels to see what is
2728 available. */
2729 intf->null_user_handler = channel_handler;
2730 intf->curr_channel = 0;
2731 rv = send_channel_info_cmd(intf, 0);
2732 if (rv)
2733 goto out;
2735 /* Wait for the channel info to be read. */
2736 wait_event(intf->waitq,
2737 intf->curr_channel >= IPMI_MAX_CHANNELS);
2738 intf->null_user_handler = NULL;
2739 } else {
2740 /* Assume a single IPMB channel at zero. */
2741 intf->channels[0].medium = IPMI_CHANNEL_MEDIUM_IPMB;
2742 intf->channels[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB;
2745 if (rv == 0)
2746 rv = add_proc_entries(intf, i);
2748 rv = ipmi_bmc_register(intf, i, sysfs_name);
2750 out:
2751 if (rv) {
2752 if (intf->proc_dir)
2753 remove_proc_entries(intf);
2754 intf->handlers = NULL;
2755 list_del_rcu(&intf->link);
2756 mutex_unlock(&ipmi_interfaces_mutex);
2757 mutex_unlock(&smi_watchers_mutex);
2758 synchronize_rcu();
2759 kref_put(&intf->refcount, intf_free);
2760 } else {
2762 * Keep memory order straight for RCU readers. Make
2763 * sure everything else is committed to memory before
2764 * setting intf_num to mark the interface valid.
2766 smp_wmb();
2767 intf->intf_num = i;
2768 mutex_unlock(&ipmi_interfaces_mutex);
2769 /* After this point the interface is legal to use. */
2770 call_smi_watchers(i, intf->si_dev);
2771 mutex_unlock(&smi_watchers_mutex);
2774 return rv;
2777 static void cleanup_smi_msgs(ipmi_smi_t intf)
2779 int i;
2780 struct seq_table *ent;
2782 /* No need for locks, the interface is down. */
2783 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {
2784 ent = &(intf->seq_table[i]);
2785 if (!ent->inuse)
2786 continue;
2787 deliver_err_response(ent->recv_msg, IPMI_ERR_UNSPECIFIED);
2791 int ipmi_unregister_smi(ipmi_smi_t intf)
2793 struct ipmi_smi_watcher *w;
2794 int intf_num = intf->intf_num;
2796 ipmi_bmc_unregister(intf);
2798 mutex_lock(&smi_watchers_mutex);
2799 mutex_lock(&ipmi_interfaces_mutex);
2800 intf->intf_num = -1;
2801 intf->handlers = NULL;
2802 list_del_rcu(&intf->link);
2803 mutex_unlock(&ipmi_interfaces_mutex);
2804 synchronize_rcu();
2806 cleanup_smi_msgs(intf);
2808 remove_proc_entries(intf);
2810 /* Call all the watcher interfaces to tell them that
2811 an interface is gone. */
2812 list_for_each_entry(w, &smi_watchers, link)
2813 w->smi_gone(intf_num);
2814 mutex_unlock(&smi_watchers_mutex);
2816 kref_put(&intf->refcount, intf_free);
2817 return 0;
2820 static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf,
2821 struct ipmi_smi_msg *msg)
2823 struct ipmi_ipmb_addr ipmb_addr;
2824 struct ipmi_recv_msg *recv_msg;
2825 unsigned long flags;
2828 /* This is 11, not 10, because the response must contain a
2829 * completion code. */
2830 if (msg->rsp_size < 11) {
2831 /* Message not big enough, just ignore it. */
2832 spin_lock_irqsave(&intf->counter_lock, flags);
2833 intf->invalid_ipmb_responses++;
2834 spin_unlock_irqrestore(&intf->counter_lock, flags);
2835 return 0;
2838 if (msg->rsp[2] != 0) {
2839 /* An error getting the response, just ignore it. */
2840 return 0;
2843 ipmb_addr.addr_type = IPMI_IPMB_ADDR_TYPE;
2844 ipmb_addr.slave_addr = msg->rsp[6];
2845 ipmb_addr.channel = msg->rsp[3] & 0x0f;
2846 ipmb_addr.lun = msg->rsp[7] & 3;
2848 /* It's a response from a remote entity. Look up the sequence
2849 number and handle the response. */
2850 if (intf_find_seq(intf,
2851 msg->rsp[7] >> 2,
2852 msg->rsp[3] & 0x0f,
2853 msg->rsp[8],
2854 (msg->rsp[4] >> 2) & (~1),
2855 (struct ipmi_addr *) &(ipmb_addr),
2856 &recv_msg))
2858 /* We were unable to find the sequence number,
2859 so just nuke the message. */
2860 spin_lock_irqsave(&intf->counter_lock, flags);
2861 intf->unhandled_ipmb_responses++;
2862 spin_unlock_irqrestore(&intf->counter_lock, flags);
2863 return 0;
2866 memcpy(recv_msg->msg_data,
2867 &(msg->rsp[9]),
2868 msg->rsp_size - 9);
2869 /* THe other fields matched, so no need to set them, except
2870 for netfn, which needs to be the response that was
2871 returned, not the request value. */
2872 recv_msg->msg.netfn = msg->rsp[4] >> 2;
2873 recv_msg->msg.data = recv_msg->msg_data;
2874 recv_msg->msg.data_len = msg->rsp_size - 10;
2875 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
2876 spin_lock_irqsave(&intf->counter_lock, flags);
2877 intf->handled_ipmb_responses++;
2878 spin_unlock_irqrestore(&intf->counter_lock, flags);
2879 deliver_response(recv_msg);
2881 return 0;
2884 static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf,
2885 struct ipmi_smi_msg *msg)
2887 struct cmd_rcvr *rcvr;
2888 int rv = 0;
2889 unsigned char netfn;
2890 unsigned char cmd;
2891 unsigned char chan;
2892 ipmi_user_t user = NULL;
2893 struct ipmi_ipmb_addr *ipmb_addr;
2894 struct ipmi_recv_msg *recv_msg;
2895 unsigned long flags;
2896 struct ipmi_smi_handlers *handlers;
2898 if (msg->rsp_size < 10) {
2899 /* Message not big enough, just ignore it. */
2900 spin_lock_irqsave(&intf->counter_lock, flags);
2901 intf->invalid_commands++;
2902 spin_unlock_irqrestore(&intf->counter_lock, flags);
2903 return 0;
2906 if (msg->rsp[2] != 0) {
2907 /* An error getting the response, just ignore it. */
2908 return 0;
2911 netfn = msg->rsp[4] >> 2;
2912 cmd = msg->rsp[8];
2913 chan = msg->rsp[3] & 0xf;
2915 rcu_read_lock();
2916 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan);
2917 if (rcvr) {
2918 user = rcvr->user;
2919 kref_get(&user->refcount);
2920 } else
2921 user = NULL;
2922 rcu_read_unlock();
2924 if (user == NULL) {
2925 /* We didn't find a user, deliver an error response. */
2926 spin_lock_irqsave(&intf->counter_lock, flags);
2927 intf->unhandled_commands++;
2928 spin_unlock_irqrestore(&intf->counter_lock, flags);
2930 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
2931 msg->data[1] = IPMI_SEND_MSG_CMD;
2932 msg->data[2] = msg->rsp[3];
2933 msg->data[3] = msg->rsp[6];
2934 msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3);
2935 msg->data[5] = ipmb_checksum(&(msg->data[3]), 2);
2936 msg->data[6] = intf->channels[msg->rsp[3] & 0xf].address;
2937 /* rqseq/lun */
2938 msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3);
2939 msg->data[8] = msg->rsp[8]; /* cmd */
2940 msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE;
2941 msg->data[10] = ipmb_checksum(&(msg->data[6]), 4);
2942 msg->data_size = 11;
2944 #ifdef DEBUG_MSGING
2946 int m;
2947 printk("Invalid command:");
2948 for (m = 0; m < msg->data_size; m++)
2949 printk(" %2.2x", msg->data[m]);
2950 printk("\n");
2952 #endif
2953 rcu_read_lock();
2954 handlers = intf->handlers;
2955 if (handlers) {
2956 handlers->sender(intf->send_info, msg, 0);
2957 /* We used the message, so return the value
2958 that causes it to not be freed or
2959 queued. */
2960 rv = -1;
2962 rcu_read_unlock();
2963 } else {
2964 /* Deliver the message to the user. */
2965 spin_lock_irqsave(&intf->counter_lock, flags);
2966 intf->handled_commands++;
2967 spin_unlock_irqrestore(&intf->counter_lock, flags);
2969 recv_msg = ipmi_alloc_recv_msg();
2970 if (!recv_msg) {
2971 /* We couldn't allocate memory for the
2972 message, so requeue it for handling
2973 later. */
2974 rv = 1;
2975 kref_put(&user->refcount, free_user);
2976 } else {
2977 /* Extract the source address from the data. */
2978 ipmb_addr = (struct ipmi_ipmb_addr *) &recv_msg->addr;
2979 ipmb_addr->addr_type = IPMI_IPMB_ADDR_TYPE;
2980 ipmb_addr->slave_addr = msg->rsp[6];
2981 ipmb_addr->lun = msg->rsp[7] & 3;
2982 ipmb_addr->channel = msg->rsp[3] & 0xf;
2984 /* Extract the rest of the message information
2985 from the IPMB header.*/
2986 recv_msg->user = user;
2987 recv_msg->recv_type = IPMI_CMD_RECV_TYPE;
2988 recv_msg->msgid = msg->rsp[7] >> 2;
2989 recv_msg->msg.netfn = msg->rsp[4] >> 2;
2990 recv_msg->msg.cmd = msg->rsp[8];
2991 recv_msg->msg.data = recv_msg->msg_data;
2993 /* We chop off 10, not 9 bytes because the checksum
2994 at the end also needs to be removed. */
2995 recv_msg->msg.data_len = msg->rsp_size - 10;
2996 memcpy(recv_msg->msg_data,
2997 &(msg->rsp[9]),
2998 msg->rsp_size - 10);
2999 deliver_response(recv_msg);
3003 return rv;
3006 static int handle_lan_get_msg_rsp(ipmi_smi_t intf,
3007 struct ipmi_smi_msg *msg)
3009 struct ipmi_lan_addr lan_addr;
3010 struct ipmi_recv_msg *recv_msg;
3011 unsigned long flags;
3014 /* This is 13, not 12, because the response must contain a
3015 * completion code. */
3016 if (msg->rsp_size < 13) {
3017 /* Message not big enough, just ignore it. */
3018 spin_lock_irqsave(&intf->counter_lock, flags);
3019 intf->invalid_lan_responses++;
3020 spin_unlock_irqrestore(&intf->counter_lock, flags);
3021 return 0;
3024 if (msg->rsp[2] != 0) {
3025 /* An error getting the response, just ignore it. */
3026 return 0;
3029 lan_addr.addr_type = IPMI_LAN_ADDR_TYPE;
3030 lan_addr.session_handle = msg->rsp[4];
3031 lan_addr.remote_SWID = msg->rsp[8];
3032 lan_addr.local_SWID = msg->rsp[5];
3033 lan_addr.channel = msg->rsp[3] & 0x0f;
3034 lan_addr.privilege = msg->rsp[3] >> 4;
3035 lan_addr.lun = msg->rsp[9] & 3;
3037 /* It's a response from a remote entity. Look up the sequence
3038 number and handle the response. */
3039 if (intf_find_seq(intf,
3040 msg->rsp[9] >> 2,
3041 msg->rsp[3] & 0x0f,
3042 msg->rsp[10],
3043 (msg->rsp[6] >> 2) & (~1),
3044 (struct ipmi_addr *) &(lan_addr),
3045 &recv_msg))
3047 /* We were unable to find the sequence number,
3048 so just nuke the message. */
3049 spin_lock_irqsave(&intf->counter_lock, flags);
3050 intf->unhandled_lan_responses++;
3051 spin_unlock_irqrestore(&intf->counter_lock, flags);
3052 return 0;
3055 memcpy(recv_msg->msg_data,
3056 &(msg->rsp[11]),
3057 msg->rsp_size - 11);
3058 /* The other fields matched, so no need to set them, except
3059 for netfn, which needs to be the response that was
3060 returned, not the request value. */
3061 recv_msg->msg.netfn = msg->rsp[6] >> 2;
3062 recv_msg->msg.data = recv_msg->msg_data;
3063 recv_msg->msg.data_len = msg->rsp_size - 12;
3064 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
3065 spin_lock_irqsave(&intf->counter_lock, flags);
3066 intf->handled_lan_responses++;
3067 spin_unlock_irqrestore(&intf->counter_lock, flags);
3068 deliver_response(recv_msg);
3070 return 0;
3073 static int handle_lan_get_msg_cmd(ipmi_smi_t intf,
3074 struct ipmi_smi_msg *msg)
3076 struct cmd_rcvr *rcvr;
3077 int rv = 0;
3078 unsigned char netfn;
3079 unsigned char cmd;
3080 unsigned char chan;
3081 ipmi_user_t user = NULL;
3082 struct ipmi_lan_addr *lan_addr;
3083 struct ipmi_recv_msg *recv_msg;
3084 unsigned long flags;
3086 if (msg->rsp_size < 12) {
3087 /* Message not big enough, just ignore it. */
3088 spin_lock_irqsave(&intf->counter_lock, flags);
3089 intf->invalid_commands++;
3090 spin_unlock_irqrestore(&intf->counter_lock, flags);
3091 return 0;
3094 if (msg->rsp[2] != 0) {
3095 /* An error getting the response, just ignore it. */
3096 return 0;
3099 netfn = msg->rsp[6] >> 2;
3100 cmd = msg->rsp[10];
3101 chan = msg->rsp[3] & 0xf;
3103 rcu_read_lock();
3104 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan);
3105 if (rcvr) {
3106 user = rcvr->user;
3107 kref_get(&user->refcount);
3108 } else
3109 user = NULL;
3110 rcu_read_unlock();
3112 if (user == NULL) {
3113 /* We didn't find a user, just give up. */
3114 spin_lock_irqsave(&intf->counter_lock, flags);
3115 intf->unhandled_commands++;
3116 spin_unlock_irqrestore(&intf->counter_lock, flags);
3118 rv = 0; /* Don't do anything with these messages, just
3119 allow them to be freed. */
3120 } else {
3121 /* Deliver the message to the user. */
3122 spin_lock_irqsave(&intf->counter_lock, flags);
3123 intf->handled_commands++;
3124 spin_unlock_irqrestore(&intf->counter_lock, flags);
3126 recv_msg = ipmi_alloc_recv_msg();
3127 if (!recv_msg) {
3128 /* We couldn't allocate memory for the
3129 message, so requeue it for handling
3130 later. */
3131 rv = 1;
3132 kref_put(&user->refcount, free_user);
3133 } else {
3134 /* Extract the source address from the data. */
3135 lan_addr = (struct ipmi_lan_addr *) &recv_msg->addr;
3136 lan_addr->addr_type = IPMI_LAN_ADDR_TYPE;
3137 lan_addr->session_handle = msg->rsp[4];
3138 lan_addr->remote_SWID = msg->rsp[8];
3139 lan_addr->local_SWID = msg->rsp[5];
3140 lan_addr->lun = msg->rsp[9] & 3;
3141 lan_addr->channel = msg->rsp[3] & 0xf;
3142 lan_addr->privilege = msg->rsp[3] >> 4;
3144 /* Extract the rest of the message information
3145 from the IPMB header.*/
3146 recv_msg->user = user;
3147 recv_msg->recv_type = IPMI_CMD_RECV_TYPE;
3148 recv_msg->msgid = msg->rsp[9] >> 2;
3149 recv_msg->msg.netfn = msg->rsp[6] >> 2;
3150 recv_msg->msg.cmd = msg->rsp[10];
3151 recv_msg->msg.data = recv_msg->msg_data;
3153 /* We chop off 12, not 11 bytes because the checksum
3154 at the end also needs to be removed. */
3155 recv_msg->msg.data_len = msg->rsp_size - 12;
3156 memcpy(recv_msg->msg_data,
3157 &(msg->rsp[11]),
3158 msg->rsp_size - 12);
3159 deliver_response(recv_msg);
3163 return rv;
3166 static void copy_event_into_recv_msg(struct ipmi_recv_msg *recv_msg,
3167 struct ipmi_smi_msg *msg)
3169 struct ipmi_system_interface_addr *smi_addr;
3171 recv_msg->msgid = 0;
3172 smi_addr = (struct ipmi_system_interface_addr *) &(recv_msg->addr);
3173 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
3174 smi_addr->channel = IPMI_BMC_CHANNEL;
3175 smi_addr->lun = msg->rsp[0] & 3;
3176 recv_msg->recv_type = IPMI_ASYNC_EVENT_RECV_TYPE;
3177 recv_msg->msg.netfn = msg->rsp[0] >> 2;
3178 recv_msg->msg.cmd = msg->rsp[1];
3179 memcpy(recv_msg->msg_data, &(msg->rsp[3]), msg->rsp_size - 3);
3180 recv_msg->msg.data = recv_msg->msg_data;
3181 recv_msg->msg.data_len = msg->rsp_size - 3;
3184 static int handle_read_event_rsp(ipmi_smi_t intf,
3185 struct ipmi_smi_msg *msg)
3187 struct ipmi_recv_msg *recv_msg, *recv_msg2;
3188 struct list_head msgs;
3189 ipmi_user_t user;
3190 int rv = 0;
3191 int deliver_count = 0;
3192 unsigned long flags;
3194 if (msg->rsp_size < 19) {
3195 /* Message is too small to be an IPMB event. */
3196 spin_lock_irqsave(&intf->counter_lock, flags);
3197 intf->invalid_events++;
3198 spin_unlock_irqrestore(&intf->counter_lock, flags);
3199 return 0;
3202 if (msg->rsp[2] != 0) {
3203 /* An error getting the event, just ignore it. */
3204 return 0;
3207 INIT_LIST_HEAD(&msgs);
3209 spin_lock_irqsave(&intf->events_lock, flags);
3211 spin_lock(&intf->counter_lock);
3212 intf->events++;
3213 spin_unlock(&intf->counter_lock);
3215 /* Allocate and fill in one message for every user that is getting
3216 events. */
3217 rcu_read_lock();
3218 list_for_each_entry_rcu(user, &intf->users, link) {
3219 if (!user->gets_events)
3220 continue;
3222 recv_msg = ipmi_alloc_recv_msg();
3223 if (!recv_msg) {
3224 rcu_read_unlock();
3225 list_for_each_entry_safe(recv_msg, recv_msg2, &msgs,
3226 link) {
3227 list_del(&recv_msg->link);
3228 ipmi_free_recv_msg(recv_msg);
3230 /* We couldn't allocate memory for the
3231 message, so requeue it for handling
3232 later. */
3233 rv = 1;
3234 goto out;
3237 deliver_count++;
3239 copy_event_into_recv_msg(recv_msg, msg);
3240 recv_msg->user = user;
3241 kref_get(&user->refcount);
3242 list_add_tail(&(recv_msg->link), &msgs);
3244 rcu_read_unlock();
3246 if (deliver_count) {
3247 /* Now deliver all the messages. */
3248 list_for_each_entry_safe(recv_msg, recv_msg2, &msgs, link) {
3249 list_del(&recv_msg->link);
3250 deliver_response(recv_msg);
3252 } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) {
3253 /* No one to receive the message, put it in queue if there's
3254 not already too many things in the queue. */
3255 recv_msg = ipmi_alloc_recv_msg();
3256 if (!recv_msg) {
3257 /* We couldn't allocate memory for the
3258 message, so requeue it for handling
3259 later. */
3260 rv = 1;
3261 goto out;
3264 copy_event_into_recv_msg(recv_msg, msg);
3265 list_add_tail(&(recv_msg->link), &(intf->waiting_events));
3266 intf->waiting_events_count++;
3267 } else {
3268 /* There's too many things in the queue, discard this
3269 message. */
3270 printk(KERN_WARNING PFX "Event queue full, discarding an"
3271 " incoming event\n");
3274 out:
3275 spin_unlock_irqrestore(&(intf->events_lock), flags);
3277 return rv;
3280 static int handle_bmc_rsp(ipmi_smi_t intf,
3281 struct ipmi_smi_msg *msg)
3283 struct ipmi_recv_msg *recv_msg;
3284 unsigned long flags;
3285 struct ipmi_user *user;
3287 recv_msg = (struct ipmi_recv_msg *) msg->user_data;
3288 if (recv_msg == NULL)
3290 printk(KERN_WARNING"IPMI message received with no owner. This\n"
3291 "could be because of a malformed message, or\n"
3292 "because of a hardware error. Contact your\n"
3293 "hardware vender for assistance\n");
3294 return 0;
3297 user = recv_msg->user;
3298 /* Make sure the user still exists. */
3299 if (user && !user->valid) {
3300 /* The user for the message went away, so give up. */
3301 spin_lock_irqsave(&intf->counter_lock, flags);
3302 intf->unhandled_local_responses++;
3303 spin_unlock_irqrestore(&intf->counter_lock, flags);
3304 ipmi_free_recv_msg(recv_msg);
3305 } else {
3306 struct ipmi_system_interface_addr *smi_addr;
3308 spin_lock_irqsave(&intf->counter_lock, flags);
3309 intf->handled_local_responses++;
3310 spin_unlock_irqrestore(&intf->counter_lock, flags);
3311 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
3312 recv_msg->msgid = msg->msgid;
3313 smi_addr = ((struct ipmi_system_interface_addr *)
3314 &(recv_msg->addr));
3315 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
3316 smi_addr->channel = IPMI_BMC_CHANNEL;
3317 smi_addr->lun = msg->rsp[0] & 3;
3318 recv_msg->msg.netfn = msg->rsp[0] >> 2;
3319 recv_msg->msg.cmd = msg->rsp[1];
3320 memcpy(recv_msg->msg_data,
3321 &(msg->rsp[2]),
3322 msg->rsp_size - 2);
3323 recv_msg->msg.data = recv_msg->msg_data;
3324 recv_msg->msg.data_len = msg->rsp_size - 2;
3325 deliver_response(recv_msg);
3328 return 0;
3331 /* Handle a new message. Return 1 if the message should be requeued,
3332 0 if the message should be freed, or -1 if the message should not
3333 be freed or requeued. */
3334 static int handle_new_recv_msg(ipmi_smi_t intf,
3335 struct ipmi_smi_msg *msg)
3337 int requeue;
3338 int chan;
3340 #ifdef DEBUG_MSGING
3341 int m;
3342 printk("Recv:");
3343 for (m = 0; m < msg->rsp_size; m++)
3344 printk(" %2.2x", msg->rsp[m]);
3345 printk("\n");
3346 #endif
3347 if (msg->rsp_size < 2) {
3348 /* Message is too small to be correct. */
3349 printk(KERN_WARNING PFX "BMC returned to small a message"
3350 " for netfn %x cmd %x, got %d bytes\n",
3351 (msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size);
3353 /* Generate an error response for the message. */
3354 msg->rsp[0] = msg->data[0] | (1 << 2);
3355 msg->rsp[1] = msg->data[1];
3356 msg->rsp[2] = IPMI_ERR_UNSPECIFIED;
3357 msg->rsp_size = 3;
3358 } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1))/* Netfn */
3359 || (msg->rsp[1] != msg->data[1])) /* Command */
3361 /* The response is not even marginally correct. */
3362 printk(KERN_WARNING PFX "BMC returned incorrect response,"
3363 " expected netfn %x cmd %x, got netfn %x cmd %x\n",
3364 (msg->data[0] >> 2) | 1, msg->data[1],
3365 msg->rsp[0] >> 2, msg->rsp[1]);
3367 /* Generate an error response for the message. */
3368 msg->rsp[0] = msg->data[0] | (1 << 2);
3369 msg->rsp[1] = msg->data[1];
3370 msg->rsp[2] = IPMI_ERR_UNSPECIFIED;
3371 msg->rsp_size = 3;
3374 if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
3375 && (msg->rsp[1] == IPMI_SEND_MSG_CMD)
3376 && (msg->user_data != NULL))
3378 /* It's a response to a response we sent. For this we
3379 deliver a send message response to the user. */
3380 struct ipmi_recv_msg *recv_msg = msg->user_data;
3382 requeue = 0;
3383 if (msg->rsp_size < 2)
3384 /* Message is too small to be correct. */
3385 goto out;
3387 chan = msg->data[2] & 0x0f;
3388 if (chan >= IPMI_MAX_CHANNELS)
3389 /* Invalid channel number */
3390 goto out;
3392 if (!recv_msg)
3393 goto out;
3395 /* Make sure the user still exists. */
3396 if (!recv_msg->user || !recv_msg->user->valid)
3397 goto out;
3399 recv_msg->recv_type = IPMI_RESPONSE_RESPONSE_TYPE;
3400 recv_msg->msg.data = recv_msg->msg_data;
3401 recv_msg->msg.data_len = 1;
3402 recv_msg->msg_data[0] = msg->rsp[2];
3403 deliver_response(recv_msg);
3404 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
3405 && (msg->rsp[1] == IPMI_GET_MSG_CMD))
3407 /* It's from the receive queue. */
3408 chan = msg->rsp[3] & 0xf;
3409 if (chan >= IPMI_MAX_CHANNELS) {
3410 /* Invalid channel number */
3411 requeue = 0;
3412 goto out;
3415 switch (intf->channels[chan].medium) {
3416 case IPMI_CHANNEL_MEDIUM_IPMB:
3417 if (msg->rsp[4] & 0x04) {
3418 /* It's a response, so find the
3419 requesting message and send it up. */
3420 requeue = handle_ipmb_get_msg_rsp(intf, msg);
3421 } else {
3422 /* It's a command to the SMS from some other
3423 entity. Handle that. */
3424 requeue = handle_ipmb_get_msg_cmd(intf, msg);
3426 break;
3428 case IPMI_CHANNEL_MEDIUM_8023LAN:
3429 case IPMI_CHANNEL_MEDIUM_ASYNC:
3430 if (msg->rsp[6] & 0x04) {
3431 /* It's a response, so find the
3432 requesting message and send it up. */
3433 requeue = handle_lan_get_msg_rsp(intf, msg);
3434 } else {
3435 /* It's a command to the SMS from some other
3436 entity. Handle that. */
3437 requeue = handle_lan_get_msg_cmd(intf, msg);
3439 break;
3441 default:
3442 /* We don't handle the channel type, so just
3443 * free the message. */
3444 requeue = 0;
3447 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
3448 && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD))
3450 /* It's an asyncronous event. */
3451 requeue = handle_read_event_rsp(intf, msg);
3452 } else {
3453 /* It's a response from the local BMC. */
3454 requeue = handle_bmc_rsp(intf, msg);
3457 out:
3458 return requeue;
3461 /* Handle a new message from the lower layer. */
3462 void ipmi_smi_msg_received(ipmi_smi_t intf,
3463 struct ipmi_smi_msg *msg)
3465 unsigned long flags;
3466 int rv;
3469 if ((msg->data_size >= 2)
3470 && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2))
3471 && (msg->data[1] == IPMI_SEND_MSG_CMD)
3472 && (msg->user_data == NULL))
3474 /* This is the local response to a command send, start
3475 the timer for these. The user_data will not be
3476 NULL if this is a response send, and we will let
3477 response sends just go through. */
3479 /* Check for errors, if we get certain errors (ones
3480 that mean basically we can try again later), we
3481 ignore them and start the timer. Otherwise we
3482 report the error immediately. */
3483 if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0)
3484 && (msg->rsp[2] != IPMI_NODE_BUSY_ERR)
3485 && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR)
3486 && (msg->rsp[2] != IPMI_BUS_ERR)
3487 && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR))
3489 int chan = msg->rsp[3] & 0xf;
3491 /* Got an error sending the message, handle it. */
3492 spin_lock_irqsave(&intf->counter_lock, flags);
3493 if (chan >= IPMI_MAX_CHANNELS)
3494 ; /* This shouldn't happen */
3495 else if ((intf->channels[chan].medium
3496 == IPMI_CHANNEL_MEDIUM_8023LAN)
3497 || (intf->channels[chan].medium
3498 == IPMI_CHANNEL_MEDIUM_ASYNC))
3499 intf->sent_lan_command_errs++;
3500 else
3501 intf->sent_ipmb_command_errs++;
3502 spin_unlock_irqrestore(&intf->counter_lock, flags);
3503 intf_err_seq(intf, msg->msgid, msg->rsp[2]);
3504 } else {
3505 /* The message was sent, start the timer. */
3506 intf_start_seq_timer(intf, msg->msgid);
3509 ipmi_free_smi_msg(msg);
3510 goto out;
3513 /* To preserve message order, if the list is not empty, we
3514 tack this message onto the end of the list. */
3515 spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3516 if (!list_empty(&intf->waiting_msgs)) {
3517 list_add_tail(&msg->link, &intf->waiting_msgs);
3518 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3519 goto out;
3521 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3523 rv = handle_new_recv_msg(intf, msg);
3524 if (rv > 0) {
3525 /* Could not handle the message now, just add it to a
3526 list to handle later. */
3527 spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3528 list_add_tail(&msg->link, &intf->waiting_msgs);
3529 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3530 } else if (rv == 0) {
3531 ipmi_free_smi_msg(msg);
3534 out:
3535 return;
3538 void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf)
3540 ipmi_user_t user;
3542 rcu_read_lock();
3543 list_for_each_entry_rcu(user, &intf->users, link) {
3544 if (!user->handler->ipmi_watchdog_pretimeout)
3545 continue;
3547 user->handler->ipmi_watchdog_pretimeout(user->handler_data);
3549 rcu_read_unlock();
3553 static struct ipmi_smi_msg *
3554 smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg,
3555 unsigned char seq, long seqid)
3557 struct ipmi_smi_msg *smi_msg = ipmi_alloc_smi_msg();
3558 if (!smi_msg)
3559 /* If we can't allocate the message, then just return, we
3560 get 4 retries, so this should be ok. */
3561 return NULL;
3563 memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len);
3564 smi_msg->data_size = recv_msg->msg.data_len;
3565 smi_msg->msgid = STORE_SEQ_IN_MSGID(seq, seqid);
3567 #ifdef DEBUG_MSGING
3569 int m;
3570 printk("Resend: ");
3571 for (m = 0; m < smi_msg->data_size; m++)
3572 printk(" %2.2x", smi_msg->data[m]);
3573 printk("\n");
3575 #endif
3576 return smi_msg;
3579 static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent,
3580 struct list_head *timeouts, long timeout_period,
3581 int slot, unsigned long *flags)
3583 struct ipmi_recv_msg *msg;
3584 struct ipmi_smi_handlers *handlers;
3586 if (intf->intf_num == -1)
3587 return;
3589 if (!ent->inuse)
3590 return;
3592 ent->timeout -= timeout_period;
3593 if (ent->timeout > 0)
3594 return;
3596 if (ent->retries_left == 0) {
3597 /* The message has used all its retries. */
3598 ent->inuse = 0;
3599 msg = ent->recv_msg;
3600 list_add_tail(&msg->link, timeouts);
3601 spin_lock(&intf->counter_lock);
3602 if (ent->broadcast)
3603 intf->timed_out_ipmb_broadcasts++;
3604 else if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE)
3605 intf->timed_out_lan_commands++;
3606 else
3607 intf->timed_out_ipmb_commands++;
3608 spin_unlock(&intf->counter_lock);
3609 } else {
3610 struct ipmi_smi_msg *smi_msg;
3611 /* More retries, send again. */
3613 /* Start with the max timer, set to normal
3614 timer after the message is sent. */
3615 ent->timeout = MAX_MSG_TIMEOUT;
3616 ent->retries_left--;
3617 spin_lock(&intf->counter_lock);
3618 if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE)
3619 intf->retransmitted_lan_commands++;
3620 else
3621 intf->retransmitted_ipmb_commands++;
3622 spin_unlock(&intf->counter_lock);
3624 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot,
3625 ent->seqid);
3626 if (!smi_msg)
3627 return;
3629 spin_unlock_irqrestore(&intf->seq_lock, *flags);
3631 /* Send the new message. We send with a zero
3632 * priority. It timed out, I doubt time is
3633 * that critical now, and high priority
3634 * messages are really only for messages to the
3635 * local MC, which don't get resent. */
3636 handlers = intf->handlers;
3637 if (handlers)
3638 intf->handlers->sender(intf->send_info,
3639 smi_msg, 0);
3640 else
3641 ipmi_free_smi_msg(smi_msg);
3643 spin_lock_irqsave(&intf->seq_lock, *flags);
3647 static void ipmi_timeout_handler(long timeout_period)
3649 ipmi_smi_t intf;
3650 struct list_head timeouts;
3651 struct ipmi_recv_msg *msg, *msg2;
3652 struct ipmi_smi_msg *smi_msg, *smi_msg2;
3653 unsigned long flags;
3654 int i;
3656 rcu_read_lock();
3657 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
3658 /* See if any waiting messages need to be processed. */
3659 spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3660 list_for_each_entry_safe(smi_msg, smi_msg2,
3661 &intf->waiting_msgs, link) {
3662 if (!handle_new_recv_msg(intf, smi_msg)) {
3663 list_del(&smi_msg->link);
3664 ipmi_free_smi_msg(smi_msg);
3665 } else {
3666 /* To preserve message order, quit if we
3667 can't handle a message. */
3668 break;
3671 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3673 /* Go through the seq table and find any messages that
3674 have timed out, putting them in the timeouts
3675 list. */
3676 INIT_LIST_HEAD(&timeouts);
3677 spin_lock_irqsave(&intf->seq_lock, flags);
3678 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++)
3679 check_msg_timeout(intf, &(intf->seq_table[i]),
3680 &timeouts, timeout_period, i,
3681 &flags);
3682 spin_unlock_irqrestore(&intf->seq_lock, flags);
3684 list_for_each_entry_safe(msg, msg2, &timeouts, link)
3685 deliver_err_response(msg, IPMI_TIMEOUT_COMPLETION_CODE);
3688 * Maintenance mode handling. Check the timeout
3689 * optimistically before we claim the lock. It may
3690 * mean a timeout gets missed occasionally, but that
3691 * only means the timeout gets extended by one period
3692 * in that case. No big deal, and it avoids the lock
3693 * most of the time.
3695 if (intf->auto_maintenance_timeout > 0) {
3696 spin_lock_irqsave(&intf->maintenance_mode_lock, flags);
3697 if (intf->auto_maintenance_timeout > 0) {
3698 intf->auto_maintenance_timeout
3699 -= timeout_period;
3700 if (!intf->maintenance_mode
3701 && (intf->auto_maintenance_timeout <= 0))
3703 intf->maintenance_mode_enable = 0;
3704 maintenance_mode_update(intf);
3707 spin_unlock_irqrestore(&intf->maintenance_mode_lock,
3708 flags);
3711 rcu_read_unlock();
3714 static void ipmi_request_event(void)
3716 ipmi_smi_t intf;
3717 struct ipmi_smi_handlers *handlers;
3719 rcu_read_lock();
3720 /* Called from the timer, no need to check if handlers is
3721 * valid. */
3722 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
3723 /* No event requests when in maintenance mode. */
3724 if (intf->maintenance_mode_enable)
3725 continue;
3727 handlers = intf->handlers;
3728 if (handlers)
3729 handlers->request_events(intf->send_info);
3731 rcu_read_unlock();
3734 static struct timer_list ipmi_timer;
3736 /* Call every ~100 ms. */
3737 #define IPMI_TIMEOUT_TIME 100
3739 /* How many jiffies does it take to get to the timeout time. */
3740 #define IPMI_TIMEOUT_JIFFIES ((IPMI_TIMEOUT_TIME * HZ) / 1000)
3742 /* Request events from the queue every second (this is the number of
3743 IPMI_TIMEOUT_TIMES between event requests). Hopefully, in the
3744 future, IPMI will add a way to know immediately if an event is in
3745 the queue and this silliness can go away. */
3746 #define IPMI_REQUEST_EV_TIME (1000 / (IPMI_TIMEOUT_TIME))
3748 static atomic_t stop_operation;
3749 static unsigned int ticks_to_req_ev = IPMI_REQUEST_EV_TIME;
3751 static void ipmi_timeout(unsigned long data)
3753 if (atomic_read(&stop_operation))
3754 return;
3756 ticks_to_req_ev--;
3757 if (ticks_to_req_ev == 0) {
3758 ipmi_request_event();
3759 ticks_to_req_ev = IPMI_REQUEST_EV_TIME;
3762 ipmi_timeout_handler(IPMI_TIMEOUT_TIME);
3764 mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
3768 static atomic_t smi_msg_inuse_count = ATOMIC_INIT(0);
3769 static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0);
3771 /* FIXME - convert these to slabs. */
3772 static void free_smi_msg(struct ipmi_smi_msg *msg)
3774 atomic_dec(&smi_msg_inuse_count);
3775 kfree(msg);
3778 struct ipmi_smi_msg *ipmi_alloc_smi_msg(void)
3780 struct ipmi_smi_msg *rv;
3781 rv = kmalloc(sizeof(struct ipmi_smi_msg), GFP_ATOMIC);
3782 if (rv) {
3783 rv->done = free_smi_msg;
3784 rv->user_data = NULL;
3785 atomic_inc(&smi_msg_inuse_count);
3787 return rv;
3790 static void free_recv_msg(struct ipmi_recv_msg *msg)
3792 atomic_dec(&recv_msg_inuse_count);
3793 kfree(msg);
3796 struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)
3798 struct ipmi_recv_msg *rv;
3800 rv = kmalloc(sizeof(struct ipmi_recv_msg), GFP_ATOMIC);
3801 if (rv) {
3802 rv->user = NULL;
3803 rv->done = free_recv_msg;
3804 atomic_inc(&recv_msg_inuse_count);
3806 return rv;
3809 void ipmi_free_recv_msg(struct ipmi_recv_msg *msg)
3811 if (msg->user)
3812 kref_put(&msg->user->refcount, free_user);
3813 msg->done(msg);
3816 #ifdef CONFIG_IPMI_PANIC_EVENT
3818 static void dummy_smi_done_handler(struct ipmi_smi_msg *msg)
3822 static void dummy_recv_done_handler(struct ipmi_recv_msg *msg)
3826 #ifdef CONFIG_IPMI_PANIC_STRING
3827 static void event_receiver_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
3829 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
3830 && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE)
3831 && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD)
3832 && (msg->msg.data[0] == IPMI_CC_NO_ERROR))
3834 /* A get event receiver command, save it. */
3835 intf->event_receiver = msg->msg.data[1];
3836 intf->event_receiver_lun = msg->msg.data[2] & 0x3;
3840 static void device_id_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
3842 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
3843 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE)
3844 && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD)
3845 && (msg->msg.data[0] == IPMI_CC_NO_ERROR))
3847 /* A get device id command, save if we are an event
3848 receiver or generator. */
3849 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1;
3850 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1;
3853 #endif
3855 static void send_panic_events(char *str)
3857 struct kernel_ipmi_msg msg;
3858 ipmi_smi_t intf;
3859 unsigned char data[16];
3860 struct ipmi_system_interface_addr *si;
3861 struct ipmi_addr addr;
3862 struct ipmi_smi_msg smi_msg;
3863 struct ipmi_recv_msg recv_msg;
3865 si = (struct ipmi_system_interface_addr *) &addr;
3866 si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
3867 si->channel = IPMI_BMC_CHANNEL;
3868 si->lun = 0;
3870 /* Fill in an event telling that we have failed. */
3871 msg.netfn = 0x04; /* Sensor or Event. */
3872 msg.cmd = 2; /* Platform event command. */
3873 msg.data = data;
3874 msg.data_len = 8;
3875 data[0] = 0x41; /* Kernel generator ID, IPMI table 5-4 */
3876 data[1] = 0x03; /* This is for IPMI 1.0. */
3877 data[2] = 0x20; /* OS Critical Stop, IPMI table 36-3 */
3878 data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */
3879 data[5] = 0xa1; /* Runtime stop OEM bytes 2 & 3. */
3881 /* Put a few breadcrumbs in. Hopefully later we can add more things
3882 to make the panic events more useful. */
3883 if (str) {
3884 data[3] = str[0];
3885 data[6] = str[1];
3886 data[7] = str[2];
3889 smi_msg.done = dummy_smi_done_handler;
3890 recv_msg.done = dummy_recv_done_handler;
3892 /* For every registered interface, send the event. */
3893 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
3894 if (!intf->handlers)
3895 /* Interface is not ready. */
3896 continue;
3898 /* Send the event announcing the panic. */
3899 intf->handlers->set_run_to_completion(intf->send_info, 1);
3900 i_ipmi_request(NULL,
3901 intf,
3902 &addr,
3904 &msg,
3905 intf,
3906 &smi_msg,
3907 &recv_msg,
3909 intf->channels[0].address,
3910 intf->channels[0].lun,
3911 0, 1); /* Don't retry, and don't wait. */
3914 #ifdef CONFIG_IPMI_PANIC_STRING
3915 /* On every interface, dump a bunch of OEM event holding the
3916 string. */
3917 if (!str)
3918 return;
3920 /* For every registered interface, send the event. */
3921 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
3922 char *p = str;
3923 struct ipmi_ipmb_addr *ipmb;
3924 int j;
3926 if (intf->intf_num == -1)
3927 /* Interface was not ready yet. */
3928 continue;
3931 * intf_num is used as an marker to tell if the
3932 * interface is valid. Thus we need a read barrier to
3933 * make sure data fetched before checking intf_num
3934 * won't be used.
3936 smp_rmb();
3938 /* First job here is to figure out where to send the
3939 OEM events. There's no way in IPMI to send OEM
3940 events using an event send command, so we have to
3941 find the SEL to put them in and stick them in
3942 there. */
3944 /* Get capabilities from the get device id. */
3945 intf->local_sel_device = 0;
3946 intf->local_event_generator = 0;
3947 intf->event_receiver = 0;
3949 /* Request the device info from the local MC. */
3950 msg.netfn = IPMI_NETFN_APP_REQUEST;
3951 msg.cmd = IPMI_GET_DEVICE_ID_CMD;
3952 msg.data = NULL;
3953 msg.data_len = 0;
3954 intf->null_user_handler = device_id_fetcher;
3955 i_ipmi_request(NULL,
3956 intf,
3957 &addr,
3959 &msg,
3960 intf,
3961 &smi_msg,
3962 &recv_msg,
3964 intf->channels[0].address,
3965 intf->channels[0].lun,
3966 0, 1); /* Don't retry, and don't wait. */
3968 if (intf->local_event_generator) {
3969 /* Request the event receiver from the local MC. */
3970 msg.netfn = IPMI_NETFN_SENSOR_EVENT_REQUEST;
3971 msg.cmd = IPMI_GET_EVENT_RECEIVER_CMD;
3972 msg.data = NULL;
3973 msg.data_len = 0;
3974 intf->null_user_handler = event_receiver_fetcher;
3975 i_ipmi_request(NULL,
3976 intf,
3977 &addr,
3979 &msg,
3980 intf,
3981 &smi_msg,
3982 &recv_msg,
3984 intf->channels[0].address,
3985 intf->channels[0].lun,
3986 0, 1); /* no retry, and no wait. */
3988 intf->null_user_handler = NULL;
3990 /* Validate the event receiver. The low bit must not
3991 be 1 (it must be a valid IPMB address), it cannot
3992 be zero, and it must not be my address. */
3993 if (((intf->event_receiver & 1) == 0)
3994 && (intf->event_receiver != 0)
3995 && (intf->event_receiver != intf->channels[0].address))
3997 /* The event receiver is valid, send an IPMB
3998 message. */
3999 ipmb = (struct ipmi_ipmb_addr *) &addr;
4000 ipmb->addr_type = IPMI_IPMB_ADDR_TYPE;
4001 ipmb->channel = 0; /* FIXME - is this right? */
4002 ipmb->lun = intf->event_receiver_lun;
4003 ipmb->slave_addr = intf->event_receiver;
4004 } else if (intf->local_sel_device) {
4005 /* The event receiver was not valid (or was
4006 me), but I am an SEL device, just dump it
4007 in my SEL. */
4008 si = (struct ipmi_system_interface_addr *) &addr;
4009 si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
4010 si->channel = IPMI_BMC_CHANNEL;
4011 si->lun = 0;
4012 } else
4013 continue; /* No where to send the event. */
4016 msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */
4017 msg.cmd = IPMI_ADD_SEL_ENTRY_CMD;
4018 msg.data = data;
4019 msg.data_len = 16;
4021 j = 0;
4022 while (*p) {
4023 int size = strlen(p);
4025 if (size > 11)
4026 size = 11;
4027 data[0] = 0;
4028 data[1] = 0;
4029 data[2] = 0xf0; /* OEM event without timestamp. */
4030 data[3] = intf->channels[0].address;
4031 data[4] = j++; /* sequence # */
4032 /* Always give 11 bytes, so strncpy will fill
4033 it with zeroes for me. */
4034 strncpy(data+5, p, 11);
4035 p += size;
4037 i_ipmi_request(NULL,
4038 intf,
4039 &addr,
4041 &msg,
4042 intf,
4043 &smi_msg,
4044 &recv_msg,
4046 intf->channels[0].address,
4047 intf->channels[0].lun,
4048 0, 1); /* no retry, and no wait. */
4051 #endif /* CONFIG_IPMI_PANIC_STRING */
4053 #endif /* CONFIG_IPMI_PANIC_EVENT */
4055 static int has_panicked;
4057 static int panic_event(struct notifier_block *this,
4058 unsigned long event,
4059 void *ptr)
4061 ipmi_smi_t intf;
4063 if (has_panicked)
4064 return NOTIFY_DONE;
4065 has_panicked = 1;
4067 /* For every registered interface, set it to run to completion. */
4068 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
4069 if (!intf->handlers)
4070 /* Interface is not ready. */
4071 continue;
4073 intf->handlers->set_run_to_completion(intf->send_info, 1);
4076 #ifdef CONFIG_IPMI_PANIC_EVENT
4077 send_panic_events(ptr);
4078 #endif
4080 return NOTIFY_DONE;
4083 static struct notifier_block panic_block = {
4084 .notifier_call = panic_event,
4085 .next = NULL,
4086 .priority = 200 /* priority: INT_MAX >= x >= 0 */
4089 static int ipmi_init_msghandler(void)
4091 int rv;
4093 if (initialized)
4094 return 0;
4096 rv = driver_register(&ipmidriver);
4097 if (rv) {
4098 printk(KERN_ERR PFX "Could not register IPMI driver\n");
4099 return rv;
4102 printk(KERN_INFO "ipmi message handler version "
4103 IPMI_DRIVER_VERSION "\n");
4105 #ifdef CONFIG_PROC_FS
4106 proc_ipmi_root = proc_mkdir("ipmi", NULL);
4107 if (!proc_ipmi_root) {
4108 printk(KERN_ERR PFX "Unable to create IPMI proc dir");
4109 return -ENOMEM;
4112 proc_ipmi_root->owner = THIS_MODULE;
4113 #endif /* CONFIG_PROC_FS */
4115 setup_timer(&ipmi_timer, ipmi_timeout, 0);
4116 mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
4118 atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
4120 initialized = 1;
4122 return 0;
4125 static __init int ipmi_init_msghandler_mod(void)
4127 ipmi_init_msghandler();
4128 return 0;
4131 static __exit void cleanup_ipmi(void)
4133 int count;
4135 if (!initialized)
4136 return;
4138 atomic_notifier_chain_unregister(&panic_notifier_list, &panic_block);
4140 /* This can't be called if any interfaces exist, so no worry about
4141 shutting down the interfaces. */
4143 /* Tell the timer to stop, then wait for it to stop. This avoids
4144 problems with race conditions removing the timer here. */
4145 atomic_inc(&stop_operation);
4146 del_timer_sync(&ipmi_timer);
4148 #ifdef CONFIG_PROC_FS
4149 remove_proc_entry(proc_ipmi_root->name, &proc_root);
4150 #endif /* CONFIG_PROC_FS */
4152 driver_unregister(&ipmidriver);
4154 initialized = 0;
4156 /* Check for buffer leaks. */
4157 count = atomic_read(&smi_msg_inuse_count);
4158 if (count != 0)
4159 printk(KERN_WARNING PFX "SMI message count %d at exit\n",
4160 count);
4161 count = atomic_read(&recv_msg_inuse_count);
4162 if (count != 0)
4163 printk(KERN_WARNING PFX "recv message count %d at exit\n",
4164 count);
4166 module_exit(cleanup_ipmi);
4168 module_init(ipmi_init_msghandler_mod);
4169 MODULE_LICENSE("GPL");
4170 MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
4171 MODULE_DESCRIPTION("Incoming and outgoing message routing for an IPMI interface.");
4172 MODULE_VERSION(IPMI_DRIVER_VERSION);
4174 EXPORT_SYMBOL(ipmi_create_user);
4175 EXPORT_SYMBOL(ipmi_destroy_user);
4176 EXPORT_SYMBOL(ipmi_get_version);
4177 EXPORT_SYMBOL(ipmi_request_settime);
4178 EXPORT_SYMBOL(ipmi_request_supply_msgs);
4179 EXPORT_SYMBOL(ipmi_register_smi);
4180 EXPORT_SYMBOL(ipmi_unregister_smi);
4181 EXPORT_SYMBOL(ipmi_register_for_cmd);
4182 EXPORT_SYMBOL(ipmi_unregister_for_cmd);
4183 EXPORT_SYMBOL(ipmi_smi_msg_received);
4184 EXPORT_SYMBOL(ipmi_smi_watchdog_pretimeout);
4185 EXPORT_SYMBOL(ipmi_alloc_smi_msg);
4186 EXPORT_SYMBOL(ipmi_addr_length);
4187 EXPORT_SYMBOL(ipmi_validate_addr);
4188 EXPORT_SYMBOL(ipmi_set_gets_events);
4189 EXPORT_SYMBOL(ipmi_smi_watcher_register);
4190 EXPORT_SYMBOL(ipmi_smi_watcher_unregister);
4191 EXPORT_SYMBOL(ipmi_set_my_address);
4192 EXPORT_SYMBOL(ipmi_get_my_address);
4193 EXPORT_SYMBOL(ipmi_set_my_LUN);
4194 EXPORT_SYMBOL(ipmi_get_my_LUN);
4195 EXPORT_SYMBOL(ipmi_smi_add_proc_entry);
4196 EXPORT_SYMBOL(ipmi_user_set_run_to_completion);
4197 EXPORT_SYMBOL(ipmi_free_recv_msg);