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