Merge ../linus
[pandora-kernel.git] / drivers / char / ipmi / ipmi_msghandler.c
1 /*
2  * ipmi_msghandler.c
3  *
4  * Incoming and outgoing message routing for an IPMI interface.
5  *
6  * Author: MontaVista Software, Inc.
7  *         Corey Minyard <minyard@mvista.com>
8  *         source@mvista.com
9  *
10  * Copyright 2002 MontaVista Software Inc.
11  *
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.
16  *
17  *
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.
28  *
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.
32  */
33
34 #include <linux/config.h>
35 #include <linux/module.h>
36 #include <linux/errno.h>
37 #include <asm/system.h>
38 #include <linux/sched.h>
39 #include <linux/poll.h>
40 #include <linux/spinlock.h>
41 #include <linux/mutex.h>
42 #include <linux/slab.h>
43 #include <linux/ipmi.h>
44 #include <linux/ipmi_smi.h>
45 #include <linux/notifier.h>
46 #include <linux/init.h>
47 #include <linux/proc_fs.h>
48 #include <linux/rcupdate.h>
49
50 #define PFX "IPMI message handler: "
51
52 #define IPMI_DRIVER_VERSION "39.0"
53
54 static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void);
55 static int ipmi_init_msghandler(void);
56
57 static int initialized = 0;
58
59 #ifdef CONFIG_PROC_FS
60 static struct proc_dir_entry *proc_ipmi_root = NULL;
61 #endif /* CONFIG_PROC_FS */
62
63 #define MAX_EVENTS_IN_QUEUE     25
64
65 /* Don't let a message sit in a queue forever, always time it with at lest
66    the max message timer.  This is in milliseconds. */
67 #define MAX_MSG_TIMEOUT         60000
68
69
70 /*
71  * The main "user" data structure.
72  */
73 struct ipmi_user
74 {
75         struct list_head link;
76
77         /* Set to "0" when the user is destroyed. */
78         int valid;
79
80         struct kref refcount;
81
82         /* The upper layer that handles receive messages. */
83         struct ipmi_user_hndl *handler;
84         void             *handler_data;
85
86         /* The interface this user is bound to. */
87         ipmi_smi_t intf;
88
89         /* Does this interface receive IPMI events? */
90         int gets_events;
91 };
92
93 struct cmd_rcvr
94 {
95         struct list_head link;
96
97         ipmi_user_t   user;
98         unsigned char netfn;
99         unsigned char cmd;
100
101         /*
102          * This is used to form a linked lised during mass deletion.
103          * Since this is in an RCU list, we cannot use the link above
104          * or change any data until the RCU period completes.  So we
105          * use this next variable during mass deletion so we can have
106          * a list and don't have to wait and restart the search on
107          * every individual deletion of a command. */
108         struct cmd_rcvr *next;
109 };
110
111 struct seq_table
112 {
113         unsigned int         inuse : 1;
114         unsigned int         broadcast : 1;
115
116         unsigned long        timeout;
117         unsigned long        orig_timeout;
118         unsigned int         retries_left;
119
120         /* To verify on an incoming send message response that this is
121            the message that the response is for, we keep a sequence id
122            and increment it every time we send a message. */
123         long                 seqid;
124
125         /* This is held so we can properly respond to the message on a
126            timeout, and it is used to hold the temporary data for
127            retransmission, too. */
128         struct ipmi_recv_msg *recv_msg;
129 };
130
131 /* Store the information in a msgid (long) to allow us to find a
132    sequence table entry from the msgid. */
133 #define STORE_SEQ_IN_MSGID(seq, seqid) (((seq&0xff)<<26) | (seqid&0x3ffffff))
134
135 #define GET_SEQ_FROM_MSGID(msgid, seq, seqid) \
136         do {                                                            \
137                 seq = ((msgid >> 26) & 0x3f);                           \
138                 seqid = (msgid & 0x3fffff);                             \
139         } while (0)
140
141 #define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3fffff)
142
143 struct ipmi_channel
144 {
145         unsigned char medium;
146         unsigned char protocol;
147
148         /* My slave address.  This is initialized to IPMI_BMC_SLAVE_ADDR,
149            but may be changed by the user. */
150         unsigned char address;
151
152         /* My LUN.  This should generally stay the SMS LUN, but just in
153            case... */
154         unsigned char lun;
155 };
156
157 #ifdef CONFIG_PROC_FS
158 struct ipmi_proc_entry
159 {
160         char                   *name;
161         struct ipmi_proc_entry *next;
162 };
163 #endif
164
165 struct bmc_device
166 {
167         struct platform_device *dev;
168         struct ipmi_device_id  id;
169         unsigned char          guid[16];
170         int                    guid_set;
171
172         struct kref            refcount;
173
174         /* bmc device attributes */
175         struct device_attribute device_id_attr;
176         struct device_attribute provides_dev_sdrs_attr;
177         struct device_attribute revision_attr;
178         struct device_attribute firmware_rev_attr;
179         struct device_attribute version_attr;
180         struct device_attribute add_dev_support_attr;
181         struct device_attribute manufacturer_id_attr;
182         struct device_attribute product_id_attr;
183         struct device_attribute guid_attr;
184         struct device_attribute aux_firmware_rev_attr;
185 };
186
187 #define IPMI_IPMB_NUM_SEQ       64
188 #define IPMI_MAX_CHANNELS       16
189 struct ipmi_smi
190 {
191         /* What interface number are we? */
192         int intf_num;
193
194         struct kref refcount;
195
196         /* The list of upper layers that are using me.  seq_lock
197          * protects this. */
198         struct list_head users;
199
200         /* Used for wake ups at startup. */
201         wait_queue_head_t waitq;
202
203         struct bmc_device *bmc;
204         char *my_dev_name;
205
206         /* This is the lower-layer's sender routine. */
207         struct ipmi_smi_handlers *handlers;
208         void                     *send_info;
209
210 #ifdef CONFIG_PROC_FS
211         /* A list of proc entries for this interface.  This does not
212            need a lock, only one thread creates it and only one thread
213            destroys it. */
214         spinlock_t             proc_entry_lock;
215         struct ipmi_proc_entry *proc_entries;
216 #endif
217
218         /* Driver-model device for the system interface. */
219         struct device          *si_dev;
220
221         /* A table of sequence numbers for this interface.  We use the
222            sequence numbers for IPMB messages that go out of the
223            interface to match them up with their responses.  A routine
224            is called periodically to time the items in this list. */
225         spinlock_t       seq_lock;
226         struct seq_table seq_table[IPMI_IPMB_NUM_SEQ];
227         int curr_seq;
228
229         /* Messages that were delayed for some reason (out of memory,
230            for instance), will go in here to be processed later in a
231            periodic timer interrupt. */
232         spinlock_t       waiting_msgs_lock;
233         struct list_head waiting_msgs;
234
235         /* The list of command receivers that are registered for commands
236            on this interface. */
237         struct mutex     cmd_rcvrs_mutex;
238         struct list_head cmd_rcvrs;
239
240         /* Events that were queues because no one was there to receive
241            them. */
242         spinlock_t       events_lock; /* For dealing with event stuff. */
243         struct list_head waiting_events;
244         unsigned int     waiting_events_count; /* How many events in queue? */
245
246         /* The event receiver for my BMC, only really used at panic
247            shutdown as a place to store this. */
248         unsigned char event_receiver;
249         unsigned char event_receiver_lun;
250         unsigned char local_sel_device;
251         unsigned char local_event_generator;
252
253         /* A cheap hack, if this is non-null and a message to an
254            interface comes in with a NULL user, call this routine with
255            it.  Note that the message will still be freed by the
256            caller.  This only works on the system interface. */
257         void (*null_user_handler)(ipmi_smi_t intf, struct ipmi_recv_msg *msg);
258
259         /* When we are scanning the channels for an SMI, this will
260            tell which channel we are scanning. */
261         int curr_channel;
262
263         /* Channel information */
264         struct ipmi_channel channels[IPMI_MAX_CHANNELS];
265
266         /* Proc FS stuff. */
267         struct proc_dir_entry *proc_dir;
268         char                  proc_dir_name[10];
269
270         spinlock_t   counter_lock; /* For making counters atomic. */
271
272         /* Commands we got that were invalid. */
273         unsigned int sent_invalid_commands;
274
275         /* Commands we sent to the MC. */
276         unsigned int sent_local_commands;
277         /* Responses from the MC that were delivered to a user. */
278         unsigned int handled_local_responses;
279         /* Responses from the MC that were not delivered to a user. */
280         unsigned int unhandled_local_responses;
281
282         /* Commands we sent out to the IPMB bus. */
283         unsigned int sent_ipmb_commands;
284         /* Commands sent on the IPMB that had errors on the SEND CMD */
285         unsigned int sent_ipmb_command_errs;
286         /* Each retransmit increments this count. */
287         unsigned int retransmitted_ipmb_commands;
288         /* When a message times out (runs out of retransmits) this is
289            incremented. */
290         unsigned int timed_out_ipmb_commands;
291
292         /* This is like above, but for broadcasts.  Broadcasts are
293            *not* included in the above count (they are expected to
294            time out). */
295         unsigned int timed_out_ipmb_broadcasts;
296
297         /* Responses I have sent to the IPMB bus. */
298         unsigned int sent_ipmb_responses;
299
300         /* The response was delivered to the user. */
301         unsigned int handled_ipmb_responses;
302         /* The response had invalid data in it. */
303         unsigned int invalid_ipmb_responses;
304         /* The response didn't have anyone waiting for it. */
305         unsigned int unhandled_ipmb_responses;
306
307         /* Commands we sent out to the IPMB bus. */
308         unsigned int sent_lan_commands;
309         /* Commands sent on the IPMB that had errors on the SEND CMD */
310         unsigned int sent_lan_command_errs;
311         /* Each retransmit increments this count. */
312         unsigned int retransmitted_lan_commands;
313         /* When a message times out (runs out of retransmits) this is
314            incremented. */
315         unsigned int timed_out_lan_commands;
316
317         /* Responses I have sent to the IPMB bus. */
318         unsigned int sent_lan_responses;
319
320         /* The response was delivered to the user. */
321         unsigned int handled_lan_responses;
322         /* The response had invalid data in it. */
323         unsigned int invalid_lan_responses;
324         /* The response didn't have anyone waiting for it. */
325         unsigned int unhandled_lan_responses;
326
327         /* The command was delivered to the user. */
328         unsigned int handled_commands;
329         /* The command had invalid data in it. */
330         unsigned int invalid_commands;
331         /* The command didn't have anyone waiting for it. */
332         unsigned int unhandled_commands;
333
334         /* Invalid data in an event. */
335         unsigned int invalid_events;
336         /* Events that were received with the proper format. */
337         unsigned int events;
338 };
339 #define to_si_intf_from_dev(device) container_of(device, struct ipmi_smi, dev)
340
341 /* Used to mark an interface entry that cannot be used but is not a
342  * free entry, either, primarily used at creation and deletion time so
343  * a slot doesn't get reused too quickly. */
344 #define IPMI_INVALID_INTERFACE_ENTRY ((ipmi_smi_t) ((long) 1))
345 #define IPMI_INVALID_INTERFACE(i) (((i) == NULL) \
346                                    || (i == IPMI_INVALID_INTERFACE_ENTRY))
347
348 /**
349  * The driver model view of the IPMI messaging driver.
350  */
351 static struct device_driver ipmidriver = {
352         .name = "ipmi",
353         .bus = &platform_bus_type
354 };
355 static DEFINE_MUTEX(ipmidriver_mutex);
356
357 #define MAX_IPMI_INTERFACES 4
358 static ipmi_smi_t ipmi_interfaces[MAX_IPMI_INTERFACES];
359
360 /* Directly protects the ipmi_interfaces data structure. */
361 static DEFINE_SPINLOCK(interfaces_lock);
362
363 /* List of watchers that want to know when smi's are added and
364    deleted. */
365 static struct list_head smi_watchers = LIST_HEAD_INIT(smi_watchers);
366 static DECLARE_RWSEM(smi_watchers_sem);
367
368
369 static void free_recv_msg_list(struct list_head *q)
370 {
371         struct ipmi_recv_msg *msg, *msg2;
372
373         list_for_each_entry_safe(msg, msg2, q, link) {
374                 list_del(&msg->link);
375                 ipmi_free_recv_msg(msg);
376         }
377 }
378
379 static void clean_up_interface_data(ipmi_smi_t intf)
380 {
381         int              i;
382         struct cmd_rcvr  *rcvr, *rcvr2;
383         struct list_head list;
384
385         free_recv_msg_list(&intf->waiting_msgs);
386         free_recv_msg_list(&intf->waiting_events);
387
388         /* Wholesale remove all the entries from the list in the
389          * interface and wait for RCU to know that none are in use. */
390         mutex_lock(&intf->cmd_rcvrs_mutex);
391         list_add_rcu(&list, &intf->cmd_rcvrs);
392         list_del_rcu(&intf->cmd_rcvrs);
393         mutex_unlock(&intf->cmd_rcvrs_mutex);
394         synchronize_rcu();
395
396         list_for_each_entry_safe(rcvr, rcvr2, &list, link)
397                 kfree(rcvr);
398
399         for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {
400                 if ((intf->seq_table[i].inuse)
401                     && (intf->seq_table[i].recv_msg))
402                 {
403                         ipmi_free_recv_msg(intf->seq_table[i].recv_msg);
404                 }
405         }
406 }
407
408 static void intf_free(struct kref *ref)
409 {
410         ipmi_smi_t intf = container_of(ref, struct ipmi_smi, refcount);
411
412         clean_up_interface_data(intf);
413         kfree(intf);
414 }
415
416 int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher)
417 {
418         int           i;
419         unsigned long flags;
420
421         down_write(&smi_watchers_sem);
422         list_add(&(watcher->link), &smi_watchers);
423         up_write(&smi_watchers_sem);
424         spin_lock_irqsave(&interfaces_lock, flags);
425         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
426                 ipmi_smi_t intf = ipmi_interfaces[i];
427                 if (IPMI_INVALID_INTERFACE(intf))
428                         continue;
429                 spin_unlock_irqrestore(&interfaces_lock, flags);
430                 watcher->new_smi(i, intf->si_dev);
431                 spin_lock_irqsave(&interfaces_lock, flags);
432         }
433         spin_unlock_irqrestore(&interfaces_lock, flags);
434         return 0;
435 }
436
437 int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher)
438 {
439         down_write(&smi_watchers_sem);
440         list_del(&(watcher->link));
441         up_write(&smi_watchers_sem);
442         return 0;
443 }
444
445 static void
446 call_smi_watchers(int i, struct device *dev)
447 {
448         struct ipmi_smi_watcher *w;
449
450         down_read(&smi_watchers_sem);
451         list_for_each_entry(w, &smi_watchers, link) {
452                 if (try_module_get(w->owner)) {
453                         w->new_smi(i, dev);
454                         module_put(w->owner);
455                 }
456         }
457         up_read(&smi_watchers_sem);
458 }
459
460 static int
461 ipmi_addr_equal(struct ipmi_addr *addr1, struct ipmi_addr *addr2)
462 {
463         if (addr1->addr_type != addr2->addr_type)
464                 return 0;
465
466         if (addr1->channel != addr2->channel)
467                 return 0;
468
469         if (addr1->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {
470                 struct ipmi_system_interface_addr *smi_addr1
471                     = (struct ipmi_system_interface_addr *) addr1;
472                 struct ipmi_system_interface_addr *smi_addr2
473                     = (struct ipmi_system_interface_addr *) addr2;
474                 return (smi_addr1->lun == smi_addr2->lun);
475         }
476
477         if ((addr1->addr_type == IPMI_IPMB_ADDR_TYPE)
478             || (addr1->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
479         {
480                 struct ipmi_ipmb_addr *ipmb_addr1
481                     = (struct ipmi_ipmb_addr *) addr1;
482                 struct ipmi_ipmb_addr *ipmb_addr2
483                     = (struct ipmi_ipmb_addr *) addr2;
484
485                 return ((ipmb_addr1->slave_addr == ipmb_addr2->slave_addr)
486                         && (ipmb_addr1->lun == ipmb_addr2->lun));
487         }
488
489         if (addr1->addr_type == IPMI_LAN_ADDR_TYPE) {
490                 struct ipmi_lan_addr *lan_addr1
491                         = (struct ipmi_lan_addr *) addr1;
492                 struct ipmi_lan_addr *lan_addr2
493                     = (struct ipmi_lan_addr *) addr2;
494
495                 return ((lan_addr1->remote_SWID == lan_addr2->remote_SWID)
496                         && (lan_addr1->local_SWID == lan_addr2->local_SWID)
497                         && (lan_addr1->session_handle
498                             == lan_addr2->session_handle)
499                         && (lan_addr1->lun == lan_addr2->lun));
500         }
501
502         return 1;
503 }
504
505 int ipmi_validate_addr(struct ipmi_addr *addr, int len)
506 {
507         if (len < sizeof(struct ipmi_system_interface_addr)) {
508                 return -EINVAL;
509         }
510
511         if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {
512                 if (addr->channel != IPMI_BMC_CHANNEL)
513                         return -EINVAL;
514                 return 0;
515         }
516
517         if ((addr->channel == IPMI_BMC_CHANNEL)
518             || (addr->channel >= IPMI_MAX_CHANNELS)
519             || (addr->channel < 0))
520                 return -EINVAL;
521
522         if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE)
523             || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
524         {
525                 if (len < sizeof(struct ipmi_ipmb_addr)) {
526                         return -EINVAL;
527                 }
528                 return 0;
529         }
530
531         if (addr->addr_type == IPMI_LAN_ADDR_TYPE) {
532                 if (len < sizeof(struct ipmi_lan_addr)) {
533                         return -EINVAL;
534                 }
535                 return 0;
536         }
537
538         return -EINVAL;
539 }
540
541 unsigned int ipmi_addr_length(int addr_type)
542 {
543         if (addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
544                 return sizeof(struct ipmi_system_interface_addr);
545
546         if ((addr_type == IPMI_IPMB_ADDR_TYPE)
547             || (addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
548         {
549                 return sizeof(struct ipmi_ipmb_addr);
550         }
551
552         if (addr_type == IPMI_LAN_ADDR_TYPE)
553                 return sizeof(struct ipmi_lan_addr);
554
555         return 0;
556 }
557
558 static void deliver_response(struct ipmi_recv_msg *msg)
559 {
560         if (!msg->user) {
561                 ipmi_smi_t    intf = msg->user_msg_data;
562                 unsigned long flags;
563
564                 /* Special handling for NULL users. */
565                 if (intf->null_user_handler) {
566                         intf->null_user_handler(intf, msg);
567                         spin_lock_irqsave(&intf->counter_lock, flags);
568                         intf->handled_local_responses++;
569                         spin_unlock_irqrestore(&intf->counter_lock, flags);
570                 } else {
571                         /* No handler, so give up. */
572                         spin_lock_irqsave(&intf->counter_lock, flags);
573                         intf->unhandled_local_responses++;
574                         spin_unlock_irqrestore(&intf->counter_lock, flags);
575                 }
576                 ipmi_free_recv_msg(msg);
577         } else {
578                 ipmi_user_t user = msg->user;
579                 user->handler->ipmi_recv_hndl(msg, user->handler_data);
580         }
581 }
582
583 /* Find the next sequence number not being used and add the given
584    message with the given timeout to the sequence table.  This must be
585    called with the interface's seq_lock held. */
586 static int intf_next_seq(ipmi_smi_t           intf,
587                          struct ipmi_recv_msg *recv_msg,
588                          unsigned long        timeout,
589                          int                  retries,
590                          int                  broadcast,
591                          unsigned char        *seq,
592                          long                 *seqid)
593 {
594         int          rv = 0;
595         unsigned int i;
596
597         for (i = intf->curr_seq;
598              (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq;
599              i = (i+1)%IPMI_IPMB_NUM_SEQ)
600         {
601                 if (!intf->seq_table[i].inuse)
602                         break;
603         }
604
605         if (!intf->seq_table[i].inuse) {
606                 intf->seq_table[i].recv_msg = recv_msg;
607
608                 /* Start with the maximum timeout, when the send response
609                    comes in we will start the real timer. */
610                 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT;
611                 intf->seq_table[i].orig_timeout = timeout;
612                 intf->seq_table[i].retries_left = retries;
613                 intf->seq_table[i].broadcast = broadcast;
614                 intf->seq_table[i].inuse = 1;
615                 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid);
616                 *seq = i;
617                 *seqid = intf->seq_table[i].seqid;
618                 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ;
619         } else {
620                 rv = -EAGAIN;
621         }
622         
623         return rv;
624 }
625
626 /* Return the receive message for the given sequence number and
627    release the sequence number so it can be reused.  Some other data
628    is passed in to be sure the message matches up correctly (to help
629    guard against message coming in after their timeout and the
630    sequence number being reused). */
631 static int intf_find_seq(ipmi_smi_t           intf,
632                          unsigned char        seq,
633                          short                channel,
634                          unsigned char        cmd,
635                          unsigned char        netfn,
636                          struct ipmi_addr     *addr,
637                          struct ipmi_recv_msg **recv_msg)
638 {
639         int           rv = -ENODEV;
640         unsigned long flags;
641
642         if (seq >= IPMI_IPMB_NUM_SEQ)
643                 return -EINVAL;
644
645         spin_lock_irqsave(&(intf->seq_lock), flags);
646         if (intf->seq_table[seq].inuse) {
647                 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg;
648
649                 if ((msg->addr.channel == channel)
650                     && (msg->msg.cmd == cmd)
651                     && (msg->msg.netfn == netfn)
652                     && (ipmi_addr_equal(addr, &(msg->addr))))
653                 {
654                         *recv_msg = msg;
655                         intf->seq_table[seq].inuse = 0;
656                         rv = 0;
657                 }
658         }
659         spin_unlock_irqrestore(&(intf->seq_lock), flags);
660
661         return rv;
662 }
663
664
665 /* Start the timer for a specific sequence table entry. */
666 static int intf_start_seq_timer(ipmi_smi_t intf,
667                                 long       msgid)
668 {
669         int           rv = -ENODEV;
670         unsigned long flags;
671         unsigned char seq;
672         unsigned long seqid;
673
674
675         GET_SEQ_FROM_MSGID(msgid, seq, seqid);
676
677         spin_lock_irqsave(&(intf->seq_lock), flags);
678         /* We do this verification because the user can be deleted
679            while a message is outstanding. */
680         if ((intf->seq_table[seq].inuse)
681             && (intf->seq_table[seq].seqid == seqid))
682         {
683                 struct seq_table *ent = &(intf->seq_table[seq]);
684                 ent->timeout = ent->orig_timeout;
685                 rv = 0;
686         }
687         spin_unlock_irqrestore(&(intf->seq_lock), flags);
688
689         return rv;
690 }
691
692 /* Got an error for the send message for a specific sequence number. */
693 static int intf_err_seq(ipmi_smi_t   intf,
694                         long         msgid,
695                         unsigned int err)
696 {
697         int                  rv = -ENODEV;
698         unsigned long        flags;
699         unsigned char        seq;
700         unsigned long        seqid;
701         struct ipmi_recv_msg *msg = NULL;
702
703
704         GET_SEQ_FROM_MSGID(msgid, seq, seqid);
705
706         spin_lock_irqsave(&(intf->seq_lock), flags);
707         /* We do this verification because the user can be deleted
708            while a message is outstanding. */
709         if ((intf->seq_table[seq].inuse)
710             && (intf->seq_table[seq].seqid == seqid))
711         {
712                 struct seq_table *ent = &(intf->seq_table[seq]);
713
714                 ent->inuse = 0;
715                 msg = ent->recv_msg;
716                 rv = 0;
717         }
718         spin_unlock_irqrestore(&(intf->seq_lock), flags);
719
720         if (msg) {
721                 msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
722                 msg->msg_data[0] = err;
723                 msg->msg.netfn |= 1; /* Convert to a response. */
724                 msg->msg.data_len = 1;
725                 msg->msg.data = msg->msg_data;
726                 deliver_response(msg);
727         }
728
729         return rv;
730 }
731
732
733 int ipmi_create_user(unsigned int          if_num,
734                      struct ipmi_user_hndl *handler,
735                      void                  *handler_data,
736                      ipmi_user_t           *user)
737 {
738         unsigned long flags;
739         ipmi_user_t   new_user;
740         int           rv = 0;
741         ipmi_smi_t    intf;
742
743         /* There is no module usecount here, because it's not
744            required.  Since this can only be used by and called from
745            other modules, they will implicitly use this module, and
746            thus this can't be removed unless the other modules are
747            removed. */
748
749         if (handler == NULL)
750                 return -EINVAL;
751
752         /* Make sure the driver is actually initialized, this handles
753            problems with initialization order. */
754         if (!initialized) {
755                 rv = ipmi_init_msghandler();
756                 if (rv)
757                         return rv;
758
759                 /* The init code doesn't return an error if it was turned
760                    off, but it won't initialize.  Check that. */
761                 if (!initialized)
762                         return -ENODEV;
763         }
764
765         new_user = kmalloc(sizeof(*new_user), GFP_KERNEL);
766         if (!new_user)
767                 return -ENOMEM;
768
769         spin_lock_irqsave(&interfaces_lock, flags);
770         intf = ipmi_interfaces[if_num];
771         if ((if_num >= MAX_IPMI_INTERFACES) || IPMI_INVALID_INTERFACE(intf)) {
772                 spin_unlock_irqrestore(&interfaces_lock, flags);
773                 rv = -EINVAL;
774                 goto out_kfree;
775         }
776
777         /* Note that each existing user holds a refcount to the interface. */
778         kref_get(&intf->refcount);
779         spin_unlock_irqrestore(&interfaces_lock, flags);
780
781         kref_init(&new_user->refcount);
782         new_user->handler = handler;
783         new_user->handler_data = handler_data;
784         new_user->intf = intf;
785         new_user->gets_events = 0;
786
787         if (!try_module_get(intf->handlers->owner)) {
788                 rv = -ENODEV;
789                 goto out_kref;
790         }
791
792         if (intf->handlers->inc_usecount) {
793                 rv = intf->handlers->inc_usecount(intf->send_info);
794                 if (rv) {
795                         module_put(intf->handlers->owner);
796                         goto out_kref;
797                 }
798         }
799
800         new_user->valid = 1;
801         spin_lock_irqsave(&intf->seq_lock, flags);
802         list_add_rcu(&new_user->link, &intf->users);
803         spin_unlock_irqrestore(&intf->seq_lock, flags);
804         *user = new_user;
805         return 0;
806
807 out_kref:
808         kref_put(&intf->refcount, intf_free);
809 out_kfree:
810         kfree(new_user);
811         return rv;
812 }
813
814 static void free_user(struct kref *ref)
815 {
816         ipmi_user_t user = container_of(ref, struct ipmi_user, refcount);
817         kfree(user);
818 }
819
820 int ipmi_destroy_user(ipmi_user_t user)
821 {
822         ipmi_smi_t       intf = user->intf;
823         int              i;
824         unsigned long    flags;
825         struct cmd_rcvr  *rcvr;
826         struct cmd_rcvr  *rcvrs = NULL;
827
828         user->valid = 0;
829
830         /* Remove the user from the interface's sequence table. */
831         spin_lock_irqsave(&intf->seq_lock, flags);
832         list_del_rcu(&user->link);
833
834         for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {
835                 if (intf->seq_table[i].inuse
836                     && (intf->seq_table[i].recv_msg->user == user))
837                 {
838                         intf->seq_table[i].inuse = 0;
839                 }
840         }
841         spin_unlock_irqrestore(&intf->seq_lock, flags);
842
843         /*
844          * Remove the user from the command receiver's table.  First
845          * we build a list of everything (not using the standard link,
846          * since other things may be using it till we do
847          * synchronize_rcu()) then free everything in that list.
848          */
849         mutex_lock(&intf->cmd_rcvrs_mutex);
850         list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
851                 if (rcvr->user == user) {
852                         list_del_rcu(&rcvr->link);
853                         rcvr->next = rcvrs;
854                         rcvrs = rcvr;
855                 }
856         }
857         mutex_unlock(&intf->cmd_rcvrs_mutex);
858         synchronize_rcu();
859         while (rcvrs) {
860                 rcvr = rcvrs;
861                 rcvrs = rcvr->next;
862                 kfree(rcvr);
863         }
864
865         module_put(intf->handlers->owner);
866         if (intf->handlers->dec_usecount)
867                 intf->handlers->dec_usecount(intf->send_info);
868
869         kref_put(&intf->refcount, intf_free);
870
871         kref_put(&user->refcount, free_user);
872
873         return 0;
874 }
875
876 void ipmi_get_version(ipmi_user_t   user,
877                       unsigned char *major,
878                       unsigned char *minor)
879 {
880         *major = ipmi_version_major(&user->intf->bmc->id);
881         *minor = ipmi_version_minor(&user->intf->bmc->id);
882 }
883
884 int ipmi_set_my_address(ipmi_user_t   user,
885                         unsigned int  channel,
886                         unsigned char address)
887 {
888         if (channel >= IPMI_MAX_CHANNELS)
889                 return -EINVAL;
890         user->intf->channels[channel].address = address;
891         return 0;
892 }
893
894 int ipmi_get_my_address(ipmi_user_t   user,
895                         unsigned int  channel,
896                         unsigned char *address)
897 {
898         if (channel >= IPMI_MAX_CHANNELS)
899                 return -EINVAL;
900         *address = user->intf->channels[channel].address;
901         return 0;
902 }
903
904 int ipmi_set_my_LUN(ipmi_user_t   user,
905                     unsigned int  channel,
906                     unsigned char LUN)
907 {
908         if (channel >= IPMI_MAX_CHANNELS)
909                 return -EINVAL;
910         user->intf->channels[channel].lun = LUN & 0x3;
911         return 0;
912 }
913
914 int ipmi_get_my_LUN(ipmi_user_t   user,
915                     unsigned int  channel,
916                     unsigned char *address)
917 {
918         if (channel >= IPMI_MAX_CHANNELS)
919                 return -EINVAL;
920         *address = user->intf->channels[channel].lun;
921         return 0;
922 }
923
924 int ipmi_set_gets_events(ipmi_user_t user, int val)
925 {
926         unsigned long        flags;
927         ipmi_smi_t           intf = user->intf;
928         struct ipmi_recv_msg *msg, *msg2;
929         struct list_head     msgs;
930
931         INIT_LIST_HEAD(&msgs);
932
933         spin_lock_irqsave(&intf->events_lock, flags);
934         user->gets_events = val;
935
936         if (val) {
937                 /* Deliver any queued events. */
938                 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link)
939                         list_move_tail(&msg->link, &msgs);
940                 intf->waiting_events_count = 0;
941         }
942
943         /* Hold the events lock while doing this to preserve order. */
944         list_for_each_entry_safe(msg, msg2, &msgs, link) {
945                 msg->user = user;
946                 kref_get(&user->refcount);
947                 deliver_response(msg);
948         }
949
950         spin_unlock_irqrestore(&intf->events_lock, flags);
951
952         return 0;
953 }
954
955 static struct cmd_rcvr *find_cmd_rcvr(ipmi_smi_t    intf,
956                                       unsigned char netfn,
957                                       unsigned char cmd)
958 {
959         struct cmd_rcvr *rcvr;
960
961         list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
962                 if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd))
963                         return rcvr;
964         }
965         return NULL;
966 }
967
968 int ipmi_register_for_cmd(ipmi_user_t   user,
969                           unsigned char netfn,
970                           unsigned char cmd)
971 {
972         ipmi_smi_t      intf = user->intf;
973         struct cmd_rcvr *rcvr;
974         struct cmd_rcvr *entry;
975         int             rv = 0;
976
977
978         rcvr = kmalloc(sizeof(*rcvr), GFP_KERNEL);
979         if (!rcvr)
980                 return -ENOMEM;
981         rcvr->cmd = cmd;
982         rcvr->netfn = netfn;
983         rcvr->user = user;
984
985         mutex_lock(&intf->cmd_rcvrs_mutex);
986         /* Make sure the command/netfn is not already registered. */
987         entry = find_cmd_rcvr(intf, netfn, cmd);
988         if (entry) {
989                 rv = -EBUSY;
990                 goto out_unlock;
991         }
992
993         list_add_rcu(&rcvr->link, &intf->cmd_rcvrs);
994
995  out_unlock:
996         mutex_unlock(&intf->cmd_rcvrs_mutex);
997         if (rv)
998                 kfree(rcvr);
999
1000         return rv;
1001 }
1002
1003 int ipmi_unregister_for_cmd(ipmi_user_t   user,
1004                             unsigned char netfn,
1005                             unsigned char cmd)
1006 {
1007         ipmi_smi_t      intf = user->intf;
1008         struct cmd_rcvr *rcvr;
1009
1010         mutex_lock(&intf->cmd_rcvrs_mutex);
1011         /* Make sure the command/netfn is not already registered. */
1012         rcvr = find_cmd_rcvr(intf, netfn, cmd);
1013         if ((rcvr) && (rcvr->user == user)) {
1014                 list_del_rcu(&rcvr->link);
1015                 mutex_unlock(&intf->cmd_rcvrs_mutex);
1016                 synchronize_rcu();
1017                 kfree(rcvr);
1018                 return 0;
1019         } else {
1020                 mutex_unlock(&intf->cmd_rcvrs_mutex);
1021                 return -ENOENT;
1022         }
1023 }
1024
1025 void ipmi_user_set_run_to_completion(ipmi_user_t user, int val)
1026 {
1027         ipmi_smi_t intf = user->intf;
1028         intf->handlers->set_run_to_completion(intf->send_info, val);
1029 }
1030
1031 static unsigned char
1032 ipmb_checksum(unsigned char *data, int size)
1033 {
1034         unsigned char csum = 0;
1035         
1036         for (; size > 0; size--, data++)
1037                 csum += *data;
1038
1039         return -csum;
1040 }
1041
1042 static inline void format_ipmb_msg(struct ipmi_smi_msg   *smi_msg,
1043                                    struct kernel_ipmi_msg *msg,
1044                                    struct ipmi_ipmb_addr *ipmb_addr,
1045                                    long                  msgid,
1046                                    unsigned char         ipmb_seq,
1047                                    int                   broadcast,
1048                                    unsigned char         source_address,
1049                                    unsigned char         source_lun)
1050 {
1051         int i = broadcast;
1052
1053         /* Format the IPMB header data. */
1054         smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
1055         smi_msg->data[1] = IPMI_SEND_MSG_CMD;
1056         smi_msg->data[2] = ipmb_addr->channel;
1057         if (broadcast)
1058                 smi_msg->data[3] = 0;
1059         smi_msg->data[i+3] = ipmb_addr->slave_addr;
1060         smi_msg->data[i+4] = (msg->netfn << 2) | (ipmb_addr->lun & 0x3);
1061         smi_msg->data[i+5] = ipmb_checksum(&(smi_msg->data[i+3]), 2);
1062         smi_msg->data[i+6] = source_address;
1063         smi_msg->data[i+7] = (ipmb_seq << 2) | source_lun;
1064         smi_msg->data[i+8] = msg->cmd;
1065
1066         /* Now tack on the data to the message. */
1067         if (msg->data_len > 0)
1068                 memcpy(&(smi_msg->data[i+9]), msg->data,
1069                        msg->data_len);
1070         smi_msg->data_size = msg->data_len + 9;
1071
1072         /* Now calculate the checksum and tack it on. */
1073         smi_msg->data[i+smi_msg->data_size]
1074                 = ipmb_checksum(&(smi_msg->data[i+6]),
1075                                 smi_msg->data_size-6);
1076
1077         /* Add on the checksum size and the offset from the
1078            broadcast. */
1079         smi_msg->data_size += 1 + i;
1080
1081         smi_msg->msgid = msgid;
1082 }
1083
1084 static inline void format_lan_msg(struct ipmi_smi_msg   *smi_msg,
1085                                   struct kernel_ipmi_msg *msg,
1086                                   struct ipmi_lan_addr  *lan_addr,
1087                                   long                  msgid,
1088                                   unsigned char         ipmb_seq,
1089                                   unsigned char         source_lun)
1090 {
1091         /* Format the IPMB header data. */
1092         smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
1093         smi_msg->data[1] = IPMI_SEND_MSG_CMD;
1094         smi_msg->data[2] = lan_addr->channel;
1095         smi_msg->data[3] = lan_addr->session_handle;
1096         smi_msg->data[4] = lan_addr->remote_SWID;
1097         smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3);
1098         smi_msg->data[6] = ipmb_checksum(&(smi_msg->data[4]), 2);
1099         smi_msg->data[7] = lan_addr->local_SWID;
1100         smi_msg->data[8] = (ipmb_seq << 2) | source_lun;
1101         smi_msg->data[9] = msg->cmd;
1102
1103         /* Now tack on the data to the message. */
1104         if (msg->data_len > 0)
1105                 memcpy(&(smi_msg->data[10]), msg->data,
1106                        msg->data_len);
1107         smi_msg->data_size = msg->data_len + 10;
1108
1109         /* Now calculate the checksum and tack it on. */
1110         smi_msg->data[smi_msg->data_size]
1111                 = ipmb_checksum(&(smi_msg->data[7]),
1112                                 smi_msg->data_size-7);
1113
1114         /* Add on the checksum size and the offset from the
1115            broadcast. */
1116         smi_msg->data_size += 1;
1117
1118         smi_msg->msgid = msgid;
1119 }
1120
1121 /* Separate from ipmi_request so that the user does not have to be
1122    supplied in certain circumstances (mainly at panic time).  If
1123    messages are supplied, they will be freed, even if an error
1124    occurs. */
1125 static int i_ipmi_request(ipmi_user_t          user,
1126                           ipmi_smi_t           intf,
1127                           struct ipmi_addr     *addr,
1128                           long                 msgid,
1129                           struct kernel_ipmi_msg *msg,
1130                           void                 *user_msg_data,
1131                           void                 *supplied_smi,
1132                           struct ipmi_recv_msg *supplied_recv,
1133                           int                  priority,
1134                           unsigned char        source_address,
1135                           unsigned char        source_lun,
1136                           int                  retries,
1137                           unsigned int         retry_time_ms)
1138 {
1139         int                  rv = 0;
1140         struct ipmi_smi_msg  *smi_msg;
1141         struct ipmi_recv_msg *recv_msg;
1142         unsigned long        flags;
1143
1144
1145         if (supplied_recv) {
1146                 recv_msg = supplied_recv;
1147         } else {
1148                 recv_msg = ipmi_alloc_recv_msg();
1149                 if (recv_msg == NULL) {
1150                         return -ENOMEM;
1151                 }
1152         }
1153         recv_msg->user_msg_data = user_msg_data;
1154
1155         if (supplied_smi) {
1156                 smi_msg = (struct ipmi_smi_msg *) supplied_smi;
1157         } else {
1158                 smi_msg = ipmi_alloc_smi_msg();
1159                 if (smi_msg == NULL) {
1160                         ipmi_free_recv_msg(recv_msg);
1161                         return -ENOMEM;
1162                 }
1163         }
1164
1165         recv_msg->user = user;
1166         if (user)
1167                 kref_get(&user->refcount);
1168         recv_msg->msgid = msgid;
1169         /* Store the message to send in the receive message so timeout
1170            responses can get the proper response data. */
1171         recv_msg->msg = *msg;
1172
1173         if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {
1174                 struct ipmi_system_interface_addr *smi_addr;
1175
1176                 if (msg->netfn & 1) {
1177                         /* Responses are not allowed to the SMI. */
1178                         rv = -EINVAL;
1179                         goto out_err;
1180                 }
1181
1182                 smi_addr = (struct ipmi_system_interface_addr *) addr;
1183                 if (smi_addr->lun > 3) {
1184                         spin_lock_irqsave(&intf->counter_lock, flags);
1185                         intf->sent_invalid_commands++;
1186                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1187                         rv = -EINVAL;
1188                         goto out_err;
1189                 }
1190
1191                 memcpy(&recv_msg->addr, smi_addr, sizeof(*smi_addr));
1192
1193                 if ((msg->netfn == IPMI_NETFN_APP_REQUEST)
1194                     && ((msg->cmd == IPMI_SEND_MSG_CMD)
1195                         || (msg->cmd == IPMI_GET_MSG_CMD)
1196                         || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD)))
1197                 {
1198                         /* We don't let the user do these, since we manage
1199                            the sequence numbers. */
1200                         spin_lock_irqsave(&intf->counter_lock, flags);
1201                         intf->sent_invalid_commands++;
1202                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1203                         rv = -EINVAL;
1204                         goto out_err;
1205                 }
1206
1207                 if ((msg->data_len + 2) > IPMI_MAX_MSG_LENGTH) {
1208                         spin_lock_irqsave(&intf->counter_lock, flags);
1209                         intf->sent_invalid_commands++;
1210                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1211                         rv = -EMSGSIZE;
1212                         goto out_err;
1213                 }
1214
1215                 smi_msg->data[0] = (msg->netfn << 2) | (smi_addr->lun & 0x3);
1216                 smi_msg->data[1] = msg->cmd;
1217                 smi_msg->msgid = msgid;
1218                 smi_msg->user_data = recv_msg;
1219                 if (msg->data_len > 0)
1220                         memcpy(&(smi_msg->data[2]), msg->data, msg->data_len);
1221                 smi_msg->data_size = msg->data_len + 2;
1222                 spin_lock_irqsave(&intf->counter_lock, flags);
1223                 intf->sent_local_commands++;
1224                 spin_unlock_irqrestore(&intf->counter_lock, flags);
1225         } else if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE)
1226                    || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
1227         {
1228                 struct ipmi_ipmb_addr *ipmb_addr;
1229                 unsigned char         ipmb_seq;
1230                 long                  seqid;
1231                 int                   broadcast = 0;
1232
1233                 if (addr->channel >= IPMI_MAX_CHANNELS) {
1234                         spin_lock_irqsave(&intf->counter_lock, flags);
1235                         intf->sent_invalid_commands++;
1236                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1237                         rv = -EINVAL;
1238                         goto out_err;
1239                 }
1240
1241                 if (intf->channels[addr->channel].medium
1242                     != IPMI_CHANNEL_MEDIUM_IPMB)
1243                 {
1244                         spin_lock_irqsave(&intf->counter_lock, flags);
1245                         intf->sent_invalid_commands++;
1246                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1247                         rv = -EINVAL;
1248                         goto out_err;
1249                 }
1250
1251                 if (retries < 0) {
1252                     if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)
1253                         retries = 0; /* Don't retry broadcasts. */
1254                     else
1255                         retries = 4;
1256                 }
1257                 if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) {
1258                     /* Broadcasts add a zero at the beginning of the
1259                        message, but otherwise is the same as an IPMB
1260                        address. */
1261                     addr->addr_type = IPMI_IPMB_ADDR_TYPE;
1262                     broadcast = 1;
1263                 }
1264
1265
1266                 /* Default to 1 second retries. */
1267                 if (retry_time_ms == 0)
1268                     retry_time_ms = 1000;
1269
1270                 /* 9 for the header and 1 for the checksum, plus
1271                    possibly one for the broadcast. */
1272                 if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) {
1273                         spin_lock_irqsave(&intf->counter_lock, flags);
1274                         intf->sent_invalid_commands++;
1275                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1276                         rv = -EMSGSIZE;
1277                         goto out_err;
1278                 }
1279
1280                 ipmb_addr = (struct ipmi_ipmb_addr *) addr;
1281                 if (ipmb_addr->lun > 3) {
1282                         spin_lock_irqsave(&intf->counter_lock, flags);
1283                         intf->sent_invalid_commands++;
1284                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1285                         rv = -EINVAL;
1286                         goto out_err;
1287                 }
1288
1289                 memcpy(&recv_msg->addr, ipmb_addr, sizeof(*ipmb_addr));
1290
1291                 if (recv_msg->msg.netfn & 0x1) {
1292                         /* It's a response, so use the user's sequence
1293                            from msgid. */
1294                         spin_lock_irqsave(&intf->counter_lock, flags);
1295                         intf->sent_ipmb_responses++;
1296                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1297                         format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid,
1298                                         msgid, broadcast,
1299                                         source_address, source_lun);
1300
1301                         /* Save the receive message so we can use it
1302                            to deliver the response. */
1303                         smi_msg->user_data = recv_msg;
1304                 } else {
1305                         /* It's a command, so get a sequence for it. */
1306
1307                         spin_lock_irqsave(&(intf->seq_lock), flags);
1308
1309                         spin_lock(&intf->counter_lock);
1310                         intf->sent_ipmb_commands++;
1311                         spin_unlock(&intf->counter_lock);
1312
1313                         /* Create a sequence number with a 1 second
1314                            timeout and 4 retries. */
1315                         rv = intf_next_seq(intf,
1316                                            recv_msg,
1317                                            retry_time_ms,
1318                                            retries,
1319                                            broadcast,
1320                                            &ipmb_seq,
1321                                            &seqid);
1322                         if (rv) {
1323                                 /* We have used up all the sequence numbers,
1324                                    probably, so abort. */
1325                                 spin_unlock_irqrestore(&(intf->seq_lock),
1326                                                        flags);
1327                                 goto out_err;
1328                         }
1329
1330                         /* Store the sequence number in the message,
1331                            so that when the send message response
1332                            comes back we can start the timer. */
1333                         format_ipmb_msg(smi_msg, msg, ipmb_addr,
1334                                         STORE_SEQ_IN_MSGID(ipmb_seq, seqid),
1335                                         ipmb_seq, broadcast,
1336                                         source_address, source_lun);
1337
1338                         /* Copy the message into the recv message data, so we
1339                            can retransmit it later if necessary. */
1340                         memcpy(recv_msg->msg_data, smi_msg->data,
1341                                smi_msg->data_size);
1342                         recv_msg->msg.data = recv_msg->msg_data;
1343                         recv_msg->msg.data_len = smi_msg->data_size;
1344
1345                         /* We don't unlock until here, because we need
1346                            to copy the completed message into the
1347                            recv_msg before we release the lock.
1348                            Otherwise, race conditions may bite us.  I
1349                            know that's pretty paranoid, but I prefer
1350                            to be correct. */
1351                         spin_unlock_irqrestore(&(intf->seq_lock), flags);
1352                 }
1353         } else if (addr->addr_type == IPMI_LAN_ADDR_TYPE) {
1354                 struct ipmi_lan_addr  *lan_addr;
1355                 unsigned char         ipmb_seq;
1356                 long                  seqid;
1357
1358                 if (addr->channel >= IPMI_MAX_CHANNELS) {
1359                         spin_lock_irqsave(&intf->counter_lock, flags);
1360                         intf->sent_invalid_commands++;
1361                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1362                         rv = -EINVAL;
1363                         goto out_err;
1364                 }
1365
1366                 if ((intf->channels[addr->channel].medium
1367                     != IPMI_CHANNEL_MEDIUM_8023LAN)
1368                     && (intf->channels[addr->channel].medium
1369                         != IPMI_CHANNEL_MEDIUM_ASYNC))
1370                 {
1371                         spin_lock_irqsave(&intf->counter_lock, flags);
1372                         intf->sent_invalid_commands++;
1373                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1374                         rv = -EINVAL;
1375                         goto out_err;
1376                 }
1377
1378                 retries = 4;
1379
1380                 /* Default to 1 second retries. */
1381                 if (retry_time_ms == 0)
1382                     retry_time_ms = 1000;
1383
1384                 /* 11 for the header and 1 for the checksum. */
1385                 if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) {
1386                         spin_lock_irqsave(&intf->counter_lock, flags);
1387                         intf->sent_invalid_commands++;
1388                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1389                         rv = -EMSGSIZE;
1390                         goto out_err;
1391                 }
1392
1393                 lan_addr = (struct ipmi_lan_addr *) addr;
1394                 if (lan_addr->lun > 3) {
1395                         spin_lock_irqsave(&intf->counter_lock, flags);
1396                         intf->sent_invalid_commands++;
1397                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1398                         rv = -EINVAL;
1399                         goto out_err;
1400                 }
1401
1402                 memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr));
1403
1404                 if (recv_msg->msg.netfn & 0x1) {
1405                         /* It's a response, so use the user's sequence
1406                            from msgid. */
1407                         spin_lock_irqsave(&intf->counter_lock, flags);
1408                         intf->sent_lan_responses++;
1409                         spin_unlock_irqrestore(&intf->counter_lock, flags);
1410                         format_lan_msg(smi_msg, msg, lan_addr, msgid,
1411                                        msgid, source_lun);
1412
1413                         /* Save the receive message so we can use it
1414                            to deliver the response. */
1415                         smi_msg->user_data = recv_msg;
1416                 } else {
1417                         /* It's a command, so get a sequence for it. */
1418
1419                         spin_lock_irqsave(&(intf->seq_lock), flags);
1420
1421                         spin_lock(&intf->counter_lock);
1422                         intf->sent_lan_commands++;
1423                         spin_unlock(&intf->counter_lock);
1424
1425                         /* Create a sequence number with a 1 second
1426                            timeout and 4 retries. */
1427                         rv = intf_next_seq(intf,
1428                                            recv_msg,
1429                                            retry_time_ms,
1430                                            retries,
1431                                            0,
1432                                            &ipmb_seq,
1433                                            &seqid);
1434                         if (rv) {
1435                                 /* We have used up all the sequence numbers,
1436                                    probably, so abort. */
1437                                 spin_unlock_irqrestore(&(intf->seq_lock),
1438                                                        flags);
1439                                 goto out_err;
1440                         }
1441
1442                         /* Store the sequence number in the message,
1443                            so that when the send message response
1444                            comes back we can start the timer. */
1445                         format_lan_msg(smi_msg, msg, lan_addr,
1446                                        STORE_SEQ_IN_MSGID(ipmb_seq, seqid),
1447                                        ipmb_seq, source_lun);
1448
1449                         /* Copy the message into the recv message data, so we
1450                            can retransmit it later if necessary. */
1451                         memcpy(recv_msg->msg_data, smi_msg->data,
1452                                smi_msg->data_size);
1453                         recv_msg->msg.data = recv_msg->msg_data;
1454                         recv_msg->msg.data_len = smi_msg->data_size;
1455
1456                         /* We don't unlock until here, because we need
1457                            to copy the completed message into the
1458                            recv_msg before we release the lock.
1459                            Otherwise, race conditions may bite us.  I
1460                            know that's pretty paranoid, but I prefer
1461                            to be correct. */
1462                         spin_unlock_irqrestore(&(intf->seq_lock), flags);
1463                 }
1464         } else {
1465             /* Unknown address type. */
1466                 spin_lock_irqsave(&intf->counter_lock, flags);
1467                 intf->sent_invalid_commands++;
1468                 spin_unlock_irqrestore(&intf->counter_lock, flags);
1469                 rv = -EINVAL;
1470                 goto out_err;
1471         }
1472
1473 #ifdef DEBUG_MSGING
1474         {
1475                 int m;
1476                 for (m = 0; m < smi_msg->data_size; m++)
1477                         printk(" %2.2x", smi_msg->data[m]);
1478                 printk("\n");
1479         }
1480 #endif
1481         intf->handlers->sender(intf->send_info, smi_msg, priority);
1482
1483         return 0;
1484
1485  out_err:
1486         ipmi_free_smi_msg(smi_msg);
1487         ipmi_free_recv_msg(recv_msg);
1488         return rv;
1489 }
1490
1491 static int check_addr(ipmi_smi_t       intf,
1492                       struct ipmi_addr *addr,
1493                       unsigned char    *saddr,
1494                       unsigned char    *lun)
1495 {
1496         if (addr->channel >= IPMI_MAX_CHANNELS)
1497                 return -EINVAL;
1498         *lun = intf->channels[addr->channel].lun;
1499         *saddr = intf->channels[addr->channel].address;
1500         return 0;
1501 }
1502
1503 int ipmi_request_settime(ipmi_user_t      user,
1504                          struct ipmi_addr *addr,
1505                          long             msgid,
1506                          struct kernel_ipmi_msg  *msg,
1507                          void             *user_msg_data,
1508                          int              priority,
1509                          int              retries,
1510                          unsigned int     retry_time_ms)
1511 {
1512         unsigned char saddr, lun;
1513         int           rv;
1514
1515         if (!user)
1516                 return -EINVAL;
1517         rv = check_addr(user->intf, addr, &saddr, &lun);
1518         if (rv)
1519                 return rv;
1520         return i_ipmi_request(user,
1521                               user->intf,
1522                               addr,
1523                               msgid,
1524                               msg,
1525                               user_msg_data,
1526                               NULL, NULL,
1527                               priority,
1528                               saddr,
1529                               lun,
1530                               retries,
1531                               retry_time_ms);
1532 }
1533
1534 int ipmi_request_supply_msgs(ipmi_user_t          user,
1535                              struct ipmi_addr     *addr,
1536                              long                 msgid,
1537                              struct kernel_ipmi_msg *msg,
1538                              void                 *user_msg_data,
1539                              void                 *supplied_smi,
1540                              struct ipmi_recv_msg *supplied_recv,
1541                              int                  priority)
1542 {
1543         unsigned char saddr, lun;
1544         int           rv;
1545
1546         if (!user)
1547                 return -EINVAL;
1548         rv = check_addr(user->intf, addr, &saddr, &lun);
1549         if (rv)
1550                 return rv;
1551         return i_ipmi_request(user,
1552                               user->intf,
1553                               addr,
1554                               msgid,
1555                               msg,
1556                               user_msg_data,
1557                               supplied_smi,
1558                               supplied_recv,
1559                               priority,
1560                               saddr,
1561                               lun,
1562                               -1, 0);
1563 }
1564
1565 static int ipmb_file_read_proc(char *page, char **start, off_t off,
1566                                int count, int *eof, void *data)
1567 {
1568         char       *out = (char *) page;
1569         ipmi_smi_t intf = data;
1570         int        i;
1571         int        rv = 0;
1572
1573         for (i = 0; i < IPMI_MAX_CHANNELS; i++)
1574                 rv += sprintf(out+rv, "%x ", intf->channels[i].address);
1575         out[rv-1] = '\n'; /* Replace the final space with a newline */
1576         out[rv] = '\0';
1577         rv++;
1578         return rv;
1579 }
1580
1581 static int version_file_read_proc(char *page, char **start, off_t off,
1582                                   int count, int *eof, void *data)
1583 {
1584         char       *out = (char *) page;
1585         ipmi_smi_t intf = data;
1586
1587         return sprintf(out, "%d.%d\n",
1588                        ipmi_version_major(&intf->bmc->id),
1589                        ipmi_version_minor(&intf->bmc->id));
1590 }
1591
1592 static int stat_file_read_proc(char *page, char **start, off_t off,
1593                                int count, int *eof, void *data)
1594 {
1595         char       *out = (char *) page;
1596         ipmi_smi_t intf = data;
1597
1598         out += sprintf(out, "sent_invalid_commands:       %d\n",
1599                        intf->sent_invalid_commands);
1600         out += sprintf(out, "sent_local_commands:         %d\n",
1601                        intf->sent_local_commands);
1602         out += sprintf(out, "handled_local_responses:     %d\n",
1603                        intf->handled_local_responses);
1604         out += sprintf(out, "unhandled_local_responses:   %d\n",
1605                        intf->unhandled_local_responses);
1606         out += sprintf(out, "sent_ipmb_commands:          %d\n",
1607                        intf->sent_ipmb_commands);
1608         out += sprintf(out, "sent_ipmb_command_errs:      %d\n",
1609                        intf->sent_ipmb_command_errs);
1610         out += sprintf(out, "retransmitted_ipmb_commands: %d\n",
1611                        intf->retransmitted_ipmb_commands);
1612         out += sprintf(out, "timed_out_ipmb_commands:     %d\n",
1613                        intf->timed_out_ipmb_commands);
1614         out += sprintf(out, "timed_out_ipmb_broadcasts:   %d\n",
1615                        intf->timed_out_ipmb_broadcasts);
1616         out += sprintf(out, "sent_ipmb_responses:         %d\n",
1617                        intf->sent_ipmb_responses);
1618         out += sprintf(out, "handled_ipmb_responses:      %d\n",
1619                        intf->handled_ipmb_responses);
1620         out += sprintf(out, "invalid_ipmb_responses:      %d\n",
1621                        intf->invalid_ipmb_responses);
1622         out += sprintf(out, "unhandled_ipmb_responses:    %d\n",
1623                        intf->unhandled_ipmb_responses);
1624         out += sprintf(out, "sent_lan_commands:           %d\n",
1625                        intf->sent_lan_commands);
1626         out += sprintf(out, "sent_lan_command_errs:       %d\n",
1627                        intf->sent_lan_command_errs);
1628         out += sprintf(out, "retransmitted_lan_commands:  %d\n",
1629                        intf->retransmitted_lan_commands);
1630         out += sprintf(out, "timed_out_lan_commands:      %d\n",
1631                        intf->timed_out_lan_commands);
1632         out += sprintf(out, "sent_lan_responses:          %d\n",
1633                        intf->sent_lan_responses);
1634         out += sprintf(out, "handled_lan_responses:       %d\n",
1635                        intf->handled_lan_responses);
1636         out += sprintf(out, "invalid_lan_responses:       %d\n",
1637                        intf->invalid_lan_responses);
1638         out += sprintf(out, "unhandled_lan_responses:     %d\n",
1639                        intf->unhandled_lan_responses);
1640         out += sprintf(out, "handled_commands:            %d\n",
1641                        intf->handled_commands);
1642         out += sprintf(out, "invalid_commands:            %d\n",
1643                        intf->invalid_commands);
1644         out += sprintf(out, "unhandled_commands:          %d\n",
1645                        intf->unhandled_commands);
1646         out += sprintf(out, "invalid_events:              %d\n",
1647                        intf->invalid_events);
1648         out += sprintf(out, "events:                      %d\n",
1649                        intf->events);
1650
1651         return (out - ((char *) page));
1652 }
1653
1654 int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name,
1655                             read_proc_t *read_proc, write_proc_t *write_proc,
1656                             void *data, struct module *owner)
1657 {
1658         int                    rv = 0;
1659 #ifdef CONFIG_PROC_FS
1660         struct proc_dir_entry  *file;
1661         struct ipmi_proc_entry *entry;
1662
1663         /* Create a list element. */
1664         entry = kmalloc(sizeof(*entry), GFP_KERNEL);
1665         if (!entry)
1666                 return -ENOMEM;
1667         entry->name = kmalloc(strlen(name)+1, GFP_KERNEL);
1668         if (!entry->name) {
1669                 kfree(entry);
1670                 return -ENOMEM;
1671         }
1672         strcpy(entry->name, name);
1673
1674         file = create_proc_entry(name, 0, smi->proc_dir);
1675         if (!file) {
1676                 kfree(entry->name);
1677                 kfree(entry);
1678                 rv = -ENOMEM;
1679         } else {
1680                 file->nlink = 1;
1681                 file->data = data;
1682                 file->read_proc = read_proc;
1683                 file->write_proc = write_proc;
1684                 file->owner = owner;
1685
1686                 spin_lock(&smi->proc_entry_lock);
1687                 /* Stick it on the list. */
1688                 entry->next = smi->proc_entries;
1689                 smi->proc_entries = entry;
1690                 spin_unlock(&smi->proc_entry_lock);
1691         }
1692 #endif /* CONFIG_PROC_FS */
1693
1694         return rv;
1695 }
1696
1697 static int add_proc_entries(ipmi_smi_t smi, int num)
1698 {
1699         int rv = 0;
1700
1701 #ifdef CONFIG_PROC_FS
1702         sprintf(smi->proc_dir_name, "%d", num);
1703         smi->proc_dir = proc_mkdir(smi->proc_dir_name, proc_ipmi_root);
1704         if (!smi->proc_dir)
1705                 rv = -ENOMEM;
1706         else {
1707                 smi->proc_dir->owner = THIS_MODULE;
1708         }
1709
1710         if (rv == 0)
1711                 rv = ipmi_smi_add_proc_entry(smi, "stats",
1712                                              stat_file_read_proc, NULL,
1713                                              smi, THIS_MODULE);
1714
1715         if (rv == 0)
1716                 rv = ipmi_smi_add_proc_entry(smi, "ipmb",
1717                                              ipmb_file_read_proc, NULL,
1718                                              smi, THIS_MODULE);
1719
1720         if (rv == 0)
1721                 rv = ipmi_smi_add_proc_entry(smi, "version",
1722                                              version_file_read_proc, NULL,
1723                                              smi, THIS_MODULE);
1724 #endif /* CONFIG_PROC_FS */
1725
1726         return rv;
1727 }
1728
1729 static void remove_proc_entries(ipmi_smi_t smi)
1730 {
1731 #ifdef CONFIG_PROC_FS
1732         struct ipmi_proc_entry *entry;
1733
1734         spin_lock(&smi->proc_entry_lock);
1735         while (smi->proc_entries) {
1736                 entry = smi->proc_entries;
1737                 smi->proc_entries = entry->next;
1738
1739                 remove_proc_entry(entry->name, smi->proc_dir);
1740                 kfree(entry->name);
1741                 kfree(entry);
1742         }
1743         spin_unlock(&smi->proc_entry_lock);
1744         remove_proc_entry(smi->proc_dir_name, proc_ipmi_root);
1745 #endif /* CONFIG_PROC_FS */
1746 }
1747
1748 static int __find_bmc_guid(struct device *dev, void *data)
1749 {
1750         unsigned char *id = data;
1751         struct bmc_device *bmc = dev_get_drvdata(dev);
1752         return memcmp(bmc->guid, id, 16) == 0;
1753 }
1754
1755 static struct bmc_device *ipmi_find_bmc_guid(struct device_driver *drv,
1756                                              unsigned char *guid)
1757 {
1758         struct device *dev;
1759
1760         dev = driver_find_device(drv, NULL, guid, __find_bmc_guid);
1761         if (dev)
1762                 return dev_get_drvdata(dev);
1763         else
1764                 return NULL;
1765 }
1766
1767 struct prod_dev_id {
1768         unsigned int  product_id;
1769         unsigned char device_id;
1770 };
1771
1772 static int __find_bmc_prod_dev_id(struct device *dev, void *data)
1773 {
1774         struct prod_dev_id *id = data;
1775         struct bmc_device *bmc = dev_get_drvdata(dev);
1776
1777         return (bmc->id.product_id == id->product_id
1778                 && bmc->id.product_id == id->product_id
1779                 && bmc->id.device_id == id->device_id);
1780 }
1781
1782 static struct bmc_device *ipmi_find_bmc_prod_dev_id(
1783         struct device_driver *drv,
1784         unsigned char product_id, unsigned char device_id)
1785 {
1786         struct prod_dev_id id = {
1787                 .product_id = product_id,
1788                 .device_id = device_id,
1789         };
1790         struct device *dev;
1791
1792         dev = driver_find_device(drv, NULL, &id, __find_bmc_prod_dev_id);
1793         if (dev)
1794                 return dev_get_drvdata(dev);
1795         else
1796                 return NULL;
1797 }
1798
1799 static ssize_t device_id_show(struct device *dev,
1800                               struct device_attribute *attr,
1801                               char *buf)
1802 {
1803         struct bmc_device *bmc = dev_get_drvdata(dev);
1804
1805         return snprintf(buf, 10, "%u\n", bmc->id.device_id);
1806 }
1807
1808 static ssize_t provides_dev_sdrs_show(struct device *dev,
1809                                       struct device_attribute *attr,
1810                                       char *buf)
1811 {
1812         struct bmc_device *bmc = dev_get_drvdata(dev);
1813
1814         return snprintf(buf, 10, "%u\n",
1815                         bmc->id.device_revision && 0x80 >> 7);
1816 }
1817
1818 static ssize_t revision_show(struct device *dev, struct device_attribute *attr,
1819                              char *buf)
1820 {
1821         struct bmc_device *bmc = dev_get_drvdata(dev);
1822
1823         return snprintf(buf, 20, "%u\n",
1824                         bmc->id.device_revision && 0x0F);
1825 }
1826
1827 static ssize_t firmware_rev_show(struct device *dev,
1828                                  struct device_attribute *attr,
1829                                  char *buf)
1830 {
1831         struct bmc_device *bmc = dev_get_drvdata(dev);
1832
1833         return snprintf(buf, 20, "%u.%x\n", bmc->id.firmware_revision_1,
1834                         bmc->id.firmware_revision_2);
1835 }
1836
1837 static ssize_t ipmi_version_show(struct device *dev,
1838                                  struct device_attribute *attr,
1839                                  char *buf)
1840 {
1841         struct bmc_device *bmc = dev_get_drvdata(dev);
1842
1843         return snprintf(buf, 20, "%u.%u\n",
1844                         ipmi_version_major(&bmc->id),
1845                         ipmi_version_minor(&bmc->id));
1846 }
1847
1848 static ssize_t add_dev_support_show(struct device *dev,
1849                                     struct device_attribute *attr,
1850                                     char *buf)
1851 {
1852         struct bmc_device *bmc = dev_get_drvdata(dev);
1853
1854         return snprintf(buf, 10, "0x%02x\n",
1855                         bmc->id.additional_device_support);
1856 }
1857
1858 static ssize_t manufacturer_id_show(struct device *dev,
1859                                     struct device_attribute *attr,
1860                                     char *buf)
1861 {
1862         struct bmc_device *bmc = dev_get_drvdata(dev);
1863
1864         return snprintf(buf, 20, "0x%6.6x\n", bmc->id.manufacturer_id);
1865 }
1866
1867 static ssize_t product_id_show(struct device *dev,
1868                                struct device_attribute *attr,
1869                                char *buf)
1870 {
1871         struct bmc_device *bmc = dev_get_drvdata(dev);
1872
1873         return snprintf(buf, 10, "0x%4.4x\n", bmc->id.product_id);
1874 }
1875
1876 static ssize_t aux_firmware_rev_show(struct device *dev,
1877                                      struct device_attribute *attr,
1878                                      char *buf)
1879 {
1880         struct bmc_device *bmc = dev_get_drvdata(dev);
1881
1882         return snprintf(buf, 21, "0x%02x 0x%02x 0x%02x 0x%02x\n",
1883                         bmc->id.aux_firmware_revision[3],
1884                         bmc->id.aux_firmware_revision[2],
1885                         bmc->id.aux_firmware_revision[1],
1886                         bmc->id.aux_firmware_revision[0]);
1887 }
1888
1889 static ssize_t guid_show(struct device *dev, struct device_attribute *attr,
1890                          char *buf)
1891 {
1892         struct bmc_device *bmc = dev_get_drvdata(dev);
1893
1894         return snprintf(buf, 100, "%Lx%Lx\n",
1895                         (long long) bmc->guid[0],
1896                         (long long) bmc->guid[8]);
1897 }
1898
1899 static void
1900 cleanup_bmc_device(struct kref *ref)
1901 {
1902         struct bmc_device *bmc;
1903
1904         bmc = container_of(ref, struct bmc_device, refcount);
1905
1906         device_remove_file(&bmc->dev->dev,
1907                            &bmc->device_id_attr);
1908         device_remove_file(&bmc->dev->dev,
1909                            &bmc->provides_dev_sdrs_attr);
1910         device_remove_file(&bmc->dev->dev,
1911                            &bmc->revision_attr);
1912         device_remove_file(&bmc->dev->dev,
1913                            &bmc->firmware_rev_attr);
1914         device_remove_file(&bmc->dev->dev,
1915                            &bmc->version_attr);
1916         device_remove_file(&bmc->dev->dev,
1917                            &bmc->add_dev_support_attr);
1918         device_remove_file(&bmc->dev->dev,
1919                            &bmc->manufacturer_id_attr);
1920         device_remove_file(&bmc->dev->dev,
1921                            &bmc->product_id_attr);
1922         if (bmc->id.aux_firmware_revision_set)
1923                 device_remove_file(&bmc->dev->dev,
1924                                    &bmc->aux_firmware_rev_attr);
1925         if (bmc->guid_set)
1926                 device_remove_file(&bmc->dev->dev,
1927                                    &bmc->guid_attr);
1928         platform_device_unregister(bmc->dev);
1929         kfree(bmc);
1930 }
1931
1932 static void ipmi_bmc_unregister(ipmi_smi_t intf)
1933 {
1934         struct bmc_device *bmc = intf->bmc;
1935
1936         sysfs_remove_link(&intf->si_dev->kobj, "bmc");
1937         if (intf->my_dev_name) {
1938                 sysfs_remove_link(&bmc->dev->dev.kobj, intf->my_dev_name);
1939                 kfree(intf->my_dev_name);
1940                 intf->my_dev_name = NULL;
1941         }
1942
1943         mutex_lock(&ipmidriver_mutex);
1944         kref_put(&bmc->refcount, cleanup_bmc_device);
1945         mutex_unlock(&ipmidriver_mutex);
1946 }
1947
1948 static int ipmi_bmc_register(ipmi_smi_t intf)
1949 {
1950         int               rv;
1951         struct bmc_device *bmc = intf->bmc;
1952         struct bmc_device *old_bmc;
1953         int               size;
1954         char              dummy[1];
1955
1956         mutex_lock(&ipmidriver_mutex);
1957
1958         /*
1959          * Try to find if there is an bmc_device struct
1960          * representing the interfaced BMC already
1961          */
1962         if (bmc->guid_set)
1963                 old_bmc = ipmi_find_bmc_guid(&ipmidriver, bmc->guid);
1964         else
1965                 old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver,
1966                                                     bmc->id.product_id,
1967                                                     bmc->id.device_id);
1968
1969         /*
1970          * If there is already an bmc_device, free the new one,
1971          * otherwise register the new BMC device
1972          */
1973         if (old_bmc) {
1974                 kfree(bmc);
1975                 intf->bmc = old_bmc;
1976                 bmc = old_bmc;
1977
1978                 kref_get(&bmc->refcount);
1979                 mutex_unlock(&ipmidriver_mutex);
1980
1981                 printk(KERN_INFO
1982                        "ipmi: interfacing existing BMC (man_id: 0x%6.6x,"
1983                        " prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",
1984                        bmc->id.manufacturer_id,
1985                        bmc->id.product_id,
1986                        bmc->id.device_id);
1987         } else {
1988                 bmc->dev = platform_device_alloc("ipmi_bmc",
1989                                                  bmc->id.device_id);
1990                 if (!bmc->dev) {
1991                         printk(KERN_ERR
1992                                "ipmi_msghandler:"
1993                                " Unable to allocate platform device\n");
1994                         return -ENOMEM;
1995                 }
1996                 bmc->dev->dev.driver = &ipmidriver;
1997                 dev_set_drvdata(&bmc->dev->dev, bmc);
1998                 kref_init(&bmc->refcount);
1999
2000                 rv = platform_device_register(bmc->dev);
2001                 mutex_unlock(&ipmidriver_mutex);
2002                 if (rv) {
2003                         printk(KERN_ERR
2004                                "ipmi_msghandler:"
2005                                " Unable to register bmc device: %d\n",
2006                                rv);
2007                         /* Don't go to out_err, you can only do that if
2008                            the device is registered already. */
2009                         return rv;
2010                 }
2011
2012                 bmc->device_id_attr.attr.name = "device_id";
2013                 bmc->device_id_attr.attr.owner = THIS_MODULE;
2014                 bmc->device_id_attr.attr.mode = S_IRUGO;
2015                 bmc->device_id_attr.show = device_id_show;
2016
2017                 bmc->provides_dev_sdrs_attr.attr.name = "provides_device_sdrs";
2018                 bmc->provides_dev_sdrs_attr.attr.owner = THIS_MODULE;
2019                 bmc->provides_dev_sdrs_attr.attr.mode = S_IRUGO;
2020                 bmc->provides_dev_sdrs_attr.show = provides_dev_sdrs_show;
2021
2022
2023                 bmc->revision_attr.attr.name = "revision";
2024                 bmc->revision_attr.attr.owner = THIS_MODULE;
2025                 bmc->revision_attr.attr.mode = S_IRUGO;
2026                 bmc->revision_attr.show = revision_show;
2027
2028                 bmc->firmware_rev_attr.attr.name = "firmware_revision";
2029                 bmc->firmware_rev_attr.attr.owner = THIS_MODULE;
2030                 bmc->firmware_rev_attr.attr.mode = S_IRUGO;
2031                 bmc->firmware_rev_attr.show = firmware_rev_show;
2032
2033                 bmc->version_attr.attr.name = "ipmi_version";
2034                 bmc->version_attr.attr.owner = THIS_MODULE;
2035                 bmc->version_attr.attr.mode = S_IRUGO;
2036                 bmc->version_attr.show = ipmi_version_show;
2037
2038                 bmc->add_dev_support_attr.attr.name
2039                         = "additional_device_support";
2040                 bmc->add_dev_support_attr.attr.owner = THIS_MODULE;
2041                 bmc->add_dev_support_attr.attr.mode = S_IRUGO;
2042                 bmc->add_dev_support_attr.show = add_dev_support_show;
2043
2044                 bmc->manufacturer_id_attr.attr.name = "manufacturer_id";
2045                 bmc->manufacturer_id_attr.attr.owner = THIS_MODULE;
2046                 bmc->manufacturer_id_attr.attr.mode = S_IRUGO;
2047                 bmc->manufacturer_id_attr.show = manufacturer_id_show;
2048
2049                 bmc->product_id_attr.attr.name = "product_id";
2050                 bmc->product_id_attr.attr.owner = THIS_MODULE;
2051                 bmc->product_id_attr.attr.mode = S_IRUGO;
2052                 bmc->product_id_attr.show = product_id_show;
2053
2054                 bmc->guid_attr.attr.name = "guid";
2055                 bmc->guid_attr.attr.owner = THIS_MODULE;
2056                 bmc->guid_attr.attr.mode = S_IRUGO;
2057                 bmc->guid_attr.show = guid_show;
2058
2059                 bmc->aux_firmware_rev_attr.attr.name = "aux_firmware_revision";
2060                 bmc->aux_firmware_rev_attr.attr.owner = THIS_MODULE;
2061                 bmc->aux_firmware_rev_attr.attr.mode = S_IRUGO;
2062                 bmc->aux_firmware_rev_attr.show = aux_firmware_rev_show;
2063
2064                 device_create_file(&bmc->dev->dev,
2065                                    &bmc->device_id_attr);
2066                 device_create_file(&bmc->dev->dev,
2067                                    &bmc->provides_dev_sdrs_attr);
2068                 device_create_file(&bmc->dev->dev,
2069                                    &bmc->revision_attr);
2070                 device_create_file(&bmc->dev->dev,
2071                                    &bmc->firmware_rev_attr);
2072                 device_create_file(&bmc->dev->dev,
2073                                    &bmc->version_attr);
2074                 device_create_file(&bmc->dev->dev,
2075                                    &bmc->add_dev_support_attr);
2076                 device_create_file(&bmc->dev->dev,
2077                                    &bmc->manufacturer_id_attr);
2078                 device_create_file(&bmc->dev->dev,
2079                                    &bmc->product_id_attr);
2080                 if (bmc->id.aux_firmware_revision_set)
2081                         device_create_file(&bmc->dev->dev,
2082                                            &bmc->aux_firmware_rev_attr);
2083                 if (bmc->guid_set)
2084                         device_create_file(&bmc->dev->dev,
2085                                            &bmc->guid_attr);
2086
2087                 printk(KERN_INFO
2088                        "ipmi: Found new BMC (man_id: 0x%6.6x, "
2089                        " prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",
2090                        bmc->id.manufacturer_id,
2091                        bmc->id.product_id,
2092                        bmc->id.device_id);
2093         }
2094
2095         /*
2096          * create symlink from system interface device to bmc device
2097          * and back.
2098          */
2099         rv = sysfs_create_link(&intf->si_dev->kobj,
2100                                &bmc->dev->dev.kobj, "bmc");
2101         if (rv) {
2102                 printk(KERN_ERR
2103                        "ipmi_msghandler: Unable to create bmc symlink: %d\n",
2104                        rv);
2105                 goto out_err;
2106         }
2107
2108         size = snprintf(dummy, 0, "ipmi%d", intf->intf_num);
2109         intf->my_dev_name = kmalloc(size+1, GFP_KERNEL);
2110         if (!intf->my_dev_name) {
2111                 rv = -ENOMEM;
2112                 printk(KERN_ERR
2113                        "ipmi_msghandler: allocate link from BMC: %d\n",
2114                        rv);
2115                 goto out_err;
2116         }
2117         snprintf(intf->my_dev_name, size+1, "ipmi%d", intf->intf_num);
2118
2119         rv = sysfs_create_link(&bmc->dev->dev.kobj, &intf->si_dev->kobj,
2120                                intf->my_dev_name);
2121         if (rv) {
2122                 kfree(intf->my_dev_name);
2123                 intf->my_dev_name = NULL;
2124                 printk(KERN_ERR
2125                        "ipmi_msghandler:"
2126                        " Unable to create symlink to bmc: %d\n",
2127                        rv);
2128                 goto out_err;
2129         }
2130
2131         return 0;
2132
2133 out_err:
2134         ipmi_bmc_unregister(intf);
2135         return rv;
2136 }
2137
2138 static int
2139 send_guid_cmd(ipmi_smi_t intf, int chan)
2140 {
2141         struct kernel_ipmi_msg            msg;
2142         struct ipmi_system_interface_addr si;
2143
2144         si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
2145         si.channel = IPMI_BMC_CHANNEL;
2146         si.lun = 0;
2147
2148         msg.netfn = IPMI_NETFN_APP_REQUEST;
2149         msg.cmd = IPMI_GET_DEVICE_GUID_CMD;
2150         msg.data = NULL;
2151         msg.data_len = 0;
2152         return i_ipmi_request(NULL,
2153                               intf,
2154                               (struct ipmi_addr *) &si,
2155                               0,
2156                               &msg,
2157                               intf,
2158                               NULL,
2159                               NULL,
2160                               0,
2161                               intf->channels[0].address,
2162                               intf->channels[0].lun,
2163                               -1, 0);
2164 }
2165
2166 static void
2167 guid_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
2168 {
2169         if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
2170             || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE)
2171             || (msg->msg.cmd != IPMI_GET_DEVICE_GUID_CMD))
2172                 /* Not for me */
2173                 return;
2174
2175         if (msg->msg.data[0] != 0) {
2176                 /* Error from getting the GUID, the BMC doesn't have one. */
2177                 intf->bmc->guid_set = 0;
2178                 goto out;
2179         }
2180
2181         if (msg->msg.data_len < 17) {
2182                 intf->bmc->guid_set = 0;
2183                 printk(KERN_WARNING PFX
2184                        "guid_handler: The GUID response from the BMC was too"
2185                        " short, it was %d but should have been 17.  Assuming"
2186                        " GUID is not available.\n",
2187                        msg->msg.data_len);
2188                 goto out;
2189         }
2190
2191         memcpy(intf->bmc->guid, msg->msg.data, 16);
2192         intf->bmc->guid_set = 1;
2193  out:
2194         wake_up(&intf->waitq);
2195 }
2196
2197 static void
2198 get_guid(ipmi_smi_t intf)
2199 {
2200         int rv;
2201
2202         intf->bmc->guid_set = 0x2;
2203         intf->null_user_handler = guid_handler;
2204         rv = send_guid_cmd(intf, 0);
2205         if (rv)
2206                 /* Send failed, no GUID available. */
2207                 intf->bmc->guid_set = 0;
2208         wait_event(intf->waitq, intf->bmc->guid_set != 2);
2209         intf->null_user_handler = NULL;
2210 }
2211
2212 static int
2213 send_channel_info_cmd(ipmi_smi_t intf, int chan)
2214 {
2215         struct kernel_ipmi_msg            msg;
2216         unsigned char                     data[1];
2217         struct ipmi_system_interface_addr si;
2218
2219         si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
2220         si.channel = IPMI_BMC_CHANNEL;
2221         si.lun = 0;
2222
2223         msg.netfn = IPMI_NETFN_APP_REQUEST;
2224         msg.cmd = IPMI_GET_CHANNEL_INFO_CMD;
2225         msg.data = data;
2226         msg.data_len = 1;
2227         data[0] = chan;
2228         return i_ipmi_request(NULL,
2229                               intf,
2230                               (struct ipmi_addr *) &si,
2231                               0,
2232                               &msg,
2233                               intf,
2234                               NULL,
2235                               NULL,
2236                               0,
2237                               intf->channels[0].address,
2238                               intf->channels[0].lun,
2239                               -1, 0);
2240 }
2241
2242 static void
2243 channel_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
2244 {
2245         int rv = 0;
2246         int chan;
2247
2248         if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
2249             && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE)
2250             && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD))
2251         {
2252                 /* It's the one we want */
2253                 if (msg->msg.data[0] != 0) {
2254                         /* Got an error from the channel, just go on. */
2255
2256                         if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) {
2257                                 /* If the MC does not support this
2258                                    command, that is legal.  We just
2259                                    assume it has one IPMB at channel
2260                                    zero. */
2261                                 intf->channels[0].medium
2262                                         = IPMI_CHANNEL_MEDIUM_IPMB;
2263                                 intf->channels[0].protocol
2264                                         = IPMI_CHANNEL_PROTOCOL_IPMB;
2265                                 rv = -ENOSYS;
2266
2267                                 intf->curr_channel = IPMI_MAX_CHANNELS;
2268                                 wake_up(&intf->waitq);
2269                                 goto out;
2270                         }
2271                         goto next_channel;
2272                 }
2273                 if (msg->msg.data_len < 4) {
2274                         /* Message not big enough, just go on. */
2275                         goto next_channel;
2276                 }
2277                 chan = intf->curr_channel;
2278                 intf->channels[chan].medium = msg->msg.data[2] & 0x7f;
2279                 intf->channels[chan].protocol = msg->msg.data[3] & 0x1f;
2280
2281         next_channel:
2282                 intf->curr_channel++;
2283                 if (intf->curr_channel >= IPMI_MAX_CHANNELS)
2284                         wake_up(&intf->waitq);
2285                 else
2286                         rv = send_channel_info_cmd(intf, intf->curr_channel);
2287
2288                 if (rv) {
2289                         /* Got an error somehow, just give up. */
2290                         intf->curr_channel = IPMI_MAX_CHANNELS;
2291                         wake_up(&intf->waitq);
2292
2293                         printk(KERN_WARNING PFX
2294                                "Error sending channel information: %d\n",
2295                                rv);
2296                 }
2297         }
2298  out:
2299         return;
2300 }
2301
2302 int ipmi_register_smi(struct ipmi_smi_handlers *handlers,
2303                       void                     *send_info,
2304                       struct ipmi_device_id    *device_id,
2305                       struct device            *si_dev,
2306                       unsigned char            slave_addr)
2307 {
2308         int              i, j;
2309         int              rv;
2310         ipmi_smi_t       intf;
2311         unsigned long    flags;
2312         int              version_major;
2313         int              version_minor;
2314
2315         version_major = ipmi_version_major(device_id);
2316         version_minor = ipmi_version_minor(device_id);
2317
2318         /* Make sure the driver is actually initialized, this handles
2319            problems with initialization order. */
2320         if (!initialized) {
2321                 rv = ipmi_init_msghandler();
2322                 if (rv)
2323                         return rv;
2324                 /* The init code doesn't return an error if it was turned
2325                    off, but it won't initialize.  Check that. */
2326                 if (!initialized)
2327                         return -ENODEV;
2328         }
2329
2330         intf = kmalloc(sizeof(*intf), GFP_KERNEL);
2331         if (!intf)
2332                 return -ENOMEM;
2333         memset(intf, 0, sizeof(*intf));
2334         intf->bmc = kzalloc(sizeof(*intf->bmc), GFP_KERNEL);
2335         if (!intf->bmc) {
2336                 kfree(intf);
2337                 return -ENOMEM;
2338         }
2339         intf->intf_num = -1;
2340         kref_init(&intf->refcount);
2341         intf->bmc->id = *device_id;
2342         intf->si_dev = si_dev;
2343         for (j = 0; j < IPMI_MAX_CHANNELS; j++) {
2344                 intf->channels[j].address = IPMI_BMC_SLAVE_ADDR;
2345                 intf->channels[j].lun = 2;
2346         }
2347         if (slave_addr != 0)
2348                 intf->channels[0].address = slave_addr;
2349         INIT_LIST_HEAD(&intf->users);
2350         intf->handlers = handlers;
2351         intf->send_info = send_info;
2352         spin_lock_init(&intf->seq_lock);
2353         for (j = 0; j < IPMI_IPMB_NUM_SEQ; j++) {
2354                 intf->seq_table[j].inuse = 0;
2355                 intf->seq_table[j].seqid = 0;
2356         }
2357         intf->curr_seq = 0;
2358 #ifdef CONFIG_PROC_FS
2359         spin_lock_init(&intf->proc_entry_lock);
2360 #endif
2361         spin_lock_init(&intf->waiting_msgs_lock);
2362         INIT_LIST_HEAD(&intf->waiting_msgs);
2363         spin_lock_init(&intf->events_lock);
2364         INIT_LIST_HEAD(&intf->waiting_events);
2365         intf->waiting_events_count = 0;
2366         mutex_init(&intf->cmd_rcvrs_mutex);
2367         INIT_LIST_HEAD(&intf->cmd_rcvrs);
2368         init_waitqueue_head(&intf->waitq);
2369
2370         spin_lock_init(&intf->counter_lock);
2371         intf->proc_dir = NULL;
2372
2373         rv = -ENOMEM;
2374         spin_lock_irqsave(&interfaces_lock, flags);
2375         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
2376                 if (ipmi_interfaces[i] == NULL) {
2377                         intf->intf_num = i;
2378                         /* Reserve the entry till we are done. */
2379                         ipmi_interfaces[i] = IPMI_INVALID_INTERFACE_ENTRY;
2380                         rv = 0;
2381                         break;
2382                 }
2383         }
2384         spin_unlock_irqrestore(&interfaces_lock, flags);
2385         if (rv)
2386                 goto out;
2387
2388         rv = handlers->start_processing(send_info, intf);
2389         if (rv)
2390                 goto out;
2391
2392         get_guid(intf);
2393
2394         if ((version_major > 1)
2395             || ((version_major == 1) && (version_minor >= 5)))
2396         {
2397                 /* Start scanning the channels to see what is
2398                    available. */
2399                 intf->null_user_handler = channel_handler;
2400                 intf->curr_channel = 0;
2401                 rv = send_channel_info_cmd(intf, 0);
2402                 if (rv)
2403                         goto out;
2404
2405                 /* Wait for the channel info to be read. */
2406                 wait_event(intf->waitq,
2407                            intf->curr_channel >= IPMI_MAX_CHANNELS);
2408                 intf->null_user_handler = NULL;
2409         } else {
2410                 /* Assume a single IPMB channel at zero. */
2411                 intf->channels[0].medium = IPMI_CHANNEL_MEDIUM_IPMB;
2412                 intf->channels[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB;
2413         }
2414
2415         if (rv == 0)
2416                 rv = add_proc_entries(intf, i);
2417
2418         rv = ipmi_bmc_register(intf);
2419
2420  out:
2421         if (rv) {
2422                 if (intf->proc_dir)
2423                         remove_proc_entries(intf);
2424                 kref_put(&intf->refcount, intf_free);
2425                 if (i < MAX_IPMI_INTERFACES) {
2426                         spin_lock_irqsave(&interfaces_lock, flags);
2427                         ipmi_interfaces[i] = NULL;
2428                         spin_unlock_irqrestore(&interfaces_lock, flags);
2429                 }
2430         } else {
2431                 spin_lock_irqsave(&interfaces_lock, flags);
2432                 ipmi_interfaces[i] = intf;
2433                 spin_unlock_irqrestore(&interfaces_lock, flags);
2434                 call_smi_watchers(i, intf->si_dev);
2435         }
2436
2437         return rv;
2438 }
2439
2440 int ipmi_unregister_smi(ipmi_smi_t intf)
2441 {
2442         int                     i;
2443         struct ipmi_smi_watcher *w;
2444         unsigned long           flags;
2445
2446         ipmi_bmc_unregister(intf);
2447
2448         spin_lock_irqsave(&interfaces_lock, flags);
2449         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
2450                 if (ipmi_interfaces[i] == intf) {
2451                         /* Set the interface number reserved until we
2452                          * are done. */
2453                         ipmi_interfaces[i] = IPMI_INVALID_INTERFACE_ENTRY;
2454                         intf->intf_num = -1;
2455                         break;
2456                 }
2457         }
2458         spin_unlock_irqrestore(&interfaces_lock,flags);
2459
2460         if (i == MAX_IPMI_INTERFACES)
2461                 return -ENODEV;
2462
2463         remove_proc_entries(intf);
2464
2465         /* Call all the watcher interfaces to tell them that
2466            an interface is gone. */
2467         down_read(&smi_watchers_sem);
2468         list_for_each_entry(w, &smi_watchers, link)
2469                 w->smi_gone(i);
2470         up_read(&smi_watchers_sem);
2471
2472         /* Allow the entry to be reused now. */
2473         spin_lock_irqsave(&interfaces_lock, flags);
2474         ipmi_interfaces[i] = NULL;
2475         spin_unlock_irqrestore(&interfaces_lock,flags);
2476
2477         kref_put(&intf->refcount, intf_free);
2478         return 0;
2479 }
2480
2481 static int handle_ipmb_get_msg_rsp(ipmi_smi_t          intf,
2482                                    struct ipmi_smi_msg *msg)
2483 {
2484         struct ipmi_ipmb_addr ipmb_addr;
2485         struct ipmi_recv_msg  *recv_msg;
2486         unsigned long         flags;
2487
2488         
2489         /* This is 11, not 10, because the response must contain a
2490          * completion code. */
2491         if (msg->rsp_size < 11) {
2492                 /* Message not big enough, just ignore it. */
2493                 spin_lock_irqsave(&intf->counter_lock, flags);
2494                 intf->invalid_ipmb_responses++;
2495                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2496                 return 0;
2497         }
2498
2499         if (msg->rsp[2] != 0) {
2500                 /* An error getting the response, just ignore it. */
2501                 return 0;
2502         }
2503
2504         ipmb_addr.addr_type = IPMI_IPMB_ADDR_TYPE;
2505         ipmb_addr.slave_addr = msg->rsp[6];
2506         ipmb_addr.channel = msg->rsp[3] & 0x0f;
2507         ipmb_addr.lun = msg->rsp[7] & 3;
2508
2509         /* It's a response from a remote entity.  Look up the sequence
2510            number and handle the response. */
2511         if (intf_find_seq(intf,
2512                           msg->rsp[7] >> 2,
2513                           msg->rsp[3] & 0x0f,
2514                           msg->rsp[8],
2515                           (msg->rsp[4] >> 2) & (~1),
2516                           (struct ipmi_addr *) &(ipmb_addr),
2517                           &recv_msg))
2518         {
2519                 /* We were unable to find the sequence number,
2520                    so just nuke the message. */
2521                 spin_lock_irqsave(&intf->counter_lock, flags);
2522                 intf->unhandled_ipmb_responses++;
2523                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2524                 return 0;
2525         }
2526
2527         memcpy(recv_msg->msg_data,
2528                &(msg->rsp[9]),
2529                msg->rsp_size - 9);
2530         /* THe other fields matched, so no need to set them, except
2531            for netfn, which needs to be the response that was
2532            returned, not the request value. */
2533         recv_msg->msg.netfn = msg->rsp[4] >> 2;
2534         recv_msg->msg.data = recv_msg->msg_data;
2535         recv_msg->msg.data_len = msg->rsp_size - 10;
2536         recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
2537         spin_lock_irqsave(&intf->counter_lock, flags);
2538         intf->handled_ipmb_responses++;
2539         spin_unlock_irqrestore(&intf->counter_lock, flags);
2540         deliver_response(recv_msg);
2541
2542         return 0;
2543 }
2544
2545 static int handle_ipmb_get_msg_cmd(ipmi_smi_t          intf,
2546                                    struct ipmi_smi_msg *msg)
2547 {
2548         struct cmd_rcvr          *rcvr;
2549         int                      rv = 0;
2550         unsigned char            netfn;
2551         unsigned char            cmd;
2552         ipmi_user_t              user = NULL;
2553         struct ipmi_ipmb_addr    *ipmb_addr;
2554         struct ipmi_recv_msg     *recv_msg;
2555         unsigned long            flags;
2556
2557         if (msg->rsp_size < 10) {
2558                 /* Message not big enough, just ignore it. */
2559                 spin_lock_irqsave(&intf->counter_lock, flags);
2560                 intf->invalid_commands++;
2561                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2562                 return 0;
2563         }
2564
2565         if (msg->rsp[2] != 0) {
2566                 /* An error getting the response, just ignore it. */
2567                 return 0;
2568         }
2569
2570         netfn = msg->rsp[4] >> 2;
2571         cmd = msg->rsp[8];
2572
2573         rcu_read_lock();
2574         rcvr = find_cmd_rcvr(intf, netfn, cmd);
2575         if (rcvr) {
2576                 user = rcvr->user;
2577                 kref_get(&user->refcount);
2578         } else
2579                 user = NULL;
2580         rcu_read_unlock();
2581
2582         if (user == NULL) {
2583                 /* We didn't find a user, deliver an error response. */
2584                 spin_lock_irqsave(&intf->counter_lock, flags);
2585                 intf->unhandled_commands++;
2586                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2587
2588                 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
2589                 msg->data[1] = IPMI_SEND_MSG_CMD;
2590                 msg->data[2] = msg->rsp[3];
2591                 msg->data[3] = msg->rsp[6];
2592                 msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3);
2593                 msg->data[5] = ipmb_checksum(&(msg->data[3]), 2);
2594                 msg->data[6] = intf->channels[msg->rsp[3] & 0xf].address;
2595                 /* rqseq/lun */
2596                 msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3);
2597                 msg->data[8] = msg->rsp[8]; /* cmd */
2598                 msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE;
2599                 msg->data[10] = ipmb_checksum(&(msg->data[6]), 4);
2600                 msg->data_size = 11;
2601
2602 #ifdef DEBUG_MSGING
2603         {
2604                 int m;
2605                 printk("Invalid command:");
2606                 for (m = 0; m < msg->data_size; m++)
2607                         printk(" %2.2x", msg->data[m]);
2608                 printk("\n");
2609         }
2610 #endif
2611                 intf->handlers->sender(intf->send_info, msg, 0);
2612
2613                 rv = -1; /* We used the message, so return the value that
2614                             causes it to not be freed or queued. */
2615         } else {
2616                 /* Deliver the message to the user. */
2617                 spin_lock_irqsave(&intf->counter_lock, flags);
2618                 intf->handled_commands++;
2619                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2620
2621                 recv_msg = ipmi_alloc_recv_msg();
2622                 if (!recv_msg) {
2623                         /* We couldn't allocate memory for the
2624                            message, so requeue it for handling
2625                            later. */
2626                         rv = 1;
2627                         kref_put(&user->refcount, free_user);
2628                 } else {
2629                         /* Extract the source address from the data. */
2630                         ipmb_addr = (struct ipmi_ipmb_addr *) &recv_msg->addr;
2631                         ipmb_addr->addr_type = IPMI_IPMB_ADDR_TYPE;
2632                         ipmb_addr->slave_addr = msg->rsp[6];
2633                         ipmb_addr->lun = msg->rsp[7] & 3;
2634                         ipmb_addr->channel = msg->rsp[3] & 0xf;
2635
2636                         /* Extract the rest of the message information
2637                            from the IPMB header.*/
2638                         recv_msg->user = user;
2639                         recv_msg->recv_type = IPMI_CMD_RECV_TYPE;
2640                         recv_msg->msgid = msg->rsp[7] >> 2;
2641                         recv_msg->msg.netfn = msg->rsp[4] >> 2;
2642                         recv_msg->msg.cmd = msg->rsp[8];
2643                         recv_msg->msg.data = recv_msg->msg_data;
2644
2645                         /* We chop off 10, not 9 bytes because the checksum
2646                            at the end also needs to be removed. */
2647                         recv_msg->msg.data_len = msg->rsp_size - 10;
2648                         memcpy(recv_msg->msg_data,
2649                                &(msg->rsp[9]),
2650                                msg->rsp_size - 10);
2651                         deliver_response(recv_msg);
2652                 }
2653         }
2654
2655         return rv;
2656 }
2657
2658 static int handle_lan_get_msg_rsp(ipmi_smi_t          intf,
2659                                   struct ipmi_smi_msg *msg)
2660 {
2661         struct ipmi_lan_addr  lan_addr;
2662         struct ipmi_recv_msg  *recv_msg;
2663         unsigned long         flags;
2664
2665
2666         /* This is 13, not 12, because the response must contain a
2667          * completion code. */
2668         if (msg->rsp_size < 13) {
2669                 /* Message not big enough, just ignore it. */
2670                 spin_lock_irqsave(&intf->counter_lock, flags);
2671                 intf->invalid_lan_responses++;
2672                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2673                 return 0;
2674         }
2675
2676         if (msg->rsp[2] != 0) {
2677                 /* An error getting the response, just ignore it. */
2678                 return 0;
2679         }
2680
2681         lan_addr.addr_type = IPMI_LAN_ADDR_TYPE;
2682         lan_addr.session_handle = msg->rsp[4];
2683         lan_addr.remote_SWID = msg->rsp[8];
2684         lan_addr.local_SWID = msg->rsp[5];
2685         lan_addr.channel = msg->rsp[3] & 0x0f;
2686         lan_addr.privilege = msg->rsp[3] >> 4;
2687         lan_addr.lun = msg->rsp[9] & 3;
2688
2689         /* It's a response from a remote entity.  Look up the sequence
2690            number and handle the response. */
2691         if (intf_find_seq(intf,
2692                           msg->rsp[9] >> 2,
2693                           msg->rsp[3] & 0x0f,
2694                           msg->rsp[10],
2695                           (msg->rsp[6] >> 2) & (~1),
2696                           (struct ipmi_addr *) &(lan_addr),
2697                           &recv_msg))
2698         {
2699                 /* We were unable to find the sequence number,
2700                    so just nuke the message. */
2701                 spin_lock_irqsave(&intf->counter_lock, flags);
2702                 intf->unhandled_lan_responses++;
2703                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2704                 return 0;
2705         }
2706
2707         memcpy(recv_msg->msg_data,
2708                &(msg->rsp[11]),
2709                msg->rsp_size - 11);
2710         /* The other fields matched, so no need to set them, except
2711            for netfn, which needs to be the response that was
2712            returned, not the request value. */
2713         recv_msg->msg.netfn = msg->rsp[6] >> 2;
2714         recv_msg->msg.data = recv_msg->msg_data;
2715         recv_msg->msg.data_len = msg->rsp_size - 12;
2716         recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
2717         spin_lock_irqsave(&intf->counter_lock, flags);
2718         intf->handled_lan_responses++;
2719         spin_unlock_irqrestore(&intf->counter_lock, flags);
2720         deliver_response(recv_msg);
2721
2722         return 0;
2723 }
2724
2725 static int handle_lan_get_msg_cmd(ipmi_smi_t          intf,
2726                                   struct ipmi_smi_msg *msg)
2727 {
2728         struct cmd_rcvr          *rcvr;
2729         int                      rv = 0;
2730         unsigned char            netfn;
2731         unsigned char            cmd;
2732         ipmi_user_t              user = NULL;
2733         struct ipmi_lan_addr     *lan_addr;
2734         struct ipmi_recv_msg     *recv_msg;
2735         unsigned long            flags;
2736
2737         if (msg->rsp_size < 12) {
2738                 /* Message not big enough, just ignore it. */
2739                 spin_lock_irqsave(&intf->counter_lock, flags);
2740                 intf->invalid_commands++;
2741                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2742                 return 0;
2743         }
2744
2745         if (msg->rsp[2] != 0) {
2746                 /* An error getting the response, just ignore it. */
2747                 return 0;
2748         }
2749
2750         netfn = msg->rsp[6] >> 2;
2751         cmd = msg->rsp[10];
2752
2753         rcu_read_lock();
2754         rcvr = find_cmd_rcvr(intf, netfn, cmd);
2755         if (rcvr) {
2756                 user = rcvr->user;
2757                 kref_get(&user->refcount);
2758         } else
2759                 user = NULL;
2760         rcu_read_unlock();
2761
2762         if (user == NULL) {
2763                 /* We didn't find a user, just give up. */
2764                 spin_lock_irqsave(&intf->counter_lock, flags);
2765                 intf->unhandled_commands++;
2766                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2767
2768                 rv = 0; /* Don't do anything with these messages, just
2769                            allow them to be freed. */
2770         } else {
2771                 /* Deliver the message to the user. */
2772                 spin_lock_irqsave(&intf->counter_lock, flags);
2773                 intf->handled_commands++;
2774                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2775
2776                 recv_msg = ipmi_alloc_recv_msg();
2777                 if (!recv_msg) {
2778                         /* We couldn't allocate memory for the
2779                            message, so requeue it for handling
2780                            later. */
2781                         rv = 1;
2782                         kref_put(&user->refcount, free_user);
2783                 } else {
2784                         /* Extract the source address from the data. */
2785                         lan_addr = (struct ipmi_lan_addr *) &recv_msg->addr;
2786                         lan_addr->addr_type = IPMI_LAN_ADDR_TYPE;
2787                         lan_addr->session_handle = msg->rsp[4];
2788                         lan_addr->remote_SWID = msg->rsp[8];
2789                         lan_addr->local_SWID = msg->rsp[5];
2790                         lan_addr->lun = msg->rsp[9] & 3;
2791                         lan_addr->channel = msg->rsp[3] & 0xf;
2792                         lan_addr->privilege = msg->rsp[3] >> 4;
2793
2794                         /* Extract the rest of the message information
2795                            from the IPMB header.*/
2796                         recv_msg->user = user;
2797                         recv_msg->recv_type = IPMI_CMD_RECV_TYPE;
2798                         recv_msg->msgid = msg->rsp[9] >> 2;
2799                         recv_msg->msg.netfn = msg->rsp[6] >> 2;
2800                         recv_msg->msg.cmd = msg->rsp[10];
2801                         recv_msg->msg.data = recv_msg->msg_data;
2802
2803                         /* We chop off 12, not 11 bytes because the checksum
2804                            at the end also needs to be removed. */
2805                         recv_msg->msg.data_len = msg->rsp_size - 12;
2806                         memcpy(recv_msg->msg_data,
2807                                &(msg->rsp[11]),
2808                                msg->rsp_size - 12);
2809                         deliver_response(recv_msg);
2810                 }
2811         }
2812
2813         return rv;
2814 }
2815
2816 static void copy_event_into_recv_msg(struct ipmi_recv_msg *recv_msg,
2817                                      struct ipmi_smi_msg  *msg)
2818 {
2819         struct ipmi_system_interface_addr *smi_addr;
2820         
2821         recv_msg->msgid = 0;
2822         smi_addr = (struct ipmi_system_interface_addr *) &(recv_msg->addr);
2823         smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
2824         smi_addr->channel = IPMI_BMC_CHANNEL;
2825         smi_addr->lun = msg->rsp[0] & 3;
2826         recv_msg->recv_type = IPMI_ASYNC_EVENT_RECV_TYPE;
2827         recv_msg->msg.netfn = msg->rsp[0] >> 2;
2828         recv_msg->msg.cmd = msg->rsp[1];
2829         memcpy(recv_msg->msg_data, &(msg->rsp[3]), msg->rsp_size - 3);
2830         recv_msg->msg.data = recv_msg->msg_data;
2831         recv_msg->msg.data_len = msg->rsp_size - 3;
2832 }
2833
2834 static int handle_read_event_rsp(ipmi_smi_t          intf,
2835                                  struct ipmi_smi_msg *msg)
2836 {
2837         struct ipmi_recv_msg *recv_msg, *recv_msg2;
2838         struct list_head     msgs;
2839         ipmi_user_t          user;
2840         int                  rv = 0;
2841         int                  deliver_count = 0;
2842         unsigned long        flags;
2843
2844         if (msg->rsp_size < 19) {
2845                 /* Message is too small to be an IPMB event. */
2846                 spin_lock_irqsave(&intf->counter_lock, flags);
2847                 intf->invalid_events++;
2848                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2849                 return 0;
2850         }
2851
2852         if (msg->rsp[2] != 0) {
2853                 /* An error getting the event, just ignore it. */
2854                 return 0;
2855         }
2856
2857         INIT_LIST_HEAD(&msgs);
2858
2859         spin_lock_irqsave(&intf->events_lock, flags);
2860
2861         spin_lock(&intf->counter_lock);
2862         intf->events++;
2863         spin_unlock(&intf->counter_lock);
2864
2865         /* Allocate and fill in one message for every user that is getting
2866            events. */
2867         rcu_read_lock();
2868         list_for_each_entry_rcu(user, &intf->users, link) {
2869                 if (!user->gets_events)
2870                         continue;
2871
2872                 recv_msg = ipmi_alloc_recv_msg();
2873                 if (!recv_msg) {
2874                         rcu_read_unlock();
2875                         list_for_each_entry_safe(recv_msg, recv_msg2, &msgs,
2876                                                  link) {
2877                                 list_del(&recv_msg->link);
2878                                 ipmi_free_recv_msg(recv_msg);
2879                         }
2880                         /* We couldn't allocate memory for the
2881                            message, so requeue it for handling
2882                            later. */
2883                         rv = 1;
2884                         goto out;
2885                 }
2886
2887                 deliver_count++;
2888
2889                 copy_event_into_recv_msg(recv_msg, msg);
2890                 recv_msg->user = user;
2891                 kref_get(&user->refcount);
2892                 list_add_tail(&(recv_msg->link), &msgs);
2893         }
2894         rcu_read_unlock();
2895
2896         if (deliver_count) {
2897                 /* Now deliver all the messages. */
2898                 list_for_each_entry_safe(recv_msg, recv_msg2, &msgs, link) {
2899                         list_del(&recv_msg->link);
2900                         deliver_response(recv_msg);
2901                 }
2902         } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) {
2903                 /* No one to receive the message, put it in queue if there's
2904                    not already too many things in the queue. */
2905                 recv_msg = ipmi_alloc_recv_msg();
2906                 if (!recv_msg) {
2907                         /* We couldn't allocate memory for the
2908                            message, so requeue it for handling
2909                            later. */
2910                         rv = 1;
2911                         goto out;
2912                 }
2913
2914                 copy_event_into_recv_msg(recv_msg, msg);
2915                 list_add_tail(&(recv_msg->link), &(intf->waiting_events));
2916                 intf->waiting_events_count++;
2917         } else {
2918                 /* There's too many things in the queue, discard this
2919                    message. */
2920                 printk(KERN_WARNING PFX "Event queue full, discarding an"
2921                        " incoming event\n");
2922         }
2923
2924  out:
2925         spin_unlock_irqrestore(&(intf->events_lock), flags);
2926
2927         return rv;
2928 }
2929
2930 static int handle_bmc_rsp(ipmi_smi_t          intf,
2931                           struct ipmi_smi_msg *msg)
2932 {
2933         struct ipmi_recv_msg *recv_msg;
2934         unsigned long        flags;
2935         struct ipmi_user     *user;
2936
2937         recv_msg = (struct ipmi_recv_msg *) msg->user_data;
2938         if (recv_msg == NULL)
2939         {
2940                 printk(KERN_WARNING"IPMI message received with no owner. This\n"
2941                         "could be because of a malformed message, or\n"
2942                         "because of a hardware error.  Contact your\n"
2943                         "hardware vender for assistance\n");
2944                 return 0;
2945         }
2946
2947         user = recv_msg->user;
2948         /* Make sure the user still exists. */
2949         if (user && !user->valid) {
2950                 /* The user for the message went away, so give up. */
2951                 spin_lock_irqsave(&intf->counter_lock, flags);
2952                 intf->unhandled_local_responses++;
2953                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2954                 ipmi_free_recv_msg(recv_msg);
2955         } else {
2956                 struct ipmi_system_interface_addr *smi_addr;
2957
2958                 spin_lock_irqsave(&intf->counter_lock, flags);
2959                 intf->handled_local_responses++;
2960                 spin_unlock_irqrestore(&intf->counter_lock, flags);
2961                 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
2962                 recv_msg->msgid = msg->msgid;
2963                 smi_addr = ((struct ipmi_system_interface_addr *)
2964                             &(recv_msg->addr));
2965                 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
2966                 smi_addr->channel = IPMI_BMC_CHANNEL;
2967                 smi_addr->lun = msg->rsp[0] & 3;
2968                 recv_msg->msg.netfn = msg->rsp[0] >> 2;
2969                 recv_msg->msg.cmd = msg->rsp[1];
2970                 memcpy(recv_msg->msg_data,
2971                        &(msg->rsp[2]),
2972                        msg->rsp_size - 2);
2973                 recv_msg->msg.data = recv_msg->msg_data;
2974                 recv_msg->msg.data_len = msg->rsp_size - 2;
2975                 deliver_response(recv_msg);
2976         }
2977
2978         return 0;
2979 }
2980
2981 /* Handle a new message.  Return 1 if the message should be requeued,
2982    0 if the message should be freed, or -1 if the message should not
2983    be freed or requeued. */
2984 static int handle_new_recv_msg(ipmi_smi_t          intf,
2985                                struct ipmi_smi_msg *msg)
2986 {
2987         int requeue;
2988         int chan;
2989
2990 #ifdef DEBUG_MSGING
2991         int m;
2992         printk("Recv:");
2993         for (m = 0; m < msg->rsp_size; m++)
2994                 printk(" %2.2x", msg->rsp[m]);
2995         printk("\n");
2996 #endif
2997         if (msg->rsp_size < 2) {
2998                 /* Message is too small to be correct. */
2999                 printk(KERN_WARNING PFX "BMC returned to small a message"
3000                        " for netfn %x cmd %x, got %d bytes\n",
3001                        (msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size);
3002
3003                 /* Generate an error response for the message. */
3004                 msg->rsp[0] = msg->data[0] | (1 << 2);
3005                 msg->rsp[1] = msg->data[1];
3006                 msg->rsp[2] = IPMI_ERR_UNSPECIFIED;
3007                 msg->rsp_size = 3;
3008         } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1))/* Netfn */
3009                    || (msg->rsp[1] != msg->data[1]))              /* Command */
3010         {
3011                 /* The response is not even marginally correct. */
3012                 printk(KERN_WARNING PFX "BMC returned incorrect response,"
3013                        " expected netfn %x cmd %x, got netfn %x cmd %x\n",
3014                        (msg->data[0] >> 2) | 1, msg->data[1],
3015                        msg->rsp[0] >> 2, msg->rsp[1]);
3016
3017                 /* Generate an error response for the message. */
3018                 msg->rsp[0] = msg->data[0] | (1 << 2);
3019                 msg->rsp[1] = msg->data[1];
3020                 msg->rsp[2] = IPMI_ERR_UNSPECIFIED;
3021                 msg->rsp_size = 3;
3022         }
3023
3024         if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
3025             && (msg->rsp[1] == IPMI_SEND_MSG_CMD)
3026             && (msg->user_data != NULL))
3027         {
3028                 /* It's a response to a response we sent.  For this we
3029                    deliver a send message response to the user. */
3030                 struct ipmi_recv_msg     *recv_msg = msg->user_data;
3031
3032                 requeue = 0;
3033                 if (msg->rsp_size < 2)
3034                         /* Message is too small to be correct. */
3035                         goto out;
3036
3037                 chan = msg->data[2] & 0x0f;
3038                 if (chan >= IPMI_MAX_CHANNELS)
3039                         /* Invalid channel number */
3040                         goto out;
3041
3042                 if (!recv_msg)
3043                         goto out;
3044
3045                 /* Make sure the user still exists. */
3046                 if (!recv_msg->user || !recv_msg->user->valid)
3047                         goto out;
3048
3049                 recv_msg->recv_type = IPMI_RESPONSE_RESPONSE_TYPE;
3050                 recv_msg->msg.data = recv_msg->msg_data;
3051                 recv_msg->msg.data_len = 1;
3052                 recv_msg->msg_data[0] = msg->rsp[2];
3053                 deliver_response(recv_msg);
3054         } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
3055                    && (msg->rsp[1] == IPMI_GET_MSG_CMD))
3056         {
3057                 /* It's from the receive queue. */
3058                 chan = msg->rsp[3] & 0xf;
3059                 if (chan >= IPMI_MAX_CHANNELS) {
3060                         /* Invalid channel number */
3061                         requeue = 0;
3062                         goto out;
3063                 }
3064
3065                 switch (intf->channels[chan].medium) {
3066                 case IPMI_CHANNEL_MEDIUM_IPMB:
3067                         if (msg->rsp[4] & 0x04) {
3068                                 /* It's a response, so find the
3069                                    requesting message and send it up. */
3070                                 requeue = handle_ipmb_get_msg_rsp(intf, msg);
3071                         } else {
3072                                 /* It's a command to the SMS from some other
3073                                    entity.  Handle that. */
3074                                 requeue = handle_ipmb_get_msg_cmd(intf, msg);
3075                         }
3076                         break;
3077
3078                 case IPMI_CHANNEL_MEDIUM_8023LAN:
3079                 case IPMI_CHANNEL_MEDIUM_ASYNC:
3080                         if (msg->rsp[6] & 0x04) {
3081                                 /* It's a response, so find the
3082                                    requesting message and send it up. */
3083                                 requeue = handle_lan_get_msg_rsp(intf, msg);
3084                         } else {
3085                                 /* It's a command to the SMS from some other
3086                                    entity.  Handle that. */
3087                                 requeue = handle_lan_get_msg_cmd(intf, msg);
3088                         }
3089                         break;
3090
3091                 default:
3092                         /* We don't handle the channel type, so just
3093                          * free the message. */
3094                         requeue = 0;
3095                 }
3096
3097         } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
3098                    && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD))
3099         {
3100                 /* It's an asyncronous event. */
3101                 requeue = handle_read_event_rsp(intf, msg);
3102         } else {
3103                 /* It's a response from the local BMC. */
3104                 requeue = handle_bmc_rsp(intf, msg);
3105         }
3106
3107  out:
3108         return requeue;
3109 }
3110
3111 /* Handle a new message from the lower layer. */
3112 void ipmi_smi_msg_received(ipmi_smi_t          intf,
3113                            struct ipmi_smi_msg *msg)
3114 {
3115         unsigned long flags;
3116         int           rv;
3117
3118
3119         if ((msg->data_size >= 2)
3120             && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2))
3121             && (msg->data[1] == IPMI_SEND_MSG_CMD)
3122             && (msg->user_data == NULL))
3123         {
3124                 /* This is the local response to a command send, start
3125                    the timer for these.  The user_data will not be
3126                    NULL if this is a response send, and we will let
3127                    response sends just go through. */
3128
3129                 /* Check for errors, if we get certain errors (ones
3130                    that mean basically we can try again later), we
3131                    ignore them and start the timer.  Otherwise we
3132                    report the error immediately. */
3133                 if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0)
3134                     && (msg->rsp[2] != IPMI_NODE_BUSY_ERR)
3135                     && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR))
3136                 {
3137                         int chan = msg->rsp[3] & 0xf;
3138
3139                         /* Got an error sending the message, handle it. */
3140                         spin_lock_irqsave(&intf->counter_lock, flags);
3141                         if (chan >= IPMI_MAX_CHANNELS)
3142                                 ; /* This shouldn't happen */
3143                         else if ((intf->channels[chan].medium
3144                                   == IPMI_CHANNEL_MEDIUM_8023LAN)
3145                                  || (intf->channels[chan].medium
3146                                      == IPMI_CHANNEL_MEDIUM_ASYNC))
3147                                 intf->sent_lan_command_errs++;
3148                         else
3149                                 intf->sent_ipmb_command_errs++;
3150                         spin_unlock_irqrestore(&intf->counter_lock, flags);
3151                         intf_err_seq(intf, msg->msgid, msg->rsp[2]);
3152                 } else {
3153                         /* The message was sent, start the timer. */
3154                         intf_start_seq_timer(intf, msg->msgid);
3155                 }
3156
3157                 ipmi_free_smi_msg(msg);
3158                 goto out;
3159         }
3160
3161         /* To preserve message order, if the list is not empty, we
3162            tack this message onto the end of the list. */
3163         spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3164         if (!list_empty(&intf->waiting_msgs)) {
3165                 list_add_tail(&msg->link, &intf->waiting_msgs);
3166                 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3167                 goto out;
3168         }
3169         spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3170                 
3171         rv = handle_new_recv_msg(intf, msg);
3172         if (rv > 0) {
3173                 /* Could not handle the message now, just add it to a
3174                    list to handle later. */
3175                 spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3176                 list_add_tail(&msg->link, &intf->waiting_msgs);
3177                 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3178         } else if (rv == 0) {
3179                 ipmi_free_smi_msg(msg);
3180         }
3181
3182  out:
3183         return;
3184 }
3185
3186 void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf)
3187 {
3188         ipmi_user_t user;
3189
3190         rcu_read_lock();
3191         list_for_each_entry_rcu(user, &intf->users, link) {
3192                 if (!user->handler->ipmi_watchdog_pretimeout)
3193                         continue;
3194
3195                 user->handler->ipmi_watchdog_pretimeout(user->handler_data);
3196         }
3197         rcu_read_unlock();
3198 }
3199
3200 static void
3201 handle_msg_timeout(struct ipmi_recv_msg *msg)
3202 {
3203         msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
3204         msg->msg_data[0] = IPMI_TIMEOUT_COMPLETION_CODE;
3205         msg->msg.netfn |= 1; /* Convert to a response. */
3206         msg->msg.data_len = 1;
3207         msg->msg.data = msg->msg_data;
3208         deliver_response(msg);
3209 }
3210
3211 static struct ipmi_smi_msg *
3212 smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg,
3213                   unsigned char seq, long seqid)
3214 {
3215         struct ipmi_smi_msg *smi_msg = ipmi_alloc_smi_msg();
3216         if (!smi_msg)
3217                 /* If we can't allocate the message, then just return, we
3218                    get 4 retries, so this should be ok. */
3219                 return NULL;
3220
3221         memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len);
3222         smi_msg->data_size = recv_msg->msg.data_len;
3223         smi_msg->msgid = STORE_SEQ_IN_MSGID(seq, seqid);
3224                 
3225 #ifdef DEBUG_MSGING
3226         {
3227                 int m;
3228                 printk("Resend: ");
3229                 for (m = 0; m < smi_msg->data_size; m++)
3230                         printk(" %2.2x", smi_msg->data[m]);
3231                 printk("\n");
3232         }
3233 #endif
3234         return smi_msg;
3235 }
3236
3237 static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent,
3238                               struct list_head *timeouts, long timeout_period,
3239                               int slot, unsigned long *flags)
3240 {
3241         struct ipmi_recv_msg *msg;
3242
3243         if (!ent->inuse)
3244                 return;
3245
3246         ent->timeout -= timeout_period;
3247         if (ent->timeout > 0)
3248                 return;
3249
3250         if (ent->retries_left == 0) {
3251                 /* The message has used all its retries. */
3252                 ent->inuse = 0;
3253                 msg = ent->recv_msg;
3254                 list_add_tail(&msg->link, timeouts);
3255                 spin_lock(&intf->counter_lock);
3256                 if (ent->broadcast)
3257                         intf->timed_out_ipmb_broadcasts++;
3258                 else if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE)
3259                         intf->timed_out_lan_commands++;
3260                 else
3261                         intf->timed_out_ipmb_commands++;
3262                 spin_unlock(&intf->counter_lock);
3263         } else {
3264                 struct ipmi_smi_msg *smi_msg;
3265                 /* More retries, send again. */
3266
3267                 /* Start with the max timer, set to normal
3268                    timer after the message is sent. */
3269                 ent->timeout = MAX_MSG_TIMEOUT;
3270                 ent->retries_left--;
3271                 spin_lock(&intf->counter_lock);
3272                 if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE)
3273                         intf->retransmitted_lan_commands++;
3274                 else
3275                         intf->retransmitted_ipmb_commands++;
3276                 spin_unlock(&intf->counter_lock);
3277
3278                 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot,
3279                                             ent->seqid);
3280                 if (!smi_msg)
3281                         return;
3282
3283                 spin_unlock_irqrestore(&intf->seq_lock, *flags);
3284                 /* Send the new message.  We send with a zero
3285                  * priority.  It timed out, I doubt time is
3286                  * that critical now, and high priority
3287                  * messages are really only for messages to the
3288                  * local MC, which don't get resent. */
3289                 intf->handlers->sender(intf->send_info,
3290                                        smi_msg, 0);
3291                 spin_lock_irqsave(&intf->seq_lock, *flags);
3292         }
3293 }
3294
3295 static void ipmi_timeout_handler(long timeout_period)
3296 {
3297         ipmi_smi_t           intf;
3298         struct list_head     timeouts;
3299         struct ipmi_recv_msg *msg, *msg2;
3300         struct ipmi_smi_msg  *smi_msg, *smi_msg2;
3301         unsigned long        flags;
3302         int                  i, j;
3303
3304         INIT_LIST_HEAD(&timeouts);
3305
3306         spin_lock(&interfaces_lock);
3307         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
3308                 intf = ipmi_interfaces[i];
3309                 if (IPMI_INVALID_INTERFACE(intf))
3310                         continue;
3311                 kref_get(&intf->refcount);
3312                 spin_unlock(&interfaces_lock);
3313
3314                 /* See if any waiting messages need to be processed. */
3315                 spin_lock_irqsave(&intf->waiting_msgs_lock, flags);
3316                 list_for_each_entry_safe(smi_msg, smi_msg2,
3317                                          &intf->waiting_msgs, link) {
3318                         if (!handle_new_recv_msg(intf, smi_msg)) {
3319                                 list_del(&smi_msg->link);
3320                                 ipmi_free_smi_msg(smi_msg);
3321                         } else {
3322                                 /* To preserve message order, quit if we
3323                                    can't handle a message. */
3324                                 break;
3325                         }
3326                 }
3327                 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags);
3328
3329                 /* Go through the seq table and find any messages that
3330                    have timed out, putting them in the timeouts
3331                    list. */
3332                 spin_lock_irqsave(&intf->seq_lock, flags);
3333                 for (j = 0; j < IPMI_IPMB_NUM_SEQ; j++)
3334                         check_msg_timeout(intf, &(intf->seq_table[j]),
3335                                           &timeouts, timeout_period, j,
3336                                           &flags);
3337                 spin_unlock_irqrestore(&intf->seq_lock, flags);
3338
3339                 list_for_each_entry_safe(msg, msg2, &timeouts, link)
3340                         handle_msg_timeout(msg);
3341
3342                 kref_put(&intf->refcount, intf_free);
3343                 spin_lock(&interfaces_lock);
3344         }
3345         spin_unlock(&interfaces_lock);
3346 }
3347
3348 static void ipmi_request_event(void)
3349 {
3350         ipmi_smi_t intf;
3351         int        i;
3352
3353         spin_lock(&interfaces_lock);
3354         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
3355                 intf = ipmi_interfaces[i];
3356                 if (IPMI_INVALID_INTERFACE(intf))
3357                         continue;
3358
3359                 intf->handlers->request_events(intf->send_info);
3360         }
3361         spin_unlock(&interfaces_lock);
3362 }
3363
3364 static struct timer_list ipmi_timer;
3365
3366 /* Call every ~100 ms. */
3367 #define IPMI_TIMEOUT_TIME       100
3368
3369 /* How many jiffies does it take to get to the timeout time. */
3370 #define IPMI_TIMEOUT_JIFFIES    ((IPMI_TIMEOUT_TIME * HZ) / 1000)
3371
3372 /* Request events from the queue every second (this is the number of
3373    IPMI_TIMEOUT_TIMES between event requests).  Hopefully, in the
3374    future, IPMI will add a way to know immediately if an event is in
3375    the queue and this silliness can go away. */
3376 #define IPMI_REQUEST_EV_TIME    (1000 / (IPMI_TIMEOUT_TIME))
3377
3378 static atomic_t stop_operation;
3379 static unsigned int ticks_to_req_ev = IPMI_REQUEST_EV_TIME;
3380
3381 static void ipmi_timeout(unsigned long data)
3382 {
3383         if (atomic_read(&stop_operation))
3384                 return;
3385
3386         ticks_to_req_ev--;
3387         if (ticks_to_req_ev == 0) {
3388                 ipmi_request_event();
3389                 ticks_to_req_ev = IPMI_REQUEST_EV_TIME;
3390         }
3391
3392         ipmi_timeout_handler(IPMI_TIMEOUT_TIME);
3393
3394         mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
3395 }
3396
3397
3398 static atomic_t smi_msg_inuse_count = ATOMIC_INIT(0);
3399 static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0);
3400
3401 /* FIXME - convert these to slabs. */
3402 static void free_smi_msg(struct ipmi_smi_msg *msg)
3403 {
3404         atomic_dec(&smi_msg_inuse_count);
3405         kfree(msg);
3406 }
3407
3408 struct ipmi_smi_msg *ipmi_alloc_smi_msg(void)
3409 {
3410         struct ipmi_smi_msg *rv;
3411         rv = kmalloc(sizeof(struct ipmi_smi_msg), GFP_ATOMIC);
3412         if (rv) {
3413                 rv->done = free_smi_msg;
3414                 rv->user_data = NULL;
3415                 atomic_inc(&smi_msg_inuse_count);
3416         }
3417         return rv;
3418 }
3419
3420 static void free_recv_msg(struct ipmi_recv_msg *msg)
3421 {
3422         atomic_dec(&recv_msg_inuse_count);
3423         kfree(msg);
3424 }
3425
3426 struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)
3427 {
3428         struct ipmi_recv_msg *rv;
3429
3430         rv = kmalloc(sizeof(struct ipmi_recv_msg), GFP_ATOMIC);
3431         if (rv) {
3432                 rv->done = free_recv_msg;
3433                 atomic_inc(&recv_msg_inuse_count);
3434         }
3435         return rv;
3436 }
3437
3438 void ipmi_free_recv_msg(struct ipmi_recv_msg *msg)
3439 {
3440         if (msg->user)
3441                 kref_put(&msg->user->refcount, free_user);
3442         msg->done(msg);
3443 }
3444
3445 #ifdef CONFIG_IPMI_PANIC_EVENT
3446
3447 static void dummy_smi_done_handler(struct ipmi_smi_msg *msg)
3448 {
3449 }
3450
3451 static void dummy_recv_done_handler(struct ipmi_recv_msg *msg)
3452 {
3453 }
3454
3455 #ifdef CONFIG_IPMI_PANIC_STRING
3456 static void event_receiver_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
3457 {
3458         if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
3459             && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE)
3460             && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD)
3461             && (msg->msg.data[0] == IPMI_CC_NO_ERROR))
3462         {
3463                 /* A get event receiver command, save it. */
3464                 intf->event_receiver = msg->msg.data[1];
3465                 intf->event_receiver_lun = msg->msg.data[2] & 0x3;
3466         }
3467 }
3468
3469 static void device_id_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg)
3470 {
3471         if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)
3472             && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE)
3473             && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD)
3474             && (msg->msg.data[0] == IPMI_CC_NO_ERROR))
3475         {
3476                 /* A get device id command, save if we are an event
3477                    receiver or generator. */
3478                 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1;
3479                 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1;
3480         }
3481 }
3482 #endif
3483
3484 static void send_panic_events(char *str)
3485 {
3486         struct kernel_ipmi_msg            msg;
3487         ipmi_smi_t                        intf;
3488         unsigned char                     data[16];
3489         int                               i;
3490         struct ipmi_system_interface_addr *si;
3491         struct ipmi_addr                  addr;
3492         struct ipmi_smi_msg               smi_msg;
3493         struct ipmi_recv_msg              recv_msg;
3494
3495         si = (struct ipmi_system_interface_addr *) &addr;
3496         si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
3497         si->channel = IPMI_BMC_CHANNEL;
3498         si->lun = 0;
3499
3500         /* Fill in an event telling that we have failed. */
3501         msg.netfn = 0x04; /* Sensor or Event. */
3502         msg.cmd = 2; /* Platform event command. */
3503         msg.data = data;
3504         msg.data_len = 8;
3505         data[0] = 0x41; /* Kernel generator ID, IPMI table 5-4 */
3506         data[1] = 0x03; /* This is for IPMI 1.0. */
3507         data[2] = 0x20; /* OS Critical Stop, IPMI table 36-3 */
3508         data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */
3509         data[5] = 0xa1; /* Runtime stop OEM bytes 2 & 3. */
3510
3511         /* Put a few breadcrumbs in.  Hopefully later we can add more things
3512            to make the panic events more useful. */
3513         if (str) {
3514                 data[3] = str[0];
3515                 data[6] = str[1];
3516                 data[7] = str[2];
3517         }
3518
3519         smi_msg.done = dummy_smi_done_handler;
3520         recv_msg.done = dummy_recv_done_handler;
3521
3522         /* For every registered interface, send the event. */
3523         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
3524                 intf = ipmi_interfaces[i];
3525                 if (IPMI_INVALID_INTERFACE(intf))
3526                         continue;
3527
3528                 /* Send the event announcing the panic. */
3529                 intf->handlers->set_run_to_completion(intf->send_info, 1);
3530                 i_ipmi_request(NULL,
3531                                intf,
3532                                &addr,
3533                                0,
3534                                &msg,
3535                                intf,
3536                                &smi_msg,
3537                                &recv_msg,
3538                                0,
3539                                intf->channels[0].address,
3540                                intf->channels[0].lun,
3541                                0, 1); /* Don't retry, and don't wait. */
3542         }
3543
3544 #ifdef CONFIG_IPMI_PANIC_STRING
3545         /* On every interface, dump a bunch of OEM event holding the
3546            string. */
3547         if (!str) 
3548                 return;
3549
3550         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
3551                 char                  *p = str;
3552                 struct ipmi_ipmb_addr *ipmb;
3553                 int                   j;
3554
3555                 intf = ipmi_interfaces[i];
3556                 if (IPMI_INVALID_INTERFACE(intf))
3557                         continue;
3558
3559                 /* First job here is to figure out where to send the
3560                    OEM events.  There's no way in IPMI to send OEM
3561                    events using an event send command, so we have to
3562                    find the SEL to put them in and stick them in
3563                    there. */
3564
3565                 /* Get capabilities from the get device id. */
3566                 intf->local_sel_device = 0;
3567                 intf->local_event_generator = 0;
3568                 intf->event_receiver = 0;
3569
3570                 /* Request the device info from the local MC. */
3571                 msg.netfn = IPMI_NETFN_APP_REQUEST;
3572                 msg.cmd = IPMI_GET_DEVICE_ID_CMD;
3573                 msg.data = NULL;
3574                 msg.data_len = 0;
3575                 intf->null_user_handler = device_id_fetcher;
3576                 i_ipmi_request(NULL,
3577                                intf,
3578                                &addr,
3579                                0,
3580                                &msg,
3581                                intf,
3582                                &smi_msg,
3583                                &recv_msg,
3584                                0,
3585                                intf->channels[0].address,
3586                                intf->channels[0].lun,
3587                                0, 1); /* Don't retry, and don't wait. */
3588
3589                 if (intf->local_event_generator) {
3590                         /* Request the event receiver from the local MC. */
3591                         msg.netfn = IPMI_NETFN_SENSOR_EVENT_REQUEST;
3592                         msg.cmd = IPMI_GET_EVENT_RECEIVER_CMD;
3593                         msg.data = NULL;
3594                         msg.data_len = 0;
3595                         intf->null_user_handler = event_receiver_fetcher;
3596                         i_ipmi_request(NULL,
3597                                        intf,
3598                                        &addr,
3599                                        0,
3600                                        &msg,
3601                                        intf,
3602                                        &smi_msg,
3603                                        &recv_msg,
3604                                        0,
3605                                        intf->channels[0].address,
3606                                        intf->channels[0].lun,
3607                                        0, 1); /* no retry, and no wait. */
3608                 }
3609                 intf->null_user_handler = NULL;
3610
3611                 /* Validate the event receiver.  The low bit must not
3612                    be 1 (it must be a valid IPMB address), it cannot
3613                    be zero, and it must not be my address. */
3614                 if (((intf->event_receiver & 1) == 0)
3615                     && (intf->event_receiver != 0)
3616                     && (intf->event_receiver != intf->channels[0].address))
3617                 {
3618                         /* The event receiver is valid, send an IPMB
3619                            message. */
3620                         ipmb = (struct ipmi_ipmb_addr *) &addr;
3621                         ipmb->addr_type = IPMI_IPMB_ADDR_TYPE;
3622                         ipmb->channel = 0; /* FIXME - is this right? */
3623                         ipmb->lun = intf->event_receiver_lun;
3624                         ipmb->slave_addr = intf->event_receiver;
3625                 } else if (intf->local_sel_device) {
3626                         /* The event receiver was not valid (or was
3627                            me), but I am an SEL device, just dump it
3628                            in my SEL. */
3629                         si = (struct ipmi_system_interface_addr *) &addr;
3630                         si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
3631                         si->channel = IPMI_BMC_CHANNEL;
3632                         si->lun = 0;
3633                 } else
3634                         continue; /* No where to send the event. */
3635
3636                 
3637                 msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */
3638                 msg.cmd = IPMI_ADD_SEL_ENTRY_CMD;
3639                 msg.data = data;
3640                 msg.data_len = 16;
3641
3642                 j = 0;
3643                 while (*p) {
3644                         int size = strlen(p);
3645
3646                         if (size > 11)
3647                                 size = 11;
3648                         data[0] = 0;
3649                         data[1] = 0;
3650                         data[2] = 0xf0; /* OEM event without timestamp. */
3651                         data[3] = intf->channels[0].address;
3652                         data[4] = j++; /* sequence # */
3653                         /* Always give 11 bytes, so strncpy will fill
3654                            it with zeroes for me. */
3655                         strncpy(data+5, p, 11);
3656                         p += size;
3657
3658                         i_ipmi_request(NULL,
3659                                        intf,
3660                                        &addr,
3661                                        0,
3662                                        &msg,
3663                                        intf,
3664                                        &smi_msg,
3665                                        &recv_msg,
3666                                        0,
3667                                        intf->channels[0].address,
3668                                        intf->channels[0].lun,
3669                                        0, 1); /* no retry, and no wait. */
3670                 }
3671         }       
3672 #endif /* CONFIG_IPMI_PANIC_STRING */
3673 }
3674 #endif /* CONFIG_IPMI_PANIC_EVENT */
3675
3676 static int has_panicked = 0;
3677
3678 static int panic_event(struct notifier_block *this,
3679                        unsigned long         event,
3680                        void                  *ptr)
3681 {
3682         int        i;
3683         ipmi_smi_t intf;
3684
3685         if (has_panicked)
3686                 return NOTIFY_DONE;
3687         has_panicked = 1;
3688
3689         /* For every registered interface, set it to run to completion. */
3690         for (i = 0; i < MAX_IPMI_INTERFACES; i++) {
3691                 intf = ipmi_interfaces[i];
3692                 if (IPMI_INVALID_INTERFACE(intf))
3693                         continue;
3694
3695                 intf->handlers->set_run_to_completion(intf->send_info, 1);
3696         }
3697
3698 #ifdef CONFIG_IPMI_PANIC_EVENT
3699         send_panic_events(ptr);
3700 #endif
3701
3702         return NOTIFY_DONE;
3703 }
3704
3705 static struct notifier_block panic_block = {
3706         .notifier_call  = panic_event,
3707         .next           = NULL,
3708         .priority       = 200   /* priority: INT_MAX >= x >= 0 */
3709 };
3710
3711 static int ipmi_init_msghandler(void)
3712 {
3713         int i;
3714         int rv;
3715
3716         if (initialized)
3717                 return 0;
3718
3719         rv = driver_register(&ipmidriver);
3720         if (rv) {
3721                 printk(KERN_ERR PFX "Could not register IPMI driver\n");
3722                 return rv;
3723         }
3724
3725         printk(KERN_INFO "ipmi message handler version "
3726                IPMI_DRIVER_VERSION "\n");
3727
3728         for (i = 0; i < MAX_IPMI_INTERFACES; i++)
3729                 ipmi_interfaces[i] = NULL;
3730
3731 #ifdef CONFIG_PROC_FS
3732         proc_ipmi_root = proc_mkdir("ipmi", NULL);
3733         if (!proc_ipmi_root) {
3734             printk(KERN_ERR PFX "Unable to create IPMI proc dir");
3735             return -ENOMEM;
3736         }
3737
3738         proc_ipmi_root->owner = THIS_MODULE;
3739 #endif /* CONFIG_PROC_FS */
3740
3741         setup_timer(&ipmi_timer, ipmi_timeout, 0);
3742         mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
3743
3744         atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
3745
3746         initialized = 1;
3747
3748         return 0;
3749 }
3750
3751 static __init int ipmi_init_msghandler_mod(void)
3752 {
3753         ipmi_init_msghandler();
3754         return 0;
3755 }
3756
3757 static __exit void cleanup_ipmi(void)
3758 {
3759         int count;
3760
3761         if (!initialized)
3762                 return;
3763
3764         atomic_notifier_chain_unregister(&panic_notifier_list, &panic_block);
3765
3766         /* This can't be called if any interfaces exist, so no worry about
3767            shutting down the interfaces. */
3768
3769         /* Tell the timer to stop, then wait for it to stop.  This avoids
3770            problems with race conditions removing the timer here. */
3771         atomic_inc(&stop_operation);
3772         del_timer_sync(&ipmi_timer);
3773
3774 #ifdef CONFIG_PROC_FS
3775         remove_proc_entry(proc_ipmi_root->name, &proc_root);
3776 #endif /* CONFIG_PROC_FS */
3777
3778         driver_unregister(&ipmidriver);
3779
3780         initialized = 0;
3781
3782         /* Check for buffer leaks. */
3783         count = atomic_read(&smi_msg_inuse_count);
3784         if (count != 0)
3785                 printk(KERN_WARNING PFX "SMI message count %d at exit\n",
3786                        count);
3787         count = atomic_read(&recv_msg_inuse_count);
3788         if (count != 0)
3789                 printk(KERN_WARNING PFX "recv message count %d at exit\n",
3790                        count);
3791 }
3792 module_exit(cleanup_ipmi);
3793
3794 module_init(ipmi_init_msghandler_mod);
3795 MODULE_LICENSE("GPL");
3796 MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
3797 MODULE_DESCRIPTION("Incoming and outgoing message routing for an IPMI interface.");
3798 MODULE_VERSION(IPMI_DRIVER_VERSION);
3799
3800 EXPORT_SYMBOL(ipmi_create_user);
3801 EXPORT_SYMBOL(ipmi_destroy_user);
3802 EXPORT_SYMBOL(ipmi_get_version);
3803 EXPORT_SYMBOL(ipmi_request_settime);
3804 EXPORT_SYMBOL(ipmi_request_supply_msgs);
3805 EXPORT_SYMBOL(ipmi_register_smi);
3806 EXPORT_SYMBOL(ipmi_unregister_smi);
3807 EXPORT_SYMBOL(ipmi_register_for_cmd);
3808 EXPORT_SYMBOL(ipmi_unregister_for_cmd);
3809 EXPORT_SYMBOL(ipmi_smi_msg_received);
3810 EXPORT_SYMBOL(ipmi_smi_watchdog_pretimeout);
3811 EXPORT_SYMBOL(ipmi_alloc_smi_msg);
3812 EXPORT_SYMBOL(ipmi_addr_length);
3813 EXPORT_SYMBOL(ipmi_validate_addr);
3814 EXPORT_SYMBOL(ipmi_set_gets_events);
3815 EXPORT_SYMBOL(ipmi_smi_watcher_register);
3816 EXPORT_SYMBOL(ipmi_smi_watcher_unregister);
3817 EXPORT_SYMBOL(ipmi_set_my_address);
3818 EXPORT_SYMBOL(ipmi_get_my_address);
3819 EXPORT_SYMBOL(ipmi_set_my_LUN);
3820 EXPORT_SYMBOL(ipmi_get_my_LUN);
3821 EXPORT_SYMBOL(ipmi_smi_add_proc_entry);
3822 EXPORT_SYMBOL(ipmi_user_set_run_to_completion);
3823 EXPORT_SYMBOL(ipmi_free_recv_msg);