5568 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/*3 * ipmi_msghandler.c4 *5 * Incoming and outgoing message routing for an IPMI interface.6 *7 * Author: MontaVista Software, Inc.8 * Corey Minyard <minyard@mvista.com>9 * source@mvista.com10 *11 * Copyright 2002 MontaVista Software Inc.12 */13 14#define pr_fmt(fmt) "IPMI message handler: " fmt15#define dev_fmt(fmt) pr_fmt(fmt)16 17#include <linux/module.h>18#include <linux/errno.h>19#include <linux/panic_notifier.h>20#include <linux/poll.h>21#include <linux/sched.h>22#include <linux/seq_file.h>23#include <linux/spinlock.h>24#include <linux/mutex.h>25#include <linux/slab.h>26#include <linux/ipmi.h>27#include <linux/ipmi_smi.h>28#include <linux/notifier.h>29#include <linux/init.h>30#include <linux/proc_fs.h>31#include <linux/rcupdate.h>32#include <linux/interrupt.h>33#include <linux/moduleparam.h>34#include <linux/workqueue.h>35#include <linux/uuid.h>36#include <linux/nospec.h>37#include <linux/vmalloc.h>38#include <linux/delay.h>39 40#define IPMI_DRIVER_VERSION "39.2"41 42static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void);43static int ipmi_init_msghandler(void);44static void smi_recv_work(struct work_struct *t);45static void handle_new_recv_msgs(struct ipmi_smi *intf);46static void need_waiter(struct ipmi_smi *intf);47static int handle_one_recv_msg(struct ipmi_smi *intf,48 struct ipmi_smi_msg *msg);49 50static bool initialized;51static bool drvregistered;52 53/* Numbers in this enumerator should be mapped to ipmi_panic_event_str */54enum ipmi_panic_event_op {55 IPMI_SEND_PANIC_EVENT_NONE,56 IPMI_SEND_PANIC_EVENT,57 IPMI_SEND_PANIC_EVENT_STRING,58 IPMI_SEND_PANIC_EVENT_MAX59};60 61/* Indices in this array should be mapped to enum ipmi_panic_event_op */62static const char *const ipmi_panic_event_str[] = { "none", "event", "string", NULL };63 64#ifdef CONFIG_IPMI_PANIC_STRING65#define IPMI_PANIC_DEFAULT IPMI_SEND_PANIC_EVENT_STRING66#elif defined(CONFIG_IPMI_PANIC_EVENT)67#define IPMI_PANIC_DEFAULT IPMI_SEND_PANIC_EVENT68#else69#define IPMI_PANIC_DEFAULT IPMI_SEND_PANIC_EVENT_NONE70#endif71 72static enum ipmi_panic_event_op ipmi_send_panic_event = IPMI_PANIC_DEFAULT;73 74static int panic_op_write_handler(const char *val,75 const struct kernel_param *kp)76{77 char valcp[16];78 int e;79 80 strscpy(valcp, val, sizeof(valcp));81 e = match_string(ipmi_panic_event_str, -1, strstrip(valcp));82 if (e < 0)83 return e;84 85 ipmi_send_panic_event = e;86 return 0;87}88 89static int panic_op_read_handler(char *buffer, const struct kernel_param *kp)90{91 const char *event_str;92 93 if (ipmi_send_panic_event >= IPMI_SEND_PANIC_EVENT_MAX)94 event_str = "???";95 else96 event_str = ipmi_panic_event_str[ipmi_send_panic_event];97 98 return sprintf(buffer, "%s\n", event_str);99}100 101static const struct kernel_param_ops panic_op_ops = {102 .set = panic_op_write_handler,103 .get = panic_op_read_handler104};105module_param_cb(panic_op, &panic_op_ops, NULL, 0600);106MODULE_PARM_DESC(panic_op, "Sets if the IPMI driver will attempt to store panic information in the event log in the event of a panic. Set to 'none' for no, 'event' for a single event, or 'string' for a generic event and the panic string in IPMI OEM events.");107 108 109#define MAX_EVENTS_IN_QUEUE 25110 111/* Remain in auto-maintenance mode for this amount of time (in ms). */112static unsigned long maintenance_mode_timeout_ms = 30000;113module_param(maintenance_mode_timeout_ms, ulong, 0644);114MODULE_PARM_DESC(maintenance_mode_timeout_ms,115 "The time (milliseconds) after the last maintenance message that the connection stays in maintenance mode.");116 117/*118 * Don't let a message sit in a queue forever, always time it with at lest119 * the max message timer. This is in milliseconds.120 */121#define MAX_MSG_TIMEOUT 60000122 123/*124 * Timeout times below are in milliseconds, and are done off a 1125 * second timer. So setting the value to 1000 would mean anything126 * between 0 and 1000ms. So really the only reasonable minimum127 * setting it 2000ms, which is between 1 and 2 seconds.128 */129 130/* The default timeout for message retries. */131static unsigned long default_retry_ms = 2000;132module_param(default_retry_ms, ulong, 0644);133MODULE_PARM_DESC(default_retry_ms,134 "The time (milliseconds) between retry sends");135 136/* The default timeout for maintenance mode message retries. */137static unsigned long default_maintenance_retry_ms = 3000;138module_param(default_maintenance_retry_ms, ulong, 0644);139MODULE_PARM_DESC(default_maintenance_retry_ms,140 "The time (milliseconds) between retry sends in maintenance mode");141 142/* The default maximum number of retries */143static unsigned int default_max_retries = 4;144module_param(default_max_retries, uint, 0644);145MODULE_PARM_DESC(default_max_retries,146 "The time (milliseconds) between retry sends in maintenance mode");147 148/* The default maximum number of users that may register. */149static unsigned int max_users = 30;150module_param(max_users, uint, 0644);151MODULE_PARM_DESC(max_users,152 "The most users that may use the IPMI stack at one time.");153 154/* The default maximum number of message a user may have outstanding. */155static unsigned int max_msgs_per_user = 100;156module_param(max_msgs_per_user, uint, 0644);157MODULE_PARM_DESC(max_msgs_per_user,158 "The most message a user may have outstanding.");159 160/* Call every ~1000 ms. */161#define IPMI_TIMEOUT_TIME 1000162 163/* How many jiffies does it take to get to the timeout time. */164#define IPMI_TIMEOUT_JIFFIES ((IPMI_TIMEOUT_TIME * HZ) / 1000)165 166/*167 * Request events from the queue every second (this is the number of168 * IPMI_TIMEOUT_TIMES between event requests). Hopefully, in the169 * future, IPMI will add a way to know immediately if an event is in170 * the queue and this silliness can go away.171 */172#define IPMI_REQUEST_EV_TIME (1000 / (IPMI_TIMEOUT_TIME))173 174/* How long should we cache dynamic device IDs? */175#define IPMI_DYN_DEV_ID_EXPIRY (10 * HZ)176 177/*178 * The main "user" data structure.179 */180struct ipmi_user {181 struct list_head link;182 183 /*184 * Set to NULL when the user is destroyed, a pointer to myself185 * so srcu_dereference can be used on it.186 */187 struct ipmi_user *self;188 struct srcu_struct release_barrier;189 190 struct kref refcount;191 192 /* The upper layer that handles receive messages. */193 const struct ipmi_user_hndl *handler;194 void *handler_data;195 196 /* The interface this user is bound to. */197 struct ipmi_smi *intf;198 199 /* Does this interface receive IPMI events? */200 bool gets_events;201 202 atomic_t nr_msgs;203 204 /* Free must run in process context for RCU cleanup. */205 struct work_struct remove_work;206};207 208static struct workqueue_struct *remove_work_wq;209 210static struct ipmi_user *acquire_ipmi_user(struct ipmi_user *user, int *index)211 __acquires(user->release_barrier)212{213 struct ipmi_user *ruser;214 215 *index = srcu_read_lock(&user->release_barrier);216 ruser = srcu_dereference(user->self, &user->release_barrier);217 if (!ruser)218 srcu_read_unlock(&user->release_barrier, *index);219 return ruser;220}221 222static void release_ipmi_user(struct ipmi_user *user, int index)223{224 srcu_read_unlock(&user->release_barrier, index);225}226 227struct cmd_rcvr {228 struct list_head link;229 230 struct ipmi_user *user;231 unsigned char netfn;232 unsigned char cmd;233 unsigned int chans;234 235 /*236 * This is used to form a linked lised during mass deletion.237 * Since this is in an RCU list, we cannot use the link above238 * or change any data until the RCU period completes. So we239 * use this next variable during mass deletion so we can have240 * a list and don't have to wait and restart the search on241 * every individual deletion of a command.242 */243 struct cmd_rcvr *next;244};245 246struct seq_table {247 unsigned int inuse : 1;248 unsigned int broadcast : 1;249 250 unsigned long timeout;251 unsigned long orig_timeout;252 unsigned int retries_left;253 254 /*255 * To verify on an incoming send message response that this is256 * the message that the response is for, we keep a sequence id257 * and increment it every time we send a message.258 */259 long seqid;260 261 /*262 * This is held so we can properly respond to the message on a263 * timeout, and it is used to hold the temporary data for264 * retransmission, too.265 */266 struct ipmi_recv_msg *recv_msg;267};268 269/*270 * Store the information in a msgid (long) to allow us to find a271 * sequence table entry from the msgid.272 */273#define STORE_SEQ_IN_MSGID(seq, seqid) \274 ((((seq) & 0x3f) << 26) | ((seqid) & 0x3ffffff))275 276#define GET_SEQ_FROM_MSGID(msgid, seq, seqid) \277 do { \278 seq = (((msgid) >> 26) & 0x3f); \279 seqid = ((msgid) & 0x3ffffff); \280 } while (0)281 282#define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3ffffff)283 284#define IPMI_MAX_CHANNELS 16285struct ipmi_channel {286 unsigned char medium;287 unsigned char protocol;288};289 290struct ipmi_channel_set {291 struct ipmi_channel c[IPMI_MAX_CHANNELS];292};293 294struct ipmi_my_addrinfo {295 /*296 * My slave address. This is initialized to IPMI_BMC_SLAVE_ADDR,297 * but may be changed by the user.298 */299 unsigned char address;300 301 /*302 * My LUN. This should generally stay the SMS LUN, but just in303 * case...304 */305 unsigned char lun;306};307 308/*309 * Note that the product id, manufacturer id, guid, and device id are310 * immutable in this structure, so dyn_mutex is not required for311 * accessing those. If those change on a BMC, a new BMC is allocated.312 */313struct bmc_device {314 struct platform_device pdev;315 struct list_head intfs; /* Interfaces on this BMC. */316 struct ipmi_device_id id;317 struct ipmi_device_id fetch_id;318 int dyn_id_set;319 unsigned long dyn_id_expiry;320 struct mutex dyn_mutex; /* Protects id, intfs, & dyn* */321 guid_t guid;322 guid_t fetch_guid;323 int dyn_guid_set;324 struct kref usecount;325 struct work_struct remove_work;326 unsigned char cc; /* completion code */327};328#define to_bmc_device(x) container_of((x), struct bmc_device, pdev.dev)329 330static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc,331 struct ipmi_device_id *id,332 bool *guid_set, guid_t *guid);333 334/*335 * Various statistics for IPMI, these index stats[] in the ipmi_smi336 * structure.337 */338enum ipmi_stat_indexes {339 /* Commands we got from the user that were invalid. */340 IPMI_STAT_sent_invalid_commands = 0,341 342 /* Commands we sent to the MC. */343 IPMI_STAT_sent_local_commands,344 345 /* Responses from the MC that were delivered to a user. */346 IPMI_STAT_handled_local_responses,347 348 /* Responses from the MC that were not delivered to a user. */349 IPMI_STAT_unhandled_local_responses,350 351 /* Commands we sent out to the IPMB bus. */352 IPMI_STAT_sent_ipmb_commands,353 354 /* Commands sent on the IPMB that had errors on the SEND CMD */355 IPMI_STAT_sent_ipmb_command_errs,356 357 /* Each retransmit increments this count. */358 IPMI_STAT_retransmitted_ipmb_commands,359 360 /*361 * When a message times out (runs out of retransmits) this is362 * incremented.363 */364 IPMI_STAT_timed_out_ipmb_commands,365 366 /*367 * This is like above, but for broadcasts. Broadcasts are368 * *not* included in the above count (they are expected to369 * time out).370 */371 IPMI_STAT_timed_out_ipmb_broadcasts,372 373 /* Responses I have sent to the IPMB bus. */374 IPMI_STAT_sent_ipmb_responses,375 376 /* The response was delivered to the user. */377 IPMI_STAT_handled_ipmb_responses,378 379 /* The response had invalid data in it. */380 IPMI_STAT_invalid_ipmb_responses,381 382 /* The response didn't have anyone waiting for it. */383 IPMI_STAT_unhandled_ipmb_responses,384 385 /* Commands we sent out to the IPMB bus. */386 IPMI_STAT_sent_lan_commands,387 388 /* Commands sent on the IPMB that had errors on the SEND CMD */389 IPMI_STAT_sent_lan_command_errs,390 391 /* Each retransmit increments this count. */392 IPMI_STAT_retransmitted_lan_commands,393 394 /*395 * When a message times out (runs out of retransmits) this is396 * incremented.397 */398 IPMI_STAT_timed_out_lan_commands,399 400 /* Responses I have sent to the IPMB bus. */401 IPMI_STAT_sent_lan_responses,402 403 /* The response was delivered to the user. */404 IPMI_STAT_handled_lan_responses,405 406 /* The response had invalid data in it. */407 IPMI_STAT_invalid_lan_responses,408 409 /* The response didn't have anyone waiting for it. */410 IPMI_STAT_unhandled_lan_responses,411 412 /* The command was delivered to the user. */413 IPMI_STAT_handled_commands,414 415 /* The command had invalid data in it. */416 IPMI_STAT_invalid_commands,417 418 /* The command didn't have anyone waiting for it. */419 IPMI_STAT_unhandled_commands,420 421 /* Invalid data in an event. */422 IPMI_STAT_invalid_events,423 424 /* Events that were received with the proper format. */425 IPMI_STAT_events,426 427 /* Retransmissions on IPMB that failed. */428 IPMI_STAT_dropped_rexmit_ipmb_commands,429 430 /* Retransmissions on LAN that failed. */431 IPMI_STAT_dropped_rexmit_lan_commands,432 433 /* This *must* remain last, add new values above this. */434 IPMI_NUM_STATS435};436 437 438#define IPMI_IPMB_NUM_SEQ 64439struct ipmi_smi {440 struct module *owner;441 442 /* What interface number are we? */443 int intf_num;444 445 struct kref refcount;446 447 /* Set when the interface is being unregistered. */448 bool in_shutdown;449 450 /* Used for a list of interfaces. */451 struct list_head link;452 453 /*454 * The list of upper layers that are using me. seq_lock write455 * protects this. Read protection is with srcu.456 */457 struct list_head users;458 struct srcu_struct users_srcu;459 atomic_t nr_users;460 struct device_attribute nr_users_devattr;461 struct device_attribute nr_msgs_devattr;462 463 464 /* Used for wake ups at startup. */465 wait_queue_head_t waitq;466 467 /*468 * Prevents the interface from being unregistered when the469 * interface is used by being looked up through the BMC470 * structure.471 */472 struct mutex bmc_reg_mutex;473 474 struct bmc_device tmp_bmc;475 struct bmc_device *bmc;476 bool bmc_registered;477 struct list_head bmc_link;478 char *my_dev_name;479 bool in_bmc_register; /* Handle recursive situations. Yuck. */480 struct work_struct bmc_reg_work;481 482 const struct ipmi_smi_handlers *handlers;483 void *send_info;484 485 /* Driver-model device for the system interface. */486 struct device *si_dev;487 488 /*489 * A table of sequence numbers for this interface. We use the490 * sequence numbers for IPMB messages that go out of the491 * interface to match them up with their responses. A routine492 * is called periodically to time the items in this list.493 */494 spinlock_t seq_lock;495 struct seq_table seq_table[IPMI_IPMB_NUM_SEQ];496 int curr_seq;497 498 /*499 * Messages queued for delivery. If delivery fails (out of memory500 * for instance), They will stay in here to be processed later in a501 * periodic timer interrupt. The workqueue is for handling received502 * messages directly from the handler.503 */504 spinlock_t waiting_rcv_msgs_lock;505 struct list_head waiting_rcv_msgs;506 atomic_t watchdog_pretimeouts_to_deliver;507 struct work_struct recv_work;508 509 spinlock_t xmit_msgs_lock;510 struct list_head xmit_msgs;511 struct ipmi_smi_msg *curr_msg;512 struct list_head hp_xmit_msgs;513 514 /*515 * The list of command receivers that are registered for commands516 * on this interface.517 */518 struct mutex cmd_rcvrs_mutex;519 struct list_head cmd_rcvrs;520 521 /*522 * Events that were queues because no one was there to receive523 * them.524 */525 spinlock_t events_lock; /* For dealing with event stuff. */526 struct list_head waiting_events;527 unsigned int waiting_events_count; /* How many events in queue? */528 char delivering_events;529 char event_msg_printed;530 531 /* How many users are waiting for events? */532 atomic_t event_waiters;533 unsigned int ticks_to_req_ev;534 535 spinlock_t watch_lock; /* For dealing with watch stuff below. */536 537 /* How many users are waiting for commands? */538 unsigned int command_waiters;539 540 /* How many users are waiting for watchdogs? */541 unsigned int watchdog_waiters;542 543 /* How many users are waiting for message responses? */544 unsigned int response_waiters;545 546 /*547 * Tells what the lower layer has last been asked to watch for,548 * messages and/or watchdogs. Protected by watch_lock.549 */550 unsigned int last_watch_mask;551 552 /*553 * The event receiver for my BMC, only really used at panic554 * shutdown as a place to store this.555 */556 unsigned char event_receiver;557 unsigned char event_receiver_lun;558 unsigned char local_sel_device;559 unsigned char local_event_generator;560 561 /* For handling of maintenance mode. */562 int maintenance_mode;563 bool maintenance_mode_enable;564 int auto_maintenance_timeout;565 spinlock_t maintenance_mode_lock; /* Used in a timer... */566 567 /*568 * If we are doing maintenance on something on IPMB, extend569 * the timeout time to avoid timeouts writing firmware and570 * such.571 */572 int ipmb_maintenance_mode_timeout;573 574 /*575 * A cheap hack, if this is non-null and a message to an576 * interface comes in with a NULL user, call this routine with577 * it. Note that the message will still be freed by the578 * caller. This only works on the system interface.579 *580 * Protected by bmc_reg_mutex.581 */582 void (*null_user_handler)(struct ipmi_smi *intf,583 struct ipmi_recv_msg *msg);584 585 /*586 * When we are scanning the channels for an SMI, this will587 * tell which channel we are scanning.588 */589 int curr_channel;590 591 /* Channel information */592 struct ipmi_channel_set *channel_list;593 unsigned int curr_working_cset; /* First index into the following. */594 struct ipmi_channel_set wchannels[2];595 struct ipmi_my_addrinfo addrinfo[IPMI_MAX_CHANNELS];596 bool channels_ready;597 598 atomic_t stats[IPMI_NUM_STATS];599 600 /*601 * run_to_completion duplicate of smb_info, smi_info602 * and ipmi_serial_info structures. Used to decrease numbers of603 * parameters passed by "low" level IPMI code.604 */605 int run_to_completion;606};607#define to_si_intf_from_dev(device) container_of(device, struct ipmi_smi, dev)608 609static void __get_guid(struct ipmi_smi *intf);610static void __ipmi_bmc_unregister(struct ipmi_smi *intf);611static int __ipmi_bmc_register(struct ipmi_smi *intf,612 struct ipmi_device_id *id,613 bool guid_set, guid_t *guid, int intf_num);614static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id);615 616 617/*618 * The driver model view of the IPMI messaging driver.619 */620static struct platform_driver ipmidriver = {621 .driver = {622 .name = "ipmi",623 .bus = &platform_bus_type624 }625};626/*627 * This mutex keeps us from adding the same BMC twice.628 */629static DEFINE_MUTEX(ipmidriver_mutex);630 631static LIST_HEAD(ipmi_interfaces);632static DEFINE_MUTEX(ipmi_interfaces_mutex);633#define ipmi_interfaces_mutex_held() \634 lockdep_is_held(&ipmi_interfaces_mutex)635static struct srcu_struct ipmi_interfaces_srcu;636 637/*638 * List of watchers that want to know when smi's are added and deleted.639 */640static LIST_HEAD(smi_watchers);641static DEFINE_MUTEX(smi_watchers_mutex);642 643#define ipmi_inc_stat(intf, stat) \644 atomic_inc(&(intf)->stats[IPMI_STAT_ ## stat])645#define ipmi_get_stat(intf, stat) \646 ((unsigned int) atomic_read(&(intf)->stats[IPMI_STAT_ ## stat]))647 648static const char * const addr_src_to_str[] = {649 "invalid", "hotmod", "hardcoded", "SPMI", "ACPI", "SMBIOS", "PCI",650 "device-tree", "platform"651};652 653const char *ipmi_addr_src_to_str(enum ipmi_addr_src src)654{655 if (src >= SI_LAST)656 src = 0; /* Invalid */657 return addr_src_to_str[src];658}659EXPORT_SYMBOL(ipmi_addr_src_to_str);660 661static int is_lan_addr(struct ipmi_addr *addr)662{663 return addr->addr_type == IPMI_LAN_ADDR_TYPE;664}665 666static int is_ipmb_addr(struct ipmi_addr *addr)667{668 return addr->addr_type == IPMI_IPMB_ADDR_TYPE;669}670 671static int is_ipmb_bcast_addr(struct ipmi_addr *addr)672{673 return addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE;674}675 676static int is_ipmb_direct_addr(struct ipmi_addr *addr)677{678 return addr->addr_type == IPMI_IPMB_DIRECT_ADDR_TYPE;679}680 681static void free_recv_msg_list(struct list_head *q)682{683 struct ipmi_recv_msg *msg, *msg2;684 685 list_for_each_entry_safe(msg, msg2, q, link) {686 list_del(&msg->link);687 ipmi_free_recv_msg(msg);688 }689}690 691static void free_smi_msg_list(struct list_head *q)692{693 struct ipmi_smi_msg *msg, *msg2;694 695 list_for_each_entry_safe(msg, msg2, q, link) {696 list_del(&msg->link);697 ipmi_free_smi_msg(msg);698 }699}700 701static void clean_up_interface_data(struct ipmi_smi *intf)702{703 int i;704 struct cmd_rcvr *rcvr, *rcvr2;705 struct list_head list;706 707 cancel_work_sync(&intf->recv_work);708 709 free_smi_msg_list(&intf->waiting_rcv_msgs);710 free_recv_msg_list(&intf->waiting_events);711 712 /*713 * Wholesale remove all the entries from the list in the714 * interface and wait for RCU to know that none are in use.715 */716 mutex_lock(&intf->cmd_rcvrs_mutex);717 INIT_LIST_HEAD(&list);718 list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu);719 mutex_unlock(&intf->cmd_rcvrs_mutex);720 721 list_for_each_entry_safe(rcvr, rcvr2, &list, link)722 kfree(rcvr);723 724 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {725 if ((intf->seq_table[i].inuse)726 && (intf->seq_table[i].recv_msg))727 ipmi_free_recv_msg(intf->seq_table[i].recv_msg);728 }729}730 731static void intf_free(struct kref *ref)732{733 struct ipmi_smi *intf = container_of(ref, struct ipmi_smi, refcount);734 735 clean_up_interface_data(intf);736 kfree(intf);737}738 739int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher)740{741 struct ipmi_smi *intf;742 int index, rv;743 744 /*745 * Make sure the driver is actually initialized, this handles746 * problems with initialization order.747 */748 rv = ipmi_init_msghandler();749 if (rv)750 return rv;751 752 mutex_lock(&smi_watchers_mutex);753 754 list_add(&watcher->link, &smi_watchers);755 756 index = srcu_read_lock(&ipmi_interfaces_srcu);757 list_for_each_entry_rcu(intf, &ipmi_interfaces, link,758 lockdep_is_held(&smi_watchers_mutex)) {759 int intf_num = READ_ONCE(intf->intf_num);760 761 if (intf_num == -1)762 continue;763 watcher->new_smi(intf_num, intf->si_dev);764 }765 srcu_read_unlock(&ipmi_interfaces_srcu, index);766 767 mutex_unlock(&smi_watchers_mutex);768 769 return 0;770}771EXPORT_SYMBOL(ipmi_smi_watcher_register);772 773int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher)774{775 mutex_lock(&smi_watchers_mutex);776 list_del(&watcher->link);777 mutex_unlock(&smi_watchers_mutex);778 return 0;779}780EXPORT_SYMBOL(ipmi_smi_watcher_unregister);781 782/*783 * Must be called with smi_watchers_mutex held.784 */785static void786call_smi_watchers(int i, struct device *dev)787{788 struct ipmi_smi_watcher *w;789 790 mutex_lock(&smi_watchers_mutex);791 list_for_each_entry(w, &smi_watchers, link) {792 if (try_module_get(w->owner)) {793 w->new_smi(i, dev);794 module_put(w->owner);795 }796 }797 mutex_unlock(&smi_watchers_mutex);798}799 800static int801ipmi_addr_equal(struct ipmi_addr *addr1, struct ipmi_addr *addr2)802{803 if (addr1->addr_type != addr2->addr_type)804 return 0;805 806 if (addr1->channel != addr2->channel)807 return 0;808 809 if (addr1->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {810 struct ipmi_system_interface_addr *smi_addr1811 = (struct ipmi_system_interface_addr *) addr1;812 struct ipmi_system_interface_addr *smi_addr2813 = (struct ipmi_system_interface_addr *) addr2;814 return (smi_addr1->lun == smi_addr2->lun);815 }816 817 if (is_ipmb_addr(addr1) || is_ipmb_bcast_addr(addr1)) {818 struct ipmi_ipmb_addr *ipmb_addr1819 = (struct ipmi_ipmb_addr *) addr1;820 struct ipmi_ipmb_addr *ipmb_addr2821 = (struct ipmi_ipmb_addr *) addr2;822 823 return ((ipmb_addr1->slave_addr == ipmb_addr2->slave_addr)824 && (ipmb_addr1->lun == ipmb_addr2->lun));825 }826 827 if (is_ipmb_direct_addr(addr1)) {828 struct ipmi_ipmb_direct_addr *daddr1829 = (struct ipmi_ipmb_direct_addr *) addr1;830 struct ipmi_ipmb_direct_addr *daddr2831 = (struct ipmi_ipmb_direct_addr *) addr2;832 833 return daddr1->slave_addr == daddr2->slave_addr &&834 daddr1->rq_lun == daddr2->rq_lun &&835 daddr1->rs_lun == daddr2->rs_lun;836 }837 838 if (is_lan_addr(addr1)) {839 struct ipmi_lan_addr *lan_addr1840 = (struct ipmi_lan_addr *) addr1;841 struct ipmi_lan_addr *lan_addr2842 = (struct ipmi_lan_addr *) addr2;843 844 return ((lan_addr1->remote_SWID == lan_addr2->remote_SWID)845 && (lan_addr1->local_SWID == lan_addr2->local_SWID)846 && (lan_addr1->session_handle847 == lan_addr2->session_handle)848 && (lan_addr1->lun == lan_addr2->lun));849 }850 851 return 1;852}853 854int ipmi_validate_addr(struct ipmi_addr *addr, int len)855{856 if (len < sizeof(struct ipmi_system_interface_addr))857 return -EINVAL;858 859 if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {860 if (addr->channel != IPMI_BMC_CHANNEL)861 return -EINVAL;862 return 0;863 }864 865 if ((addr->channel == IPMI_BMC_CHANNEL)866 || (addr->channel >= IPMI_MAX_CHANNELS)867 || (addr->channel < 0))868 return -EINVAL;869 870 if (is_ipmb_addr(addr) || is_ipmb_bcast_addr(addr)) {871 if (len < sizeof(struct ipmi_ipmb_addr))872 return -EINVAL;873 return 0;874 }875 876 if (is_ipmb_direct_addr(addr)) {877 struct ipmi_ipmb_direct_addr *daddr = (void *) addr;878 879 if (addr->channel != 0)880 return -EINVAL;881 if (len < sizeof(struct ipmi_ipmb_direct_addr))882 return -EINVAL;883 884 if (daddr->slave_addr & 0x01)885 return -EINVAL;886 if (daddr->rq_lun >= 4)887 return -EINVAL;888 if (daddr->rs_lun >= 4)889 return -EINVAL;890 return 0;891 }892 893 if (is_lan_addr(addr)) {894 if (len < sizeof(struct ipmi_lan_addr))895 return -EINVAL;896 return 0;897 }898 899 return -EINVAL;900}901EXPORT_SYMBOL(ipmi_validate_addr);902 903unsigned int ipmi_addr_length(int addr_type)904{905 if (addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)906 return sizeof(struct ipmi_system_interface_addr);907 908 if ((addr_type == IPMI_IPMB_ADDR_TYPE)909 || (addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))910 return sizeof(struct ipmi_ipmb_addr);911 912 if (addr_type == IPMI_IPMB_DIRECT_ADDR_TYPE)913 return sizeof(struct ipmi_ipmb_direct_addr);914 915 if (addr_type == IPMI_LAN_ADDR_TYPE)916 return sizeof(struct ipmi_lan_addr);917 918 return 0;919}920EXPORT_SYMBOL(ipmi_addr_length);921 922static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)923{924 int rv = 0;925 926 if (!msg->user) {927 /* Special handling for NULL users. */928 if (intf->null_user_handler) {929 intf->null_user_handler(intf, msg);930 } else {931 /* No handler, so give up. */932 rv = -EINVAL;933 }934 ipmi_free_recv_msg(msg);935 } else if (oops_in_progress) {936 /*937 * If we are running in the panic context, calling the938 * receive handler doesn't much meaning and has a deadlock939 * risk. At this moment, simply skip it in that case.940 */941 ipmi_free_recv_msg(msg);942 atomic_dec(&msg->user->nr_msgs);943 } else {944 int index;945 struct ipmi_user *user = acquire_ipmi_user(msg->user, &index);946 947 if (user) {948 atomic_dec(&user->nr_msgs);949 user->handler->ipmi_recv_hndl(msg, user->handler_data);950 release_ipmi_user(user, index);951 } else {952 /* User went away, give up. */953 ipmi_free_recv_msg(msg);954 rv = -EINVAL;955 }956 }957 958 return rv;959}960 961static void deliver_local_response(struct ipmi_smi *intf,962 struct ipmi_recv_msg *msg)963{964 if (deliver_response(intf, msg))965 ipmi_inc_stat(intf, unhandled_local_responses);966 else967 ipmi_inc_stat(intf, handled_local_responses);968}969 970static void deliver_err_response(struct ipmi_smi *intf,971 struct ipmi_recv_msg *msg, int err)972{973 msg->recv_type = IPMI_RESPONSE_RECV_TYPE;974 msg->msg_data[0] = err;975 msg->msg.netfn |= 1; /* Convert to a response. */976 msg->msg.data_len = 1;977 msg->msg.data = msg->msg_data;978 deliver_local_response(intf, msg);979}980 981static void smi_add_watch(struct ipmi_smi *intf, unsigned int flags)982{983 unsigned long iflags;984 985 if (!intf->handlers->set_need_watch)986 return;987 988 spin_lock_irqsave(&intf->watch_lock, iflags);989 if (flags & IPMI_WATCH_MASK_CHECK_MESSAGES)990 intf->response_waiters++;991 992 if (flags & IPMI_WATCH_MASK_CHECK_WATCHDOG)993 intf->watchdog_waiters++;994 995 if (flags & IPMI_WATCH_MASK_CHECK_COMMANDS)996 intf->command_waiters++;997 998 if ((intf->last_watch_mask & flags) != flags) {999 intf->last_watch_mask |= flags;1000 intf->handlers->set_need_watch(intf->send_info,1001 intf->last_watch_mask);1002 }1003 spin_unlock_irqrestore(&intf->watch_lock, iflags);1004}1005 1006static void smi_remove_watch(struct ipmi_smi *intf, unsigned int flags)1007{1008 unsigned long iflags;1009 1010 if (!intf->handlers->set_need_watch)1011 return;1012 1013 spin_lock_irqsave(&intf->watch_lock, iflags);1014 if (flags & IPMI_WATCH_MASK_CHECK_MESSAGES)1015 intf->response_waiters--;1016 1017 if (flags & IPMI_WATCH_MASK_CHECK_WATCHDOG)1018 intf->watchdog_waiters--;1019 1020 if (flags & IPMI_WATCH_MASK_CHECK_COMMANDS)1021 intf->command_waiters--;1022 1023 flags = 0;1024 if (intf->response_waiters)1025 flags |= IPMI_WATCH_MASK_CHECK_MESSAGES;1026 if (intf->watchdog_waiters)1027 flags |= IPMI_WATCH_MASK_CHECK_WATCHDOG;1028 if (intf->command_waiters)1029 flags |= IPMI_WATCH_MASK_CHECK_COMMANDS;1030 1031 if (intf->last_watch_mask != flags) {1032 intf->last_watch_mask = flags;1033 intf->handlers->set_need_watch(intf->send_info,1034 intf->last_watch_mask);1035 }1036 spin_unlock_irqrestore(&intf->watch_lock, iflags);1037}1038 1039/*1040 * Find the next sequence number not being used and add the given1041 * message with the given timeout to the sequence table. This must be1042 * called with the interface's seq_lock held.1043 */1044static int intf_next_seq(struct ipmi_smi *intf,1045 struct ipmi_recv_msg *recv_msg,1046 unsigned long timeout,1047 int retries,1048 int broadcast,1049 unsigned char *seq,1050 long *seqid)1051{1052 int rv = 0;1053 unsigned int i;1054 1055 if (timeout == 0)1056 timeout = default_retry_ms;1057 if (retries < 0)1058 retries = default_max_retries;1059 1060 for (i = intf->curr_seq; (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq;1061 i = (i+1)%IPMI_IPMB_NUM_SEQ) {1062 if (!intf->seq_table[i].inuse)1063 break;1064 }1065 1066 if (!intf->seq_table[i].inuse) {1067 intf->seq_table[i].recv_msg = recv_msg;1068 1069 /*1070 * Start with the maximum timeout, when the send response1071 * comes in we will start the real timer.1072 */1073 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT;1074 intf->seq_table[i].orig_timeout = timeout;1075 intf->seq_table[i].retries_left = retries;1076 intf->seq_table[i].broadcast = broadcast;1077 intf->seq_table[i].inuse = 1;1078 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid);1079 *seq = i;1080 *seqid = intf->seq_table[i].seqid;1081 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ;1082 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES);1083 need_waiter(intf);1084 } else {1085 rv = -EAGAIN;1086 }1087 1088 return rv;1089}1090 1091/*1092 * Return the receive message for the given sequence number and1093 * release the sequence number so it can be reused. Some other data1094 * is passed in to be sure the message matches up correctly (to help1095 * guard against message coming in after their timeout and the1096 * sequence number being reused).1097 */1098static int intf_find_seq(struct ipmi_smi *intf,1099 unsigned char seq,1100 short channel,1101 unsigned char cmd,1102 unsigned char netfn,1103 struct ipmi_addr *addr,1104 struct ipmi_recv_msg **recv_msg)1105{1106 int rv = -ENODEV;1107 unsigned long flags;1108 1109 if (seq >= IPMI_IPMB_NUM_SEQ)1110 return -EINVAL;1111 1112 spin_lock_irqsave(&intf->seq_lock, flags);1113 if (intf->seq_table[seq].inuse) {1114 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg;1115 1116 if ((msg->addr.channel == channel) && (msg->msg.cmd == cmd)1117 && (msg->msg.netfn == netfn)1118 && (ipmi_addr_equal(addr, &msg->addr))) {1119 *recv_msg = msg;1120 intf->seq_table[seq].inuse = 0;1121 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES);1122 rv = 0;1123 }1124 }1125 spin_unlock_irqrestore(&intf->seq_lock, flags);1126 1127 return rv;1128}1129 1130 1131/* Start the timer for a specific sequence table entry. */1132static int intf_start_seq_timer(struct ipmi_smi *intf,1133 long msgid)1134{1135 int rv = -ENODEV;1136 unsigned long flags;1137 unsigned char seq;1138 unsigned long seqid;1139 1140 1141 GET_SEQ_FROM_MSGID(msgid, seq, seqid);1142 1143 spin_lock_irqsave(&intf->seq_lock, flags);1144 /*1145 * We do this verification because the user can be deleted1146 * while a message is outstanding.1147 */1148 if ((intf->seq_table[seq].inuse)1149 && (intf->seq_table[seq].seqid == seqid)) {1150 struct seq_table *ent = &intf->seq_table[seq];1151 ent->timeout = ent->orig_timeout;1152 rv = 0;1153 }1154 spin_unlock_irqrestore(&intf->seq_lock, flags);1155 1156 return rv;1157}1158 1159/* Got an error for the send message for a specific sequence number. */1160static int intf_err_seq(struct ipmi_smi *intf,1161 long msgid,1162 unsigned int err)1163{1164 int rv = -ENODEV;1165 unsigned long flags;1166 unsigned char seq;1167 unsigned long seqid;1168 struct ipmi_recv_msg *msg = NULL;1169 1170 1171 GET_SEQ_FROM_MSGID(msgid, seq, seqid);1172 1173 spin_lock_irqsave(&intf->seq_lock, flags);1174 /*1175 * We do this verification because the user can be deleted1176 * while a message is outstanding.1177 */1178 if ((intf->seq_table[seq].inuse)1179 && (intf->seq_table[seq].seqid == seqid)) {1180 struct seq_table *ent = &intf->seq_table[seq];1181 1182 ent->inuse = 0;1183 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES);1184 msg = ent->recv_msg;1185 rv = 0;1186 }1187 spin_unlock_irqrestore(&intf->seq_lock, flags);1188 1189 if (msg)1190 deliver_err_response(intf, msg, err);1191 1192 return rv;1193}1194 1195static void free_user_work(struct work_struct *work)1196{1197 struct ipmi_user *user = container_of(work, struct ipmi_user,1198 remove_work);1199 1200 cleanup_srcu_struct(&user->release_barrier);1201 vfree(user);1202}1203 1204int ipmi_create_user(unsigned int if_num,1205 const struct ipmi_user_hndl *handler,1206 void *handler_data,1207 struct ipmi_user **user)1208{1209 unsigned long flags;1210 struct ipmi_user *new_user;1211 int rv, index;1212 struct ipmi_smi *intf;1213 1214 /*1215 * There is no module usecount here, because it's not1216 * required. Since this can only be used by and called from1217 * other modules, they will implicitly use this module, and1218 * thus this can't be removed unless the other modules are1219 * removed.1220 */1221 1222 if (handler == NULL)1223 return -EINVAL;1224 1225 /*1226 * Make sure the driver is actually initialized, this handles1227 * problems with initialization order.1228 */1229 rv = ipmi_init_msghandler();1230 if (rv)1231 return rv;1232 1233 new_user = vzalloc(sizeof(*new_user));1234 if (!new_user)1235 return -ENOMEM;1236 1237 index = srcu_read_lock(&ipmi_interfaces_srcu);1238 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {1239 if (intf->intf_num == if_num)1240 goto found;1241 }1242 /* Not found, return an error */1243 rv = -EINVAL;1244 goto out_kfree;1245 1246 found:1247 if (atomic_add_return(1, &intf->nr_users) > max_users) {1248 rv = -EBUSY;1249 goto out_kfree;1250 }1251 1252 INIT_WORK(&new_user->remove_work, free_user_work);1253 1254 rv = init_srcu_struct(&new_user->release_barrier);1255 if (rv)1256 goto out_kfree;1257 1258 if (!try_module_get(intf->owner)) {1259 rv = -ENODEV;1260 goto out_kfree;1261 }1262 1263 /* Note that each existing user holds a refcount to the interface. */1264 kref_get(&intf->refcount);1265 1266 atomic_set(&new_user->nr_msgs, 0);1267 kref_init(&new_user->refcount);1268 new_user->handler = handler;1269 new_user->handler_data = handler_data;1270 new_user->intf = intf;1271 new_user->gets_events = false;1272 1273 rcu_assign_pointer(new_user->self, new_user);1274 spin_lock_irqsave(&intf->seq_lock, flags);1275 list_add_rcu(&new_user->link, &intf->users);1276 spin_unlock_irqrestore(&intf->seq_lock, flags);1277 if (handler->ipmi_watchdog_pretimeout)1278 /* User wants pretimeouts, so make sure to watch for them. */1279 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG);1280 srcu_read_unlock(&ipmi_interfaces_srcu, index);1281 *user = new_user;1282 return 0;1283 1284out_kfree:1285 atomic_dec(&intf->nr_users);1286 srcu_read_unlock(&ipmi_interfaces_srcu, index);1287 vfree(new_user);1288 return rv;1289}1290EXPORT_SYMBOL(ipmi_create_user);1291 1292int ipmi_get_smi_info(int if_num, struct ipmi_smi_info *data)1293{1294 int rv, index;1295 struct ipmi_smi *intf;1296 1297 index = srcu_read_lock(&ipmi_interfaces_srcu);1298 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {1299 if (intf->intf_num == if_num)1300 goto found;1301 }1302 srcu_read_unlock(&ipmi_interfaces_srcu, index);1303 1304 /* Not found, return an error */1305 return -EINVAL;1306 1307found:1308 if (!intf->handlers->get_smi_info)1309 rv = -ENOTTY;1310 else1311 rv = intf->handlers->get_smi_info(intf->send_info, data);1312 srcu_read_unlock(&ipmi_interfaces_srcu, index);1313 1314 return rv;1315}1316EXPORT_SYMBOL(ipmi_get_smi_info);1317 1318static void free_user(struct kref *ref)1319{1320 struct ipmi_user *user = container_of(ref, struct ipmi_user, refcount);1321 1322 /* SRCU cleanup must happen in workqueue context. */1323 queue_work(remove_work_wq, &user->remove_work);1324}1325 1326static void _ipmi_destroy_user(struct ipmi_user *user)1327{1328 struct ipmi_smi *intf = user->intf;1329 int i;1330 unsigned long flags;1331 struct cmd_rcvr *rcvr;1332 struct cmd_rcvr *rcvrs = NULL;1333 struct module *owner;1334 1335 if (!acquire_ipmi_user(user, &i)) {1336 /*1337 * The user has already been cleaned up, just make sure1338 * nothing is using it and return.1339 */1340 synchronize_srcu(&user->release_barrier);1341 return;1342 }1343 1344 rcu_assign_pointer(user->self, NULL);1345 release_ipmi_user(user, i);1346 1347 synchronize_srcu(&user->release_barrier);1348 1349 if (user->handler->shutdown)1350 user->handler->shutdown(user->handler_data);1351 1352 if (user->handler->ipmi_watchdog_pretimeout)1353 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG);1354 1355 if (user->gets_events)1356 atomic_dec(&intf->event_waiters);1357 1358 /* Remove the user from the interface's sequence table. */1359 spin_lock_irqsave(&intf->seq_lock, flags);1360 list_del_rcu(&user->link);1361 atomic_dec(&intf->nr_users);1362 1363 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {1364 if (intf->seq_table[i].inuse1365 && (intf->seq_table[i].recv_msg->user == user)) {1366 intf->seq_table[i].inuse = 0;1367 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES);1368 ipmi_free_recv_msg(intf->seq_table[i].recv_msg);1369 }1370 }1371 spin_unlock_irqrestore(&intf->seq_lock, flags);1372 1373 /*1374 * Remove the user from the command receiver's table. First1375 * we build a list of everything (not using the standard link,1376 * since other things may be using it till we do1377 * synchronize_srcu()) then free everything in that list.1378 */1379 mutex_lock(&intf->cmd_rcvrs_mutex);1380 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,1381 lockdep_is_held(&intf->cmd_rcvrs_mutex)) {1382 if (rcvr->user == user) {1383 list_del_rcu(&rcvr->link);1384 rcvr->next = rcvrs;1385 rcvrs = rcvr;1386 }1387 }1388 mutex_unlock(&intf->cmd_rcvrs_mutex);1389 synchronize_rcu();1390 while (rcvrs) {1391 rcvr = rcvrs;1392 rcvrs = rcvr->next;1393 kfree(rcvr);1394 }1395 1396 owner = intf->owner;1397 kref_put(&intf->refcount, intf_free);1398 module_put(owner);1399}1400 1401int ipmi_destroy_user(struct ipmi_user *user)1402{1403 _ipmi_destroy_user(user);1404 1405 kref_put(&user->refcount, free_user);1406 1407 return 0;1408}1409EXPORT_SYMBOL(ipmi_destroy_user);1410 1411int ipmi_get_version(struct ipmi_user *user,1412 unsigned char *major,1413 unsigned char *minor)1414{1415 struct ipmi_device_id id;1416 int rv, index;1417 1418 user = acquire_ipmi_user(user, &index);1419 if (!user)1420 return -ENODEV;1421 1422 rv = bmc_get_device_id(user->intf, NULL, &id, NULL, NULL);1423 if (!rv) {1424 *major = ipmi_version_major(&id);1425 *minor = ipmi_version_minor(&id);1426 }1427 release_ipmi_user(user, index);1428 1429 return rv;1430}1431EXPORT_SYMBOL(ipmi_get_version);1432 1433int ipmi_set_my_address(struct ipmi_user *user,1434 unsigned int channel,1435 unsigned char address)1436{1437 int index, rv = 0;1438 1439 user = acquire_ipmi_user(user, &index);1440 if (!user)1441 return -ENODEV;1442 1443 if (channel >= IPMI_MAX_CHANNELS) {1444 rv = -EINVAL;1445 } else {1446 channel = array_index_nospec(channel, IPMI_MAX_CHANNELS);1447 user->intf->addrinfo[channel].address = address;1448 }1449 release_ipmi_user(user, index);1450 1451 return rv;1452}1453EXPORT_SYMBOL(ipmi_set_my_address);1454 1455int ipmi_get_my_address(struct ipmi_user *user,1456 unsigned int channel,1457 unsigned char *address)1458{1459 int index, rv = 0;1460 1461 user = acquire_ipmi_user(user, &index);1462 if (!user)1463 return -ENODEV;1464 1465 if (channel >= IPMI_MAX_CHANNELS) {1466 rv = -EINVAL;1467 } else {1468 channel = array_index_nospec(channel, IPMI_MAX_CHANNELS);1469 *address = user->intf->addrinfo[channel].address;1470 }1471 release_ipmi_user(user, index);1472 1473 return rv;1474}1475EXPORT_SYMBOL(ipmi_get_my_address);1476 1477int ipmi_set_my_LUN(struct ipmi_user *user,1478 unsigned int channel,1479 unsigned char LUN)1480{1481 int index, rv = 0;1482 1483 user = acquire_ipmi_user(user, &index);1484 if (!user)1485 return -ENODEV;1486 1487 if (channel >= IPMI_MAX_CHANNELS) {1488 rv = -EINVAL;1489 } else {1490 channel = array_index_nospec(channel, IPMI_MAX_CHANNELS);1491 user->intf->addrinfo[channel].lun = LUN & 0x3;1492 }1493 release_ipmi_user(user, index);1494 1495 return rv;1496}1497EXPORT_SYMBOL(ipmi_set_my_LUN);1498 1499int ipmi_get_my_LUN(struct ipmi_user *user,1500 unsigned int channel,1501 unsigned char *address)1502{1503 int index, rv = 0;1504 1505 user = acquire_ipmi_user(user, &index);1506 if (!user)1507 return -ENODEV;1508 1509 if (channel >= IPMI_MAX_CHANNELS) {1510 rv = -EINVAL;1511 } else {1512 channel = array_index_nospec(channel, IPMI_MAX_CHANNELS);1513 *address = user->intf->addrinfo[channel].lun;1514 }1515 release_ipmi_user(user, index);1516 1517 return rv;1518}1519EXPORT_SYMBOL(ipmi_get_my_LUN);1520 1521int ipmi_get_maintenance_mode(struct ipmi_user *user)1522{1523 int mode, index;1524 unsigned long flags;1525 1526 user = acquire_ipmi_user(user, &index);1527 if (!user)1528 return -ENODEV;1529 1530 spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags);1531 mode = user->intf->maintenance_mode;1532 spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags);1533 release_ipmi_user(user, index);1534 1535 return mode;1536}1537EXPORT_SYMBOL(ipmi_get_maintenance_mode);1538 1539static void maintenance_mode_update(struct ipmi_smi *intf)1540{1541 if (intf->handlers->set_maintenance_mode)1542 intf->handlers->set_maintenance_mode(1543 intf->send_info, intf->maintenance_mode_enable);1544}1545 1546int ipmi_set_maintenance_mode(struct ipmi_user *user, int mode)1547{1548 int rv = 0, index;1549 unsigned long flags;1550 struct ipmi_smi *intf = user->intf;1551 1552 user = acquire_ipmi_user(user, &index);1553 if (!user)1554 return -ENODEV;1555 1556 spin_lock_irqsave(&intf->maintenance_mode_lock, flags);1557 if (intf->maintenance_mode != mode) {1558 switch (mode) {1559 case IPMI_MAINTENANCE_MODE_AUTO:1560 intf->maintenance_mode_enable1561 = (intf->auto_maintenance_timeout > 0);1562 break;1563 1564 case IPMI_MAINTENANCE_MODE_OFF:1565 intf->maintenance_mode_enable = false;1566 break;1567 1568 case IPMI_MAINTENANCE_MODE_ON:1569 intf->maintenance_mode_enable = true;1570 break;1571 1572 default:1573 rv = -EINVAL;1574 goto out_unlock;1575 }1576 intf->maintenance_mode = mode;1577 1578 maintenance_mode_update(intf);1579 }1580 out_unlock:1581 spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags);1582 release_ipmi_user(user, index);1583 1584 return rv;1585}1586EXPORT_SYMBOL(ipmi_set_maintenance_mode);1587 1588int ipmi_set_gets_events(struct ipmi_user *user, bool val)1589{1590 unsigned long flags;1591 struct ipmi_smi *intf = user->intf;1592 struct ipmi_recv_msg *msg, *msg2;1593 struct list_head msgs;1594 int index;1595 1596 user = acquire_ipmi_user(user, &index);1597 if (!user)1598 return -ENODEV;1599 1600 INIT_LIST_HEAD(&msgs);1601 1602 spin_lock_irqsave(&intf->events_lock, flags);1603 if (user->gets_events == val)1604 goto out;1605 1606 user->gets_events = val;1607 1608 if (val) {1609 if (atomic_inc_return(&intf->event_waiters) == 1)1610 need_waiter(intf);1611 } else {1612 atomic_dec(&intf->event_waiters);1613 }1614 1615 if (intf->delivering_events)1616 /*1617 * Another thread is delivering events for this, so1618 * let it handle any new events.1619 */1620 goto out;1621 1622 /* Deliver any queued events. */1623 while (user->gets_events && !list_empty(&intf->waiting_events)) {1624 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link)1625 list_move_tail(&msg->link, &msgs);1626 intf->waiting_events_count = 0;1627 if (intf->event_msg_printed) {1628 dev_warn(intf->si_dev, "Event queue no longer full\n");1629 intf->event_msg_printed = 0;1630 }1631 1632 intf->delivering_events = 1;1633 spin_unlock_irqrestore(&intf->events_lock, flags);1634 1635 list_for_each_entry_safe(msg, msg2, &msgs, link) {1636 msg->user = user;1637 kref_get(&user->refcount);1638 deliver_local_response(intf, msg);1639 }1640 1641 spin_lock_irqsave(&intf->events_lock, flags);1642 intf->delivering_events = 0;1643 }1644 1645 out:1646 spin_unlock_irqrestore(&intf->events_lock, flags);1647 release_ipmi_user(user, index);1648 1649 return 0;1650}1651EXPORT_SYMBOL(ipmi_set_gets_events);1652 1653static struct cmd_rcvr *find_cmd_rcvr(struct ipmi_smi *intf,1654 unsigned char netfn,1655 unsigned char cmd,1656 unsigned char chan)1657{1658 struct cmd_rcvr *rcvr;1659 1660 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,1661 lockdep_is_held(&intf->cmd_rcvrs_mutex)) {1662 if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)1663 && (rcvr->chans & (1 << chan)))1664 return rcvr;1665 }1666 return NULL;1667}1668 1669static int is_cmd_rcvr_exclusive(struct ipmi_smi *intf,1670 unsigned char netfn,1671 unsigned char cmd,1672 unsigned int chans)1673{1674 struct cmd_rcvr *rcvr;1675 1676 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,1677 lockdep_is_held(&intf->cmd_rcvrs_mutex)) {1678 if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)1679 && (rcvr->chans & chans))1680 return 0;1681 }1682 return 1;1683}1684 1685int ipmi_register_for_cmd(struct ipmi_user *user,1686 unsigned char netfn,1687 unsigned char cmd,1688 unsigned int chans)1689{1690 struct ipmi_smi *intf = user->intf;1691 struct cmd_rcvr *rcvr;1692 int rv = 0, index;1693 1694 user = acquire_ipmi_user(user, &index);1695 if (!user)1696 return -ENODEV;1697 1698 rcvr = kmalloc(sizeof(*rcvr), GFP_KERNEL);1699 if (!rcvr) {1700 rv = -ENOMEM;1701 goto out_release;1702 }1703 rcvr->cmd = cmd;1704 rcvr->netfn = netfn;1705 rcvr->chans = chans;1706 rcvr->user = user;1707 1708 mutex_lock(&intf->cmd_rcvrs_mutex);1709 /* Make sure the command/netfn is not already registered. */1710 if (!is_cmd_rcvr_exclusive(intf, netfn, cmd, chans)) {1711 rv = -EBUSY;1712 goto out_unlock;1713 }1714 1715 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS);1716 1717 list_add_rcu(&rcvr->link, &intf->cmd_rcvrs);1718 1719out_unlock:1720 mutex_unlock(&intf->cmd_rcvrs_mutex);1721 if (rv)1722 kfree(rcvr);1723out_release:1724 release_ipmi_user(user, index);1725 1726 return rv;1727}1728EXPORT_SYMBOL(ipmi_register_for_cmd);1729 1730int ipmi_unregister_for_cmd(struct ipmi_user *user,1731 unsigned char netfn,1732 unsigned char cmd,1733 unsigned int chans)1734{1735 struct ipmi_smi *intf = user->intf;1736 struct cmd_rcvr *rcvr;1737 struct cmd_rcvr *rcvrs = NULL;1738 int i, rv = -ENOENT, index;1739 1740 user = acquire_ipmi_user(user, &index);1741 if (!user)1742 return -ENODEV;1743 1744 mutex_lock(&intf->cmd_rcvrs_mutex);1745 for (i = 0; i < IPMI_NUM_CHANNELS; i++) {1746 if (((1 << i) & chans) == 0)1747 continue;1748 rcvr = find_cmd_rcvr(intf, netfn, cmd, i);1749 if (rcvr == NULL)1750 continue;1751 if (rcvr->user == user) {1752 rv = 0;1753 rcvr->chans &= ~chans;1754 if (rcvr->chans == 0) {1755 list_del_rcu(&rcvr->link);1756 rcvr->next = rcvrs;1757 rcvrs = rcvr;1758 }1759 }1760 }1761 mutex_unlock(&intf->cmd_rcvrs_mutex);1762 synchronize_rcu();1763 release_ipmi_user(user, index);1764 while (rcvrs) {1765 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS);1766 rcvr = rcvrs;1767 rcvrs = rcvr->next;1768 kfree(rcvr);1769 }1770 1771 return rv;1772}1773EXPORT_SYMBOL(ipmi_unregister_for_cmd);1774 1775unsigned char1776ipmb_checksum(unsigned char *data, int size)1777{1778 unsigned char csum = 0;1779 1780 for (; size > 0; size--, data++)1781 csum += *data;1782 1783 return -csum;1784}1785EXPORT_SYMBOL(ipmb_checksum);1786 1787static inline void format_ipmb_msg(struct ipmi_smi_msg *smi_msg,1788 struct kernel_ipmi_msg *msg,1789 struct ipmi_ipmb_addr *ipmb_addr,1790 long msgid,1791 unsigned char ipmb_seq,1792 int broadcast,1793 unsigned char source_address,1794 unsigned char source_lun)1795{1796 int i = broadcast;1797 1798 /* Format the IPMB header data. */1799 smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);1800 smi_msg->data[1] = IPMI_SEND_MSG_CMD;1801 smi_msg->data[2] = ipmb_addr->channel;1802 if (broadcast)1803 smi_msg->data[3] = 0;1804 smi_msg->data[i+3] = ipmb_addr->slave_addr;1805 smi_msg->data[i+4] = (msg->netfn << 2) | (ipmb_addr->lun & 0x3);1806 smi_msg->data[i+5] = ipmb_checksum(&smi_msg->data[i + 3], 2);1807 smi_msg->data[i+6] = source_address;1808 smi_msg->data[i+7] = (ipmb_seq << 2) | source_lun;1809 smi_msg->data[i+8] = msg->cmd;1810 1811 /* Now tack on the data to the message. */1812 if (msg->data_len > 0)1813 memcpy(&smi_msg->data[i + 9], msg->data, msg->data_len);1814 smi_msg->data_size = msg->data_len + 9;1815 1816 /* Now calculate the checksum and tack it on. */1817 smi_msg->data[i+smi_msg->data_size]1818 = ipmb_checksum(&smi_msg->data[i + 6], smi_msg->data_size - 6);1819 1820 /*1821 * Add on the checksum size and the offset from the1822 * broadcast.1823 */1824 smi_msg->data_size += 1 + i;1825 1826 smi_msg->msgid = msgid;1827}1828 1829static inline void format_lan_msg(struct ipmi_smi_msg *smi_msg,1830 struct kernel_ipmi_msg *msg,1831 struct ipmi_lan_addr *lan_addr,1832 long msgid,1833 unsigned char ipmb_seq,1834 unsigned char source_lun)1835{1836 /* Format the IPMB header data. */1837 smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);1838 smi_msg->data[1] = IPMI_SEND_MSG_CMD;1839 smi_msg->data[2] = lan_addr->channel;1840 smi_msg->data[3] = lan_addr->session_handle;1841 smi_msg->data[4] = lan_addr->remote_SWID;1842 smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3);1843 smi_msg->data[6] = ipmb_checksum(&smi_msg->data[4], 2);1844 smi_msg->data[7] = lan_addr->local_SWID;1845 smi_msg->data[8] = (ipmb_seq << 2) | source_lun;1846 smi_msg->data[9] = msg->cmd;1847 1848 /* Now tack on the data to the message. */1849 if (msg->data_len > 0)1850 memcpy(&smi_msg->data[10], msg->data, msg->data_len);1851 smi_msg->data_size = msg->data_len + 10;1852 1853 /* Now calculate the checksum and tack it on. */1854 smi_msg->data[smi_msg->data_size]1855 = ipmb_checksum(&smi_msg->data[7], smi_msg->data_size - 7);1856 1857 /*1858 * Add on the checksum size and the offset from the1859 * broadcast.1860 */1861 smi_msg->data_size += 1;1862 1863 smi_msg->msgid = msgid;1864}1865 1866static struct ipmi_smi_msg *smi_add_send_msg(struct ipmi_smi *intf,1867 struct ipmi_smi_msg *smi_msg,1868 int priority)1869{1870 if (intf->curr_msg) {1871 if (priority > 0)1872 list_add_tail(&smi_msg->link, &intf->hp_xmit_msgs);1873 else1874 list_add_tail(&smi_msg->link, &intf->xmit_msgs);1875 smi_msg = NULL;1876 } else {1877 intf->curr_msg = smi_msg;1878 }1879 1880 return smi_msg;1881}1882 1883static void smi_send(struct ipmi_smi *intf,1884 const struct ipmi_smi_handlers *handlers,1885 struct ipmi_smi_msg *smi_msg, int priority)1886{1887 int run_to_completion = intf->run_to_completion;1888 unsigned long flags = 0;1889 1890 if (!run_to_completion)1891 spin_lock_irqsave(&intf->xmit_msgs_lock, flags);1892 smi_msg = smi_add_send_msg(intf, smi_msg, priority);1893 1894 if (!run_to_completion)1895 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags);1896 1897 if (smi_msg)1898 handlers->sender(intf->send_info, smi_msg);1899}1900 1901static bool is_maintenance_mode_cmd(struct kernel_ipmi_msg *msg)1902{1903 return (((msg->netfn == IPMI_NETFN_APP_REQUEST)1904 && ((msg->cmd == IPMI_COLD_RESET_CMD)1905 || (msg->cmd == IPMI_WARM_RESET_CMD)))1906 || (msg->netfn == IPMI_NETFN_FIRMWARE_REQUEST));1907}1908 1909static int i_ipmi_req_sysintf(struct ipmi_smi *intf,1910 struct ipmi_addr *addr,1911 long msgid,1912 struct kernel_ipmi_msg *msg,1913 struct ipmi_smi_msg *smi_msg,1914 struct ipmi_recv_msg *recv_msg,1915 int retries,1916 unsigned int retry_time_ms)1917{1918 struct ipmi_system_interface_addr *smi_addr;1919 1920 if (msg->netfn & 1)1921 /* Responses are not allowed to the SMI. */1922 return -EINVAL;1923 1924 smi_addr = (struct ipmi_system_interface_addr *) addr;1925 if (smi_addr->lun > 3) {1926 ipmi_inc_stat(intf, sent_invalid_commands);1927 return -EINVAL;1928 }1929 1930 memcpy(&recv_msg->addr, smi_addr, sizeof(*smi_addr));1931 1932 if ((msg->netfn == IPMI_NETFN_APP_REQUEST)1933 && ((msg->cmd == IPMI_SEND_MSG_CMD)1934 || (msg->cmd == IPMI_GET_MSG_CMD)1935 || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD))) {1936 /*1937 * We don't let the user do these, since we manage1938 * the sequence numbers.1939 */1940 ipmi_inc_stat(intf, sent_invalid_commands);1941 return -EINVAL;1942 }1943 1944 if (is_maintenance_mode_cmd(msg)) {1945 unsigned long flags;1946 1947 spin_lock_irqsave(&intf->maintenance_mode_lock, flags);1948 intf->auto_maintenance_timeout1949 = maintenance_mode_timeout_ms;1950 if (!intf->maintenance_mode1951 && !intf->maintenance_mode_enable) {1952 intf->maintenance_mode_enable = true;1953 maintenance_mode_update(intf);1954 }1955 spin_unlock_irqrestore(&intf->maintenance_mode_lock,1956 flags);1957 }1958 1959 if (msg->data_len + 2 > IPMI_MAX_MSG_LENGTH) {1960 ipmi_inc_stat(intf, sent_invalid_commands);1961 return -EMSGSIZE;1962 }1963 1964 smi_msg->data[0] = (msg->netfn << 2) | (smi_addr->lun & 0x3);1965 smi_msg->data[1] = msg->cmd;1966 smi_msg->msgid = msgid;1967 smi_msg->user_data = recv_msg;1968 if (msg->data_len > 0)1969 memcpy(&smi_msg->data[2], msg->data, msg->data_len);1970 smi_msg->data_size = msg->data_len + 2;1971 ipmi_inc_stat(intf, sent_local_commands);1972 1973 return 0;1974}1975 1976static int i_ipmi_req_ipmb(struct ipmi_smi *intf,1977 struct ipmi_addr *addr,1978 long msgid,1979 struct kernel_ipmi_msg *msg,1980 struct ipmi_smi_msg *smi_msg,1981 struct ipmi_recv_msg *recv_msg,1982 unsigned char source_address,1983 unsigned char source_lun,1984 int retries,1985 unsigned int retry_time_ms)1986{1987 struct ipmi_ipmb_addr *ipmb_addr;1988 unsigned char ipmb_seq;1989 long seqid;1990 int broadcast = 0;1991 struct ipmi_channel *chans;1992 int rv = 0;1993 1994 if (addr->channel >= IPMI_MAX_CHANNELS) {1995 ipmi_inc_stat(intf, sent_invalid_commands);1996 return -EINVAL;1997 }1998 1999 chans = READ_ONCE(intf->channel_list)->c;2000 2001 if (chans[addr->channel].medium != IPMI_CHANNEL_MEDIUM_IPMB) {2002 ipmi_inc_stat(intf, sent_invalid_commands);2003 return -EINVAL;2004 }2005 2006 if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) {2007 /*2008 * Broadcasts add a zero at the beginning of the2009 * message, but otherwise is the same as an IPMB2010 * address.2011 */2012 addr->addr_type = IPMI_IPMB_ADDR_TYPE;2013 broadcast = 1;2014 retries = 0; /* Don't retry broadcasts. */2015 }2016 2017 /*2018 * 9 for the header and 1 for the checksum, plus2019 * possibly one for the broadcast.2020 */2021 if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) {2022 ipmi_inc_stat(intf, sent_invalid_commands);2023 return -EMSGSIZE;2024 }2025 2026 ipmb_addr = (struct ipmi_ipmb_addr *) addr;2027 if (ipmb_addr->lun > 3) {2028 ipmi_inc_stat(intf, sent_invalid_commands);2029 return -EINVAL;2030 }2031 2032 memcpy(&recv_msg->addr, ipmb_addr, sizeof(*ipmb_addr));2033 2034 if (recv_msg->msg.netfn & 0x1) {2035 /*2036 * It's a response, so use the user's sequence2037 * from msgid.2038 */2039 ipmi_inc_stat(intf, sent_ipmb_responses);2040 format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid,2041 msgid, broadcast,2042 source_address, source_lun);2043 2044 /*2045 * Save the receive message so we can use it2046 * to deliver the response.2047 */2048 smi_msg->user_data = recv_msg;2049 } else {2050 /* It's a command, so get a sequence for it. */2051 unsigned long flags;2052 2053 spin_lock_irqsave(&intf->seq_lock, flags);2054 2055 if (is_maintenance_mode_cmd(msg))2056 intf->ipmb_maintenance_mode_timeout =2057 maintenance_mode_timeout_ms;2058 2059 if (intf->ipmb_maintenance_mode_timeout && retry_time_ms == 0)2060 /* Different default in maintenance mode */2061 retry_time_ms = default_maintenance_retry_ms;2062 2063 /*2064 * Create a sequence number with a 1 second2065 * timeout and 4 retries.2066 */2067 rv = intf_next_seq(intf,2068 recv_msg,2069 retry_time_ms,2070 retries,2071 broadcast,2072 &ipmb_seq,2073 &seqid);2074 if (rv)2075 /*2076 * We have used up all the sequence numbers,2077 * probably, so abort.2078 */2079 goto out_err;2080 2081 ipmi_inc_stat(intf, sent_ipmb_commands);2082 2083 /*2084 * Store the sequence number in the message,2085 * so that when the send message response2086 * comes back we can start the timer.2087 */2088 format_ipmb_msg(smi_msg, msg, ipmb_addr,2089 STORE_SEQ_IN_MSGID(ipmb_seq, seqid),2090 ipmb_seq, broadcast,2091 source_address, source_lun);2092 2093 /*2094 * Copy the message into the recv message data, so we2095 * can retransmit it later if necessary.2096 */2097 memcpy(recv_msg->msg_data, smi_msg->data,2098 smi_msg->data_size);2099 recv_msg->msg.data = recv_msg->msg_data;2100 recv_msg->msg.data_len = smi_msg->data_size;2101 2102 /*2103 * We don't unlock until here, because we need2104 * to copy the completed message into the2105 * recv_msg before we release the lock.2106 * Otherwise, race conditions may bite us. I2107 * know that's pretty paranoid, but I prefer2108 * to be correct.2109 */2110out_err:2111 spin_unlock_irqrestore(&intf->seq_lock, flags);2112 }2113 2114 return rv;2115}2116 2117static int i_ipmi_req_ipmb_direct(struct ipmi_smi *intf,2118 struct ipmi_addr *addr,2119 long msgid,2120 struct kernel_ipmi_msg *msg,2121 struct ipmi_smi_msg *smi_msg,2122 struct ipmi_recv_msg *recv_msg,2123 unsigned char source_lun)2124{2125 struct ipmi_ipmb_direct_addr *daddr;2126 bool is_cmd = !(recv_msg->msg.netfn & 0x1);2127 2128 if (!(intf->handlers->flags & IPMI_SMI_CAN_HANDLE_IPMB_DIRECT))2129 return -EAFNOSUPPORT;2130 2131 /* Responses must have a completion code. */2132 if (!is_cmd && msg->data_len < 1) {2133 ipmi_inc_stat(intf, sent_invalid_commands);2134 return -EINVAL;2135 }2136 2137 if ((msg->data_len + 4) > IPMI_MAX_MSG_LENGTH) {2138 ipmi_inc_stat(intf, sent_invalid_commands);2139 return -EMSGSIZE;2140 }2141 2142 daddr = (struct ipmi_ipmb_direct_addr *) addr;2143 if (daddr->rq_lun > 3 || daddr->rs_lun > 3) {2144 ipmi_inc_stat(intf, sent_invalid_commands);2145 return -EINVAL;2146 }2147 2148 smi_msg->type = IPMI_SMI_MSG_TYPE_IPMB_DIRECT;2149 smi_msg->msgid = msgid;2150 2151 if (is_cmd) {2152 smi_msg->data[0] = msg->netfn << 2 | daddr->rs_lun;2153 smi_msg->data[2] = recv_msg->msgid << 2 | daddr->rq_lun;2154 } else {2155 smi_msg->data[0] = msg->netfn << 2 | daddr->rq_lun;2156 smi_msg->data[2] = recv_msg->msgid << 2 | daddr->rs_lun;2157 }2158 smi_msg->data[1] = daddr->slave_addr;2159 smi_msg->data[3] = msg->cmd;2160 2161 memcpy(smi_msg->data + 4, msg->data, msg->data_len);2162 smi_msg->data_size = msg->data_len + 4;2163 2164 smi_msg->user_data = recv_msg;2165 2166 return 0;2167}2168 2169static int i_ipmi_req_lan(struct ipmi_smi *intf,2170 struct ipmi_addr *addr,2171 long msgid,2172 struct kernel_ipmi_msg *msg,2173 struct ipmi_smi_msg *smi_msg,2174 struct ipmi_recv_msg *recv_msg,2175 unsigned char source_lun,2176 int retries,2177 unsigned int retry_time_ms)2178{2179 struct ipmi_lan_addr *lan_addr;2180 unsigned char ipmb_seq;2181 long seqid;2182 struct ipmi_channel *chans;2183 int rv = 0;2184 2185 if (addr->channel >= IPMI_MAX_CHANNELS) {2186 ipmi_inc_stat(intf, sent_invalid_commands);2187 return -EINVAL;2188 }2189 2190 chans = READ_ONCE(intf->channel_list)->c;2191 2192 if ((chans[addr->channel].medium2193 != IPMI_CHANNEL_MEDIUM_8023LAN)2194 && (chans[addr->channel].medium2195 != IPMI_CHANNEL_MEDIUM_ASYNC)) {2196 ipmi_inc_stat(intf, sent_invalid_commands);2197 return -EINVAL;2198 }2199 2200 /* 11 for the header and 1 for the checksum. */2201 if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) {2202 ipmi_inc_stat(intf, sent_invalid_commands);2203 return -EMSGSIZE;2204 }2205 2206 lan_addr = (struct ipmi_lan_addr *) addr;2207 if (lan_addr->lun > 3) {2208 ipmi_inc_stat(intf, sent_invalid_commands);2209 return -EINVAL;2210 }2211 2212 memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr));2213 2214 if (recv_msg->msg.netfn & 0x1) {2215 /*2216 * It's a response, so use the user's sequence2217 * from msgid.2218 */2219 ipmi_inc_stat(intf, sent_lan_responses);2220 format_lan_msg(smi_msg, msg, lan_addr, msgid,2221 msgid, source_lun);2222 2223 /*2224 * Save the receive message so we can use it2225 * to deliver the response.2226 */2227 smi_msg->user_data = recv_msg;2228 } else {2229 /* It's a command, so get a sequence for it. */2230 unsigned long flags;2231 2232 spin_lock_irqsave(&intf->seq_lock, flags);2233 2234 /*2235 * Create a sequence number with a 1 second2236 * timeout and 4 retries.2237 */2238 rv = intf_next_seq(intf,2239 recv_msg,2240 retry_time_ms,2241 retries,2242 0,2243 &ipmb_seq,2244 &seqid);2245 if (rv)2246 /*2247 * We have used up all the sequence numbers,2248 * probably, so abort.2249 */2250 goto out_err;2251 2252 ipmi_inc_stat(intf, sent_lan_commands);2253 2254 /*2255 * Store the sequence number in the message,2256 * so that when the send message response2257 * comes back we can start the timer.2258 */2259 format_lan_msg(smi_msg, msg, lan_addr,2260 STORE_SEQ_IN_MSGID(ipmb_seq, seqid),2261 ipmb_seq, source_lun);2262 2263 /*2264 * Copy the message into the recv message data, so we2265 * can retransmit it later if necessary.2266 */2267 memcpy(recv_msg->msg_data, smi_msg->data,2268 smi_msg->data_size);2269 recv_msg->msg.data = recv_msg->msg_data;2270 recv_msg->msg.data_len = smi_msg->data_size;2271 2272 /*2273 * We don't unlock until here, because we need2274 * to copy the completed message into the2275 * recv_msg before we release the lock.2276 * Otherwise, race conditions may bite us. I2277 * know that's pretty paranoid, but I prefer2278 * to be correct.2279 */2280out_err:2281 spin_unlock_irqrestore(&intf->seq_lock, flags);2282 }2283 2284 return rv;2285}2286 2287/*2288 * Separate from ipmi_request so that the user does not have to be2289 * supplied in certain circumstances (mainly at panic time). If2290 * messages are supplied, they will be freed, even if an error2291 * occurs.2292 */2293static int i_ipmi_request(struct ipmi_user *user,2294 struct ipmi_smi *intf,2295 struct ipmi_addr *addr,2296 long msgid,2297 struct kernel_ipmi_msg *msg,2298 void *user_msg_data,2299 void *supplied_smi,2300 struct ipmi_recv_msg *supplied_recv,2301 int priority,2302 unsigned char source_address,2303 unsigned char source_lun,2304 int retries,2305 unsigned int retry_time_ms)2306{2307 struct ipmi_smi_msg *smi_msg;2308 struct ipmi_recv_msg *recv_msg;2309 int rv = 0;2310 2311 if (user) {2312 if (atomic_add_return(1, &user->nr_msgs) > max_msgs_per_user) {2313 /* Decrement will happen at the end of the routine. */2314 rv = -EBUSY;2315 goto out;2316 }2317 }2318 2319 if (supplied_recv)2320 recv_msg = supplied_recv;2321 else {2322 recv_msg = ipmi_alloc_recv_msg();2323 if (recv_msg == NULL) {2324 rv = -ENOMEM;2325 goto out;2326 }2327 }2328 recv_msg->user_msg_data = user_msg_data;2329 2330 if (supplied_smi)2331 smi_msg = supplied_smi;2332 else {2333 smi_msg = ipmi_alloc_smi_msg();2334 if (smi_msg == NULL) {2335 if (!supplied_recv)2336 ipmi_free_recv_msg(recv_msg);2337 rv = -ENOMEM;2338 goto out;2339 }2340 }2341 2342 rcu_read_lock();2343 if (intf->in_shutdown) {2344 rv = -ENODEV;2345 goto out_err;2346 }2347 2348 recv_msg->user = user;2349 if (user)2350 /* The put happens when the message is freed. */2351 kref_get(&user->refcount);2352 recv_msg->msgid = msgid;2353 /*2354 * Store the message to send in the receive message so timeout2355 * responses can get the proper response data.2356 */2357 recv_msg->msg = *msg;2358 2359 if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {2360 rv = i_ipmi_req_sysintf(intf, addr, msgid, msg, smi_msg,2361 recv_msg, retries, retry_time_ms);2362 } else if (is_ipmb_addr(addr) || is_ipmb_bcast_addr(addr)) {2363 rv = i_ipmi_req_ipmb(intf, addr, msgid, msg, smi_msg, recv_msg,2364 source_address, source_lun,2365 retries, retry_time_ms);2366 } else if (is_ipmb_direct_addr(addr)) {2367 rv = i_ipmi_req_ipmb_direct(intf, addr, msgid, msg, smi_msg,2368 recv_msg, source_lun);2369 } else if (is_lan_addr(addr)) {2370 rv = i_ipmi_req_lan(intf, addr, msgid, msg, smi_msg, recv_msg,2371 source_lun, retries, retry_time_ms);2372 } else {2373 /* Unknown address type. */2374 ipmi_inc_stat(intf, sent_invalid_commands);2375 rv = -EINVAL;2376 }2377 2378 if (rv) {2379out_err:2380 ipmi_free_smi_msg(smi_msg);2381 ipmi_free_recv_msg(recv_msg);2382 } else {2383 dev_dbg(intf->si_dev, "Send: %*ph\n",2384 smi_msg->data_size, smi_msg->data);2385 2386 smi_send(intf, intf->handlers, smi_msg, priority);2387 }2388 rcu_read_unlock();2389 2390out:2391 if (rv && user)2392 atomic_dec(&user->nr_msgs);2393 return rv;2394}2395 2396static int check_addr(struct ipmi_smi *intf,2397 struct ipmi_addr *addr,2398 unsigned char *saddr,2399 unsigned char *lun)2400{2401 if (addr->channel >= IPMI_MAX_CHANNELS)2402 return -EINVAL;2403 addr->channel = array_index_nospec(addr->channel, IPMI_MAX_CHANNELS);2404 *lun = intf->addrinfo[addr->channel].lun;2405 *saddr = intf->addrinfo[addr->channel].address;2406 return 0;2407}2408 2409int ipmi_request_settime(struct ipmi_user *user,2410 struct ipmi_addr *addr,2411 long msgid,2412 struct kernel_ipmi_msg *msg,2413 void *user_msg_data,2414 int priority,2415 int retries,2416 unsigned int retry_time_ms)2417{2418 unsigned char saddr = 0, lun = 0;2419 int rv, index;2420 2421 if (!user)2422 return -EINVAL;2423 2424 user = acquire_ipmi_user(user, &index);2425 if (!user)2426 return -ENODEV;2427 2428 rv = check_addr(user->intf, addr, &saddr, &lun);2429 if (!rv)2430 rv = i_ipmi_request(user,2431 user->intf,2432 addr,2433 msgid,2434 msg,2435 user_msg_data,2436 NULL, NULL,2437 priority,2438 saddr,2439 lun,2440 retries,2441 retry_time_ms);2442 2443 release_ipmi_user(user, index);2444 return rv;2445}2446EXPORT_SYMBOL(ipmi_request_settime);2447 2448int ipmi_request_supply_msgs(struct ipmi_user *user,2449 struct ipmi_addr *addr,2450 long msgid,2451 struct kernel_ipmi_msg *msg,2452 void *user_msg_data,2453 void *supplied_smi,2454 struct ipmi_recv_msg *supplied_recv,2455 int priority)2456{2457 unsigned char saddr = 0, lun = 0;2458 int rv, index;2459 2460 if (!user)2461 return -EINVAL;2462 2463 user = acquire_ipmi_user(user, &index);2464 if (!user)2465 return -ENODEV;2466 2467 rv = check_addr(user->intf, addr, &saddr, &lun);2468 if (!rv)2469 rv = i_ipmi_request(user,2470 user->intf,2471 addr,2472 msgid,2473 msg,2474 user_msg_data,2475 supplied_smi,2476 supplied_recv,2477 priority,2478 saddr,2479 lun,2480 -1, 0);2481 2482 release_ipmi_user(user, index);2483 return rv;2484}2485EXPORT_SYMBOL(ipmi_request_supply_msgs);2486 2487static void bmc_device_id_handler(struct ipmi_smi *intf,2488 struct ipmi_recv_msg *msg)2489{2490 int rv;2491 2492 if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE)2493 || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE)2494 || (msg->msg.cmd != IPMI_GET_DEVICE_ID_CMD)) {2495 dev_warn(intf->si_dev,2496 "invalid device_id msg: addr_type=%d netfn=%x cmd=%x\n",2497 msg->addr.addr_type, msg->msg.netfn, msg->msg.cmd);2498 return;2499 }2500 2501 if (msg->msg.data[0]) {2502 dev_warn(intf->si_dev, "device id fetch failed: 0x%2.2x\n",2503 msg->msg.data[0]);2504 intf->bmc->dyn_id_set = 0;2505 goto out;2506 }2507 2508 rv = ipmi_demangle_device_id(msg->msg.netfn, msg->msg.cmd,2509 msg->msg.data, msg->msg.data_len, &intf->bmc->fetch_id);2510 if (rv) {2511 dev_warn(intf->si_dev, "device id demangle failed: %d\n", rv);2512 /* record completion code when error */2513 intf->bmc->cc = msg->msg.data[0];2514 intf->bmc->dyn_id_set = 0;2515 } else {2516 /*2517 * Make sure the id data is available before setting2518 * dyn_id_set.2519 */2520 smp_wmb();2521 intf->bmc->dyn_id_set = 1;2522 }2523out:2524 wake_up(&intf->waitq);2525}2526 2527static int2528send_get_device_id_cmd(struct ipmi_smi *intf)2529{2530 struct ipmi_system_interface_addr si;2531 struct kernel_ipmi_msg msg;2532 2533 si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;2534 si.channel = IPMI_BMC_CHANNEL;2535 si.lun = 0;2536 2537 msg.netfn = IPMI_NETFN_APP_REQUEST;2538 msg.cmd = IPMI_GET_DEVICE_ID_CMD;2539 msg.data = NULL;2540 msg.data_len = 0;2541 2542 return i_ipmi_request(NULL,2543 intf,2544 (struct ipmi_addr *) &si,2545 0,2546 &msg,2547 intf,2548 NULL,2549 NULL,2550 0,2551 intf->addrinfo[0].address,2552 intf->addrinfo[0].lun,2553 -1, 0);2554}2555 2556static int __get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc)2557{2558 int rv;2559 unsigned int retry_count = 0;2560 2561 intf->null_user_handler = bmc_device_id_handler;2562 2563retry:2564 bmc->cc = 0;2565 bmc->dyn_id_set = 2;2566 2567 rv = send_get_device_id_cmd(intf);2568 if (rv)2569 goto out_reset_handler;2570 2571 wait_event(intf->waitq, bmc->dyn_id_set != 2);2572 2573 if (!bmc->dyn_id_set) {2574 if (bmc->cc != IPMI_CC_NO_ERROR &&2575 ++retry_count <= GET_DEVICE_ID_MAX_RETRY) {2576 msleep(500);2577 dev_warn(intf->si_dev,2578 "BMC returned 0x%2.2x, retry get bmc device id\n",2579 bmc->cc);2580 goto retry;2581 }2582 2583 rv = -EIO; /* Something went wrong in the fetch. */2584 }2585 2586 /* dyn_id_set makes the id data available. */2587 smp_rmb();2588 2589out_reset_handler:2590 intf->null_user_handler = NULL;2591 2592 return rv;2593}2594 2595/*2596 * Fetch the device id for the bmc/interface. You must pass in either2597 * bmc or intf, this code will get the other one. If the data has2598 * been recently fetched, this will just use the cached data. Otherwise2599 * it will run a new fetch.2600 *2601 * Except for the first time this is called (in ipmi_add_smi()),2602 * this will always return good data;2603 */2604static int __bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc,2605 struct ipmi_device_id *id,2606 bool *guid_set, guid_t *guid, int intf_num)2607{2608 int rv = 0;2609 int prev_dyn_id_set, prev_guid_set;2610 bool intf_set = intf != NULL;2611 2612 if (!intf) {2613 mutex_lock(&bmc->dyn_mutex);2614retry_bmc_lock:2615 if (list_empty(&bmc->intfs)) {2616 mutex_unlock(&bmc->dyn_mutex);2617 return -ENOENT;2618 }2619 intf = list_first_entry(&bmc->intfs, struct ipmi_smi,2620 bmc_link);2621 kref_get(&intf->refcount);2622 mutex_unlock(&bmc->dyn_mutex);2623 mutex_lock(&intf->bmc_reg_mutex);2624 mutex_lock(&bmc->dyn_mutex);2625 if (intf != list_first_entry(&bmc->intfs, struct ipmi_smi,2626 bmc_link)) {2627 mutex_unlock(&intf->bmc_reg_mutex);2628 kref_put(&intf->refcount, intf_free);2629 goto retry_bmc_lock;2630 }2631 } else {2632 mutex_lock(&intf->bmc_reg_mutex);2633 bmc = intf->bmc;2634 mutex_lock(&bmc->dyn_mutex);2635 kref_get(&intf->refcount);2636 }2637 2638 /* If we have a valid and current ID, just return that. */2639 if (intf->in_bmc_register ||2640 (bmc->dyn_id_set && time_is_after_jiffies(bmc->dyn_id_expiry)))2641 goto out_noprocessing;2642 2643 prev_guid_set = bmc->dyn_guid_set;2644 __get_guid(intf);2645 2646 prev_dyn_id_set = bmc->dyn_id_set;2647 rv = __get_device_id(intf, bmc);2648 if (rv)2649 goto out;2650 2651 /*2652 * The guid, device id, manufacturer id, and product id should2653 * not change on a BMC. If it does we have to do some dancing.2654 */2655 if (!intf->bmc_registered2656 || (!prev_guid_set && bmc->dyn_guid_set)2657 || (!prev_dyn_id_set && bmc->dyn_id_set)2658 || (prev_guid_set && bmc->dyn_guid_set2659 && !guid_equal(&bmc->guid, &bmc->fetch_guid))2660 || bmc->id.device_id != bmc->fetch_id.device_id2661 || bmc->id.manufacturer_id != bmc->fetch_id.manufacturer_id2662 || bmc->id.product_id != bmc->fetch_id.product_id) {2663 struct ipmi_device_id id = bmc->fetch_id;2664 int guid_set = bmc->dyn_guid_set;2665 guid_t guid;2666 2667 guid = bmc->fetch_guid;2668 mutex_unlock(&bmc->dyn_mutex);2669 2670 __ipmi_bmc_unregister(intf);2671 /* Fill in the temporary BMC for good measure. */2672 intf->bmc->id = id;2673 intf->bmc->dyn_guid_set = guid_set;2674 intf->bmc->guid = guid;2675 if (__ipmi_bmc_register(intf, &id, guid_set, &guid, intf_num))2676 need_waiter(intf); /* Retry later on an error. */2677 else2678 __scan_channels(intf, &id);2679 2680 2681 if (!intf_set) {2682 /*2683 * We weren't given the interface on the2684 * command line, so restart the operation on2685 * the next interface for the BMC.2686 */2687 mutex_unlock(&intf->bmc_reg_mutex);2688 mutex_lock(&bmc->dyn_mutex);2689 goto retry_bmc_lock;2690 }2691 2692 /* We have a new BMC, set it up. */2693 bmc = intf->bmc;2694 mutex_lock(&bmc->dyn_mutex);2695 goto out_noprocessing;2696 } else if (memcmp(&bmc->fetch_id, &bmc->id, sizeof(bmc->id)))2697 /* Version info changes, scan the channels again. */2698 __scan_channels(intf, &bmc->fetch_id);2699 2700 bmc->dyn_id_expiry = jiffies + IPMI_DYN_DEV_ID_EXPIRY;2701 2702out:2703 if (rv && prev_dyn_id_set) {2704 rv = 0; /* Ignore failures if we have previous data. */2705 bmc->dyn_id_set = prev_dyn_id_set;2706 }2707 if (!rv) {2708 bmc->id = bmc->fetch_id;2709 if (bmc->dyn_guid_set)2710 bmc->guid = bmc->fetch_guid;2711 else if (prev_guid_set)2712 /*2713 * The guid used to be valid and it failed to fetch,2714 * just use the cached value.2715 */2716 bmc->dyn_guid_set = prev_guid_set;2717 }2718out_noprocessing:2719 if (!rv) {2720 if (id)2721 *id = bmc->id;2722 2723 if (guid_set)2724 *guid_set = bmc->dyn_guid_set;2725 2726 if (guid && bmc->dyn_guid_set)2727 *guid = bmc->guid;2728 }2729 2730 mutex_unlock(&bmc->dyn_mutex);2731 mutex_unlock(&intf->bmc_reg_mutex);2732 2733 kref_put(&intf->refcount, intf_free);2734 return rv;2735}2736 2737static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc,2738 struct ipmi_device_id *id,2739 bool *guid_set, guid_t *guid)2740{2741 return __bmc_get_device_id(intf, bmc, id, guid_set, guid, -1);2742}2743 2744static ssize_t device_id_show(struct device *dev,2745 struct device_attribute *attr,2746 char *buf)2747{2748 struct bmc_device *bmc = to_bmc_device(dev);2749 struct ipmi_device_id id;2750 int rv;2751 2752 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2753 if (rv)2754 return rv;2755 2756 return sysfs_emit(buf, "%u\n", id.device_id);2757}2758static DEVICE_ATTR_RO(device_id);2759 2760static ssize_t provides_device_sdrs_show(struct device *dev,2761 struct device_attribute *attr,2762 char *buf)2763{2764 struct bmc_device *bmc = to_bmc_device(dev);2765 struct ipmi_device_id id;2766 int rv;2767 2768 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2769 if (rv)2770 return rv;2771 2772 return sysfs_emit(buf, "%u\n", (id.device_revision & 0x80) >> 7);2773}2774static DEVICE_ATTR_RO(provides_device_sdrs);2775 2776static ssize_t revision_show(struct device *dev, struct device_attribute *attr,2777 char *buf)2778{2779 struct bmc_device *bmc = to_bmc_device(dev);2780 struct ipmi_device_id id;2781 int rv;2782 2783 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2784 if (rv)2785 return rv;2786 2787 return sysfs_emit(buf, "%u\n", id.device_revision & 0x0F);2788}2789static DEVICE_ATTR_RO(revision);2790 2791static ssize_t firmware_revision_show(struct device *dev,2792 struct device_attribute *attr,2793 char *buf)2794{2795 struct bmc_device *bmc = to_bmc_device(dev);2796 struct ipmi_device_id id;2797 int rv;2798 2799 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2800 if (rv)2801 return rv;2802 2803 return sysfs_emit(buf, "%u.%x\n", id.firmware_revision_1,2804 id.firmware_revision_2);2805}2806static DEVICE_ATTR_RO(firmware_revision);2807 2808static ssize_t ipmi_version_show(struct device *dev,2809 struct device_attribute *attr,2810 char *buf)2811{2812 struct bmc_device *bmc = to_bmc_device(dev);2813 struct ipmi_device_id id;2814 int rv;2815 2816 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2817 if (rv)2818 return rv;2819 2820 return sysfs_emit(buf, "%u.%u\n",2821 ipmi_version_major(&id),2822 ipmi_version_minor(&id));2823}2824static DEVICE_ATTR_RO(ipmi_version);2825 2826static ssize_t add_dev_support_show(struct device *dev,2827 struct device_attribute *attr,2828 char *buf)2829{2830 struct bmc_device *bmc = to_bmc_device(dev);2831 struct ipmi_device_id id;2832 int rv;2833 2834 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2835 if (rv)2836 return rv;2837 2838 return sysfs_emit(buf, "0x%02x\n", id.additional_device_support);2839}2840static DEVICE_ATTR(additional_device_support, S_IRUGO, add_dev_support_show,2841 NULL);2842 2843static ssize_t manufacturer_id_show(struct device *dev,2844 struct device_attribute *attr,2845 char *buf)2846{2847 struct bmc_device *bmc = to_bmc_device(dev);2848 struct ipmi_device_id id;2849 int rv;2850 2851 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2852 if (rv)2853 return rv;2854 2855 return sysfs_emit(buf, "0x%6.6x\n", id.manufacturer_id);2856}2857static DEVICE_ATTR_RO(manufacturer_id);2858 2859static ssize_t product_id_show(struct device *dev,2860 struct device_attribute *attr,2861 char *buf)2862{2863 struct bmc_device *bmc = to_bmc_device(dev);2864 struct ipmi_device_id id;2865 int rv;2866 2867 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2868 if (rv)2869 return rv;2870 2871 return sysfs_emit(buf, "0x%4.4x\n", id.product_id);2872}2873static DEVICE_ATTR_RO(product_id);2874 2875static ssize_t aux_firmware_rev_show(struct device *dev,2876 struct device_attribute *attr,2877 char *buf)2878{2879 struct bmc_device *bmc = to_bmc_device(dev);2880 struct ipmi_device_id id;2881 int rv;2882 2883 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2884 if (rv)2885 return rv;2886 2887 return sysfs_emit(buf, "0x%02x 0x%02x 0x%02x 0x%02x\n",2888 id.aux_firmware_revision[3],2889 id.aux_firmware_revision[2],2890 id.aux_firmware_revision[1],2891 id.aux_firmware_revision[0]);2892}2893static DEVICE_ATTR(aux_firmware_revision, S_IRUGO, aux_firmware_rev_show, NULL);2894 2895static ssize_t guid_show(struct device *dev, struct device_attribute *attr,2896 char *buf)2897{2898 struct bmc_device *bmc = to_bmc_device(dev);2899 bool guid_set;2900 guid_t guid;2901 int rv;2902 2903 rv = bmc_get_device_id(NULL, bmc, NULL, &guid_set, &guid);2904 if (rv)2905 return rv;2906 if (!guid_set)2907 return -ENOENT;2908 2909 return sysfs_emit(buf, "%pUl\n", &guid);2910}2911static DEVICE_ATTR_RO(guid);2912 2913static struct attribute *bmc_dev_attrs[] = {2914 &dev_attr_device_id.attr,2915 &dev_attr_provides_device_sdrs.attr,2916 &dev_attr_revision.attr,2917 &dev_attr_firmware_revision.attr,2918 &dev_attr_ipmi_version.attr,2919 &dev_attr_additional_device_support.attr,2920 &dev_attr_manufacturer_id.attr,2921 &dev_attr_product_id.attr,2922 &dev_attr_aux_firmware_revision.attr,2923 &dev_attr_guid.attr,2924 NULL2925};2926 2927static umode_t bmc_dev_attr_is_visible(struct kobject *kobj,2928 struct attribute *attr, int idx)2929{2930 struct device *dev = kobj_to_dev(kobj);2931 struct bmc_device *bmc = to_bmc_device(dev);2932 umode_t mode = attr->mode;2933 int rv;2934 2935 if (attr == &dev_attr_aux_firmware_revision.attr) {2936 struct ipmi_device_id id;2937 2938 rv = bmc_get_device_id(NULL, bmc, &id, NULL, NULL);2939 return (!rv && id.aux_firmware_revision_set) ? mode : 0;2940 }2941 if (attr == &dev_attr_guid.attr) {2942 bool guid_set;2943 2944 rv = bmc_get_device_id(NULL, bmc, NULL, &guid_set, NULL);2945 return (!rv && guid_set) ? mode : 0;2946 }2947 return mode;2948}2949 2950static const struct attribute_group bmc_dev_attr_group = {2951 .attrs = bmc_dev_attrs,2952 .is_visible = bmc_dev_attr_is_visible,2953};2954 2955static const struct attribute_group *bmc_dev_attr_groups[] = {2956 &bmc_dev_attr_group,2957 NULL2958};2959 2960static const struct device_type bmc_device_type = {2961 .groups = bmc_dev_attr_groups,2962};2963 2964static int __find_bmc_guid(struct device *dev, const void *data)2965{2966 const guid_t *guid = data;2967 struct bmc_device *bmc;2968 int rv;2969 2970 if (dev->type != &bmc_device_type)2971 return 0;2972 2973 bmc = to_bmc_device(dev);2974 rv = bmc->dyn_guid_set && guid_equal(&bmc->guid, guid);2975 if (rv)2976 rv = kref_get_unless_zero(&bmc->usecount);2977 return rv;2978}2979 2980/*2981 * Returns with the bmc's usecount incremented, if it is non-NULL.2982 */2983static struct bmc_device *ipmi_find_bmc_guid(struct device_driver *drv,2984 guid_t *guid)2985{2986 struct device *dev;2987 struct bmc_device *bmc = NULL;2988 2989 dev = driver_find_device(drv, NULL, guid, __find_bmc_guid);2990 if (dev) {2991 bmc = to_bmc_device(dev);2992 put_device(dev);2993 }2994 return bmc;2995}2996 2997struct prod_dev_id {2998 unsigned int product_id;2999 unsigned char device_id;3000};3001 3002static int __find_bmc_prod_dev_id(struct device *dev, const void *data)3003{3004 const struct prod_dev_id *cid = data;3005 struct bmc_device *bmc;3006 int rv;3007 3008 if (dev->type != &bmc_device_type)3009 return 0;3010 3011 bmc = to_bmc_device(dev);3012 rv = (bmc->id.product_id == cid->product_id3013 && bmc->id.device_id == cid->device_id);3014 if (rv)3015 rv = kref_get_unless_zero(&bmc->usecount);3016 return rv;3017}3018 3019/*3020 * Returns with the bmc's usecount incremented, if it is non-NULL.3021 */3022static struct bmc_device *ipmi_find_bmc_prod_dev_id(3023 struct device_driver *drv,3024 unsigned int product_id, unsigned char device_id)3025{3026 struct prod_dev_id id = {3027 .product_id = product_id,3028 .device_id = device_id,3029 };3030 struct device *dev;3031 struct bmc_device *bmc = NULL;3032 3033 dev = driver_find_device(drv, NULL, &id, __find_bmc_prod_dev_id);3034 if (dev) {3035 bmc = to_bmc_device(dev);3036 put_device(dev);3037 }3038 return bmc;3039}3040 3041static DEFINE_IDA(ipmi_bmc_ida);3042 3043static void3044release_bmc_device(struct device *dev)3045{3046 kfree(to_bmc_device(dev));3047}3048 3049static void cleanup_bmc_work(struct work_struct *work)3050{3051 struct bmc_device *bmc = container_of(work, struct bmc_device,3052 remove_work);3053 int id = bmc->pdev.id; /* Unregister overwrites id */3054 3055 platform_device_unregister(&bmc->pdev);3056 ida_free(&ipmi_bmc_ida, id);3057}3058 3059static void3060cleanup_bmc_device(struct kref *ref)3061{3062 struct bmc_device *bmc = container_of(ref, struct bmc_device, usecount);3063 3064 /*3065 * Remove the platform device in a work queue to avoid issues3066 * with removing the device attributes while reading a device3067 * attribute.3068 */3069 queue_work(remove_work_wq, &bmc->remove_work);3070}3071 3072/*3073 * Must be called with intf->bmc_reg_mutex held.3074 */3075static void __ipmi_bmc_unregister(struct ipmi_smi *intf)3076{3077 struct bmc_device *bmc = intf->bmc;3078 3079 if (!intf->bmc_registered)3080 return;3081 3082 sysfs_remove_link(&intf->si_dev->kobj, "bmc");3083 sysfs_remove_link(&bmc->pdev.dev.kobj, intf->my_dev_name);3084 kfree(intf->my_dev_name);3085 intf->my_dev_name = NULL;3086 3087 mutex_lock(&bmc->dyn_mutex);3088 list_del(&intf->bmc_link);3089 mutex_unlock(&bmc->dyn_mutex);3090 intf->bmc = &intf->tmp_bmc;3091 kref_put(&bmc->usecount, cleanup_bmc_device);3092 intf->bmc_registered = false;3093}3094 3095static void ipmi_bmc_unregister(struct ipmi_smi *intf)3096{3097 mutex_lock(&intf->bmc_reg_mutex);3098 __ipmi_bmc_unregister(intf);3099 mutex_unlock(&intf->bmc_reg_mutex);3100}3101 3102/*3103 * Must be called with intf->bmc_reg_mutex held.3104 */3105static int __ipmi_bmc_register(struct ipmi_smi *intf,3106 struct ipmi_device_id *id,3107 bool guid_set, guid_t *guid, int intf_num)3108{3109 int rv;3110 struct bmc_device *bmc;3111 struct bmc_device *old_bmc;3112 3113 /*3114 * platform_device_register() can cause bmc_reg_mutex to3115 * be claimed because of the is_visible functions of3116 * the attributes. Eliminate possible recursion and3117 * release the lock.3118 */3119 intf->in_bmc_register = true;3120 mutex_unlock(&intf->bmc_reg_mutex);3121 3122 /*3123 * Try to find if there is an bmc_device struct3124 * representing the interfaced BMC already3125 */3126 mutex_lock(&ipmidriver_mutex);3127 if (guid_set)3128 old_bmc = ipmi_find_bmc_guid(&ipmidriver.driver, guid);3129 else3130 old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver.driver,3131 id->product_id,3132 id->device_id);3133 3134 /*3135 * If there is already an bmc_device, free the new one,3136 * otherwise register the new BMC device3137 */3138 if (old_bmc) {3139 bmc = old_bmc;3140 /*3141 * Note: old_bmc already has usecount incremented by3142 * the BMC find functions.3143 */3144 intf->bmc = old_bmc;3145 mutex_lock(&bmc->dyn_mutex);3146 list_add_tail(&intf->bmc_link, &bmc->intfs);3147 mutex_unlock(&bmc->dyn_mutex);3148 3149 dev_info(intf->si_dev,3150 "interfacing existing BMC (man_id: 0x%6.6x, prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",3151 bmc->id.manufacturer_id,3152 bmc->id.product_id,3153 bmc->id.device_id);3154 } else {3155 bmc = kzalloc(sizeof(*bmc), GFP_KERNEL);3156 if (!bmc) {3157 rv = -ENOMEM;3158 goto out;3159 }3160 INIT_LIST_HEAD(&bmc->intfs);3161 mutex_init(&bmc->dyn_mutex);3162 INIT_WORK(&bmc->remove_work, cleanup_bmc_work);3163 3164 bmc->id = *id;3165 bmc->dyn_id_set = 1;3166 bmc->dyn_guid_set = guid_set;3167 bmc->guid = *guid;3168 bmc->dyn_id_expiry = jiffies + IPMI_DYN_DEV_ID_EXPIRY;3169 3170 bmc->pdev.name = "ipmi_bmc";3171 3172 rv = ida_alloc(&ipmi_bmc_ida, GFP_KERNEL);3173 if (rv < 0) {3174 kfree(bmc);3175 goto out;3176 }3177 3178 bmc->pdev.dev.driver = &ipmidriver.driver;3179 bmc->pdev.id = rv;3180 bmc->pdev.dev.release = release_bmc_device;3181 bmc->pdev.dev.type = &bmc_device_type;3182 kref_init(&bmc->usecount);3183 3184 intf->bmc = bmc;3185 mutex_lock(&bmc->dyn_mutex);3186 list_add_tail(&intf->bmc_link, &bmc->intfs);3187 mutex_unlock(&bmc->dyn_mutex);3188 3189 rv = platform_device_register(&bmc->pdev);3190 if (rv) {3191 dev_err(intf->si_dev,3192 "Unable to register bmc device: %d\n",3193 rv);3194 goto out_list_del;3195 }3196 3197 dev_info(intf->si_dev,3198 "Found new BMC (man_id: 0x%6.6x, prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",3199 bmc->id.manufacturer_id,3200 bmc->id.product_id,3201 bmc->id.device_id);3202 }3203 3204 /*3205 * create symlink from system interface device to bmc device3206 * and back.3207 */3208 rv = sysfs_create_link(&intf->si_dev->kobj, &bmc->pdev.dev.kobj, "bmc");3209 if (rv) {3210 dev_err(intf->si_dev, "Unable to create bmc symlink: %d\n", rv);3211 goto out_put_bmc;3212 }3213 3214 if (intf_num == -1)3215 intf_num = intf->intf_num;3216 intf->my_dev_name = kasprintf(GFP_KERNEL, "ipmi%d", intf_num);3217 if (!intf->my_dev_name) {3218 rv = -ENOMEM;3219 dev_err(intf->si_dev, "Unable to allocate link from BMC: %d\n",3220 rv);3221 goto out_unlink1;3222 }3223 3224 rv = sysfs_create_link(&bmc->pdev.dev.kobj, &intf->si_dev->kobj,3225 intf->my_dev_name);3226 if (rv) {3227 dev_err(intf->si_dev, "Unable to create symlink to bmc: %d\n",3228 rv);3229 goto out_free_my_dev_name;3230 }3231 3232 intf->bmc_registered = true;3233 3234out:3235 mutex_unlock(&ipmidriver_mutex);3236 mutex_lock(&intf->bmc_reg_mutex);3237 intf->in_bmc_register = false;3238 return rv;3239 3240 3241out_free_my_dev_name:3242 kfree(intf->my_dev_name);3243 intf->my_dev_name = NULL;3244 3245out_unlink1:3246 sysfs_remove_link(&intf->si_dev->kobj, "bmc");3247 3248out_put_bmc:3249 mutex_lock(&bmc->dyn_mutex);3250 list_del(&intf->bmc_link);3251 mutex_unlock(&bmc->dyn_mutex);3252 intf->bmc = &intf->tmp_bmc;3253 kref_put(&bmc->usecount, cleanup_bmc_device);3254 goto out;3255 3256out_list_del:3257 mutex_lock(&bmc->dyn_mutex);3258 list_del(&intf->bmc_link);3259 mutex_unlock(&bmc->dyn_mutex);3260 intf->bmc = &intf->tmp_bmc;3261 put_device(&bmc->pdev.dev);3262 goto out;3263}3264 3265static int3266send_guid_cmd(struct ipmi_smi *intf, int chan)3267{3268 struct kernel_ipmi_msg msg;3269 struct ipmi_system_interface_addr si;3270 3271 si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;3272 si.channel = IPMI_BMC_CHANNEL;3273 si.lun = 0;3274 3275 msg.netfn = IPMI_NETFN_APP_REQUEST;3276 msg.cmd = IPMI_GET_DEVICE_GUID_CMD;3277 msg.data = NULL;3278 msg.data_len = 0;3279 return i_ipmi_request(NULL,3280 intf,3281 (struct ipmi_addr *) &si,3282 0,3283 &msg,3284 intf,3285 NULL,3286 NULL,3287 0,3288 intf->addrinfo[0].address,3289 intf->addrinfo[0].lun,3290 -1, 0);3291}3292 3293static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)3294{3295 struct bmc_device *bmc = intf->bmc;3296 3297 if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE)3298 || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE)3299 || (msg->msg.cmd != IPMI_GET_DEVICE_GUID_CMD))3300 /* Not for me */3301 return;3302 3303 if (msg->msg.data[0] != 0) {3304 /* Error from getting the GUID, the BMC doesn't have one. */3305 bmc->dyn_guid_set = 0;3306 goto out;3307 }3308 3309 if (msg->msg.data_len < UUID_SIZE + 1) {3310 bmc->dyn_guid_set = 0;3311 dev_warn(intf->si_dev,3312 "The GUID response from the BMC was too short, it was %d but should have been %d. Assuming GUID is not available.\n",3313 msg->msg.data_len, UUID_SIZE + 1);3314 goto out;3315 }3316 3317 import_guid(&bmc->fetch_guid, msg->msg.data + 1);3318 /*3319 * Make sure the guid data is available before setting3320 * dyn_guid_set.3321 */3322 smp_wmb();3323 bmc->dyn_guid_set = 1;3324 out:3325 wake_up(&intf->waitq);3326}3327 3328static void __get_guid(struct ipmi_smi *intf)3329{3330 int rv;3331 struct bmc_device *bmc = intf->bmc;3332 3333 bmc->dyn_guid_set = 2;3334 intf->null_user_handler = guid_handler;3335 rv = send_guid_cmd(intf, 0);3336 if (rv)3337 /* Send failed, no GUID available. */3338 bmc->dyn_guid_set = 0;3339 else3340 wait_event(intf->waitq, bmc->dyn_guid_set != 2);3341 3342 /* dyn_guid_set makes the guid data available. */3343 smp_rmb();3344 3345 intf->null_user_handler = NULL;3346}3347 3348static int3349send_channel_info_cmd(struct ipmi_smi *intf, int chan)3350{3351 struct kernel_ipmi_msg msg;3352 unsigned char data[1];3353 struct ipmi_system_interface_addr si;3354 3355 si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;3356 si.channel = IPMI_BMC_CHANNEL;3357 si.lun = 0;3358 3359 msg.netfn = IPMI_NETFN_APP_REQUEST;3360 msg.cmd = IPMI_GET_CHANNEL_INFO_CMD;3361 msg.data = data;3362 msg.data_len = 1;3363 data[0] = chan;3364 return i_ipmi_request(NULL,3365 intf,3366 (struct ipmi_addr *) &si,3367 0,3368 &msg,3369 intf,3370 NULL,3371 NULL,3372 0,3373 intf->addrinfo[0].address,3374 intf->addrinfo[0].lun,3375 -1, 0);3376}3377 3378static void3379channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)3380{3381 int rv = 0;3382 int ch;3383 unsigned int set = intf->curr_working_cset;3384 struct ipmi_channel *chans;3385 3386 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)3387 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE)3388 && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD)) {3389 /* It's the one we want */3390 if (msg->msg.data[0] != 0) {3391 /* Got an error from the channel, just go on. */3392 if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) {3393 /*3394 * If the MC does not support this3395 * command, that is legal. We just3396 * assume it has one IPMB at channel3397 * zero.3398 */3399 intf->wchannels[set].c[0].medium3400 = IPMI_CHANNEL_MEDIUM_IPMB;3401 intf->wchannels[set].c[0].protocol3402 = IPMI_CHANNEL_PROTOCOL_IPMB;3403 3404 intf->channel_list = intf->wchannels + set;3405 intf->channels_ready = true;3406 wake_up(&intf->waitq);3407 goto out;3408 }3409 goto next_channel;3410 }3411 if (msg->msg.data_len < 4) {3412 /* Message not big enough, just go on. */3413 goto next_channel;3414 }3415 ch = intf->curr_channel;3416 chans = intf->wchannels[set].c;3417 chans[ch].medium = msg->msg.data[2] & 0x7f;3418 chans[ch].protocol = msg->msg.data[3] & 0x1f;3419 3420 next_channel:3421 intf->curr_channel++;3422 if (intf->curr_channel >= IPMI_MAX_CHANNELS) {3423 intf->channel_list = intf->wchannels + set;3424 intf->channels_ready = true;3425 wake_up(&intf->waitq);3426 } else {3427 intf->channel_list = intf->wchannels + set;3428 intf->channels_ready = true;3429 rv = send_channel_info_cmd(intf, intf->curr_channel);3430 }3431 3432 if (rv) {3433 /* Got an error somehow, just give up. */3434 dev_warn(intf->si_dev,3435 "Error sending channel information for channel %d: %d\n",3436 intf->curr_channel, rv);3437 3438 intf->channel_list = intf->wchannels + set;3439 intf->channels_ready = true;3440 wake_up(&intf->waitq);3441 }3442 }3443 out:3444 return;3445}3446 3447/*3448 * Must be holding intf->bmc_reg_mutex to call this.3449 */3450static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id)3451{3452 int rv;3453 3454 if (ipmi_version_major(id) > 13455 || (ipmi_version_major(id) == 13456 && ipmi_version_minor(id) >= 5)) {3457 unsigned int set;3458 3459 /*3460 * Start scanning the channels to see what is3461 * available.3462 */3463 set = !intf->curr_working_cset;3464 intf->curr_working_cset = set;3465 memset(&intf->wchannels[set], 0,3466 sizeof(struct ipmi_channel_set));3467 3468 intf->null_user_handler = channel_handler;3469 intf->curr_channel = 0;3470 rv = send_channel_info_cmd(intf, 0);3471 if (rv) {3472 dev_warn(intf->si_dev,3473 "Error sending channel information for channel 0, %d\n",3474 rv);3475 intf->null_user_handler = NULL;3476 return -EIO;3477 }3478 3479 /* Wait for the channel info to be read. */3480 wait_event(intf->waitq, intf->channels_ready);3481 intf->null_user_handler = NULL;3482 } else {3483 unsigned int set = intf->curr_working_cset;3484 3485 /* Assume a single IPMB channel at zero. */3486 intf->wchannels[set].c[0].medium = IPMI_CHANNEL_MEDIUM_IPMB;3487 intf->wchannels[set].c[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB;3488 intf->channel_list = intf->wchannels + set;3489 intf->channels_ready = true;3490 }3491 3492 return 0;3493}3494 3495static void ipmi_poll(struct ipmi_smi *intf)3496{3497 if (intf->handlers->poll)3498 intf->handlers->poll(intf->send_info);3499 /* In case something came in */3500 handle_new_recv_msgs(intf);3501}3502 3503void ipmi_poll_interface(struct ipmi_user *user)3504{3505 ipmi_poll(user->intf);3506}3507EXPORT_SYMBOL(ipmi_poll_interface);3508 3509static ssize_t nr_users_show(struct device *dev,3510 struct device_attribute *attr,3511 char *buf)3512{3513 struct ipmi_smi *intf = container_of(attr,3514 struct ipmi_smi, nr_users_devattr);3515 3516 return sysfs_emit(buf, "%d\n", atomic_read(&intf->nr_users));3517}3518static DEVICE_ATTR_RO(nr_users);3519 3520static ssize_t nr_msgs_show(struct device *dev,3521 struct device_attribute *attr,3522 char *buf)3523{3524 struct ipmi_smi *intf = container_of(attr,3525 struct ipmi_smi, nr_msgs_devattr);3526 struct ipmi_user *user;3527 int index;3528 unsigned int count = 0;3529 3530 index = srcu_read_lock(&intf->users_srcu);3531 list_for_each_entry_rcu(user, &intf->users, link)3532 count += atomic_read(&user->nr_msgs);3533 srcu_read_unlock(&intf->users_srcu, index);3534 3535 return sysfs_emit(buf, "%u\n", count);3536}3537static DEVICE_ATTR_RO(nr_msgs);3538 3539static void redo_bmc_reg(struct work_struct *work)3540{3541 struct ipmi_smi *intf = container_of(work, struct ipmi_smi,3542 bmc_reg_work);3543 3544 if (!intf->in_shutdown)3545 bmc_get_device_id(intf, NULL, NULL, NULL, NULL);3546 3547 kref_put(&intf->refcount, intf_free);3548}3549 3550int ipmi_add_smi(struct module *owner,3551 const struct ipmi_smi_handlers *handlers,3552 void *send_info,3553 struct device *si_dev,3554 unsigned char slave_addr)3555{3556 int i, j;3557 int rv;3558 struct ipmi_smi *intf, *tintf;3559 struct list_head *link;3560 struct ipmi_device_id id;3561 3562 /*3563 * Make sure the driver is actually initialized, this handles3564 * problems with initialization order.3565 */3566 rv = ipmi_init_msghandler();3567 if (rv)3568 return rv;3569 3570 intf = kzalloc(sizeof(*intf), GFP_KERNEL);3571 if (!intf)3572 return -ENOMEM;3573 3574 rv = init_srcu_struct(&intf->users_srcu);3575 if (rv) {3576 kfree(intf);3577 return rv;3578 }3579 3580 intf->owner = owner;3581 intf->bmc = &intf->tmp_bmc;3582 INIT_LIST_HEAD(&intf->bmc->intfs);3583 mutex_init(&intf->bmc->dyn_mutex);3584 INIT_LIST_HEAD(&intf->bmc_link);3585 mutex_init(&intf->bmc_reg_mutex);3586 intf->intf_num = -1; /* Mark it invalid for now. */3587 kref_init(&intf->refcount);3588 INIT_WORK(&intf->bmc_reg_work, redo_bmc_reg);3589 intf->si_dev = si_dev;3590 for (j = 0; j < IPMI_MAX_CHANNELS; j++) {3591 intf->addrinfo[j].address = IPMI_BMC_SLAVE_ADDR;3592 intf->addrinfo[j].lun = 2;3593 }3594 if (slave_addr != 0)3595 intf->addrinfo[0].address = slave_addr;3596 INIT_LIST_HEAD(&intf->users);3597 atomic_set(&intf->nr_users, 0);3598 intf->handlers = handlers;3599 intf->send_info = send_info;3600 spin_lock_init(&intf->seq_lock);3601 for (j = 0; j < IPMI_IPMB_NUM_SEQ; j++) {3602 intf->seq_table[j].inuse = 0;3603 intf->seq_table[j].seqid = 0;3604 }3605 intf->curr_seq = 0;3606 spin_lock_init(&intf->waiting_rcv_msgs_lock);3607 INIT_LIST_HEAD(&intf->waiting_rcv_msgs);3608 INIT_WORK(&intf->recv_work, smi_recv_work);3609 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 0);3610 spin_lock_init(&intf->xmit_msgs_lock);3611 INIT_LIST_HEAD(&intf->xmit_msgs);3612 INIT_LIST_HEAD(&intf->hp_xmit_msgs);3613 spin_lock_init(&intf->events_lock);3614 spin_lock_init(&intf->watch_lock);3615 atomic_set(&intf->event_waiters, 0);3616 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME;3617 INIT_LIST_HEAD(&intf->waiting_events);3618 intf->waiting_events_count = 0;3619 mutex_init(&intf->cmd_rcvrs_mutex);3620 spin_lock_init(&intf->maintenance_mode_lock);3621 INIT_LIST_HEAD(&intf->cmd_rcvrs);3622 init_waitqueue_head(&intf->waitq);3623 for (i = 0; i < IPMI_NUM_STATS; i++)3624 atomic_set(&intf->stats[i], 0);3625 3626 mutex_lock(&ipmi_interfaces_mutex);3627 /* Look for a hole in the numbers. */3628 i = 0;3629 link = &ipmi_interfaces;3630 list_for_each_entry_rcu(tintf, &ipmi_interfaces, link,3631 ipmi_interfaces_mutex_held()) {3632 if (tintf->intf_num != i) {3633 link = &tintf->link;3634 break;3635 }3636 i++;3637 }3638 /* Add the new interface in numeric order. */3639 if (i == 0)3640 list_add_rcu(&intf->link, &ipmi_interfaces);3641 else3642 list_add_tail_rcu(&intf->link, link);3643 3644 rv = handlers->start_processing(send_info, intf);3645 if (rv)3646 goto out_err;3647 3648 rv = __bmc_get_device_id(intf, NULL, &id, NULL, NULL, i);3649 if (rv) {3650 dev_err(si_dev, "Unable to get the device id: %d\n", rv);3651 goto out_err_started;3652 }3653 3654 mutex_lock(&intf->bmc_reg_mutex);3655 rv = __scan_channels(intf, &id);3656 mutex_unlock(&intf->bmc_reg_mutex);3657 if (rv)3658 goto out_err_bmc_reg;3659 3660 intf->nr_users_devattr = dev_attr_nr_users;3661 sysfs_attr_init(&intf->nr_users_devattr.attr);3662 rv = device_create_file(intf->si_dev, &intf->nr_users_devattr);3663 if (rv)3664 goto out_err_bmc_reg;3665 3666 intf->nr_msgs_devattr = dev_attr_nr_msgs;3667 sysfs_attr_init(&intf->nr_msgs_devattr.attr);3668 rv = device_create_file(intf->si_dev, &intf->nr_msgs_devattr);3669 if (rv) {3670 device_remove_file(intf->si_dev, &intf->nr_users_devattr);3671 goto out_err_bmc_reg;3672 }3673 3674 /*3675 * Keep memory order straight for RCU readers. Make3676 * sure everything else is committed to memory before3677 * setting intf_num to mark the interface valid.3678 */3679 smp_wmb();3680 intf->intf_num = i;3681 mutex_unlock(&ipmi_interfaces_mutex);3682 3683 /* After this point the interface is legal to use. */3684 call_smi_watchers(i, intf->si_dev);3685 3686 return 0;3687 3688 out_err_bmc_reg:3689 ipmi_bmc_unregister(intf);3690 out_err_started:3691 if (intf->handlers->shutdown)3692 intf->handlers->shutdown(intf->send_info);3693 out_err:3694 list_del_rcu(&intf->link);3695 mutex_unlock(&ipmi_interfaces_mutex);3696 synchronize_srcu(&ipmi_interfaces_srcu);3697 cleanup_srcu_struct(&intf->users_srcu);3698 kref_put(&intf->refcount, intf_free);3699 3700 return rv;3701}3702EXPORT_SYMBOL(ipmi_add_smi);3703 3704static void deliver_smi_err_response(struct ipmi_smi *intf,3705 struct ipmi_smi_msg *msg,3706 unsigned char err)3707{3708 int rv;3709 msg->rsp[0] = msg->data[0] | 4;3710 msg->rsp[1] = msg->data[1];3711 msg->rsp[2] = err;3712 msg->rsp_size = 3;3713 3714 /* This will never requeue, but it may ask us to free the message. */3715 rv = handle_one_recv_msg(intf, msg);3716 if (rv == 0)3717 ipmi_free_smi_msg(msg);3718}3719 3720static void cleanup_smi_msgs(struct ipmi_smi *intf)3721{3722 int i;3723 struct seq_table *ent;3724 struct ipmi_smi_msg *msg;3725 struct list_head *entry;3726 struct list_head tmplist;3727 3728 /* Clear out our transmit queues and hold the messages. */3729 INIT_LIST_HEAD(&tmplist);3730 list_splice_tail(&intf->hp_xmit_msgs, &tmplist);3731 list_splice_tail(&intf->xmit_msgs, &tmplist);3732 3733 /* Current message first, to preserve order */3734 while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) {3735 /* Wait for the message to clear out. */3736 schedule_timeout(1);3737 }3738 3739 /* No need for locks, the interface is down. */3740 3741 /*3742 * Return errors for all pending messages in queue and in the3743 * tables waiting for remote responses.3744 */3745 while (!list_empty(&tmplist)) {3746 entry = tmplist.next;3747 list_del(entry);3748 msg = list_entry(entry, struct ipmi_smi_msg, link);3749 deliver_smi_err_response(intf, msg, IPMI_ERR_UNSPECIFIED);3750 }3751 3752 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) {3753 ent = &intf->seq_table[i];3754 if (!ent->inuse)3755 continue;3756 deliver_err_response(intf, ent->recv_msg, IPMI_ERR_UNSPECIFIED);3757 }3758}3759 3760void ipmi_unregister_smi(struct ipmi_smi *intf)3761{3762 struct ipmi_smi_watcher *w;3763 int intf_num, index;3764 3765 if (!intf)3766 return;3767 intf_num = intf->intf_num;3768 mutex_lock(&ipmi_interfaces_mutex);3769 intf->intf_num = -1;3770 intf->in_shutdown = true;3771 list_del_rcu(&intf->link);3772 mutex_unlock(&ipmi_interfaces_mutex);3773 synchronize_srcu(&ipmi_interfaces_srcu);3774 3775 /* At this point no users can be added to the interface. */3776 3777 device_remove_file(intf->si_dev, &intf->nr_msgs_devattr);3778 device_remove_file(intf->si_dev, &intf->nr_users_devattr);3779 3780 /*3781 * Call all the watcher interfaces to tell them that3782 * an interface is going away.3783 */3784 mutex_lock(&smi_watchers_mutex);3785 list_for_each_entry(w, &smi_watchers, link)3786 w->smi_gone(intf_num);3787 mutex_unlock(&smi_watchers_mutex);3788 3789 index = srcu_read_lock(&intf->users_srcu);3790 while (!list_empty(&intf->users)) {3791 struct ipmi_user *user =3792 container_of(list_next_rcu(&intf->users),3793 struct ipmi_user, link);3794 3795 _ipmi_destroy_user(user);3796 }3797 srcu_read_unlock(&intf->users_srcu, index);3798 3799 if (intf->handlers->shutdown)3800 intf->handlers->shutdown(intf->send_info);3801 3802 cleanup_smi_msgs(intf);3803 3804 ipmi_bmc_unregister(intf);3805 3806 cleanup_srcu_struct(&intf->users_srcu);3807 kref_put(&intf->refcount, intf_free);3808}3809EXPORT_SYMBOL(ipmi_unregister_smi);3810 3811static int handle_ipmb_get_msg_rsp(struct ipmi_smi *intf,3812 struct ipmi_smi_msg *msg)3813{3814 struct ipmi_ipmb_addr ipmb_addr;3815 struct ipmi_recv_msg *recv_msg;3816 3817 /*3818 * This is 11, not 10, because the response must contain a3819 * completion code.3820 */3821 if (msg->rsp_size < 11) {3822 /* Message not big enough, just ignore it. */3823 ipmi_inc_stat(intf, invalid_ipmb_responses);3824 return 0;3825 }3826 3827 if (msg->rsp[2] != 0) {3828 /* An error getting the response, just ignore it. */3829 return 0;3830 }3831 3832 ipmb_addr.addr_type = IPMI_IPMB_ADDR_TYPE;3833 ipmb_addr.slave_addr = msg->rsp[6];3834 ipmb_addr.channel = msg->rsp[3] & 0x0f;3835 ipmb_addr.lun = msg->rsp[7] & 3;3836 3837 /*3838 * It's a response from a remote entity. Look up the sequence3839 * number and handle the response.3840 */3841 if (intf_find_seq(intf,3842 msg->rsp[7] >> 2,3843 msg->rsp[3] & 0x0f,3844 msg->rsp[8],3845 (msg->rsp[4] >> 2) & (~1),3846 (struct ipmi_addr *) &ipmb_addr,3847 &recv_msg)) {3848 /*3849 * We were unable to find the sequence number,3850 * so just nuke the message.3851 */3852 ipmi_inc_stat(intf, unhandled_ipmb_responses);3853 return 0;3854 }3855 3856 memcpy(recv_msg->msg_data, &msg->rsp[9], msg->rsp_size - 9);3857 /*3858 * The other fields matched, so no need to set them, except3859 * for netfn, which needs to be the response that was3860 * returned, not the request value.3861 */3862 recv_msg->msg.netfn = msg->rsp[4] >> 2;3863 recv_msg->msg.data = recv_msg->msg_data;3864 recv_msg->msg.data_len = msg->rsp_size - 10;3865 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;3866 if (deliver_response(intf, recv_msg))3867 ipmi_inc_stat(intf, unhandled_ipmb_responses);3868 else3869 ipmi_inc_stat(intf, handled_ipmb_responses);3870 3871 return 0;3872}3873 3874static int handle_ipmb_get_msg_cmd(struct ipmi_smi *intf,3875 struct ipmi_smi_msg *msg)3876{3877 struct cmd_rcvr *rcvr;3878 int rv = 0;3879 unsigned char netfn;3880 unsigned char cmd;3881 unsigned char chan;3882 struct ipmi_user *user = NULL;3883 struct ipmi_ipmb_addr *ipmb_addr;3884 struct ipmi_recv_msg *recv_msg;3885 3886 if (msg->rsp_size < 10) {3887 /* Message not big enough, just ignore it. */3888 ipmi_inc_stat(intf, invalid_commands);3889 return 0;3890 }3891 3892 if (msg->rsp[2] != 0) {3893 /* An error getting the response, just ignore it. */3894 return 0;3895 }3896 3897 netfn = msg->rsp[4] >> 2;3898 cmd = msg->rsp[8];3899 chan = msg->rsp[3] & 0xf;3900 3901 rcu_read_lock();3902 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan);3903 if (rcvr) {3904 user = rcvr->user;3905 kref_get(&user->refcount);3906 } else3907 user = NULL;3908 rcu_read_unlock();3909 3910 if (user == NULL) {3911 /* We didn't find a user, deliver an error response. */3912 ipmi_inc_stat(intf, unhandled_commands);3913 3914 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);3915 msg->data[1] = IPMI_SEND_MSG_CMD;3916 msg->data[2] = msg->rsp[3];3917 msg->data[3] = msg->rsp[6];3918 msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3);3919 msg->data[5] = ipmb_checksum(&msg->data[3], 2);3920 msg->data[6] = intf->addrinfo[msg->rsp[3] & 0xf].address;3921 /* rqseq/lun */3922 msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3);3923 msg->data[8] = msg->rsp[8]; /* cmd */3924 msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE;3925 msg->data[10] = ipmb_checksum(&msg->data[6], 4);3926 msg->data_size = 11;3927 3928 dev_dbg(intf->si_dev, "Invalid command: %*ph\n",3929 msg->data_size, msg->data);3930 3931 rcu_read_lock();3932 if (!intf->in_shutdown) {3933 smi_send(intf, intf->handlers, msg, 0);3934 /*3935 * We used the message, so return the value3936 * that causes it to not be freed or3937 * queued.3938 */3939 rv = -1;3940 }3941 rcu_read_unlock();3942 } else {3943 recv_msg = ipmi_alloc_recv_msg();3944 if (!recv_msg) {3945 /*3946 * We couldn't allocate memory for the3947 * message, so requeue it for handling3948 * later.3949 */3950 rv = 1;3951 kref_put(&user->refcount, free_user);3952 } else {3953 /* Extract the source address from the data. */3954 ipmb_addr = (struct ipmi_ipmb_addr *) &recv_msg->addr;3955 ipmb_addr->addr_type = IPMI_IPMB_ADDR_TYPE;3956 ipmb_addr->slave_addr = msg->rsp[6];3957 ipmb_addr->lun = msg->rsp[7] & 3;3958 ipmb_addr->channel = msg->rsp[3] & 0xf;3959 3960 /*3961 * Extract the rest of the message information3962 * from the IPMB header.3963 */3964 recv_msg->user = user;3965 recv_msg->recv_type = IPMI_CMD_RECV_TYPE;3966 recv_msg->msgid = msg->rsp[7] >> 2;3967 recv_msg->msg.netfn = msg->rsp[4] >> 2;3968 recv_msg->msg.cmd = msg->rsp[8];3969 recv_msg->msg.data = recv_msg->msg_data;3970 3971 /*3972 * We chop off 10, not 9 bytes because the checksum3973 * at the end also needs to be removed.3974 */3975 recv_msg->msg.data_len = msg->rsp_size - 10;3976 memcpy(recv_msg->msg_data, &msg->rsp[9],3977 msg->rsp_size - 10);3978 if (deliver_response(intf, recv_msg))3979 ipmi_inc_stat(intf, unhandled_commands);3980 else3981 ipmi_inc_stat(intf, handled_commands);3982 }3983 }3984 3985 return rv;3986}3987 3988static int handle_ipmb_direct_rcv_cmd(struct ipmi_smi *intf,3989 struct ipmi_smi_msg *msg)3990{3991 struct cmd_rcvr *rcvr;3992 int rv = 0;3993 struct ipmi_user *user = NULL;3994 struct ipmi_ipmb_direct_addr *daddr;3995 struct ipmi_recv_msg *recv_msg;3996 unsigned char netfn = msg->rsp[0] >> 2;3997 unsigned char cmd = msg->rsp[3];3998 3999 rcu_read_lock();4000 /* We always use channel 0 for direct messages. */4001 rcvr = find_cmd_rcvr(intf, netfn, cmd, 0);4002 if (rcvr) {4003 user = rcvr->user;4004 kref_get(&user->refcount);4005 } else4006 user = NULL;4007 rcu_read_unlock();4008 4009 if (user == NULL) {4010 /* We didn't find a user, deliver an error response. */4011 ipmi_inc_stat(intf, unhandled_commands);4012 4013 msg->data[0] = (netfn + 1) << 2;4014 msg->data[0] |= msg->rsp[2] & 0x3; /* rqLUN */4015 msg->data[1] = msg->rsp[1]; /* Addr */4016 msg->data[2] = msg->rsp[2] & ~0x3; /* rqSeq */4017 msg->data[2] |= msg->rsp[0] & 0x3; /* rsLUN */4018 msg->data[3] = cmd;4019 msg->data[4] = IPMI_INVALID_CMD_COMPLETION_CODE;4020 msg->data_size = 5;4021 4022 rcu_read_lock();4023 if (!intf->in_shutdown) {4024 smi_send(intf, intf->handlers, msg, 0);4025 /*4026 * We used the message, so return the value4027 * that causes it to not be freed or4028 * queued.4029 */4030 rv = -1;4031 }4032 rcu_read_unlock();4033 } else {4034 recv_msg = ipmi_alloc_recv_msg();4035 if (!recv_msg) {4036 /*4037 * We couldn't allocate memory for the4038 * message, so requeue it for handling4039 * later.4040 */4041 rv = 1;4042 kref_put(&user->refcount, free_user);4043 } else {4044 /* Extract the source address from the data. */4045 daddr = (struct ipmi_ipmb_direct_addr *)&recv_msg->addr;4046 daddr->addr_type = IPMI_IPMB_DIRECT_ADDR_TYPE;4047 daddr->channel = 0;4048 daddr->slave_addr = msg->rsp[1];4049 daddr->rs_lun = msg->rsp[0] & 3;4050 daddr->rq_lun = msg->rsp[2] & 3;4051 4052 /*4053 * Extract the rest of the message information4054 * from the IPMB header.4055 */4056 recv_msg->user = user;4057 recv_msg->recv_type = IPMI_CMD_RECV_TYPE;4058 recv_msg->msgid = (msg->rsp[2] >> 2);4059 recv_msg->msg.netfn = msg->rsp[0] >> 2;4060 recv_msg->msg.cmd = msg->rsp[3];4061 recv_msg->msg.data = recv_msg->msg_data;4062 4063 recv_msg->msg.data_len = msg->rsp_size - 4;4064 memcpy(recv_msg->msg_data, msg->rsp + 4,4065 msg->rsp_size - 4);4066 if (deliver_response(intf, recv_msg))4067 ipmi_inc_stat(intf, unhandled_commands);4068 else4069 ipmi_inc_stat(intf, handled_commands);4070 }4071 }4072 4073 return rv;4074}4075 4076static int handle_ipmb_direct_rcv_rsp(struct ipmi_smi *intf,4077 struct ipmi_smi_msg *msg)4078{4079 struct ipmi_recv_msg *recv_msg;4080 struct ipmi_ipmb_direct_addr *daddr;4081 4082 recv_msg = msg->user_data;4083 if (recv_msg == NULL) {4084 dev_warn(intf->si_dev,4085 "IPMI direct message received with no owner. This could be because of a malformed message, or because of a hardware error. Contact your hardware vendor for assistance.\n");4086 return 0;4087 }4088 4089 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;4090 recv_msg->msgid = msg->msgid;4091 daddr = (struct ipmi_ipmb_direct_addr *) &recv_msg->addr;4092 daddr->addr_type = IPMI_IPMB_DIRECT_ADDR_TYPE;4093 daddr->channel = 0;4094 daddr->slave_addr = msg->rsp[1];4095 daddr->rq_lun = msg->rsp[0] & 3;4096 daddr->rs_lun = msg->rsp[2] & 3;4097 recv_msg->msg.netfn = msg->rsp[0] >> 2;4098 recv_msg->msg.cmd = msg->rsp[3];4099 memcpy(recv_msg->msg_data, &msg->rsp[4], msg->rsp_size - 4);4100 recv_msg->msg.data = recv_msg->msg_data;4101 recv_msg->msg.data_len = msg->rsp_size - 4;4102 deliver_local_response(intf, recv_msg);4103 4104 return 0;4105}4106 4107static int handle_lan_get_msg_rsp(struct ipmi_smi *intf,4108 struct ipmi_smi_msg *msg)4109{4110 struct ipmi_lan_addr lan_addr;4111 struct ipmi_recv_msg *recv_msg;4112 4113 4114 /*4115 * This is 13, not 12, because the response must contain a4116 * completion code.4117 */4118 if (msg->rsp_size < 13) {4119 /* Message not big enough, just ignore it. */4120 ipmi_inc_stat(intf, invalid_lan_responses);4121 return 0;4122 }4123 4124 if (msg->rsp[2] != 0) {4125 /* An error getting the response, just ignore it. */4126 return 0;4127 }4128 4129 lan_addr.addr_type = IPMI_LAN_ADDR_TYPE;4130 lan_addr.session_handle = msg->rsp[4];4131 lan_addr.remote_SWID = msg->rsp[8];4132 lan_addr.local_SWID = msg->rsp[5];4133 lan_addr.channel = msg->rsp[3] & 0x0f;4134 lan_addr.privilege = msg->rsp[3] >> 4;4135 lan_addr.lun = msg->rsp[9] & 3;4136 4137 /*4138 * It's a response from a remote entity. Look up the sequence4139 * number and handle the response.4140 */4141 if (intf_find_seq(intf,4142 msg->rsp[9] >> 2,4143 msg->rsp[3] & 0x0f,4144 msg->rsp[10],4145 (msg->rsp[6] >> 2) & (~1),4146 (struct ipmi_addr *) &lan_addr,4147 &recv_msg)) {4148 /*4149 * We were unable to find the sequence number,4150 * so just nuke the message.4151 */4152 ipmi_inc_stat(intf, unhandled_lan_responses);4153 return 0;4154 }4155 4156 memcpy(recv_msg->msg_data, &msg->rsp[11], msg->rsp_size - 11);4157 /*4158 * The other fields matched, so no need to set them, except4159 * for netfn, which needs to be the response that was4160 * returned, not the request value.4161 */4162 recv_msg->msg.netfn = msg->rsp[6] >> 2;4163 recv_msg->msg.data = recv_msg->msg_data;4164 recv_msg->msg.data_len = msg->rsp_size - 12;4165 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;4166 if (deliver_response(intf, recv_msg))4167 ipmi_inc_stat(intf, unhandled_lan_responses);4168 else4169 ipmi_inc_stat(intf, handled_lan_responses);4170 4171 return 0;4172}4173 4174static int handle_lan_get_msg_cmd(struct ipmi_smi *intf,4175 struct ipmi_smi_msg *msg)4176{4177 struct cmd_rcvr *rcvr;4178 int rv = 0;4179 unsigned char netfn;4180 unsigned char cmd;4181 unsigned char chan;4182 struct ipmi_user *user = NULL;4183 struct ipmi_lan_addr *lan_addr;4184 struct ipmi_recv_msg *recv_msg;4185 4186 if (msg->rsp_size < 12) {4187 /* Message not big enough, just ignore it. */4188 ipmi_inc_stat(intf, invalid_commands);4189 return 0;4190 }4191 4192 if (msg->rsp[2] != 0) {4193 /* An error getting the response, just ignore it. */4194 return 0;4195 }4196 4197 netfn = msg->rsp[6] >> 2;4198 cmd = msg->rsp[10];4199 chan = msg->rsp[3] & 0xf;4200 4201 rcu_read_lock();4202 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan);4203 if (rcvr) {4204 user = rcvr->user;4205 kref_get(&user->refcount);4206 } else4207 user = NULL;4208 rcu_read_unlock();4209 4210 if (user == NULL) {4211 /* We didn't find a user, just give up. */4212 ipmi_inc_stat(intf, unhandled_commands);4213 4214 /*4215 * Don't do anything with these messages, just allow4216 * them to be freed.4217 */4218 rv = 0;4219 } else {4220 recv_msg = ipmi_alloc_recv_msg();4221 if (!recv_msg) {4222 /*4223 * We couldn't allocate memory for the4224 * message, so requeue it for handling later.4225 */4226 rv = 1;4227 kref_put(&user->refcount, free_user);4228 } else {4229 /* Extract the source address from the data. */4230 lan_addr = (struct ipmi_lan_addr *) &recv_msg->addr;4231 lan_addr->addr_type = IPMI_LAN_ADDR_TYPE;4232 lan_addr->session_handle = msg->rsp[4];4233 lan_addr->remote_SWID = msg->rsp[8];4234 lan_addr->local_SWID = msg->rsp[5];4235 lan_addr->lun = msg->rsp[9] & 3;4236 lan_addr->channel = msg->rsp[3] & 0xf;4237 lan_addr->privilege = msg->rsp[3] >> 4;4238 4239 /*4240 * Extract the rest of the message information4241 * from the IPMB header.4242 */4243 recv_msg->user = user;4244 recv_msg->recv_type = IPMI_CMD_RECV_TYPE;4245 recv_msg->msgid = msg->rsp[9] >> 2;4246 recv_msg->msg.netfn = msg->rsp[6] >> 2;4247 recv_msg->msg.cmd = msg->rsp[10];4248 recv_msg->msg.data = recv_msg->msg_data;4249 4250 /*4251 * We chop off 12, not 11 bytes because the checksum4252 * at the end also needs to be removed.4253 */4254 recv_msg->msg.data_len = msg->rsp_size - 12;4255 memcpy(recv_msg->msg_data, &msg->rsp[11],4256 msg->rsp_size - 12);4257 if (deliver_response(intf, recv_msg))4258 ipmi_inc_stat(intf, unhandled_commands);4259 else4260 ipmi_inc_stat(intf, handled_commands);4261 }4262 }4263 4264 return rv;4265}4266 4267/*4268 * This routine will handle "Get Message" command responses with4269 * channels that use an OEM Medium. The message format belongs to4270 * the OEM. See IPMI 2.0 specification, Chapter 6 and4271 * Chapter 22, sections 22.6 and 22.24 for more details.4272 */4273static int handle_oem_get_msg_cmd(struct ipmi_smi *intf,4274 struct ipmi_smi_msg *msg)4275{4276 struct cmd_rcvr *rcvr;4277 int rv = 0;4278 unsigned char netfn;4279 unsigned char cmd;4280 unsigned char chan;4281 struct ipmi_user *user = NULL;4282 struct ipmi_system_interface_addr *smi_addr;4283 struct ipmi_recv_msg *recv_msg;4284 4285 /*4286 * We expect the OEM SW to perform error checking4287 * so we just do some basic sanity checks4288 */4289 if (msg->rsp_size < 4) {4290 /* Message not big enough, just ignore it. */4291 ipmi_inc_stat(intf, invalid_commands);4292 return 0;4293 }4294 4295 if (msg->rsp[2] != 0) {4296 /* An error getting the response, just ignore it. */4297 return 0;4298 }4299 4300 /*4301 * This is an OEM Message so the OEM needs to know how4302 * handle the message. We do no interpretation.4303 */4304 netfn = msg->rsp[0] >> 2;4305 cmd = msg->rsp[1];4306 chan = msg->rsp[3] & 0xf;4307 4308 rcu_read_lock();4309 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan);4310 if (rcvr) {4311 user = rcvr->user;4312 kref_get(&user->refcount);4313 } else4314 user = NULL;4315 rcu_read_unlock();4316 4317 if (user == NULL) {4318 /* We didn't find a user, just give up. */4319 ipmi_inc_stat(intf, unhandled_commands);4320 4321 /*4322 * Don't do anything with these messages, just allow4323 * them to be freed.4324 */4325 4326 rv = 0;4327 } else {4328 recv_msg = ipmi_alloc_recv_msg();4329 if (!recv_msg) {4330 /*4331 * We couldn't allocate memory for the4332 * message, so requeue it for handling4333 * later.4334 */4335 rv = 1;4336 kref_put(&user->refcount, free_user);4337 } else {4338 /*4339 * OEM Messages are expected to be delivered via4340 * the system interface to SMS software. We might4341 * need to visit this again depending on OEM4342 * requirements4343 */4344 smi_addr = ((struct ipmi_system_interface_addr *)4345 &recv_msg->addr);4346 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;4347 smi_addr->channel = IPMI_BMC_CHANNEL;4348 smi_addr->lun = msg->rsp[0] & 3;4349 4350 recv_msg->user = user;4351 recv_msg->user_msg_data = NULL;4352 recv_msg->recv_type = IPMI_OEM_RECV_TYPE;4353 recv_msg->msg.netfn = msg->rsp[0] >> 2;4354 recv_msg->msg.cmd = msg->rsp[1];4355 recv_msg->msg.data = recv_msg->msg_data;4356 4357 /*4358 * The message starts at byte 4 which follows the4359 * Channel Byte in the "GET MESSAGE" command4360 */4361 recv_msg->msg.data_len = msg->rsp_size - 4;4362 memcpy(recv_msg->msg_data, &msg->rsp[4],4363 msg->rsp_size - 4);4364 if (deliver_response(intf, recv_msg))4365 ipmi_inc_stat(intf, unhandled_commands);4366 else4367 ipmi_inc_stat(intf, handled_commands);4368 }4369 }4370 4371 return rv;4372}4373 4374static void copy_event_into_recv_msg(struct ipmi_recv_msg *recv_msg,4375 struct ipmi_smi_msg *msg)4376{4377 struct ipmi_system_interface_addr *smi_addr;4378 4379 recv_msg->msgid = 0;4380 smi_addr = (struct ipmi_system_interface_addr *) &recv_msg->addr;4381 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;4382 smi_addr->channel = IPMI_BMC_CHANNEL;4383 smi_addr->lun = msg->rsp[0] & 3;4384 recv_msg->recv_type = IPMI_ASYNC_EVENT_RECV_TYPE;4385 recv_msg->msg.netfn = msg->rsp[0] >> 2;4386 recv_msg->msg.cmd = msg->rsp[1];4387 memcpy(recv_msg->msg_data, &msg->rsp[3], msg->rsp_size - 3);4388 recv_msg->msg.data = recv_msg->msg_data;4389 recv_msg->msg.data_len = msg->rsp_size - 3;4390}4391 4392static int handle_read_event_rsp(struct ipmi_smi *intf,4393 struct ipmi_smi_msg *msg)4394{4395 struct ipmi_recv_msg *recv_msg, *recv_msg2;4396 struct list_head msgs;4397 struct ipmi_user *user;4398 int rv = 0, deliver_count = 0, index;4399 unsigned long flags;4400 4401 if (msg->rsp_size < 19) {4402 /* Message is too small to be an IPMB event. */4403 ipmi_inc_stat(intf, invalid_events);4404 return 0;4405 }4406 4407 if (msg->rsp[2] != 0) {4408 /* An error getting the event, just ignore it. */4409 return 0;4410 }4411 4412 INIT_LIST_HEAD(&msgs);4413 4414 spin_lock_irqsave(&intf->events_lock, flags);4415 4416 ipmi_inc_stat(intf, events);4417 4418 /*4419 * Allocate and fill in one message for every user that is4420 * getting events.4421 */4422 index = srcu_read_lock(&intf->users_srcu);4423 list_for_each_entry_rcu(user, &intf->users, link) {4424 if (!user->gets_events)4425 continue;4426 4427 recv_msg = ipmi_alloc_recv_msg();4428 if (!recv_msg) {4429 rcu_read_unlock();4430 list_for_each_entry_safe(recv_msg, recv_msg2, &msgs,4431 link) {4432 list_del(&recv_msg->link);4433 ipmi_free_recv_msg(recv_msg);4434 }4435 /*4436 * We couldn't allocate memory for the4437 * message, so requeue it for handling4438 * later.4439 */4440 rv = 1;4441 goto out;4442 }4443 4444 deliver_count++;4445 4446 copy_event_into_recv_msg(recv_msg, msg);4447 recv_msg->user = user;4448 kref_get(&user->refcount);4449 list_add_tail(&recv_msg->link, &msgs);4450 }4451 srcu_read_unlock(&intf->users_srcu, index);4452 4453 if (deliver_count) {4454 /* Now deliver all the messages. */4455 list_for_each_entry_safe(recv_msg, recv_msg2, &msgs, link) {4456 list_del(&recv_msg->link);4457 deliver_local_response(intf, recv_msg);4458 }4459 } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) {4460 /*4461 * No one to receive the message, put it in queue if there's4462 * not already too many things in the queue.4463 */4464 recv_msg = ipmi_alloc_recv_msg();4465 if (!recv_msg) {4466 /*4467 * We couldn't allocate memory for the4468 * message, so requeue it for handling4469 * later.4470 */4471 rv = 1;4472 goto out;4473 }4474 4475 copy_event_into_recv_msg(recv_msg, msg);4476 list_add_tail(&recv_msg->link, &intf->waiting_events);4477 intf->waiting_events_count++;4478 } else if (!intf->event_msg_printed) {4479 /*4480 * There's too many things in the queue, discard this4481 * message.4482 */4483 dev_warn(intf->si_dev,4484 "Event queue full, discarding incoming events\n");4485 intf->event_msg_printed = 1;4486 }4487 4488 out:4489 spin_unlock_irqrestore(&intf->events_lock, flags);4490 4491 return rv;4492}4493 4494static int handle_bmc_rsp(struct ipmi_smi *intf,4495 struct ipmi_smi_msg *msg)4496{4497 struct ipmi_recv_msg *recv_msg;4498 struct ipmi_system_interface_addr *smi_addr;4499 4500 recv_msg = msg->user_data;4501 if (recv_msg == NULL) {4502 dev_warn(intf->si_dev,4503 "IPMI SMI message received with no owner. This could be because of a malformed message, or because of a hardware error. Contact your hardware vendor for assistance.\n");4504 return 0;4505 }4506 4507 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;4508 recv_msg->msgid = msg->msgid;4509 smi_addr = ((struct ipmi_system_interface_addr *)4510 &recv_msg->addr);4511 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;4512 smi_addr->channel = IPMI_BMC_CHANNEL;4513 smi_addr->lun = msg->rsp[0] & 3;4514 recv_msg->msg.netfn = msg->rsp[0] >> 2;4515 recv_msg->msg.cmd = msg->rsp[1];4516 memcpy(recv_msg->msg_data, &msg->rsp[2], msg->rsp_size - 2);4517 recv_msg->msg.data = recv_msg->msg_data;4518 recv_msg->msg.data_len = msg->rsp_size - 2;4519 deliver_local_response(intf, recv_msg);4520 4521 return 0;4522}4523 4524/*4525 * Handle a received message. Return 1 if the message should be requeued,4526 * 0 if the message should be freed, or -1 if the message should not4527 * be freed or requeued.4528 */4529static int handle_one_recv_msg(struct ipmi_smi *intf,4530 struct ipmi_smi_msg *msg)4531{4532 int requeue = 0;4533 int chan;4534 unsigned char cc;4535 bool is_cmd = !((msg->rsp[0] >> 2) & 1);4536 4537 dev_dbg(intf->si_dev, "Recv: %*ph\n", msg->rsp_size, msg->rsp);4538 4539 if (msg->rsp_size < 2) {4540 /* Message is too small to be correct. */4541 dev_warn(intf->si_dev,4542 "BMC returned too small a message for netfn %x cmd %x, got %d bytes\n",4543 (msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size);4544 4545return_unspecified:4546 /* Generate an error response for the message. */4547 msg->rsp[0] = msg->data[0] | (1 << 2);4548 msg->rsp[1] = msg->data[1];4549 msg->rsp[2] = IPMI_ERR_UNSPECIFIED;4550 msg->rsp_size = 3;4551 } else if (msg->type == IPMI_SMI_MSG_TYPE_IPMB_DIRECT) {4552 /* commands must have at least 4 bytes, responses 5. */4553 if (is_cmd && (msg->rsp_size < 4)) {4554 ipmi_inc_stat(intf, invalid_commands);4555 goto out;4556 }4557 if (!is_cmd && (msg->rsp_size < 5)) {4558 ipmi_inc_stat(intf, invalid_ipmb_responses);4559 /* Construct a valid error response. */4560 msg->rsp[0] = msg->data[0] & 0xfc; /* NetFN */4561 msg->rsp[0] |= (1 << 2); /* Make it a response */4562 msg->rsp[0] |= msg->data[2] & 3; /* rqLUN */4563 msg->rsp[1] = msg->data[1]; /* Addr */4564 msg->rsp[2] = msg->data[2] & 0xfc; /* rqSeq */4565 msg->rsp[2] |= msg->data[0] & 0x3; /* rsLUN */4566 msg->rsp[3] = msg->data[3]; /* Cmd */4567 msg->rsp[4] = IPMI_ERR_UNSPECIFIED;4568 msg->rsp_size = 5;4569 }4570 } else if ((msg->data_size >= 2)4571 && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2))4572 && (msg->data[1] == IPMI_SEND_MSG_CMD)4573 && (msg->user_data == NULL)) {4574 4575 if (intf->in_shutdown)4576 goto out;4577 4578 /*4579 * This is the local response to a command send, start4580 * the timer for these. The user_data will not be4581 * NULL if this is a response send, and we will let4582 * response sends just go through.4583 */4584 4585 /*4586 * Check for errors, if we get certain errors (ones4587 * that mean basically we can try again later), we4588 * ignore them and start the timer. Otherwise we4589 * report the error immediately.4590 */4591 if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0)4592 && (msg->rsp[2] != IPMI_NODE_BUSY_ERR)4593 && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR)4594 && (msg->rsp[2] != IPMI_BUS_ERR)4595 && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) {4596 int ch = msg->rsp[3] & 0xf;4597 struct ipmi_channel *chans;4598 4599 /* Got an error sending the message, handle it. */4600 4601 chans = READ_ONCE(intf->channel_list)->c;4602 if ((chans[ch].medium == IPMI_CHANNEL_MEDIUM_8023LAN)4603 || (chans[ch].medium == IPMI_CHANNEL_MEDIUM_ASYNC))4604 ipmi_inc_stat(intf, sent_lan_command_errs);4605 else4606 ipmi_inc_stat(intf, sent_ipmb_command_errs);4607 intf_err_seq(intf, msg->msgid, msg->rsp[2]);4608 } else4609 /* The message was sent, start the timer. */4610 intf_start_seq_timer(intf, msg->msgid);4611 requeue = 0;4612 goto out;4613 } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1))4614 || (msg->rsp[1] != msg->data[1])) {4615 /*4616 * The NetFN and Command in the response is not even4617 * marginally correct.4618 */4619 dev_warn(intf->si_dev,4620 "BMC returned incorrect response, expected netfn %x cmd %x, got netfn %x cmd %x\n",4621 (msg->data[0] >> 2) | 1, msg->data[1],4622 msg->rsp[0] >> 2, msg->rsp[1]);4623 4624 goto return_unspecified;4625 }4626 4627 if (msg->type == IPMI_SMI_MSG_TYPE_IPMB_DIRECT) {4628 if ((msg->data[0] >> 2) & 1) {4629 /* It's a response to a sent response. */4630 chan = 0;4631 cc = msg->rsp[4];4632 goto process_response_response;4633 }4634 if (is_cmd)4635 requeue = handle_ipmb_direct_rcv_cmd(intf, msg);4636 else4637 requeue = handle_ipmb_direct_rcv_rsp(intf, msg);4638 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))4639 && (msg->rsp[1] == IPMI_SEND_MSG_CMD)4640 && (msg->user_data != NULL)) {4641 /*4642 * It's a response to a response we sent. For this we4643 * deliver a send message response to the user.4644 */4645 struct ipmi_recv_msg *recv_msg;4646 4647 chan = msg->data[2] & 0x0f;4648 if (chan >= IPMI_MAX_CHANNELS)4649 /* Invalid channel number */4650 goto out;4651 cc = msg->rsp[2];4652 4653process_response_response:4654 recv_msg = msg->user_data;4655 4656 requeue = 0;4657 if (!recv_msg)4658 goto out;4659 4660 recv_msg->recv_type = IPMI_RESPONSE_RESPONSE_TYPE;4661 recv_msg->msg.data = recv_msg->msg_data;4662 recv_msg->msg_data[0] = cc;4663 recv_msg->msg.data_len = 1;4664 deliver_local_response(intf, recv_msg);4665 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))4666 && (msg->rsp[1] == IPMI_GET_MSG_CMD)) {4667 struct ipmi_channel *chans;4668 4669 /* It's from the receive queue. */4670 chan = msg->rsp[3] & 0xf;4671 if (chan >= IPMI_MAX_CHANNELS) {4672 /* Invalid channel number */4673 requeue = 0;4674 goto out;4675 }4676 4677 /*4678 * We need to make sure the channels have been initialized.4679 * The channel_handler routine will set the "curr_channel"4680 * equal to or greater than IPMI_MAX_CHANNELS when all the4681 * channels for this interface have been initialized.4682 */4683 if (!intf->channels_ready) {4684 requeue = 0; /* Throw the message away */4685 goto out;4686 }4687 4688 chans = READ_ONCE(intf->channel_list)->c;4689 4690 switch (chans[chan].medium) {4691 case IPMI_CHANNEL_MEDIUM_IPMB:4692 if (msg->rsp[4] & 0x04) {4693 /*4694 * It's a response, so find the4695 * requesting message and send it up.4696 */4697 requeue = handle_ipmb_get_msg_rsp(intf, msg);4698 } else {4699 /*4700 * It's a command to the SMS from some other4701 * entity. Handle that.4702 */4703 requeue = handle_ipmb_get_msg_cmd(intf, msg);4704 }4705 break;4706 4707 case IPMI_CHANNEL_MEDIUM_8023LAN:4708 case IPMI_CHANNEL_MEDIUM_ASYNC:4709 if (msg->rsp[6] & 0x04) {4710 /*4711 * It's a response, so find the4712 * requesting message and send it up.4713 */4714 requeue = handle_lan_get_msg_rsp(intf, msg);4715 } else {4716 /*4717 * It's a command to the SMS from some other4718 * entity. Handle that.4719 */4720 requeue = handle_lan_get_msg_cmd(intf, msg);4721 }4722 break;4723 4724 default:4725 /* Check for OEM Channels. Clients had better4726 register for these commands. */4727 if ((chans[chan].medium >= IPMI_CHANNEL_MEDIUM_OEM_MIN)4728 && (chans[chan].medium4729 <= IPMI_CHANNEL_MEDIUM_OEM_MAX)) {4730 requeue = handle_oem_get_msg_cmd(intf, msg);4731 } else {4732 /*4733 * We don't handle the channel type, so just4734 * free the message.4735 */4736 requeue = 0;4737 }4738 }4739 4740 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))4741 && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD)) {4742 /* It's an asynchronous event. */4743 requeue = handle_read_event_rsp(intf, msg);4744 } else {4745 /* It's a response from the local BMC. */4746 requeue = handle_bmc_rsp(intf, msg);4747 }4748 4749 out:4750 return requeue;4751}4752 4753/*4754 * If there are messages in the queue or pretimeouts, handle them.4755 */4756static void handle_new_recv_msgs(struct ipmi_smi *intf)4757{4758 struct ipmi_smi_msg *smi_msg;4759 unsigned long flags = 0;4760 int rv;4761 int run_to_completion = intf->run_to_completion;4762 4763 /* See if any waiting messages need to be processed. */4764 if (!run_to_completion)4765 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags);4766 while (!list_empty(&intf->waiting_rcv_msgs)) {4767 smi_msg = list_entry(intf->waiting_rcv_msgs.next,4768 struct ipmi_smi_msg, link);4769 list_del(&smi_msg->link);4770 if (!run_to_completion)4771 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock,4772 flags);4773 rv = handle_one_recv_msg(intf, smi_msg);4774 if (!run_to_completion)4775 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags);4776 if (rv > 0) {4777 /*4778 * To preserve message order, quit if we4779 * can't handle a message. Add the message4780 * back at the head, this is safe because this4781 * workqueue is the only thing that pulls the4782 * messages.4783 */4784 list_add(&smi_msg->link, &intf->waiting_rcv_msgs);4785 break;4786 } else {4787 if (rv == 0)4788 /* Message handled */4789 ipmi_free_smi_msg(smi_msg);4790 /* If rv < 0, fatal error, del but don't free. */4791 }4792 }4793 if (!run_to_completion)4794 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, flags);4795 4796 /*4797 * If the pretimout count is non-zero, decrement one from it and4798 * deliver pretimeouts to all the users.4799 */4800 if (atomic_add_unless(&intf->watchdog_pretimeouts_to_deliver, -1, 0)) {4801 struct ipmi_user *user;4802 int index;4803 4804 index = srcu_read_lock(&intf->users_srcu);4805 list_for_each_entry_rcu(user, &intf->users, link) {4806 if (user->handler->ipmi_watchdog_pretimeout)4807 user->handler->ipmi_watchdog_pretimeout(4808 user->handler_data);4809 }4810 srcu_read_unlock(&intf->users_srcu, index);4811 }4812}4813 4814static void smi_recv_work(struct work_struct *t)4815{4816 unsigned long flags = 0; /* keep us warning-free. */4817 struct ipmi_smi *intf = from_work(intf, t, recv_work);4818 int run_to_completion = intf->run_to_completion;4819 struct ipmi_smi_msg *newmsg = NULL;4820 4821 /*4822 * Start the next message if available.4823 *4824 * Do this here, not in the actual receiver, because we may deadlock4825 * because the lower layer is allowed to hold locks while calling4826 * message delivery.4827 */4828 4829 rcu_read_lock();4830 4831 if (!run_to_completion)4832 spin_lock_irqsave(&intf->xmit_msgs_lock, flags);4833 if (intf->curr_msg == NULL && !intf->in_shutdown) {4834 struct list_head *entry = NULL;4835 4836 /* Pick the high priority queue first. */4837 if (!list_empty(&intf->hp_xmit_msgs))4838 entry = intf->hp_xmit_msgs.next;4839 else if (!list_empty(&intf->xmit_msgs))4840 entry = intf->xmit_msgs.next;4841 4842 if (entry) {4843 list_del(entry);4844 newmsg = list_entry(entry, struct ipmi_smi_msg, link);4845 intf->curr_msg = newmsg;4846 }4847 }4848 4849 if (!run_to_completion)4850 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags);4851 if (newmsg)4852 intf->handlers->sender(intf->send_info, newmsg);4853 4854 rcu_read_unlock();4855 4856 handle_new_recv_msgs(intf);4857}4858 4859/* Handle a new message from the lower layer. */4860void ipmi_smi_msg_received(struct ipmi_smi *intf,4861 struct ipmi_smi_msg *msg)4862{4863 unsigned long flags = 0; /* keep us warning-free. */4864 int run_to_completion = intf->run_to_completion;4865 4866 /*4867 * To preserve message order, we keep a queue and deliver from4868 * a workqueue.4869 */4870 if (!run_to_completion)4871 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags);4872 list_add_tail(&msg->link, &intf->waiting_rcv_msgs);4873 if (!run_to_completion)4874 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock,4875 flags);4876 4877 if (!run_to_completion)4878 spin_lock_irqsave(&intf->xmit_msgs_lock, flags);4879 /*4880 * We can get an asynchronous event or receive message in addition4881 * to commands we send.4882 */4883 if (msg == intf->curr_msg)4884 intf->curr_msg = NULL;4885 if (!run_to_completion)4886 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags);4887 4888 if (run_to_completion)4889 smi_recv_work(&intf->recv_work);4890 else4891 queue_work(system_bh_wq, &intf->recv_work);4892}4893EXPORT_SYMBOL(ipmi_smi_msg_received);4894 4895void ipmi_smi_watchdog_pretimeout(struct ipmi_smi *intf)4896{4897 if (intf->in_shutdown)4898 return;4899 4900 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 1);4901 queue_work(system_bh_wq, &intf->recv_work);4902}4903EXPORT_SYMBOL(ipmi_smi_watchdog_pretimeout);4904 4905static struct ipmi_smi_msg *4906smi_from_recv_msg(struct ipmi_smi *intf, struct ipmi_recv_msg *recv_msg,4907 unsigned char seq, long seqid)4908{4909 struct ipmi_smi_msg *smi_msg = ipmi_alloc_smi_msg();4910 if (!smi_msg)4911 /*4912 * If we can't allocate the message, then just return, we4913 * get 4 retries, so this should be ok.4914 */4915 return NULL;4916 4917 memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len);4918 smi_msg->data_size = recv_msg->msg.data_len;4919 smi_msg->msgid = STORE_SEQ_IN_MSGID(seq, seqid);4920 4921 dev_dbg(intf->si_dev, "Resend: %*ph\n",4922 smi_msg->data_size, smi_msg->data);4923 4924 return smi_msg;4925}4926 4927static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent,4928 struct list_head *timeouts,4929 unsigned long timeout_period,4930 int slot, unsigned long *flags,4931 bool *need_timer)4932{4933 struct ipmi_recv_msg *msg;4934 4935 if (intf->in_shutdown)4936 return;4937 4938 if (!ent->inuse)4939 return;4940 4941 if (timeout_period < ent->timeout) {4942 ent->timeout -= timeout_period;4943 *need_timer = true;4944 return;4945 }4946 4947 if (ent->retries_left == 0) {4948 /* The message has used all its retries. */4949 ent->inuse = 0;4950 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES);4951 msg = ent->recv_msg;4952 list_add_tail(&msg->link, timeouts);4953 if (ent->broadcast)4954 ipmi_inc_stat(intf, timed_out_ipmb_broadcasts);4955 else if (is_lan_addr(&ent->recv_msg->addr))4956 ipmi_inc_stat(intf, timed_out_lan_commands);4957 else4958 ipmi_inc_stat(intf, timed_out_ipmb_commands);4959 } else {4960 struct ipmi_smi_msg *smi_msg;4961 /* More retries, send again. */4962 4963 *need_timer = true;4964 4965 /*4966 * Start with the max timer, set to normal timer after4967 * the message is sent.4968 */4969 ent->timeout = MAX_MSG_TIMEOUT;4970 ent->retries_left--;4971 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot,4972 ent->seqid);4973 if (!smi_msg) {4974 if (is_lan_addr(&ent->recv_msg->addr))4975 ipmi_inc_stat(intf,4976 dropped_rexmit_lan_commands);4977 else4978 ipmi_inc_stat(intf,4979 dropped_rexmit_ipmb_commands);4980 return;4981 }4982 4983 spin_unlock_irqrestore(&intf->seq_lock, *flags);4984 4985 /*4986 * Send the new message. We send with a zero4987 * priority. It timed out, I doubt time is that4988 * critical now, and high priority messages are really4989 * only for messages to the local MC, which don't get4990 * resent.4991 */4992 if (intf->handlers) {4993 if (is_lan_addr(&ent->recv_msg->addr))4994 ipmi_inc_stat(intf,4995 retransmitted_lan_commands);4996 else4997 ipmi_inc_stat(intf,4998 retransmitted_ipmb_commands);4999 5000 smi_send(intf, intf->handlers, smi_msg, 0);5001 } else5002 ipmi_free_smi_msg(smi_msg);5003 5004 spin_lock_irqsave(&intf->seq_lock, *flags);5005 }5006}5007 5008static bool ipmi_timeout_handler(struct ipmi_smi *intf,5009 unsigned long timeout_period)5010{5011 struct list_head timeouts;5012 struct ipmi_recv_msg *msg, *msg2;5013 unsigned long flags;5014 int i;5015 bool need_timer = false;5016 5017 if (!intf->bmc_registered) {5018 kref_get(&intf->refcount);5019 if (!schedule_work(&intf->bmc_reg_work)) {5020 kref_put(&intf->refcount, intf_free);5021 need_timer = true;5022 }5023 }5024 5025 /*5026 * Go through the seq table and find any messages that5027 * have timed out, putting them in the timeouts5028 * list.5029 */5030 INIT_LIST_HEAD(&timeouts);5031 spin_lock_irqsave(&intf->seq_lock, flags);5032 if (intf->ipmb_maintenance_mode_timeout) {5033 if (intf->ipmb_maintenance_mode_timeout <= timeout_period)5034 intf->ipmb_maintenance_mode_timeout = 0;5035 else5036 intf->ipmb_maintenance_mode_timeout -= timeout_period;5037 }5038 for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++)5039 check_msg_timeout(intf, &intf->seq_table[i],5040 &timeouts, timeout_period, i,5041 &flags, &need_timer);5042 spin_unlock_irqrestore(&intf->seq_lock, flags);5043 5044 list_for_each_entry_safe(msg, msg2, &timeouts, link)5045 deliver_err_response(intf, msg, IPMI_TIMEOUT_COMPLETION_CODE);5046 5047 /*5048 * Maintenance mode handling. Check the timeout5049 * optimistically before we claim the lock. It may5050 * mean a timeout gets missed occasionally, but that5051 * only means the timeout gets extended by one period5052 * in that case. No big deal, and it avoids the lock5053 * most of the time.5054 */5055 if (intf->auto_maintenance_timeout > 0) {5056 spin_lock_irqsave(&intf->maintenance_mode_lock, flags);5057 if (intf->auto_maintenance_timeout > 0) {5058 intf->auto_maintenance_timeout5059 -= timeout_period;5060 if (!intf->maintenance_mode5061 && (intf->auto_maintenance_timeout <= 0)) {5062 intf->maintenance_mode_enable = false;5063 maintenance_mode_update(intf);5064 }5065 }5066 spin_unlock_irqrestore(&intf->maintenance_mode_lock,5067 flags);5068 }5069 5070 queue_work(system_bh_wq, &intf->recv_work);5071 5072 return need_timer;5073}5074 5075static void ipmi_request_event(struct ipmi_smi *intf)5076{5077 /* No event requests when in maintenance mode. */5078 if (intf->maintenance_mode_enable)5079 return;5080 5081 if (!intf->in_shutdown)5082 intf->handlers->request_events(intf->send_info);5083}5084 5085static struct timer_list ipmi_timer;5086 5087static atomic_t stop_operation;5088 5089static void ipmi_timeout(struct timer_list *unused)5090{5091 struct ipmi_smi *intf;5092 bool need_timer = false;5093 int index;5094 5095 if (atomic_read(&stop_operation))5096 return;5097 5098 index = srcu_read_lock(&ipmi_interfaces_srcu);5099 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {5100 if (atomic_read(&intf->event_waiters)) {5101 intf->ticks_to_req_ev--;5102 if (intf->ticks_to_req_ev == 0) {5103 ipmi_request_event(intf);5104 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME;5105 }5106 need_timer = true;5107 }5108 5109 need_timer |= ipmi_timeout_handler(intf, IPMI_TIMEOUT_TIME);5110 }5111 srcu_read_unlock(&ipmi_interfaces_srcu, index);5112 5113 if (need_timer)5114 mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);5115}5116 5117static void need_waiter(struct ipmi_smi *intf)5118{5119 /* Racy, but worst case we start the timer twice. */5120 if (!timer_pending(&ipmi_timer))5121 mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);5122}5123 5124static atomic_t smi_msg_inuse_count = ATOMIC_INIT(0);5125static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0);5126 5127static void free_smi_msg(struct ipmi_smi_msg *msg)5128{5129 atomic_dec(&smi_msg_inuse_count);5130 /* Try to keep as much stuff out of the panic path as possible. */5131 if (!oops_in_progress)5132 kfree(msg);5133}5134 5135struct ipmi_smi_msg *ipmi_alloc_smi_msg(void)5136{5137 struct ipmi_smi_msg *rv;5138 rv = kmalloc(sizeof(struct ipmi_smi_msg), GFP_ATOMIC);5139 if (rv) {5140 rv->done = free_smi_msg;5141 rv->user_data = NULL;5142 rv->type = IPMI_SMI_MSG_TYPE_NORMAL;5143 atomic_inc(&smi_msg_inuse_count);5144 }5145 return rv;5146}5147EXPORT_SYMBOL(ipmi_alloc_smi_msg);5148 5149static void free_recv_msg(struct ipmi_recv_msg *msg)5150{5151 atomic_dec(&recv_msg_inuse_count);5152 /* Try to keep as much stuff out of the panic path as possible. */5153 if (!oops_in_progress)5154 kfree(msg);5155}5156 5157static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void)5158{5159 struct ipmi_recv_msg *rv;5160 5161 rv = kmalloc(sizeof(struct ipmi_recv_msg), GFP_ATOMIC);5162 if (rv) {5163 rv->user = NULL;5164 rv->done = free_recv_msg;5165 atomic_inc(&recv_msg_inuse_count);5166 }5167 return rv;5168}5169 5170void ipmi_free_recv_msg(struct ipmi_recv_msg *msg)5171{5172 if (msg->user && !oops_in_progress)5173 kref_put(&msg->user->refcount, free_user);5174 msg->done(msg);5175}5176EXPORT_SYMBOL(ipmi_free_recv_msg);5177 5178static atomic_t panic_done_count = ATOMIC_INIT(0);5179 5180static void dummy_smi_done_handler(struct ipmi_smi_msg *msg)5181{5182 atomic_dec(&panic_done_count);5183}5184 5185static void dummy_recv_done_handler(struct ipmi_recv_msg *msg)5186{5187 atomic_dec(&panic_done_count);5188}5189 5190/*5191 * Inside a panic, send a message and wait for a response.5192 */5193static void ipmi_panic_request_and_wait(struct ipmi_smi *intf,5194 struct ipmi_addr *addr,5195 struct kernel_ipmi_msg *msg)5196{5197 struct ipmi_smi_msg smi_msg;5198 struct ipmi_recv_msg recv_msg;5199 int rv;5200 5201 smi_msg.done = dummy_smi_done_handler;5202 recv_msg.done = dummy_recv_done_handler;5203 atomic_add(2, &panic_done_count);5204 rv = i_ipmi_request(NULL,5205 intf,5206 addr,5207 0,5208 msg,5209 intf,5210 &smi_msg,5211 &recv_msg,5212 0,5213 intf->addrinfo[0].address,5214 intf->addrinfo[0].lun,5215 0, 1); /* Don't retry, and don't wait. */5216 if (rv)5217 atomic_sub(2, &panic_done_count);5218 else if (intf->handlers->flush_messages)5219 intf->handlers->flush_messages(intf->send_info);5220 5221 while (atomic_read(&panic_done_count) != 0)5222 ipmi_poll(intf);5223}5224 5225static void event_receiver_fetcher(struct ipmi_smi *intf,5226 struct ipmi_recv_msg *msg)5227{5228 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)5229 && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE)5230 && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD)5231 && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) {5232 /* A get event receiver command, save it. */5233 intf->event_receiver = msg->msg.data[1];5234 intf->event_receiver_lun = msg->msg.data[2] & 0x3;5235 }5236}5237 5238static void device_id_fetcher(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)5239{5240 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE)5241 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE)5242 && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD)5243 && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) {5244 /*5245 * A get device id command, save if we are an event5246 * receiver or generator.5247 */5248 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1;5249 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1;5250 }5251}5252 5253static void send_panic_events(struct ipmi_smi *intf, char *str)5254{5255 struct kernel_ipmi_msg msg;5256 unsigned char data[16];5257 struct ipmi_system_interface_addr *si;5258 struct ipmi_addr addr;5259 char *p = str;5260 struct ipmi_ipmb_addr *ipmb;5261 int j;5262 5263 if (ipmi_send_panic_event == IPMI_SEND_PANIC_EVENT_NONE)5264 return;5265 5266 si = (struct ipmi_system_interface_addr *) &addr;5267 si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;5268 si->channel = IPMI_BMC_CHANNEL;5269 si->lun = 0;5270 5271 /* Fill in an event telling that we have failed. */5272 msg.netfn = 0x04; /* Sensor or Event. */5273 msg.cmd = 2; /* Platform event command. */5274 msg.data = data;5275 msg.data_len = 8;5276 data[0] = 0x41; /* Kernel generator ID, IPMI table 5-4 */5277 data[1] = 0x03; /* This is for IPMI 1.0. */5278 data[2] = 0x20; /* OS Critical Stop, IPMI table 36-3 */5279 data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */5280 data[5] = 0xa1; /* Runtime stop OEM bytes 2 & 3. */5281 5282 /*5283 * Put a few breadcrumbs in. Hopefully later we can add more things5284 * to make the panic events more useful.5285 */5286 if (str) {5287 data[3] = str[0];5288 data[6] = str[1];5289 data[7] = str[2];5290 }5291 5292 /* Send the event announcing the panic. */5293 ipmi_panic_request_and_wait(intf, &addr, &msg);5294 5295 /*5296 * On every interface, dump a bunch of OEM event holding the5297 * string.5298 */5299 if (ipmi_send_panic_event != IPMI_SEND_PANIC_EVENT_STRING || !str)5300 return;5301 5302 /*5303 * intf_num is used as an marker to tell if the5304 * interface is valid. Thus we need a read barrier to5305 * make sure data fetched before checking intf_num5306 * won't be used.5307 */5308 smp_rmb();5309 5310 /*5311 * First job here is to figure out where to send the5312 * OEM events. There's no way in IPMI to send OEM5313 * events using an event send command, so we have to5314 * find the SEL to put them in and stick them in5315 * there.5316 */5317 5318 /* Get capabilities from the get device id. */5319 intf->local_sel_device = 0;5320 intf->local_event_generator = 0;5321 intf->event_receiver = 0;5322 5323 /* Request the device info from the local MC. */5324 msg.netfn = IPMI_NETFN_APP_REQUEST;5325 msg.cmd = IPMI_GET_DEVICE_ID_CMD;5326 msg.data = NULL;5327 msg.data_len = 0;5328 intf->null_user_handler = device_id_fetcher;5329 ipmi_panic_request_and_wait(intf, &addr, &msg);5330 5331 if (intf->local_event_generator) {5332 /* Request the event receiver from the local MC. */5333 msg.netfn = IPMI_NETFN_SENSOR_EVENT_REQUEST;5334 msg.cmd = IPMI_GET_EVENT_RECEIVER_CMD;5335 msg.data = NULL;5336 msg.data_len = 0;5337 intf->null_user_handler = event_receiver_fetcher;5338 ipmi_panic_request_and_wait(intf, &addr, &msg);5339 }5340 intf->null_user_handler = NULL;5341 5342 /*5343 * Validate the event receiver. The low bit must not5344 * be 1 (it must be a valid IPMB address), it cannot5345 * be zero, and it must not be my address.5346 */5347 if (((intf->event_receiver & 1) == 0)5348 && (intf->event_receiver != 0)5349 && (intf->event_receiver != intf->addrinfo[0].address)) {5350 /*5351 * The event receiver is valid, send an IPMB5352 * message.5353 */5354 ipmb = (struct ipmi_ipmb_addr *) &addr;5355 ipmb->addr_type = IPMI_IPMB_ADDR_TYPE;5356 ipmb->channel = 0; /* FIXME - is this right? */5357 ipmb->lun = intf->event_receiver_lun;5358 ipmb->slave_addr = intf->event_receiver;5359 } else if (intf->local_sel_device) {5360 /*5361 * The event receiver was not valid (or was5362 * me), but I am an SEL device, just dump it5363 * in my SEL.5364 */5365 si = (struct ipmi_system_interface_addr *) &addr;5366 si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;5367 si->channel = IPMI_BMC_CHANNEL;5368 si->lun = 0;5369 } else5370 return; /* No where to send the event. */5371 5372 msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */5373 msg.cmd = IPMI_ADD_SEL_ENTRY_CMD;5374 msg.data = data;5375 msg.data_len = 16;5376 5377 j = 0;5378 while (*p) {5379 int size = strnlen(p, 11);5380 5381 data[0] = 0;5382 data[1] = 0;5383 data[2] = 0xf0; /* OEM event without timestamp. */5384 data[3] = intf->addrinfo[0].address;5385 data[4] = j++; /* sequence # */5386 5387 memcpy_and_pad(data+5, 11, p, size, '\0');5388 p += size;5389 5390 ipmi_panic_request_and_wait(intf, &addr, &msg);5391 }5392}5393 5394static int has_panicked;5395 5396static int panic_event(struct notifier_block *this,5397 unsigned long event,5398 void *ptr)5399{5400 struct ipmi_smi *intf;5401 struct ipmi_user *user;5402 5403 if (has_panicked)5404 return NOTIFY_DONE;5405 has_panicked = 1;5406 5407 /* For every registered interface, set it to run to completion. */5408 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {5409 if (!intf->handlers || intf->intf_num == -1)5410 /* Interface is not ready. */5411 continue;5412 5413 if (!intf->handlers->poll)5414 continue;5415 5416 /*5417 * If we were interrupted while locking xmit_msgs_lock or5418 * waiting_rcv_msgs_lock, the corresponding list may be5419 * corrupted. In this case, drop items on the list for5420 * the safety.5421 */5422 if (!spin_trylock(&intf->xmit_msgs_lock)) {5423 INIT_LIST_HEAD(&intf->xmit_msgs);5424 INIT_LIST_HEAD(&intf->hp_xmit_msgs);5425 } else5426 spin_unlock(&intf->xmit_msgs_lock);5427 5428 if (!spin_trylock(&intf->waiting_rcv_msgs_lock))5429 INIT_LIST_HEAD(&intf->waiting_rcv_msgs);5430 else5431 spin_unlock(&intf->waiting_rcv_msgs_lock);5432 5433 intf->run_to_completion = 1;5434 if (intf->handlers->set_run_to_completion)5435 intf->handlers->set_run_to_completion(intf->send_info,5436 1);5437 5438 list_for_each_entry_rcu(user, &intf->users, link) {5439 if (user->handler->ipmi_panic_handler)5440 user->handler->ipmi_panic_handler(5441 user->handler_data);5442 }5443 5444 send_panic_events(intf, ptr);5445 }5446 5447 return NOTIFY_DONE;5448}5449 5450/* Must be called with ipmi_interfaces_mutex held. */5451static int ipmi_register_driver(void)5452{5453 int rv;5454 5455 if (drvregistered)5456 return 0;5457 5458 rv = driver_register(&ipmidriver.driver);5459 if (rv)5460 pr_err("Could not register IPMI driver\n");5461 else5462 drvregistered = true;5463 return rv;5464}5465 5466static struct notifier_block panic_block = {5467 .notifier_call = panic_event,5468 .next = NULL,5469 .priority = 200 /* priority: INT_MAX >= x >= 0 */5470};5471 5472static int ipmi_init_msghandler(void)5473{5474 int rv;5475 5476 mutex_lock(&ipmi_interfaces_mutex);5477 rv = ipmi_register_driver();5478 if (rv)5479 goto out;5480 if (initialized)5481 goto out;5482 5483 rv = init_srcu_struct(&ipmi_interfaces_srcu);5484 if (rv)5485 goto out;5486 5487 remove_work_wq = create_singlethread_workqueue("ipmi-msghandler-remove-wq");5488 if (!remove_work_wq) {5489 pr_err("unable to create ipmi-msghandler-remove-wq workqueue");5490 rv = -ENOMEM;5491 goto out_wq;5492 }5493 5494 timer_setup(&ipmi_timer, ipmi_timeout, 0);5495 mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);5496 5497 atomic_notifier_chain_register(&panic_notifier_list, &panic_block);5498 5499 initialized = true;5500 5501out_wq:5502 if (rv)5503 cleanup_srcu_struct(&ipmi_interfaces_srcu);5504out:5505 mutex_unlock(&ipmi_interfaces_mutex);5506 return rv;5507}5508 5509static int __init ipmi_init_msghandler_mod(void)5510{5511 int rv;5512 5513 pr_info("version " IPMI_DRIVER_VERSION "\n");5514 5515 mutex_lock(&ipmi_interfaces_mutex);5516 rv = ipmi_register_driver();5517 mutex_unlock(&ipmi_interfaces_mutex);5518 5519 return rv;5520}5521 5522static void __exit cleanup_ipmi(void)5523{5524 int count;5525 5526 if (initialized) {5527 destroy_workqueue(remove_work_wq);5528 5529 atomic_notifier_chain_unregister(&panic_notifier_list,5530 &panic_block);5531 5532 /*5533 * This can't be called if any interfaces exist, so no worry5534 * about shutting down the interfaces.5535 */5536 5537 /*5538 * Tell the timer to stop, then wait for it to stop. This5539 * avoids problems with race conditions removing the timer5540 * here.5541 */5542 atomic_set(&stop_operation, 1);5543 del_timer_sync(&ipmi_timer);5544 5545 initialized = false;5546 5547 /* Check for buffer leaks. */5548 count = atomic_read(&smi_msg_inuse_count);5549 if (count != 0)5550 pr_warn("SMI message count %d at exit\n", count);5551 count = atomic_read(&recv_msg_inuse_count);5552 if (count != 0)5553 pr_warn("recv message count %d at exit\n", count);5554 5555 cleanup_srcu_struct(&ipmi_interfaces_srcu);5556 }5557 if (drvregistered)5558 driver_unregister(&ipmidriver.driver);5559}5560module_exit(cleanup_ipmi);5561 5562module_init(ipmi_init_msghandler_mod);5563MODULE_LICENSE("GPL");5564MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");5565MODULE_DESCRIPTION("Incoming and outgoing message routing for an IPMI interface.");5566MODULE_VERSION(IPMI_DRIVER_VERSION);5567MODULE_SOFTDEP("post: ipmi_devintf");5568