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