diff options
| author | Corey Minyard <cminyard@mvista.com> | 2008-04-29 04:01:09 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:15 -0400 |
| commit | c70d749986f6f1d4e2bb008bfc0c5fc22ec3fc64 (patch) | |
| tree | 69ddc91cf39938e5ec3ba7924cff78c6760de927 | |
| parent | ba8ff1c61eb119e687b06ca35f7f4ab041bf0422 (diff) | |
ipmi: style fixes in the base code
Lots of style fixes for the base IPMI driver. No functional changes.
Basically fixes everything reported by checkpatch and fixes the comment
style.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/char/ipmi/ipmi_msghandler.c | 995 | ||||
| -rw-r--r-- | include/linux/ipmi.h | 72 | ||||
| -rw-r--r-- | include/linux/ipmi_smi.h | 8 |
3 files changed, 614 insertions, 461 deletions
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index ea6ba35b3d7e..5b13579ca21d 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
| @@ -63,15 +63,16 @@ static struct proc_dir_entry *proc_ipmi_root; | |||
| 63 | 63 | ||
| 64 | #define MAX_EVENTS_IN_QUEUE 25 | 64 | #define MAX_EVENTS_IN_QUEUE 25 |
| 65 | 65 | ||
| 66 | /* Don't let a message sit in a queue forever, always time it with at lest | 66 | /* |
| 67 | the max message timer. This is in milliseconds. */ | 67 | * Don't let a message sit in a queue forever, always time it with at lest |
| 68 | * the max message timer. This is in milliseconds. | ||
| 69 | */ | ||
| 68 | #define MAX_MSG_TIMEOUT 60000 | 70 | #define MAX_MSG_TIMEOUT 60000 |
| 69 | 71 | ||
| 70 | /* | 72 | /* |
| 71 | * The main "user" data structure. | 73 | * The main "user" data structure. |
| 72 | */ | 74 | */ |
| 73 | struct ipmi_user | 75 | struct ipmi_user { |
| 74 | { | ||
| 75 | struct list_head link; | 76 | struct list_head link; |
| 76 | 77 | ||
| 77 | /* Set to "0" when the user is destroyed. */ | 78 | /* Set to "0" when the user is destroyed. */ |
| @@ -90,8 +91,7 @@ struct ipmi_user | |||
| 90 | int gets_events; | 91 | int gets_events; |
| 91 | }; | 92 | }; |
| 92 | 93 | ||
| 93 | struct cmd_rcvr | 94 | struct cmd_rcvr { |
| 94 | { | ||
| 95 | struct list_head link; | 95 | struct list_head link; |
| 96 | 96 | ||
| 97 | ipmi_user_t user; | 97 | ipmi_user_t user; |
| @@ -105,12 +105,12 @@ struct cmd_rcvr | |||
| 105 | * or change any data until the RCU period completes. So we | 105 | * or change any data until the RCU period completes. So we |
| 106 | * use this next variable during mass deletion so we can have | 106 | * use this next variable during mass deletion so we can have |
| 107 | * a list and don't have to wait and restart the search on | 107 | * a list and don't have to wait and restart the search on |
| 108 | * every individual deletion of a command. */ | 108 | * every individual deletion of a command. |
| 109 | */ | ||
| 109 | struct cmd_rcvr *next; | 110 | struct cmd_rcvr *next; |
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 112 | struct seq_table | 113 | struct seq_table { |
| 113 | { | ||
| 114 | unsigned int inuse : 1; | 114 | unsigned int inuse : 1; |
| 115 | unsigned int broadcast : 1; | 115 | unsigned int broadcast : 1; |
| 116 | 116 | ||
| @@ -118,53 +118,60 @@ struct seq_table | |||
| 118 | unsigned long orig_timeout; | 118 | unsigned long orig_timeout; |
| 119 | unsigned int retries_left; | 119 | unsigned int retries_left; |
| 120 | 120 | ||
| 121 | /* To verify on an incoming send message response that this is | 121 | /* |
| 122 | the message that the response is for, we keep a sequence id | 122 | * To verify on an incoming send message response that this is |
| 123 | and increment it every time we send a message. */ | 123 | * the message that the response is for, we keep a sequence id |
| 124 | * and increment it every time we send a message. | ||
| 125 | */ | ||
| 124 | long seqid; | 126 | long seqid; |
| 125 | 127 | ||
| 126 | /* This is held so we can properly respond to the message on a | 128 | /* |
| 127 | timeout, and it is used to hold the temporary data for | 129 | * This is held so we can properly respond to the message on a |
| 128 | retransmission, too. */ | 130 | * timeout, and it is used to hold the temporary data for |
| 131 | * retransmission, too. | ||
| 132 | */ | ||
| 129 | struct ipmi_recv_msg *recv_msg; | 133 | struct ipmi_recv_msg *recv_msg; |
| 130 | }; | 134 | }; |
| 131 | 135 | ||
| 132 | /* Store the information in a msgid (long) to allow us to find a | 136 | /* |
| 133 | sequence table entry from the msgid. */ | 137 | * Store the information in a msgid (long) to allow us to find a |
| 138 | * sequence table entry from the msgid. | ||
| 139 | */ | ||
| 134 | #define STORE_SEQ_IN_MSGID(seq, seqid) (((seq&0xff)<<26) | (seqid&0x3ffffff)) | 140 | #define STORE_SEQ_IN_MSGID(seq, seqid) (((seq&0xff)<<26) | (seqid&0x3ffffff)) |
| 135 | 141 | ||
| 136 | #define GET_SEQ_FROM_MSGID(msgid, seq, seqid) \ | 142 | #define GET_SEQ_FROM_MSGID(msgid, seq, seqid) \ |
| 137 | do { \ | 143 | do { \ |
| 138 | seq = ((msgid >> 26) & 0x3f); \ | 144 | seq = ((msgid >> 26) & 0x3f); \ |
| 139 | seqid = (msgid & 0x3fffff); \ | 145 | seqid = (msgid & 0x3fffff); \ |
| 140 | } while (0) | 146 | } while (0) |
| 141 | 147 | ||
| 142 | #define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3fffff) | 148 | #define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3fffff) |
| 143 | 149 | ||
| 144 | struct ipmi_channel | 150 | struct ipmi_channel { |
| 145 | { | ||
| 146 | unsigned char medium; | 151 | unsigned char medium; |
| 147 | unsigned char protocol; | 152 | unsigned char protocol; |
| 148 | 153 | ||
| 149 | /* My slave address. This is initialized to IPMI_BMC_SLAVE_ADDR, | 154 | /* |
| 150 | but may be changed by the user. */ | 155 | * My slave address. This is initialized to IPMI_BMC_SLAVE_ADDR, |
| 156 | * but may be changed by the user. | ||
| 157 | */ | ||
| 151 | unsigned char address; | 158 | unsigned char address; |
| 152 | 159 | ||
| 153 | /* My LUN. This should generally stay the SMS LUN, but just in | 160 | /* |
| 154 | case... */ | 161 | * My LUN. This should generally stay the SMS LUN, but just in |
| 162 | * case... | ||
| 163 | */ | ||
| 155 | unsigned char lun; | 164 | unsigned char lun; |
| 156 | }; | 165 | }; |
| 157 | 166 | ||
| 158 | #ifdef CONFIG_PROC_FS | 167 | #ifdef CONFIG_PROC_FS |
| 159 | struct ipmi_proc_entry | 168 | struct ipmi_proc_entry { |
| 160 | { | ||
| 161 | char *name; | 169 | char *name; |
| 162 | struct ipmi_proc_entry *next; | 170 | struct ipmi_proc_entry *next; |
| 163 | }; | 171 | }; |
| 164 | #endif | 172 | #endif |
| 165 | 173 | ||
| 166 | struct bmc_device | 174 | struct bmc_device { |
| 167 | { | ||
| 168 | struct platform_device *dev; | 175 | struct platform_device *dev; |
| 169 | struct ipmi_device_id id; | 176 | struct ipmi_device_id id; |
| 170 | unsigned char guid[16]; | 177 | unsigned char guid[16]; |
| @@ -286,8 +293,7 @@ enum ipmi_stat_indexes { | |||
| 286 | 293 | ||
| 287 | #define IPMI_IPMB_NUM_SEQ 64 | 294 | #define IPMI_IPMB_NUM_SEQ 64 |
| 288 | #define IPMI_MAX_CHANNELS 16 | 295 | #define IPMI_MAX_CHANNELS 16 |
| 289 | struct ipmi_smi | 296 | struct ipmi_smi { |
| 290 | { | ||
| 291 | /* What interface number are we? */ | 297 | /* What interface number are we? */ |
| 292 | int intf_num; | 298 | int intf_num; |
| 293 | 299 | ||
| @@ -296,8 +302,10 @@ struct ipmi_smi | |||
| 296 | /* Used for a list of interfaces. */ | 302 | /* Used for a list of interfaces. */ |
| 297 | struct list_head link; | 303 | struct list_head link; |
| 298 | 304 | ||
| 299 | /* The list of upper layers that are using me. seq_lock | 305 | /* |
| 300 | * protects this. */ | 306 | * The list of upper layers that are using me. seq_lock |
| 307 | * protects this. | ||
| 308 | */ | ||
| 301 | struct list_head users; | 309 | struct list_head users; |
| 302 | 310 | ||
| 303 | /* Information to supply to users. */ | 311 | /* Information to supply to users. */ |
| @@ -311,10 +319,12 @@ struct ipmi_smi | |||
| 311 | char *my_dev_name; | 319 | char *my_dev_name; |
| 312 | char *sysfs_name; | 320 | char *sysfs_name; |
| 313 | 321 | ||
| 314 | /* This is the lower-layer's sender routine. Note that you | 322 | /* |
| 323 | * This is the lower-layer's sender routine. Note that you | ||
| 315 | * must either be holding the ipmi_interfaces_mutex or be in | 324 | * must either be holding the ipmi_interfaces_mutex or be in |
| 316 | * an umpreemptible region to use this. You must fetch the | 325 | * an umpreemptible region to use this. You must fetch the |
| 317 | * value into a local variable and make sure it is not NULL. */ | 326 | * value into a local variable and make sure it is not NULL. |
| 327 | */ | ||
| 318 | struct ipmi_smi_handlers *handlers; | 328 | struct ipmi_smi_handlers *handlers; |
| 319 | void *send_info; | 329 | void *send_info; |
| 320 | 330 | ||
| @@ -327,35 +337,45 @@ struct ipmi_smi | |||
| 327 | /* Driver-model device for the system interface. */ | 337 | /* Driver-model device for the system interface. */ |
| 328 | struct device *si_dev; | 338 | struct device *si_dev; |
| 329 | 339 | ||
| 330 | /* A table of sequence numbers for this interface. We use the | 340 | /* |
| 331 | sequence numbers for IPMB messages that go out of the | 341 | * A table of sequence numbers for this interface. We use the |
| 332 | interface to match them up with their responses. A routine | 342 | * sequence numbers for IPMB messages that go out of the |
| 333 | is called periodically to time the items in this list. */ | 343 | * interface to match them up with their responses. A routine |
| 344 | * is called periodically to time the items in this list. | ||
| 345 | */ | ||
| 334 | spinlock_t seq_lock; | 346 | spinlock_t seq_lock; |
| 335 | struct seq_table seq_table[IPMI_IPMB_NUM_SEQ]; | 347 | struct seq_table seq_table[IPMI_IPMB_NUM_SEQ]; |
| 336 | int curr_seq; | 348 | int curr_seq; |
| 337 | 349 | ||
| 338 | /* Messages that were delayed for some reason (out of memory, | 350 | /* |
| 339 | for instance), will go in here to be processed later in a | 351 | * Messages that were delayed for some reason (out of memory, |
| 340 | periodic timer interrupt. */ | 352 | * for instance), will go in here to be processed later in a |
| 353 | * periodic timer interrupt. | ||
| 354 | */ | ||
| 341 | spinlock_t waiting_msgs_lock; | 355 | spinlock_t waiting_msgs_lock; |
| 342 | struct list_head waiting_msgs; | 356 | struct list_head waiting_msgs; |
| 343 | 357 | ||
| 344 | /* The list of command receivers that are registered for commands | 358 | /* |
| 345 | on this interface. */ | 359 | * The list of command receivers that are registered for commands |
| 360 | * on this interface. | ||
| 361 | */ | ||
| 346 | struct mutex cmd_rcvrs_mutex; | 362 | struct mutex cmd_rcvrs_mutex; |
| 347 | struct list_head cmd_rcvrs; | 363 | struct list_head cmd_rcvrs; |
| 348 | 364 | ||
| 349 | /* Events that were queues because no one was there to receive | 365 | /* |
| 350 | them. */ | 366 | * Events that were queues because no one was there to receive |
| 367 | * them. | ||
| 368 | */ | ||
| 351 | spinlock_t events_lock; /* For dealing with event stuff. */ | 369 | spinlock_t events_lock; /* For dealing with event stuff. */ |
| 352 | struct list_head waiting_events; | 370 | struct list_head waiting_events; |
| 353 | unsigned int waiting_events_count; /* How many events in queue? */ | 371 | unsigned int waiting_events_count; /* How many events in queue? */ |
| 354 | char delivering_events; | 372 | char delivering_events; |
| 355 | char event_msg_printed; | 373 | char event_msg_printed; |
| 356 | 374 | ||
| 357 | /* The event receiver for my BMC, only really used at panic | 375 | /* |
| 358 | shutdown as a place to store this. */ | 376 | * The event receiver for my BMC, only really used at panic |
| 377 | * shutdown as a place to store this. | ||
| 378 | */ | ||
| 359 | unsigned char event_receiver; | 379 | unsigned char event_receiver; |
| 360 | unsigned char event_receiver_lun; | 380 | unsigned char event_receiver_lun; |
| 361 | unsigned char local_sel_device; | 381 | unsigned char local_sel_device; |
| @@ -367,14 +387,18 @@ struct ipmi_smi | |||
| 367 | int auto_maintenance_timeout; | 387 | int auto_maintenance_timeout; |
| 368 | spinlock_t maintenance_mode_lock; /* Used in a timer... */ | 388 | spinlock_t maintenance_mode_lock; /* Used in a timer... */ |
| 369 | 389 | ||
| 370 | /* A cheap hack, if this is non-null and a message to an | 390 | /* |
| 371 | interface comes in with a NULL user, call this routine with | 391 | * A cheap hack, if this is non-null and a message to an |
| 372 | it. Note that the message will still be freed by the | 392 | * interface comes in with a NULL user, call this routine with |
| 373 | caller. This only works on the system interface. */ | 393 | * it. Note that the message will still be freed by the |
| 394 | * caller. This only works on the system interface. | ||
| 395 | */ | ||
| 374 | void (*null_user_handler)(ipmi_smi_t intf, struct ipmi_recv_msg *msg); | 396 | void (*null_user_handler)(ipmi_smi_t intf, struct ipmi_recv_msg *msg); |
| 375 | 397 | ||
| 376 | /* When we are scanning the channels for an SMI, this will | 398 | /* |
| 377 | tell which channel we are scanning. */ | 399 | * When we are scanning the channels for an SMI, this will |
| 400 | * tell which channel we are scanning. | ||
| 401 | */ | ||
| 378 | int curr_channel; | 402 | int curr_channel; |
| 379 | 403 | ||
| 380 | /* Channel information */ | 404 | /* Channel information */ |
| @@ -407,8 +431,9 @@ static DEFINE_MUTEX(ipmidriver_mutex); | |||
| 407 | static LIST_HEAD(ipmi_interfaces); | 431 | static LIST_HEAD(ipmi_interfaces); |
| 408 | static DEFINE_MUTEX(ipmi_interfaces_mutex); | 432 | static DEFINE_MUTEX(ipmi_interfaces_mutex); |
| 409 | 433 | ||
| 410 | /* List of watchers that want to know when smi's are added and | 434 | /* |
| 411 | deleted. */ | 435 | * List of watchers that want to know when smi's are added and deleted. |
| 436 | */ | ||
| 412 | static LIST_HEAD(smi_watchers); | 437 | static LIST_HEAD(smi_watchers); |
| 413 | static DEFINE_MUTEX(smi_watchers_mutex); | 438 | static DEFINE_MUTEX(smi_watchers_mutex); |
| 414 | 439 | ||
| @@ -462,10 +487,8 @@ static void clean_up_interface_data(ipmi_smi_t intf) | |||
| 462 | 487 | ||
| 463 | for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) { | 488 | for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) { |
| 464 | if ((intf->seq_table[i].inuse) | 489 | if ((intf->seq_table[i].inuse) |
| 465 | && (intf->seq_table[i].recv_msg)) | 490 | && (intf->seq_table[i].recv_msg)) |
| 466 | { | ||
| 467 | ipmi_free_recv_msg(intf->seq_table[i].recv_msg); | 491 | ipmi_free_recv_msg(intf->seq_table[i].recv_msg); |
| 468 | } | ||
| 469 | } | 492 | } |
| 470 | } | 493 | } |
| 471 | 494 | ||
| @@ -532,6 +555,7 @@ int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher) | |||
| 532 | } | 555 | } |
| 533 | return -ENOMEM; | 556 | return -ENOMEM; |
| 534 | } | 557 | } |
| 558 | EXPORT_SYMBOL(ipmi_smi_watcher_register); | ||
| 535 | 559 | ||
| 536 | int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher) | 560 | int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher) |
| 537 | { | 561 | { |
| @@ -540,6 +564,7 @@ int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher) | |||
| 540 | mutex_unlock(&smi_watchers_mutex); | 564 | mutex_unlock(&smi_watchers_mutex); |
| 541 | return 0; | 565 | return 0; |
| 542 | } | 566 | } |
| 567 | EXPORT_SYMBOL(ipmi_smi_watcher_unregister); | ||
| 543 | 568 | ||
| 544 | /* | 569 | /* |
| 545 | * Must be called with smi_watchers_mutex held. | 570 | * Must be called with smi_watchers_mutex held. |
| @@ -575,8 +600,7 @@ ipmi_addr_equal(struct ipmi_addr *addr1, struct ipmi_addr *addr2) | |||
| 575 | } | 600 | } |
| 576 | 601 | ||
| 577 | if ((addr1->addr_type == IPMI_IPMB_ADDR_TYPE) | 602 | if ((addr1->addr_type == IPMI_IPMB_ADDR_TYPE) |
| 578 | || (addr1->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) | 603 | || (addr1->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) { |
| 579 | { | ||
| 580 | struct ipmi_ipmb_addr *ipmb_addr1 | 604 | struct ipmi_ipmb_addr *ipmb_addr1 |
| 581 | = (struct ipmi_ipmb_addr *) addr1; | 605 | = (struct ipmi_ipmb_addr *) addr1; |
| 582 | struct ipmi_ipmb_addr *ipmb_addr2 | 606 | struct ipmi_ipmb_addr *ipmb_addr2 |
| @@ -604,9 +628,8 @@ ipmi_addr_equal(struct ipmi_addr *addr1, struct ipmi_addr *addr2) | |||
| 604 | 628 | ||
| 605 | int ipmi_validate_addr(struct ipmi_addr *addr, int len) | 629 | int ipmi_validate_addr(struct ipmi_addr *addr, int len) |
| 606 | { | 630 | { |
| 607 | if (len < sizeof(struct ipmi_system_interface_addr)) { | 631 | if (len < sizeof(struct ipmi_system_interface_addr)) |
| 608 | return -EINVAL; | 632 | return -EINVAL; |
| 609 | } | ||
| 610 | 633 | ||
| 611 | if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { | 634 | if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { |
| 612 | if (addr->channel != IPMI_BMC_CHANNEL) | 635 | if (addr->channel != IPMI_BMC_CHANNEL) |
| @@ -620,23 +643,21 @@ int ipmi_validate_addr(struct ipmi_addr *addr, int len) | |||
| 620 | return -EINVAL; | 643 | return -EINVAL; |
| 621 | 644 | ||
| 622 | if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE) | 645 | if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE) |
| 623 | || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) | 646 | || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) { |
| 624 | { | 647 | if (len < sizeof(struct ipmi_ipmb_addr)) |
| 625 | if (len < sizeof(struct ipmi_ipmb_addr)) { | ||
| 626 | return -EINVAL; | 648 | return -EINVAL; |
| 627 | } | ||
| 628 | return 0; | 649 | return 0; |
| 629 | } | 650 | } |
| 630 | 651 | ||
| 631 | if (addr->addr_type == IPMI_LAN_ADDR_TYPE) { | 652 | if (addr->addr_type == IPMI_LAN_ADDR_TYPE) { |
| 632 | if (len < sizeof(struct ipmi_lan_addr)) { | 653 | if (len < sizeof(struct ipmi_lan_addr)) |
| 633 | return -EINVAL; | 654 | return -EINVAL; |
| 634 | } | ||
| 635 | return 0; | 655 | return 0; |
| 636 | } | 656 | } |
| 637 | 657 | ||
| 638 | return -EINVAL; | 658 | return -EINVAL; |
| 639 | } | 659 | } |
| 660 | EXPORT_SYMBOL(ipmi_validate_addr); | ||
| 640 | 661 | ||
| 641 | unsigned int ipmi_addr_length(int addr_type) | 662 | unsigned int ipmi_addr_length(int addr_type) |
| 642 | { | 663 | { |
| @@ -644,16 +665,15 @@ unsigned int ipmi_addr_length(int addr_type) | |||
| 644 | return sizeof(struct ipmi_system_interface_addr); | 665 | return sizeof(struct ipmi_system_interface_addr); |
| 645 | 666 | ||
| 646 | if ((addr_type == IPMI_IPMB_ADDR_TYPE) | 667 | if ((addr_type == IPMI_IPMB_ADDR_TYPE) |
| 647 | || (addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) | 668 | || (addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) |
| 648 | { | ||
| 649 | return sizeof(struct ipmi_ipmb_addr); | 669 | return sizeof(struct ipmi_ipmb_addr); |
| 650 | } | ||
| 651 | 670 | ||
| 652 | if (addr_type == IPMI_LAN_ADDR_TYPE) | 671 | if (addr_type == IPMI_LAN_ADDR_TYPE) |
| 653 | return sizeof(struct ipmi_lan_addr); | 672 | return sizeof(struct ipmi_lan_addr); |
| 654 | 673 | ||
| 655 | return 0; | 674 | return 0; |
| 656 | } | 675 | } |
| 676 | EXPORT_SYMBOL(ipmi_addr_length); | ||
| 657 | 677 | ||
| 658 | static void deliver_response(struct ipmi_recv_msg *msg) | 678 | static void deliver_response(struct ipmi_recv_msg *msg) |
| 659 | { | 679 | { |
| @@ -686,9 +706,11 @@ deliver_err_response(struct ipmi_recv_msg *msg, int err) | |||
| 686 | deliver_response(msg); | 706 | deliver_response(msg); |
| 687 | } | 707 | } |
| 688 | 708 | ||
| 689 | /* Find the next sequence number not being used and add the given | 709 | /* |
| 690 | message with the given timeout to the sequence table. This must be | 710 | * Find the next sequence number not being used and add the given |
| 691 | called with the interface's seq_lock held. */ | 711 | * message with the given timeout to the sequence table. This must be |
| 712 | * called with the interface's seq_lock held. | ||
| 713 | */ | ||
| 692 | static int intf_next_seq(ipmi_smi_t intf, | 714 | static int intf_next_seq(ipmi_smi_t intf, |
| 693 | struct ipmi_recv_msg *recv_msg, | 715 | struct ipmi_recv_msg *recv_msg, |
| 694 | unsigned long timeout, | 716 | unsigned long timeout, |
| @@ -700,10 +722,8 @@ static int intf_next_seq(ipmi_smi_t intf, | |||
| 700 | int rv = 0; | 722 | int rv = 0; |
| 701 | unsigned int i; | 723 | unsigned int i; |
| 702 | 724 | ||
| 703 | for (i = intf->curr_seq; | 725 | for (i = intf->curr_seq; (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; |
| 704 | (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; | 726 | i = (i+1)%IPMI_IPMB_NUM_SEQ) { |
| 705 | i = (i+1)%IPMI_IPMB_NUM_SEQ) | ||
| 706 | { | ||
| 707 | if (!intf->seq_table[i].inuse) | 727 | if (!intf->seq_table[i].inuse) |
| 708 | break; | 728 | break; |
| 709 | } | 729 | } |
| @@ -711,8 +731,10 @@ static int intf_next_seq(ipmi_smi_t intf, | |||
| 711 | if (!intf->seq_table[i].inuse) { | 731 | if (!intf->seq_table[i].inuse) { |
| 712 | intf->seq_table[i].recv_msg = recv_msg; | 732 | intf->seq_table[i].recv_msg = recv_msg; |
| 713 | 733 | ||
| 714 | /* Start with the maximum timeout, when the send response | 734 | /* |
| 715 | comes in we will start the real timer. */ | 735 | * Start with the maximum timeout, when the send response |
| 736 | * comes in we will start the real timer. | ||
| 737 | */ | ||
| 716 | intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; | 738 | intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; |
| 717 | intf->seq_table[i].orig_timeout = timeout; | 739 | intf->seq_table[i].orig_timeout = timeout; |
| 718 | intf->seq_table[i].retries_left = retries; | 740 | intf->seq_table[i].retries_left = retries; |
| @@ -725,15 +747,17 @@ static int intf_next_seq(ipmi_smi_t intf, | |||
| 725 | } else { | 747 | } else { |
| 726 | rv = -EAGAIN; | 748 | rv = -EAGAIN; |
| 727 | } | 749 | } |
| 728 | 750 | ||
| 729 | return rv; | 751 | return rv; |
| 730 | } | 752 | } |
| 731 | 753 | ||
| 732 | /* Return the receive message for the given sequence number and | 754 | /* |
| 733 | release the sequence number so it can be reused. Some other data | 755 | * Return the receive message for the given sequence number and |
| 734 | is passed in to be sure the message matches up correctly (to help | 756 | * release the sequence number so it can be reused. Some other data |
| 735 | guard against message coming in after their timeout and the | 757 | * is passed in to be sure the message matches up correctly (to help |
| 736 | sequence number being reused). */ | 758 | * guard against message coming in after their timeout and the |
| 759 | * sequence number being reused). | ||
| 760 | */ | ||
| 737 | static int intf_find_seq(ipmi_smi_t intf, | 761 | static int intf_find_seq(ipmi_smi_t intf, |
| 738 | unsigned char seq, | 762 | unsigned char seq, |
| 739 | short channel, | 763 | short channel, |
| @@ -752,11 +776,9 @@ static int intf_find_seq(ipmi_smi_t intf, | |||
| 752 | if (intf->seq_table[seq].inuse) { | 776 | if (intf->seq_table[seq].inuse) { |
| 753 | struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; | 777 | struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; |
| 754 | 778 | ||
| 755 | if ((msg->addr.channel == channel) | 779 | if ((msg->addr.channel == channel) && (msg->msg.cmd == cmd) |
| 756 | && (msg->msg.cmd == cmd) | 780 | && (msg->msg.netfn == netfn) |
| 757 | && (msg->msg.netfn == netfn) | 781 | && (ipmi_addr_equal(addr, &(msg->addr)))) { |
| 758 | && (ipmi_addr_equal(addr, &(msg->addr)))) | ||
| 759 | { | ||
| 760 | *recv_msg = msg; | 782 | *recv_msg = msg; |
| 761 | intf->seq_table[seq].inuse = 0; | 783 | intf->seq_table[seq].inuse = 0; |
| 762 | rv = 0; | 784 | rv = 0; |
| @@ -781,11 +803,12 @@ static int intf_start_seq_timer(ipmi_smi_t intf, | |||
| 781 | GET_SEQ_FROM_MSGID(msgid, seq, seqid); | 803 | GET_SEQ_FROM_MSGID(msgid, seq, seqid); |
| 782 | 804 | ||
| 783 | spin_lock_irqsave(&(intf->seq_lock), flags); | 805 | spin_lock_irqsave(&(intf->seq_lock), flags); |
| 784 | /* We do this verification because the user can be deleted | 806 | /* |
| 785 | while a message is outstanding. */ | 807 | * We do this verification because the user can be deleted |
| 808 | * while a message is outstanding. | ||
| 809 | */ | ||
| 786 | if ((intf->seq_table[seq].inuse) | 810 | if ((intf->seq_table[seq].inuse) |
| 787 | && (intf->seq_table[seq].seqid == seqid)) | 811 | && (intf->seq_table[seq].seqid == seqid)) { |
| 788 | { | ||
| 789 | struct seq_table *ent = &(intf->seq_table[seq]); | 812 | struct seq_table *ent = &(intf->seq_table[seq]); |
| 790 | ent->timeout = ent->orig_timeout; | 813 | ent->timeout = ent->orig_timeout; |
| 791 | rv = 0; | 814 | rv = 0; |
| @@ -810,11 +833,12 @@ static int intf_err_seq(ipmi_smi_t intf, | |||
| 810 | GET_SEQ_FROM_MSGID(msgid, seq, seqid); | 833 | GET_SEQ_FROM_MSGID(msgid, seq, seqid); |
| 811 | 834 | ||
| 812 | spin_lock_irqsave(&(intf->seq_lock), flags); | 835 | spin_lock_irqsave(&(intf->seq_lock), flags); |
| 813 | /* We do this verification because the user can be deleted | 836 | /* |
| 814 | while a message is outstanding. */ | 837 | * We do this verification because the user can be deleted |
| 838 | * while a message is outstanding. | ||
| 839 | */ | ||
| 815 | if ((intf->seq_table[seq].inuse) | 840 | if ((intf->seq_table[seq].inuse) |
| 816 | && (intf->seq_table[seq].seqid == seqid)) | 841 | && (intf->seq_table[seq].seqid == seqid)) { |
| 817 | { | ||
| 818 | struct seq_table *ent = &(intf->seq_table[seq]); | 842 | struct seq_table *ent = &(intf->seq_table[seq]); |
| 819 | 843 | ||
| 820 | ent->inuse = 0; | 844 | ent->inuse = 0; |
| @@ -840,24 +864,30 @@ int ipmi_create_user(unsigned int if_num, | |||
| 840 | int rv = 0; | 864 | int rv = 0; |
| 841 | ipmi_smi_t intf; | 865 | ipmi_smi_t intf; |
| 842 | 866 | ||
| 843 | /* There is no module usecount here, because it's not | 867 | /* |
| 844 | required. Since this can only be used by and called from | 868 | * There is no module usecount here, because it's not |
| 845 | other modules, they will implicitly use this module, and | 869 | * required. Since this can only be used by and called from |
| 846 | thus this can't be removed unless the other modules are | 870 | * other modules, they will implicitly use this module, and |
| 847 | removed. */ | 871 | * thus this can't be removed unless the other modules are |
| 872 | * removed. | ||
| 873 | */ | ||
| 848 | 874 | ||
| 849 | if (handler == NULL) | 875 | if (handler == NULL) |
| 850 | return -EINVAL; | 876 | return -EINVAL; |
| 851 | 877 | ||
| 852 | /* Make sure the driver is actually initialized, this handles | 878 | /* |
| 853 | problems with initialization order. */ | 879 | * Make sure the driver is actually initialized, this handles |
| 880 | * problems with initialization order. | ||
| 881 | */ | ||
| 854 | if (!initialized) { | 882 | if (!initialized) { |
| 855 | rv = ipmi_init_msghandler(); | 883 | rv = ipmi_init_msghandler(); |
| 856 | if (rv) | 884 | if (rv) |
| 857 | return rv; | 885 | return rv; |
| 858 | 886 | ||
| 859 | /* The init code doesn't return an error if it was turned | 887 | /* |
| 860 | off, but it won't initialize. Check that. */ | 888 | * The init code doesn't return an error if it was turned |
| 889 | * off, but it won't initialize. Check that. | ||
| 890 | */ | ||
| 861 | if (!initialized) | 891 | if (!initialized) |
| 862 | return -ENODEV; | 892 | return -ENODEV; |
| 863 | } | 893 | } |
| @@ -898,8 +928,10 @@ int ipmi_create_user(unsigned int if_num, | |||
| 898 | } | 928 | } |
| 899 | } | 929 | } |
| 900 | 930 | ||
| 901 | /* Hold the lock so intf->handlers is guaranteed to be good | 931 | /* |
| 902 | * until now */ | 932 | * Hold the lock so intf->handlers is guaranteed to be good |
| 933 | * until now | ||
| 934 | */ | ||
| 903 | mutex_unlock(&ipmi_interfaces_mutex); | 935 | mutex_unlock(&ipmi_interfaces_mutex); |
| 904 | 936 | ||
| 905 | new_user->valid = 1; | 937 | new_user->valid = 1; |
| @@ -916,6 +948,7 @@ out_kfree: | |||
| 916 | kfree(new_user); | 948 | kfree(new_user); |
| 917 | return rv; | 949 | return rv; |
| 918 | } | 950 | } |
| 951 | EXPORT_SYMBOL(ipmi_create_user); | ||
| 919 | 952 | ||
| 920 | static void free_user(struct kref *ref) | 953 | static void free_user(struct kref *ref) |
| 921 | { | 954 | { |
| @@ -939,8 +972,7 @@ int ipmi_destroy_user(ipmi_user_t user) | |||
| 939 | 972 | ||
| 940 | for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) { | 973 | for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) { |
| 941 | if (intf->seq_table[i].inuse | 974 | if (intf->seq_table[i].inuse |
| 942 | && (intf->seq_table[i].recv_msg->user == user)) | 975 | && (intf->seq_table[i].recv_msg->user == user)) { |
| 943 | { | ||
| 944 | intf->seq_table[i].inuse = 0; | 976 | intf->seq_table[i].inuse = 0; |
| 945 | ipmi_free_recv_msg(intf->seq_table[i].recv_msg); | 977 | ipmi_free_recv_msg(intf->seq_table[i].recv_msg); |
| 946 | } | 978 | } |
| @@ -983,6 +1015,7 @@ int ipmi_destroy_user(ipmi_user_t user) | |||
| 983 | 1015 | ||
| 984 | return 0; | 1016 | return 0; |
| 985 | } | 1017 | } |
| 1018 | EXPORT_SYMBOL(ipmi_destroy_user); | ||
| 986 | 1019 | ||
| 987 | void ipmi_get_version(ipmi_user_t user, | 1020 | void ipmi_get_version(ipmi_user_t user, |
| 988 | unsigned char *major, | 1021 | unsigned char *major, |
| @@ -991,6 +1024,7 @@ void ipmi_get_version(ipmi_user_t user, | |||
| 991 | *major = user->intf->ipmi_version_major; | 1024 | *major = user->intf->ipmi_version_major; |
| 992 | *minor = user->intf->ipmi_version_minor; | 1025 | *minor = user->intf->ipmi_version_minor; |
| 993 | } | 1026 | } |
| 1027 | EXPORT_SYMBOL(ipmi_get_version); | ||
| 994 | 1028 | ||
| 995 | int ipmi_set_my_address(ipmi_user_t user, | 1029 | int ipmi_set_my_address(ipmi_user_t user, |
| 996 | unsigned int channel, | 1030 | unsigned int channel, |
| @@ -1001,6 +1035,7 @@ int ipmi_set_my_address(ipmi_user_t user, | |||
| 1001 | user->intf->channels[channel].address = address; | 1035 | user->intf->channels[channel].address = address; |
| 1002 | return 0; | 1036 | return 0; |
| 1003 | } | 1037 | } |
| 1038 | EXPORT_SYMBOL(ipmi_set_my_address); | ||
| 1004 | 1039 | ||
| 1005 | int ipmi_get_my_address(ipmi_user_t user, | 1040 | int ipmi_get_my_address(ipmi_user_t user, |
| 1006 | unsigned int channel, | 1041 | unsigned int channel, |
| @@ -1011,6 +1046,7 @@ int ipmi_get_my_address(ipmi_user_t user, | |||
| 1011 | *address = user->intf->channels[channel].address; | 1046 | *address = user->intf->channels[channel].address; |
| 1012 | return 0; | 1047 | return 0; |
| 1013 | } | 1048 | } |
| 1049 | EXPORT_SYMBOL(ipmi_get_my_address); | ||
| 1014 | 1050 | ||
| 1015 | int ipmi_set_my_LUN(ipmi_user_t user, | 1051 | int ipmi_set_my_LUN(ipmi_user_t user, |
| 1016 | unsigned int channel, | 1052 | unsigned int channel, |
| @@ -1021,6 +1057,7 @@ int ipmi_set_my_LUN(ipmi_user_t user, | |||
| 1021 | user->intf->channels[channel].lun = LUN & 0x3; | 1057 | user->intf->channels[channel].lun = LUN & 0x3; |
| 1022 | return 0; | 1058 | return 0; |
| 1023 | } | 1059 | } |
| 1060 | EXPORT_SYMBOL(ipmi_set_my_LUN); | ||
| 1024 | 1061 | ||
| 1025 | int ipmi_get_my_LUN(ipmi_user_t user, | 1062 | int ipmi_get_my_LUN(ipmi_user_t user, |
| 1026 | unsigned int channel, | 1063 | unsigned int channel, |
| @@ -1031,6 +1068,7 @@ int ipmi_get_my_LUN(ipmi_user_t user, | |||
| 1031 | *address = user->intf->channels[channel].lun; | 1068 | *address = user->intf->channels[channel].lun; |
| 1032 | return 0; | 1069 | return 0; |
| 1033 | } | 1070 | } |
| 1071 | EXPORT_SYMBOL(ipmi_get_my_LUN); | ||
| 1034 | 1072 | ||
| 1035 | int ipmi_get_maintenance_mode(ipmi_user_t user) | 1073 | int ipmi_get_maintenance_mode(ipmi_user_t user) |
| 1036 | { | 1074 | { |
| @@ -1139,6 +1177,7 @@ int ipmi_set_gets_events(ipmi_user_t user, int val) | |||
| 1139 | 1177 | ||
| 1140 | return 0; | 1178 | return 0; |
| 1141 | } | 1179 | } |
| 1180 | EXPORT_SYMBOL(ipmi_set_gets_events); | ||
| 1142 | 1181 | ||
| 1143 | static struct cmd_rcvr *find_cmd_rcvr(ipmi_smi_t intf, | 1182 | static struct cmd_rcvr *find_cmd_rcvr(ipmi_smi_t intf, |
| 1144 | unsigned char netfn, | 1183 | unsigned char netfn, |
| @@ -1204,6 +1243,7 @@ int ipmi_register_for_cmd(ipmi_user_t user, | |||
| 1204 | 1243 | ||
| 1205 | return rv; | 1244 | return rv; |
| 1206 | } | 1245 | } |
| 1246 | EXPORT_SYMBOL(ipmi_register_for_cmd); | ||
| 1207 | 1247 | ||
| 1208 | int ipmi_unregister_for_cmd(ipmi_user_t user, | 1248 | int ipmi_unregister_for_cmd(ipmi_user_t user, |
| 1209 | unsigned char netfn, | 1249 | unsigned char netfn, |
| @@ -1241,12 +1281,13 @@ int ipmi_unregister_for_cmd(ipmi_user_t user, | |||
| 1241 | } | 1281 | } |
| 1242 | return rv; | 1282 | return rv; |
| 1243 | } | 1283 | } |
| 1284 | EXPORT_SYMBOL(ipmi_unregister_for_cmd); | ||
| 1244 | 1285 | ||
| 1245 | static unsigned char | 1286 | static unsigned char |
| 1246 | ipmb_checksum(unsigned char *data, int size) | 1287 | ipmb_checksum(unsigned char *data, int size) |
| 1247 | { | 1288 | { |
| 1248 | unsigned char csum = 0; | 1289 | unsigned char csum = 0; |
| 1249 | 1290 | ||
| 1250 | for (; size > 0; size--, data++) | 1291 | for (; size > 0; size--, data++) |
| 1251 | csum += *data; | 1292 | csum += *data; |
| 1252 | 1293 | ||
| @@ -1288,8 +1329,10 @@ static inline void format_ipmb_msg(struct ipmi_smi_msg *smi_msg, | |||
| 1288 | = ipmb_checksum(&(smi_msg->data[i+6]), | 1329 | = ipmb_checksum(&(smi_msg->data[i+6]), |
| 1289 | smi_msg->data_size-6); | 1330 | smi_msg->data_size-6); |
| 1290 | 1331 | ||
| 1291 | /* Add on the checksum size and the offset from the | 1332 | /* |
| 1292 | broadcast. */ | 1333 | * Add on the checksum size and the offset from the |
| 1334 | * broadcast. | ||
| 1335 | */ | ||
| 1293 | smi_msg->data_size += 1 + i; | 1336 | smi_msg->data_size += 1 + i; |
| 1294 | 1337 | ||
| 1295 | smi_msg->msgid = msgid; | 1338 | smi_msg->msgid = msgid; |
| @@ -1325,17 +1368,21 @@ static inline void format_lan_msg(struct ipmi_smi_msg *smi_msg, | |||
| 1325 | = ipmb_checksum(&(smi_msg->data[7]), | 1368 | = ipmb_checksum(&(smi_msg->data[7]), |
| 1326 | smi_msg->data_size-7); | 1369 | smi_msg->data_size-7); |
| 1327 | 1370 | ||
| 1328 | /* Add on the checksum size and the offset from the | 1371 | /* |
| 1329 | broadcast. */ | 1372 | * Add on the checksum size and the offset from the |
| 1373 | * broadcast. | ||
| 1374 | */ | ||
| 1330 | smi_msg->data_size += 1; | 1375 | smi_msg->data_size += 1; |
| 1331 | 1376 | ||
| 1332 | smi_msg->msgid = msgid; | 1377 | smi_msg->msgid = msgid; |
| 1333 | } | 1378 | } |
| 1334 | 1379 | ||
| 1335 | /* Separate from ipmi_request so that the user does not have to be | 1380 | /* |
| 1336 | supplied in certain circumstances (mainly at panic time). If | 1381 | * Separate from ipmi_request so that the user does not have to be |
| 1337 | messages are supplied, they will be freed, even if an error | 1382 | * supplied in certain circumstances (mainly at panic time). If |
| 1338 | occurs. */ | 1383 | * messages are supplied, they will be freed, even if an error |
| 1384 | * occurs. | ||
| 1385 | */ | ||
| 1339 | static int i_ipmi_request(ipmi_user_t user, | 1386 | static int i_ipmi_request(ipmi_user_t user, |
| 1340 | ipmi_smi_t intf, | 1387 | ipmi_smi_t intf, |
| 1341 | struct ipmi_addr *addr, | 1388 | struct ipmi_addr *addr, |
| @@ -1357,19 +1404,18 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1357 | struct ipmi_smi_handlers *handlers; | 1404 | struct ipmi_smi_handlers *handlers; |
| 1358 | 1405 | ||
| 1359 | 1406 | ||
| 1360 | if (supplied_recv) { | 1407 | if (supplied_recv) |
| 1361 | recv_msg = supplied_recv; | 1408 | recv_msg = supplied_recv; |
| 1362 | } else { | 1409 | else { |
| 1363 | recv_msg = ipmi_alloc_recv_msg(); | 1410 | recv_msg = ipmi_alloc_recv_msg(); |
| 1364 | if (recv_msg == NULL) { | 1411 | if (recv_msg == NULL) |
| 1365 | return -ENOMEM; | 1412 | return -ENOMEM; |
| 1366 | } | ||
| 1367 | } | 1413 | } |
| 1368 | recv_msg->user_msg_data = user_msg_data; | 1414 | recv_msg->user_msg_data = user_msg_data; |
| 1369 | 1415 | ||
| 1370 | if (supplied_smi) { | 1416 | if (supplied_smi) |
| 1371 | smi_msg = (struct ipmi_smi_msg *) supplied_smi; | 1417 | smi_msg = (struct ipmi_smi_msg *) supplied_smi; |
| 1372 | } else { | 1418 | else { |
| 1373 | smi_msg = ipmi_alloc_smi_msg(); | 1419 | smi_msg = ipmi_alloc_smi_msg(); |
| 1374 | if (smi_msg == NULL) { | 1420 | if (smi_msg == NULL) { |
| 1375 | ipmi_free_recv_msg(recv_msg); | 1421 | ipmi_free_recv_msg(recv_msg); |
| @@ -1388,8 +1434,10 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1388 | if (user) | 1434 | if (user) |
| 1389 | kref_get(&user->refcount); | 1435 | kref_get(&user->refcount); |
| 1390 | recv_msg->msgid = msgid; | 1436 | recv_msg->msgid = msgid; |
| 1391 | /* Store the message to send in the receive message so timeout | 1437 | /* |
| 1392 | responses can get the proper response data. */ | 1438 | * Store the message to send in the receive message so timeout |
| 1439 | * responses can get the proper response data. | ||
| 1440 | */ | ||
| 1393 | recv_msg->msg = *msg; | 1441 | recv_msg->msg = *msg; |
| 1394 | 1442 | ||
| 1395 | if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { | 1443 | if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { |
| @@ -1413,10 +1461,11 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1413 | if ((msg->netfn == IPMI_NETFN_APP_REQUEST) | 1461 | if ((msg->netfn == IPMI_NETFN_APP_REQUEST) |
| 1414 | && ((msg->cmd == IPMI_SEND_MSG_CMD) | 1462 | && ((msg->cmd == IPMI_SEND_MSG_CMD) |
| 1415 | || (msg->cmd == IPMI_GET_MSG_CMD) | 1463 | || (msg->cmd == IPMI_GET_MSG_CMD) |
| 1416 | || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD))) | 1464 | || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD))) { |
| 1417 | { | 1465 | /* |
| 1418 | /* We don't let the user do these, since we manage | 1466 | * We don't let the user do these, since we manage |
| 1419 | the sequence numbers. */ | 1467 | * the sequence numbers. |
| 1468 | */ | ||
| 1420 | ipmi_inc_stat(intf, sent_invalid_commands); | 1469 | ipmi_inc_stat(intf, sent_invalid_commands); |
| 1421 | rv = -EINVAL; | 1470 | rv = -EINVAL; |
| 1422 | goto out_err; | 1471 | goto out_err; |
| @@ -1425,14 +1474,12 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1425 | if (((msg->netfn == IPMI_NETFN_APP_REQUEST) | 1474 | if (((msg->netfn == IPMI_NETFN_APP_REQUEST) |
| 1426 | && ((msg->cmd == IPMI_COLD_RESET_CMD) | 1475 | && ((msg->cmd == IPMI_COLD_RESET_CMD) |
| 1427 | || (msg->cmd == IPMI_WARM_RESET_CMD))) | 1476 | || (msg->cmd == IPMI_WARM_RESET_CMD))) |
| 1428 | || (msg->netfn == IPMI_NETFN_FIRMWARE_REQUEST)) | 1477 | || (msg->netfn == IPMI_NETFN_FIRMWARE_REQUEST)) { |
| 1429 | { | ||
| 1430 | spin_lock_irqsave(&intf->maintenance_mode_lock, flags); | 1478 | spin_lock_irqsave(&intf->maintenance_mode_lock, flags); |
| 1431 | intf->auto_maintenance_timeout | 1479 | intf->auto_maintenance_timeout |
| 1432 | = IPMI_MAINTENANCE_MODE_TIMEOUT; | 1480 | = IPMI_MAINTENANCE_MODE_TIMEOUT; |
| 1433 | if (!intf->maintenance_mode | 1481 | if (!intf->maintenance_mode |
| 1434 | && !intf->maintenance_mode_enable) | 1482 | && !intf->maintenance_mode_enable) { |
| 1435 | { | ||
| 1436 | intf->maintenance_mode_enable = 1; | 1483 | intf->maintenance_mode_enable = 1; |
| 1437 | maintenance_mode_update(intf); | 1484 | maintenance_mode_update(intf); |
| 1438 | } | 1485 | } |
| @@ -1455,8 +1502,7 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1455 | smi_msg->data_size = msg->data_len + 2; | 1502 | smi_msg->data_size = msg->data_len + 2; |
| 1456 | ipmi_inc_stat(intf, sent_local_commands); | 1503 | ipmi_inc_stat(intf, sent_local_commands); |
| 1457 | } else if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE) | 1504 | } else if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE) |
| 1458 | || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) | 1505 | || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) { |
| 1459 | { | ||
| 1460 | struct ipmi_ipmb_addr *ipmb_addr; | 1506 | struct ipmi_ipmb_addr *ipmb_addr; |
| 1461 | unsigned char ipmb_seq; | 1507 | unsigned char ipmb_seq; |
| 1462 | long seqid; | 1508 | long seqid; |
| @@ -1469,8 +1515,7 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1469 | } | 1515 | } |
| 1470 | 1516 | ||
| 1471 | if (intf->channels[addr->channel].medium | 1517 | if (intf->channels[addr->channel].medium |
| 1472 | != IPMI_CHANNEL_MEDIUM_IPMB) | 1518 | != IPMI_CHANNEL_MEDIUM_IPMB) { |
| 1473 | { | ||
| 1474 | ipmi_inc_stat(intf, sent_invalid_commands); | 1519 | ipmi_inc_stat(intf, sent_invalid_commands); |
| 1475 | rv = -EINVAL; | 1520 | rv = -EINVAL; |
| 1476 | goto out_err; | 1521 | goto out_err; |
| @@ -1483,9 +1528,11 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1483 | retries = 4; | 1528 | retries = 4; |
| 1484 | } | 1529 | } |
| 1485 | if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) { | 1530 | if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) { |
| 1486 | /* Broadcasts add a zero at the beginning of the | 1531 | /* |
| 1487 | message, but otherwise is the same as an IPMB | 1532 | * Broadcasts add a zero at the beginning of the |
| 1488 | address. */ | 1533 | * message, but otherwise is the same as an IPMB |
| 1534 | * address. | ||
| 1535 | */ | ||
| 1489 | addr->addr_type = IPMI_IPMB_ADDR_TYPE; | 1536 | addr->addr_type = IPMI_IPMB_ADDR_TYPE; |
| 1490 | broadcast = 1; | 1537 | broadcast = 1; |
| 1491 | } | 1538 | } |
| @@ -1495,8 +1542,10 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1495 | if (retry_time_ms == 0) | 1542 | if (retry_time_ms == 0) |
| 1496 | retry_time_ms = 1000; | 1543 | retry_time_ms = 1000; |
| 1497 | 1544 | ||
| 1498 | /* 9 for the header and 1 for the checksum, plus | 1545 | /* |
| 1499 | possibly one for the broadcast. */ | 1546 | * 9 for the header and 1 for the checksum, plus |
| 1547 | * possibly one for the broadcast. | ||
| 1548 | */ | ||
| 1500 | if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) { | 1549 | if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) { |
| 1501 | ipmi_inc_stat(intf, sent_invalid_commands); | 1550 | ipmi_inc_stat(intf, sent_invalid_commands); |
| 1502 | rv = -EMSGSIZE; | 1551 | rv = -EMSGSIZE; |
| @@ -1513,15 +1562,19 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1513 | memcpy(&recv_msg->addr, ipmb_addr, sizeof(*ipmb_addr)); | 1562 | memcpy(&recv_msg->addr, ipmb_addr, sizeof(*ipmb_addr)); |
| 1514 | 1563 | ||
| 1515 | if (recv_msg->msg.netfn & 0x1) { | 1564 | if (recv_msg->msg.netfn & 0x1) { |
| 1516 | /* It's a response, so use the user's sequence | 1565 | /* |
| 1517 | from msgid. */ | 1566 | * It's a response, so use the user's sequence |
| 1567 | * from msgid. | ||
| 1568 | */ | ||
| 1518 | ipmi_inc_stat(intf, sent_ipmb_responses); | 1569 | ipmi_inc_stat(intf, sent_ipmb_responses); |
| 1519 | format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid, | 1570 | format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid, |
| 1520 | msgid, broadcast, | 1571 | msgid, broadcast, |
| 1521 | source_address, source_lun); | 1572 | source_address, source_lun); |
| 1522 | 1573 | ||
| 1523 | /* Save the receive message so we can use it | 1574 | /* |
| 1524 | to deliver the response. */ | 1575 | * Save the receive message so we can use it |
| 1576 | * to deliver the response. | ||
| 1577 | */ | ||
| 1525 | smi_msg->user_data = recv_msg; | 1578 | smi_msg->user_data = recv_msg; |
| 1526 | } else { | 1579 | } else { |
| 1527 | /* It's a command, so get a sequence for it. */ | 1580 | /* It's a command, so get a sequence for it. */ |
| @@ -1530,8 +1583,10 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1530 | 1583 | ||
| 1531 | ipmi_inc_stat(intf, sent_ipmb_commands); | 1584 | ipmi_inc_stat(intf, sent_ipmb_commands); |
| 1532 | 1585 | ||
| 1533 | /* Create a sequence number with a 1 second | 1586 | /* |
| 1534 | timeout and 4 retries. */ | 1587 | * Create a sequence number with a 1 second |
| 1588 | * timeout and 4 retries. | ||
| 1589 | */ | ||
| 1535 | rv = intf_next_seq(intf, | 1590 | rv = intf_next_seq(intf, |
| 1536 | recv_msg, | 1591 | recv_msg, |
| 1537 | retry_time_ms, | 1592 | retry_time_ms, |
| @@ -1540,34 +1595,42 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1540 | &ipmb_seq, | 1595 | &ipmb_seq, |
| 1541 | &seqid); | 1596 | &seqid); |
| 1542 | if (rv) { | 1597 | if (rv) { |
| 1543 | /* We have used up all the sequence numbers, | 1598 | /* |
| 1544 | probably, so abort. */ | 1599 | * We have used up all the sequence numbers, |
| 1600 | * probably, so abort. | ||
| 1601 | */ | ||
| 1545 | spin_unlock_irqrestore(&(intf->seq_lock), | 1602 | spin_unlock_irqrestore(&(intf->seq_lock), |
| 1546 | flags); | 1603 | flags); |
| 1547 | goto out_err; | 1604 | goto out_err; |
| 1548 | } | 1605 | } |
| 1549 | 1606 | ||
| 1550 | /* Store the sequence number in the message, | 1607 | /* |
| 1551 | so that when the send message response | 1608 | * Store the sequence number in the message, |
| 1552 | comes back we can start the timer. */ | 1609 | * so that when the send message response |
| 1610 | * comes back we can start the timer. | ||
| 1611 | */ | ||
| 1553 | format_ipmb_msg(smi_msg, msg, ipmb_addr, | 1612 | format_ipmb_msg(smi_msg, msg, ipmb_addr, |
| 1554 | STORE_SEQ_IN_MSGID(ipmb_seq, seqid), | 1613 | STORE_SEQ_IN_MSGID(ipmb_seq, seqid), |
| 1555 | ipmb_seq, broadcast, | 1614 | ipmb_seq, broadcast, |
| 1556 | source_address, source_lun); | 1615 | source_address, source_lun); |
| 1557 | 1616 | ||
| 1558 | /* Copy the message into the recv message data, so we | 1617 | /* |
| 1559 | can retransmit it later if necessary. */ | 1618 | * Copy the message into the recv message data, so we |
| 1619 | * can retransmit it later if necessary. | ||
| 1620 | */ | ||
| 1560 | memcpy(recv_msg->msg_data, smi_msg->data, | 1621 | memcpy(recv_msg->msg_data, smi_msg->data, |
| 1561 | smi_msg->data_size); | 1622 | smi_msg->data_size); |
| 1562 | recv_msg->msg.data = recv_msg->msg_data; | 1623 | recv_msg->msg.data = recv_msg->msg_data; |
| 1563 | recv_msg->msg.data_len = smi_msg->data_size; | 1624 | recv_msg->msg.data_len = smi_msg->data_size; |
| 1564 | 1625 | ||
| 1565 | /* We don't unlock until here, because we need | 1626 | /* |
| 1566 | to copy the completed message into the | 1627 | * We don't unlock until here, because we need |
| 1567 | recv_msg before we release the lock. | 1628 | * to copy the completed message into the |
| 1568 | Otherwise, race conditions may bite us. I | 1629 | * recv_msg before we release the lock. |
| 1569 | know that's pretty paranoid, but I prefer | 1630 | * Otherwise, race conditions may bite us. I |
| 1570 | to be correct. */ | 1631 | * know that's pretty paranoid, but I prefer |
| 1632 | * to be correct. | ||
| 1633 | */ | ||
| 1571 | spin_unlock_irqrestore(&(intf->seq_lock), flags); | 1634 | spin_unlock_irqrestore(&(intf->seq_lock), flags); |
| 1572 | } | 1635 | } |
| 1573 | } else if (addr->addr_type == IPMI_LAN_ADDR_TYPE) { | 1636 | } else if (addr->addr_type == IPMI_LAN_ADDR_TYPE) { |
| @@ -1582,10 +1645,9 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1582 | } | 1645 | } |
| 1583 | 1646 | ||
| 1584 | if ((intf->channels[addr->channel].medium | 1647 | if ((intf->channels[addr->channel].medium |
| 1585 | != IPMI_CHANNEL_MEDIUM_8023LAN) | 1648 | != IPMI_CHANNEL_MEDIUM_8023LAN) |
| 1586 | && (intf->channels[addr->channel].medium | 1649 | && (intf->channels[addr->channel].medium |
| 1587 | != IPMI_CHANNEL_MEDIUM_ASYNC)) | 1650 | != IPMI_CHANNEL_MEDIUM_ASYNC)) { |
| 1588 | { | ||
| 1589 | ipmi_inc_stat(intf, sent_invalid_commands); | 1651 | ipmi_inc_stat(intf, sent_invalid_commands); |
| 1590 | rv = -EINVAL; | 1652 | rv = -EINVAL; |
| 1591 | goto out_err; | 1653 | goto out_err; |
| @@ -1614,14 +1676,18 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1614 | memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr)); | 1676 | memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr)); |
| 1615 | 1677 | ||
| 1616 | if (recv_msg->msg.netfn & 0x1) { | 1678 | if (recv_msg->msg.netfn & 0x1) { |
| 1617 | /* It's a response, so use the user's sequence | 1679 | /* |
| 1618 | from msgid. */ | 1680 | * It's a response, so use the user's sequence |
| 1681 | * from msgid. | ||
| 1682 | */ | ||
| 1619 | ipmi_inc_stat(intf, sent_lan_responses); | 1683 | ipmi_inc_stat(intf, sent_lan_responses); |
| 1620 | format_lan_msg(smi_msg, msg, lan_addr, msgid, | 1684 | format_lan_msg(smi_msg, msg, lan_addr, msgid, |
| 1621 | msgid, source_lun); | 1685 | msgid, source_lun); |
| 1622 | 1686 | ||
| 1623 | /* Save the receive message so we can use it | 1687 | /* |
| 1624 | to deliver the response. */ | 1688 | * Save the receive message so we can use it |
| 1689 | * to deliver the response. | ||
| 1690 | */ | ||
| 1625 | smi_msg->user_data = recv_msg; | 1691 | smi_msg->user_data = recv_msg; |
| 1626 | } else { | 1692 | } else { |
| 1627 | /* It's a command, so get a sequence for it. */ | 1693 | /* It's a command, so get a sequence for it. */ |
| @@ -1630,8 +1696,10 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1630 | 1696 | ||
| 1631 | ipmi_inc_stat(intf, sent_lan_commands); | 1697 | ipmi_inc_stat(intf, sent_lan_commands); |
| 1632 | 1698 | ||
| 1633 | /* Create a sequence number with a 1 second | 1699 | /* |
| 1634 | timeout and 4 retries. */ | 1700 | * Create a sequence number with a 1 second |
| 1701 | * timeout and 4 retries. | ||
| 1702 | */ | ||
| 1635 | rv = intf_next_seq(intf, | 1703 | rv = intf_next_seq(intf, |
| 1636 | recv_msg, | 1704 | recv_msg, |
| 1637 | retry_time_ms, | 1705 | retry_time_ms, |
| @@ -1640,33 +1708,41 @@ static int i_ipmi_request(ipmi_user_t user, | |||
| 1640 | &ipmb_seq, | 1708 | &ipmb_seq, |
| 1641 | &seqid); | 1709 | &seqid); |
| 1642 | if (rv) { | 1710 | if (rv) { |
| 1643 | /* We have used up all the sequence numbers, | 1711 | /* |
| 1644 | probably, so abort. */ | 1712 | * We have used up all the sequence numbers, |
| 1713 | * probably, so abort. | ||
| 1714 | */ | ||
| 1645 | spin_unlock_irqrestore(&(intf->seq_lock), | 1715 | spin_unlock_irqrestore(&(intf->seq_lock), |
| 1646 | flags); | 1716 | flags); |
| 1647 | goto out_err; | 1717 | goto out_err; |
| 1648 | } | 1718 | } |
| 1649 | 1719 | ||
| 1650 | /* Store the sequence number in the message, | 1720 | /* |
| 1651 | so that when the send message response | 1721 | * Store the sequence number in the message, |
| 1652 | comes back we can start the timer. */ | 1722 | * so that when the send message response |
| 1723 | * comes back we can start the timer. | ||
| 1724 | */ | ||
| 1653 | format_lan_msg(smi_msg, msg, lan_addr, | 1725 | format_lan_msg(smi_msg, msg, lan_addr, |
| 1654 | STORE_SEQ_IN_MSGID(ipmb_seq, seqid), | 1726 | STORE_SEQ_IN_MSGID(ipmb_seq, seqid), |
| 1655 | ipmb_seq, source_lun); | 1727 | ipmb_seq, source_lun); |
| 1656 | 1728 | ||
| 1657 | /* Copy the message into the recv message data, so we | 1729 | /* |
| 1658 | can retransmit it later if necessary. */ | 1730 | * Copy the message into the recv message data, so we |
| 1731 | * can retransmit it later if necessary. | ||
| 1732 | */ | ||
| 1659 | memcpy(recv_msg->msg_data, smi_msg->data, | 1733 | memcpy(recv_msg->msg_data, smi_msg->data, |
| 1660 | smi_msg->data_size); | 1734 | smi_msg->data_size); |
| 1661 | recv_msg->msg.data = recv_msg->msg_data; | 1735 | recv_msg->msg.data = recv_msg->msg_data; |
| 1662 | recv_msg->msg.data_len = smi_msg->data_size; | 1736 | recv_msg->msg.data_len = smi_msg->data_size; |
| 1663 | 1737 | ||
| 1664 | /* We don't unlock until here, because we need | 1738 | /* |
| 1665 | to copy the completed message into the | 1739 | * We don't unlock until here, because we need |
| 1666 | recv_msg before we release the lock. | 1740 | * to copy the completed message into the |
| 1667 | Otherwise, race conditions may bite us. I | 1741 | * recv_msg before we release the lock. |
| 1668 | know that's pretty paranoid, but I prefer | 1742 | * Otherwise, race conditions may bite us. I |
| 1669 | to be correct. */ | 1743 | * know that's pretty paranoid, but I prefer |
| 1744 | * to be correct. | ||
| 1745 | */ | ||
| 1670 | spin_unlock_irqrestore(&(intf->seq_lock), flags); | 1746 | spin_unlock_irqrestore(&(intf->seq_lock), flags); |
| 1671 | } | 1747 | } |
| 1672 | } else { | 1748 | } else { |
| @@ -1739,6 +1815,7 @@ int ipmi_request_settime(ipmi_user_t user, | |||
| 1739 | retries, | 1815 | retries, |
| 1740 | retry_time_ms); | 1816 | retry_time_ms); |
| 1741 | } | 1817 | } |
| 1818 | EXPORT_SYMBOL(ipmi_request_settime); | ||
| 1742 | 1819 | ||
| 1743 | int ipmi_request_supply_msgs(ipmi_user_t user, | 1820 | int ipmi_request_supply_msgs(ipmi_user_t user, |
| 1744 | struct ipmi_addr *addr, | 1821 | struct ipmi_addr *addr, |
| @@ -1770,6 +1847,7 @@ int ipmi_request_supply_msgs(ipmi_user_t user, | |||
| 1770 | lun, | 1847 | lun, |
| 1771 | -1, 0); | 1848 | -1, 0); |
| 1772 | } | 1849 | } |
| 1850 | EXPORT_SYMBOL(ipmi_request_supply_msgs); | ||
| 1773 | 1851 | ||
| 1774 | #ifdef CONFIG_PROC_FS | 1852 | #ifdef CONFIG_PROC_FS |
| 1775 | static int ipmb_file_read_proc(char *page, char **start, off_t off, | 1853 | static int ipmb_file_read_proc(char *page, char **start, off_t off, |
| @@ -1903,6 +1981,7 @@ int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name, | |||
| 1903 | 1981 | ||
| 1904 | return rv; | 1982 | return rv; |
| 1905 | } | 1983 | } |
| 1984 | EXPORT_SYMBOL(ipmi_smi_add_proc_entry); | ||
| 1906 | 1985 | ||
| 1907 | static int add_proc_entries(ipmi_smi_t smi, int num) | 1986 | static int add_proc_entries(ipmi_smi_t smi, int num) |
| 1908 | { | 1987 | { |
| @@ -1913,9 +1992,8 @@ static int add_proc_entries(ipmi_smi_t smi, int num) | |||
| 1913 | smi->proc_dir = proc_mkdir(smi->proc_dir_name, proc_ipmi_root); | 1992 | smi->proc_dir = proc_mkdir(smi->proc_dir_name, proc_ipmi_root); |
| 1914 | if (!smi->proc_dir) | 1993 | if (!smi->proc_dir) |
| 1915 | rv = -ENOMEM; | 1994 | rv = -ENOMEM; |
| 1916 | else { | 1995 | else |
| 1917 | smi->proc_dir->owner = THIS_MODULE; | 1996 | smi->proc_dir->owner = THIS_MODULE; |
| 1918 | } | ||
| 1919 | 1997 | ||
| 1920 | if (rv == 0) | 1998 | if (rv == 0) |
| 1921 | rv = ipmi_smi_add_proc_entry(smi, "stats", | 1999 | rv = ipmi_smi_add_proc_entry(smi, "stats", |
| @@ -2214,37 +2292,47 @@ static int create_files(struct bmc_device *bmc) | |||
| 2214 | 2292 | ||
| 2215 | err = device_create_file(&bmc->dev->dev, | 2293 | err = device_create_file(&bmc->dev->dev, |
| 2216 | &bmc->device_id_attr); | 2294 | &bmc->device_id_attr); |
| 2217 | if (err) goto out; | 2295 | if (err) |
| 2296 | goto out; | ||
| 2218 | err = device_create_file(&bmc->dev->dev, | 2297 | err = device_create_file(&bmc->dev->dev, |
| 2219 | &bmc->provides_dev_sdrs_attr); | 2298 | &bmc->provides_dev_sdrs_attr); |
| 2220 | if (err) goto out_devid; | 2299 | if (err) |
| 2300 | goto out_devid; | ||
| 2221 | err = device_create_file(&bmc->dev->dev, | 2301 | err = device_create_file(&bmc->dev->dev, |
| 2222 | &bmc->revision_attr); | 2302 | &bmc->revision_attr); |
| 2223 | if (err) goto out_sdrs; | 2303 | if (err) |
| 2304 | goto out_sdrs; | ||
| 2224 | err = device_create_file(&bmc->dev->dev, | 2305 | err = device_create_file(&bmc->dev->dev, |
| 2225 | &bmc->firmware_rev_attr); | 2306 | &bmc->firmware_rev_attr); |
| 2226 | if (err) goto out_rev; | 2307 | if (err) |
| 2308 | goto out_rev; | ||
| 2227 | err = device_create_file(&bmc->dev->dev, | 2309 | err = device_create_file(&bmc->dev->dev, |
| 2228 | &bmc->version_attr); | 2310 | &bmc->version_attr); |
| 2229 | if (err) goto out_firm; | 2311 | if (err) |
| 2312 | goto out_firm; | ||
| 2230 | err = device_create_file(&bmc->dev->dev, | 2313 | err = device_create_file(&bmc->dev->dev, |
| 2231 | &bmc->add_dev_support_attr); | 2314 | &bmc->add_dev_support_attr); |
| 2232 | if (err) goto out_version; | 2315 | if (err) |
| 2316 | goto out_version; | ||
| 2233 | err = device_create_file(&bmc->dev->dev, | 2317 | err = device_create_file(&bmc->dev->dev, |
| 2234 | &bmc->manufacturer_id_attr); | 2318 | &bmc->manufacturer_id_attr); |
| 2235 | if (err) goto out_add_dev; | 2319 | if (err) |
| 2320 | goto out_add_dev; | ||
| 2236 | err = device_create_file(&bmc->dev->dev, | 2321 | err = device_create_file(&bmc->dev->dev, |
| 2237 | &bmc->product_id_attr); | 2322 | &bmc->product_id_attr); |
| 2238 | if (err) goto out_manu; | 2323 | if (err) |
| 2324 | goto out_manu; | ||
| 2239 | if (bmc->id.aux_firmware_revision_set) { | 2325 | if (bmc->id.aux_firmware_revision_set) { |
| 2240 | err = device_create_file(&bmc->dev->dev, | 2326 | err = device_create_file(&bmc->dev->dev, |
| 2241 | &bmc->aux_firmware_rev_attr); | 2327 | &bmc->aux_firmware_rev_attr); |
| 2242 | if (err) goto out_prod_id; | 2328 | if (err) |
| 2329 | goto out_prod_id; | ||
| 2243 | } | 2330 | } |
| 2244 | if (bmc->guid_set) { | 2331 | if (bmc->guid_set) { |
| 2245 | err = device_create_file(&bmc->dev->dev, | 2332 | err = device_create_file(&bmc->dev->dev, |
| 2246 | &bmc->guid_attr); | 2333 | &bmc->guid_attr); |
| 2247 | if (err) goto out_aux_firm; | 2334 | if (err) |
| 2335 | goto out_aux_firm; | ||
| 2248 | } | 2336 | } |
| 2249 | 2337 | ||
| 2250 | return 0; | 2338 | return 0; |
| @@ -2372,8 +2460,10 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, | |||
| 2372 | "ipmi_msghandler:" | 2460 | "ipmi_msghandler:" |
| 2373 | " Unable to register bmc device: %d\n", | 2461 | " Unable to register bmc device: %d\n", |
| 2374 | rv); | 2462 | rv); |
| 2375 | /* Don't go to out_err, you can only do that if | 2463 | /* |
| 2376 | the device is registered already. */ | 2464 | * Don't go to out_err, you can only do that if |
| 2465 | * the device is registered already. | ||
| 2466 | */ | ||
| 2377 | return rv; | 2467 | return rv; |
| 2378 | } | 2468 | } |
| 2379 | 2469 | ||
| @@ -2564,17 +2654,18 @@ channel_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg) | |||
| 2564 | 2654 | ||
| 2565 | if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) | 2655 | if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) |
| 2566 | && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) | 2656 | && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) |
| 2567 | && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD)) | 2657 | && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD)) { |
| 2568 | { | ||
| 2569 | /* It's the one we want */ | 2658 | /* It's the one we want */ |
| 2570 | if (msg->msg.data[0] != 0) { | 2659 | if (msg->msg.data[0] != 0) { |
| 2571 | /* Got an error from the channel, just go on. */ | 2660 | /* Got an error from the channel, just go on. */ |
| 2572 | 2661 | ||
| 2573 | if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) { | 2662 | if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) { |
| 2574 | /* If the MC does not support this | 2663 | /* |
| 2575 | command, that is legal. We just | 2664 | * If the MC does not support this |
| 2576 | assume it has one IPMB at channel | 2665 | * command, that is legal. We just |
| 2577 | zero. */ | 2666 | * assume it has one IPMB at channel |
| 2667 | * zero. | ||
| 2668 | */ | ||
| 2578 | intf->channels[0].medium | 2669 | intf->channels[0].medium |
| 2579 | = IPMI_CHANNEL_MEDIUM_IPMB; | 2670 | = IPMI_CHANNEL_MEDIUM_IPMB; |
| 2580 | intf->channels[0].protocol | 2671 | intf->channels[0].protocol |
| @@ -2595,7 +2686,7 @@ channel_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg) | |||
| 2595 | intf->channels[chan].medium = msg->msg.data[2] & 0x7f; | 2686 | intf->channels[chan].medium = msg->msg.data[2] & 0x7f; |
| 2596 | intf->channels[chan].protocol = msg->msg.data[3] & 0x1f; | 2687 | intf->channels[chan].protocol = msg->msg.data[3] & 0x1f; |
| 2597 | 2688 | ||
| 2598 | next_channel: | 2689 | next_channel: |
| 2599 | intf->curr_channel++; | 2690 | intf->curr_channel++; |
| 2600 | if (intf->curr_channel >= IPMI_MAX_CHANNELS) | 2691 | if (intf->curr_channel >= IPMI_MAX_CHANNELS) |
| 2601 | wake_up(&intf->waitq); | 2692 | wake_up(&intf->waitq); |
| @@ -2623,6 +2714,7 @@ void ipmi_poll_interface(ipmi_user_t user) | |||
| 2623 | if (intf->handlers->poll) | 2714 | if (intf->handlers->poll) |
| 2624 | intf->handlers->poll(intf->send_info); | 2715 | intf->handlers->poll(intf->send_info); |
| 2625 | } | 2716 | } |
| 2717 | EXPORT_SYMBOL(ipmi_poll_interface); | ||
| 2626 | 2718 | ||
| 2627 | int ipmi_register_smi(struct ipmi_smi_handlers *handlers, | 2719 | int ipmi_register_smi(struct ipmi_smi_handlers *handlers, |
| 2628 | void *send_info, | 2720 | void *send_info, |
| @@ -2637,14 +2729,18 @@ int ipmi_register_smi(struct ipmi_smi_handlers *handlers, | |||
| 2637 | ipmi_smi_t tintf; | 2729 | ipmi_smi_t tintf; |
| 2638 | struct list_head *link; | 2730 | struct list_head *link; |
| 2639 | 2731 | ||
| 2640 | /* Make sure the driver is actually initialized, this handles | 2732 | /* |
| 2641 | problems with initialization order. */ | 2733 | * Make sure the driver is actually initialized, this handles |
| 2734 | * problems with initialization order. | ||
| 2735 | */ | ||
| 2642 | if (!initialized) { | 2736 | if (!initialized) { |
| 2643 | rv = ipmi_init_msghandler(); | 2737 | rv = ipmi_init_msghandler(); |
| 2644 | if (rv) | 2738 | if (rv) |
| 2645 | return rv; | 2739 | return rv; |
| 2646 | /* The init code doesn't return an error if it was turned | 2740 | /* |
| 2647 | off, but it won't initialize. Check that. */ | 2741 | * The init code doesn't return an error if it was turned |
| 2742 | * off, but it won't initialize. Check that. | ||
| 2743 | */ | ||
| 2648 | if (!initialized) | 2744 | if (!initialized) |
| 2649 | return -ENODEV; | 2745 | return -ENODEV; |
| 2650 | } | 2746 | } |
| @@ -2722,11 +2818,12 @@ int ipmi_register_smi(struct ipmi_smi_handlers *handlers, | |||
| 2722 | get_guid(intf); | 2818 | get_guid(intf); |
| 2723 | 2819 | ||
| 2724 | if ((intf->ipmi_version_major > 1) | 2820 | if ((intf->ipmi_version_major > 1) |
| 2725 | || ((intf->ipmi_version_major == 1) | 2821 | || ((intf->ipmi_version_major == 1) |
| 2726 | && (intf->ipmi_version_minor >= 5))) | 2822 | && (intf->ipmi_version_minor >= 5))) { |
| 2727 | { | 2823 | /* |
| 2728 | /* Start scanning the channels to see what is | 2824 | * Start scanning the channels to see what is |
| 2729 | available. */ | 2825 | * available. |
| 2826 | */ | ||
| 2730 | intf->null_user_handler = channel_handler; | 2827 | intf->null_user_handler = channel_handler; |
| 2731 | intf->curr_channel = 0; | 2828 | intf->curr_channel = 0; |
| 2732 | rv = send_channel_info_cmd(intf, 0); | 2829 | rv = send_channel_info_cmd(intf, 0); |
| @@ -2774,6 +2871,7 @@ int ipmi_register_smi(struct ipmi_smi_handlers *handlers, | |||
| 2774 | 2871 | ||
| 2775 | return rv; | 2872 | return rv; |
| 2776 | } | 2873 | } |
| 2874 | EXPORT_SYMBOL(ipmi_register_smi); | ||
| 2777 | 2875 | ||
| 2778 | static void cleanup_smi_msgs(ipmi_smi_t intf) | 2876 | static void cleanup_smi_msgs(ipmi_smi_t intf) |
| 2779 | { | 2877 | { |
| @@ -2808,8 +2906,10 @@ int ipmi_unregister_smi(ipmi_smi_t intf) | |||
| 2808 | 2906 | ||
| 2809 | remove_proc_entries(intf); | 2907 | remove_proc_entries(intf); |
| 2810 | 2908 | ||
| 2811 | /* Call all the watcher interfaces to tell them that | 2909 | /* |
| 2812 | an interface is gone. */ | 2910 | * Call all the watcher interfaces to tell them that |
| 2911 | * an interface is gone. | ||
| 2912 | */ | ||
| 2813 | list_for_each_entry(w, &smi_watchers, link) | 2913 | list_for_each_entry(w, &smi_watchers, link) |
| 2814 | w->smi_gone(intf_num); | 2914 | w->smi_gone(intf_num); |
| 2815 | mutex_unlock(&smi_watchers_mutex); | 2915 | mutex_unlock(&smi_watchers_mutex); |
| @@ -2817,6 +2917,7 @@ int ipmi_unregister_smi(ipmi_smi_t intf) | |||
| 2817 | kref_put(&intf->refcount, intf_free); | 2917 | kref_put(&intf->refcount, intf_free); |
| 2818 | return 0; | 2918 | return 0; |
| 2819 | } | 2919 | } |
| 2920 | EXPORT_SYMBOL(ipmi_unregister_smi); | ||
| 2820 | 2921 | ||
| 2821 | static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf, | 2922 | static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf, |
| 2822 | struct ipmi_smi_msg *msg) | 2923 | struct ipmi_smi_msg *msg) |
| @@ -2824,9 +2925,10 @@ static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf, | |||
| 2824 | struct ipmi_ipmb_addr ipmb_addr; | 2925 | struct ipmi_ipmb_addr ipmb_addr; |
| 2825 | struct ipmi_recv_msg *recv_msg; | 2926 | struct ipmi_recv_msg *recv_msg; |
| 2826 | 2927 | ||
| 2827 | 2928 | /* | |
| 2828 | /* This is 11, not 10, because the response must contain a | 2929 | * This is 11, not 10, because the response must contain a |
| 2829 | * completion code. */ | 2930 | * completion code. |
| 2931 | */ | ||
| 2830 | if (msg->rsp_size < 11) { | 2932 | if (msg->rsp_size < 11) { |
| 2831 | /* Message not big enough, just ignore it. */ | 2933 | /* Message not big enough, just ignore it. */ |
| 2832 | ipmi_inc_stat(intf, invalid_ipmb_responses); | 2934 | ipmi_inc_stat(intf, invalid_ipmb_responses); |
| @@ -2843,18 +2945,21 @@ static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf, | |||
| 2843 | ipmb_addr.channel = msg->rsp[3] & 0x0f; | 2945 | ipmb_addr.channel = msg->rsp[3] & 0x0f; |
| 2844 | ipmb_addr.lun = msg->rsp[7] & 3; | 2946 | ipmb_addr.lun = msg->rsp[7] & 3; |
| 2845 | 2947 | ||
| 2846 | /* It's a response from a remote entity. Look up the sequence | 2948 | /* |
| 2847 | number and handle the response. */ | 2949 | * It's a response from a remote entity. Look up the sequence |
| 2950 | * number and handle the response. | ||
| 2951 | */ | ||
| 2848 | if (intf_find_seq(intf, | 2952 | if (intf_find_seq(intf, |
| 2849 | msg->rsp[7] >> 2, | 2953 | msg->rsp[7] >> 2, |
| 2850 | msg->rsp[3] & 0x0f, | 2954 | msg->rsp[3] & 0x0f, |
| 2851 | msg->rsp[8], | 2955 | msg->rsp[8], |
| 2852 | (msg->rsp[4] >> 2) & (~1), | 2956 | (msg->rsp[4] >> 2) & (~1), |
| 2853 | (struct ipmi_addr *) &(ipmb_addr), | 2957 | (struct ipmi_addr *) &(ipmb_addr), |
| 2854 | &recv_msg)) | 2958 | &recv_msg)) { |
| 2855 | { | 2959 | /* |
| 2856 | /* We were unable to find the sequence number, | 2960 | * We were unable to find the sequence number, |
| 2857 | so just nuke the message. */ | 2961 | * so just nuke the message. |
| 2962 | */ | ||
| 2858 | ipmi_inc_stat(intf, unhandled_ipmb_responses); | 2963 | ipmi_inc_stat(intf, unhandled_ipmb_responses); |
| 2859 | return 0; | 2964 | return 0; |
| 2860 | } | 2965 | } |
| @@ -2862,9 +2967,11 @@ static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf, | |||
| 2862 | memcpy(recv_msg->msg_data, | 2967 | memcpy(recv_msg->msg_data, |
| 2863 | &(msg->rsp[9]), | 2968 | &(msg->rsp[9]), |
| 2864 | msg->rsp_size - 9); | 2969 | msg->rsp_size - 9); |
| 2865 | /* THe other fields matched, so no need to set them, except | 2970 | /* |
| 2866 | for netfn, which needs to be the response that was | 2971 | * The other fields matched, so no need to set them, except |
| 2867 | returned, not the request value. */ | 2972 | * for netfn, which needs to be the response that was |
| 2973 | * returned, not the request value. | ||
| 2974 | */ | ||
| 2868 | recv_msg->msg.netfn = msg->rsp[4] >> 2; | 2975 | recv_msg->msg.netfn = msg->rsp[4] >> 2; |
| 2869 | recv_msg->msg.data = recv_msg->msg_data; | 2976 | recv_msg->msg.data = recv_msg->msg_data; |
| 2870 | recv_msg->msg.data_len = msg->rsp_size - 10; | 2977 | recv_msg->msg.data_len = msg->rsp_size - 10; |
| @@ -2920,11 +3027,11 @@ static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, | |||
| 2920 | msg->data[1] = IPMI_SEND_MSG_CMD; | 3027 | msg->data[1] = IPMI_SEND_MSG_CMD; |
| 2921 | msg->data[2] = msg->rsp[3]; | 3028 | msg->data[2] = msg->rsp[3]; |
| 2922 | msg->data[3] = msg->rsp[6]; | 3029 | msg->data[3] = msg->rsp[6]; |
| 2923 | msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3); | 3030 | msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3); |
| 2924 | msg->data[5] = ipmb_checksum(&(msg->data[3]), 2); | 3031 | msg->data[5] = ipmb_checksum(&(msg->data[3]), 2); |
| 2925 | msg->data[6] = intf->channels[msg->rsp[3] & 0xf].address; | 3032 | msg->data[6] = intf->channels[msg->rsp[3] & 0xf].address; |
| 2926 | /* rqseq/lun */ | 3033 | /* rqseq/lun */ |
| 2927 | msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3); | 3034 | msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3); |
| 2928 | msg->data[8] = msg->rsp[8]; /* cmd */ | 3035 | msg->data[8] = msg->rsp[8]; /* cmd */ |
| 2929 | msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE; | 3036 | msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE; |
| 2930 | msg->data[10] = ipmb_checksum(&(msg->data[6]), 4); | 3037 | msg->data[10] = ipmb_checksum(&(msg->data[6]), 4); |
| @@ -2943,9 +3050,11 @@ static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, | |||
| 2943 | handlers = intf->handlers; | 3050 | handlers = intf->handlers; |
| 2944 | if (handlers) { | 3051 | if (handlers) { |
| 2945 | handlers->sender(intf->send_info, msg, 0); | 3052 | handlers->sender(intf->send_info, msg, 0); |
| 2946 | /* We used the message, so return the value | 3053 | /* |
| 2947 | that causes it to not be freed or | 3054 | * We used the message, so return the value |
| 2948 | queued. */ | 3055 | * that causes it to not be freed or |
| 3056 | * queued. | ||
| 3057 | */ | ||
| 2949 | rv = -1; | 3058 | rv = -1; |
| 2950 | } | 3059 | } |
| 2951 | rcu_read_unlock(); | 3060 | rcu_read_unlock(); |
| @@ -2955,9 +3064,11 @@ static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, | |||
| 2955 | 3064 | ||
| 2956 | recv_msg = ipmi_alloc_recv_msg(); | 3065 | recv_msg = ipmi_alloc_recv_msg(); |
| 2957 | if (!recv_msg) { | 3066 | if (!recv_msg) { |
| 2958 | /* We couldn't allocate memory for the | 3067 | /* |
| 2959 | message, so requeue it for handling | 3068 | * We couldn't allocate memory for the |
| 2960 | later. */ | 3069 | * message, so requeue it for handling |
| 3070 | * later. | ||
| 3071 | */ | ||
| 2961 | rv = 1; | 3072 | rv = 1; |
| 2962 | kref_put(&user->refcount, free_user); | 3073 | kref_put(&user->refcount, free_user); |
| 2963 | } else { | 3074 | } else { |
| @@ -2968,8 +3079,10 @@ static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, | |||
| 2968 | ipmb_addr->lun = msg->rsp[7] & 3; | 3079 | ipmb_addr->lun = msg->rsp[7] & 3; |
| 2969 | ipmb_addr->channel = msg->rsp[3] & 0xf; | 3080 | ipmb_addr->channel = msg->rsp[3] & 0xf; |
| 2970 | 3081 | ||
| 2971 | /* Extract the rest of the message information | 3082 | /* |
| 2972 | from the IPMB header.*/ | 3083 | * Extract the rest of the message information |
| 3084 | * from the IPMB header. | ||
| 3085 | */ | ||
| 2973 | recv_msg->user = user; | 3086 | recv_msg->user = user; |
| 2974 | recv_msg->recv_type = IPMI_CMD_RECV_TYPE; | 3087 | recv_msg->recv_type = IPMI_CMD_RECV_TYPE; |
| 2975 | recv_msg->msgid = msg->rsp[7] >> 2; | 3088 | recv_msg->msgid = msg->rsp[7] >> 2; |
| @@ -2977,8 +3090,10 @@ static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, | |||
| 2977 | recv_msg->msg.cmd = msg->rsp[8]; | 3090 | recv_msg->msg.cmd = msg->rsp[8]; |
| 2978 | recv_msg->msg.data = recv_msg->msg_data; | 3091 | recv_msg->msg.data = recv_msg->msg_data; |
| 2979 | 3092 | ||
| 2980 | /* We chop off 10, not 9 bytes because the checksum | 3093 | /* |
| 2981 | at the end also needs to be removed. */ | 3094 | * We chop off 10, not 9 bytes because the checksum |
| 3095 | * at the end also needs to be removed. | ||
| 3096 | */ | ||
| 2982 | recv_msg->msg.data_len = msg->rsp_size - 10; | 3097 | recv_msg->msg.data_len = msg->rsp_size - 10; |
| 2983 | memcpy(recv_msg->msg_data, | 3098 | memcpy(recv_msg->msg_data, |
| 2984 | &(msg->rsp[9]), | 3099 | &(msg->rsp[9]), |
| @@ -2997,8 +3112,10 @@ static int handle_lan_get_msg_rsp(ipmi_smi_t intf, | |||
| 2997 | struct ipmi_recv_msg *recv_msg; | 3112 | struct ipmi_recv_msg *recv_msg; |
| 2998 | 3113 | ||
| 2999 | 3114 | ||
| 3000 | /* This is 13, not 12, because the response must contain a | 3115 | /* |
| 3001 | * completion code. */ | 3116 | * This is 13, not 12, because the response must contain a |
| 3117 | * completion code. | ||
| 3118 | */ | ||
| 3002 | if (msg->rsp_size < 13) { | 3119 | if (msg->rsp_size < 13) { |
| 3003 | /* Message not big enough, just ignore it. */ | 3120 | /* Message not big enough, just ignore it. */ |
| 3004 | ipmi_inc_stat(intf, invalid_lan_responses); | 3121 | ipmi_inc_stat(intf, invalid_lan_responses); |
| @@ -3018,18 +3135,21 @@ static int handle_lan_get_msg_rsp(ipmi_smi_t intf, | |||
| 3018 | lan_addr.privilege = msg->rsp[3] >> 4; | 3135 | lan_addr.privilege = msg->rsp[3] >> 4; |
| 3019 | lan_addr.lun = msg->rsp[9] & 3; | 3136 | lan_addr.lun = msg->rsp[9] & 3; |
| 3020 | 3137 | ||
| 3021 | /* It's a response from a remote entity. Look up the sequence | 3138 | /* |
| 3022 | number and handle the response. */ | 3139 | * It's a response from a remote entity. Look up the sequence |
| 3140 | * number and handle the response. | ||
| 3141 | */ | ||
| 3023 | if (intf_find_seq(intf, | 3142 | if (intf_find_seq(intf, |
| 3024 | msg->rsp[9] >> 2, | 3143 | msg->rsp[9] >> 2, |
| 3025 | msg->rsp[3] & 0x0f, | 3144 | msg->rsp[3] & 0x0f, |
| 3026 | msg->rsp[10], | 3145 | msg->rsp[10], |
| 3027 | (msg->rsp[6] >> 2) & (~1), | 3146 | (msg->rsp[6] >> 2) & (~1), |
| 3028 | (struct ipmi_addr *) &(lan_addr), | 3147 | (struct ipmi_addr *) &(lan_addr), |
| 3029 | &recv_msg)) | 3148 | &recv_msg)) { |
| 3030 | { | 3149 | /* |
| 3031 | /* We were unable to find the sequence number, | 3150 | * We were unable to find the sequence number, |
| 3032 | so just nuke the message. */ | 3151 | * so just nuke the message. |
| 3152 | */ | ||
| 3033 | ipmi_inc_stat(intf, unhandled_lan_responses); | 3153 | ipmi_inc_stat(intf, unhandled_lan_responses); |
| 3034 | return 0; | 3154 | return 0; |
| 3035 | } | 3155 | } |
| @@ -3037,9 +3157,11 @@ static int handle_lan_get_msg_rsp(ipmi_smi_t intf, | |||
| 3037 | memcpy(recv_msg->msg_data, | 3157 | memcpy(recv_msg->msg_data, |
| 3038 | &(msg->rsp[11]), | 3158 | &(msg->rsp[11]), |
| 3039 | msg->rsp_size - 11); | 3159 | msg->rsp_size - 11); |
| 3040 | /* The other fields matched, so no need to set them, except | 3160 | /* |
| 3041 | for netfn, which needs to be the response that was | 3161 | * The other fields matched, so no need to set them, except |
| 3042 | returned, not the request value. */ | 3162 | * for netfn, which needs to be the response that was |
| 3163 | * returned, not the request value. | ||
| 3164 | */ | ||
| 3043 | recv_msg->msg.netfn = msg->rsp[6] >> 2; | 3165 | recv_msg->msg.netfn = msg->rsp[6] >> 2; |
| 3044 | recv_msg->msg.data = recv_msg->msg_data; | 3166 | recv_msg->msg.data = recv_msg->msg_data; |
| 3045 | recv_msg->msg.data_len = msg->rsp_size - 12; | 3167 | recv_msg->msg.data_len = msg->rsp_size - 12; |
| @@ -3090,17 +3212,21 @@ static int handle_lan_get_msg_cmd(ipmi_smi_t intf, | |||
| 3090 | /* We didn't find a user, just give up. */ | 3212 | /* We didn't find a user, just give up. */ |
| 3091 | ipmi_inc_stat(intf, unhandled_commands); | 3213 | ipmi_inc_stat(intf, unhandled_commands); |
| 3092 | 3214 | ||
| 3093 | rv = 0; /* Don't do anything with these messages, just | 3215 | /* |
| 3094 | allow them to be freed. */ | 3216 | * Don't do anything with these messages, just allow |
| 3217 | * them to be freed. | ||
| 3218 | */ | ||
| 3219 | rv = 0; | ||
| 3095 | } else { | 3220 | } else { |
| 3096 | /* Deliver the message to the user. */ | 3221 | /* Deliver the message to the user. */ |
| 3097 | ipmi_inc_stat(intf, handled_commands); | 3222 | ipmi_inc_stat(intf, handled_commands); |
| 3098 | 3223 | ||
| 3099 | recv_msg = ipmi_alloc_recv_msg(); | 3224 | recv_msg = ipmi_alloc_recv_msg(); |
| 3100 | if (!recv_msg) { | 3225 | if (!recv_msg) { |
| 3101 | /* We couldn't allocate memory for the | 3226 | /* |
| 3102 | message, so requeue it for handling | 3227 | * We couldn't allocate memory for the |
| 3103 | later. */ | 3228 | * message, so requeue it for handling later. |
| 3229 | */ | ||
| 3104 | rv = 1; | 3230 | rv = 1; |
| 3105 | kref_put(&user->refcount, free_user); | 3231 | kref_put(&user->refcount, free_user); |
| 3106 | } else { | 3232 | } else { |
| @@ -3114,8 +3240,10 @@ static int handle_lan_get_msg_cmd(ipmi_smi_t intf, | |||
| 3114 | lan_addr->channel = msg->rsp[3] & 0xf; | 3240 | lan_addr->channel = msg->rsp[3] & 0xf; |
| 3115 | lan_addr->privilege = msg->rsp[3] >> 4; | 3241 | lan_addr->privilege = msg->rsp[3] >> 4; |
| 3116 | 3242 | ||
| 3117 | /* Extract the rest of the message information | 3243 | /* |
| 3118 | from the IPMB header.*/ | 3244 | * Extract the rest of the message information |
| 3245 | * from the IPMB header. | ||
| 3246 | */ | ||
| 3119 | recv_msg->user = user; | 3247 | recv_msg->user = user; |
| 3120 | recv_msg->recv_type = IPMI_CMD_RECV_TYPE; | 3248 | recv_msg->recv_type = IPMI_CMD_RECV_TYPE; |
| 3121 | recv_msg->msgid = msg->rsp[9] >> 2; | 3249 | recv_msg->msgid = msg->rsp[9] >> 2; |
| @@ -3123,8 +3251,10 @@ static int handle_lan_get_msg_cmd(ipmi_smi_t intf, | |||
| 3123 | recv_msg->msg.cmd = msg->rsp[10]; | 3251 | recv_msg->msg.cmd = msg->rsp[10]; |
| 3124 | recv_msg->msg.data = recv_msg->msg_data; | 3252 | recv_msg->msg.data = recv_msg->msg_data; |
| 3125 | 3253 | ||
| 3126 | /* We chop off 12, not 11 bytes because the checksum | 3254 | /* |
| 3127 | at the end also needs to be removed. */ | 3255 | * We chop off 12, not 11 bytes because the checksum |
| 3256 | * at the end also needs to be removed. | ||
| 3257 | */ | ||
| 3128 | recv_msg->msg.data_len = msg->rsp_size - 12; | 3258 | recv_msg->msg.data_len = msg->rsp_size - 12; |
| 3129 | memcpy(recv_msg->msg_data, | 3259 | memcpy(recv_msg->msg_data, |
| 3130 | &(msg->rsp[11]), | 3260 | &(msg->rsp[11]), |
| @@ -3140,7 +3270,7 @@ static void copy_event_into_recv_msg(struct ipmi_recv_msg *recv_msg, | |||
| 3140 | struct ipmi_smi_msg *msg) | 3270 | struct ipmi_smi_msg *msg) |
| 3141 | { | 3271 | { |
| 3142 | struct ipmi_system_interface_addr *smi_addr; | 3272 | struct ipmi_system_interface_addr *smi_addr; |
| 3143 | 3273 | ||
| 3144 | recv_msg->msgid = 0; | 3274 | recv_msg->msgid = 0; |
| 3145 | smi_addr = (struct ipmi_system_interface_addr *) &(recv_msg->addr); | 3275 | smi_addr = (struct ipmi_system_interface_addr *) &(recv_msg->addr); |
| 3146 | smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; | 3276 | smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; |
| @@ -3181,8 +3311,10 @@ static int handle_read_event_rsp(ipmi_smi_t intf, | |||
| 3181 | 3311 | ||
| 3182 | ipmi_inc_stat(intf, events); | 3312 | ipmi_inc_stat(intf, events); |
| 3183 | 3313 | ||
| 3184 | /* Allocate and fill in one message for every user that is getting | 3314 | /* |
| 3185 | events. */ | 3315 | * Allocate and fill in one message for every user that is |
| 3316 | * getting events. | ||
| 3317 | */ | ||
| 3186 | rcu_read_lock(); | 3318 | rcu_read_lock(); |
| 3187 | list_for_each_entry_rcu(user, &intf->users, link) { | 3319 | list_for_each_entry_rcu(user, &intf->users, link) { |
| 3188 | if (!user->gets_events) | 3320 | if (!user->gets_events) |
| @@ -3196,9 +3328,11 @@ static int handle_read_event_rsp(ipmi_smi_t intf, | |||
| 3196 | list_del(&recv_msg->link); | 3328 | list_del(&recv_msg->link); |
| 3197 | ipmi_free_recv_msg(recv_msg); | 3329 | ipmi_free_recv_msg(recv_msg); |
| 3198 | } | 3330 | } |
| 3199 | /* We couldn't allocate memory for the | 3331 | /* |
| 3200 | message, so requeue it for handling | 3332 | * We couldn't allocate memory for the |
| 3201 | later. */ | 3333 | * message, so requeue it for handling |
| 3334 | * later. | ||
| 3335 | */ | ||
| 3202 | rv = 1; | 3336 | rv = 1; |
| 3203 | goto out; | 3337 | goto out; |
| 3204 | } | 3338 | } |
| @@ -3219,13 +3353,17 @@ static int handle_read_event_rsp(ipmi_smi_t intf, | |||
| 3219 | deliver_response(recv_msg); | 3353 | deliver_response(recv_msg); |
| 3220 | } | 3354 | } |
| 3221 | } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { | 3355 | } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { |
| 3222 | /* No one to receive the message, put it in queue if there's | 3356 | /* |
| 3223 | not already too many things in the queue. */ | 3357 | * No one to receive the message, put it in queue if there's |
| 3358 | * not already too many things in the queue. | ||
| 3359 | */ | ||
| 3224 | recv_msg = ipmi_alloc_recv_msg(); | 3360 | recv_msg = ipmi_alloc_recv_msg(); |
| 3225 | if (!recv_msg) { | 3361 | if (!recv_msg) { |
| 3226 | /* We couldn't allocate memory for the | 3362 | /* |
| 3227 | message, so requeue it for handling | 3363 | * We couldn't allocate memory for the |
| 3228 | later. */ | 3364 | * message, so requeue it for handling |
| 3365 | * later. | ||
| 3366 | */ | ||
| 3229 | rv = 1; | 3367 | rv = 1; |
| 3230 | goto out; | 3368 | goto out; |
| 3231 | } | 3369 | } |
| @@ -3234,8 +3372,10 @@ static int handle_read_event_rsp(ipmi_smi_t intf, | |||
| 3234 | list_add_tail(&(recv_msg->link), &(intf->waiting_events)); | 3372 | list_add_tail(&(recv_msg->link), &(intf->waiting_events)); |
| 3235 | intf->waiting_events_count++; | 3373 | intf->waiting_events_count++; |
| 3236 | } else if (!intf->event_msg_printed) { | 3374 | } else if (!intf->event_msg_printed) { |
| 3237 | /* There's too many things in the queue, discard this | 3375 | /* |
| 3238 | message. */ | 3376 | * There's too many things in the queue, discard this |
| 3377 | * message. | ||
| 3378 | */ | ||
| 3239 | printk(KERN_WARNING PFX "Event queue full, discarding" | 3379 | printk(KERN_WARNING PFX "Event queue full, discarding" |
| 3240 | " incoming events\n"); | 3380 | " incoming events\n"); |
| 3241 | intf->event_msg_printed = 1; | 3381 | intf->event_msg_printed = 1; |
| @@ -3254,12 +3394,12 @@ static int handle_bmc_rsp(ipmi_smi_t intf, | |||
| 3254 | struct ipmi_user *user; | 3394 | struct ipmi_user *user; |
| 3255 | 3395 | ||
| 3256 | recv_msg = (struct ipmi_recv_msg *) msg->user_data; | 3396 | recv_msg = (struct ipmi_recv_msg *) msg->user_data; |
| 3257 | if (recv_msg == NULL) | 3397 | if (recv_msg == NULL) { |
| 3258 | { | 3398 | printk(KERN_WARNING |
| 3259 | printk(KERN_WARNING"IPMI message received with no owner. This\n" | 3399 | "IPMI message received with no owner. This\n" |
| 3260 | "could be because of a malformed message, or\n" | 3400 | "could be because of a malformed message, or\n" |
| 3261 | "because of a hardware error. Contact your\n" | 3401 | "because of a hardware error. Contact your\n" |
| 3262 | "hardware vender for assistance\n"); | 3402 | "hardware vender for assistance\n"); |
| 3263 | return 0; | 3403 | return 0; |
| 3264 | } | 3404 | } |
| 3265 | 3405 | ||
| @@ -3293,9 +3433,11 @@ static int handle_bmc_rsp(ipmi_smi_t intf, | |||
| 3293 | return 0; | 3433 | return 0; |
| 3294 | } | 3434 | } |
| 3295 | 3435 | ||
| 3296 | /* Handle a new message. Return 1 if the message should be requeued, | 3436 | /* |
| 3297 | 0 if the message should be freed, or -1 if the message should not | 3437 | * Handle a new message. Return 1 if the message should be requeued, |
| 3298 | be freed or requeued. */ | 3438 | * 0 if the message should be freed, or -1 if the message should not |
| 3439 | * be freed or requeued. | ||
| 3440 | */ | ||
| 3299 | static int handle_new_recv_msg(ipmi_smi_t intf, | 3441 | static int handle_new_recv_msg(ipmi_smi_t intf, |
| 3300 | struct ipmi_smi_msg *msg) | 3442 | struct ipmi_smi_msg *msg) |
| 3301 | { | 3443 | { |
| @@ -3320,10 +3462,12 @@ static int handle_new_recv_msg(ipmi_smi_t intf, | |||
| 3320 | msg->rsp[1] = msg->data[1]; | 3462 | msg->rsp[1] = msg->data[1]; |
| 3321 | msg->rsp[2] = IPMI_ERR_UNSPECIFIED; | 3463 | msg->rsp[2] = IPMI_ERR_UNSPECIFIED; |
| 3322 | msg->rsp_size = 3; | 3464 | msg->rsp_size = 3; |
| 3323 | } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1))/* Netfn */ | 3465 | } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1)) |
| 3324 | || (msg->rsp[1] != msg->data[1])) /* Command */ | 3466 | || (msg->rsp[1] != msg->data[1])) { |
| 3325 | { | 3467 | /* |
| 3326 | /* The response is not even marginally correct. */ | 3468 | * The NetFN and Command in the response is not even |
| 3469 | * marginally correct. | ||
| 3470 | */ | ||
| 3327 | printk(KERN_WARNING PFX "BMC returned incorrect response," | 3471 | printk(KERN_WARNING PFX "BMC returned incorrect response," |
| 3328 | " expected netfn %x cmd %x, got netfn %x cmd %x\n", | 3472 | " expected netfn %x cmd %x, got netfn %x cmd %x\n", |
| 3329 | (msg->data[0] >> 2) | 1, msg->data[1], | 3473 | (msg->data[0] >> 2) | 1, msg->data[1], |
| @@ -3338,10 +3482,11 @@ static int handle_new_recv_msg(ipmi_smi_t intf, | |||
| 3338 | 3482 | ||
| 3339 | if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) | 3483 | if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) |
| 3340 | && (msg->rsp[1] == IPMI_SEND_MSG_CMD) | 3484 | && (msg->rsp[1] == IPMI_SEND_MSG_CMD) |
| 3341 | && (msg->user_data != NULL)) | 3485 | && (msg->user_data != NULL)) { |
| 3342 | { | 3486 | /* |
| 3343 | /* It's a response to a response we sent. For this we | 3487 | * It's a response to a response we sent. For this we |
| 3344 | deliver a send message response to the user. */ | 3488 | * deliver a send message response to the user. |
| 3489 | */ | ||
| 3345 | struct ipmi_recv_msg *recv_msg = msg->user_data; | 3490 | struct ipmi_recv_msg *recv_msg = msg->user_data; |
| 3346 | 3491 | ||
| 3347 | requeue = 0; | 3492 | requeue = 0; |
| @@ -3367,8 +3512,7 @@ static int handle_new_recv_msg(ipmi_smi_t intf, | |||
| 3367 | recv_msg->msg_data[0] = msg->rsp[2]; | 3512 | recv_msg->msg_data[0] = msg->rsp[2]; |
| 3368 | deliver_response(recv_msg); | 3513 | deliver_response(recv_msg); |
| 3369 | } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) | 3514 | } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) |
| 3370 | && (msg->rsp[1] == IPMI_GET_MSG_CMD)) | 3515 | && (msg->rsp[1] == IPMI_GET_MSG_CMD)) { |
| 3371 | { | ||
| 3372 | /* It's from the receive queue. */ | 3516 | /* It's from the receive queue. */ |
| 3373 | chan = msg->rsp[3] & 0xf; | 3517 | chan = msg->rsp[3] & 0xf; |
| 3374 | if (chan >= IPMI_MAX_CHANNELS) { | 3518 | if (chan >= IPMI_MAX_CHANNELS) { |
| @@ -3380,12 +3524,16 @@ static int handle_new_recv_msg(ipmi_smi_t intf, | |||
| 3380 | switch (intf->channels[chan].medium) { | 3524 | switch (intf->channels[chan].medium) { |
| 3381 | case IPMI_CHANNEL_MEDIUM_IPMB: | 3525 | case IPMI_CHANNEL_MEDIUM_IPMB: |
| 3382 | if (msg->rsp[4] & 0x04) { | 3526 | if (msg->rsp[4] & 0x04) { |
| 3383 | /* It's a response, so find the | 3527 | /* |
| 3384 | requesting message and send it up. */ | 3528 | * It's a response, so find the |
| 3529 | * requesting message and send it up. | ||
| 3530 | */ | ||
| 3385 | requeue = handle_ipmb_get_msg_rsp(intf, msg); | 3531 | requeue = handle_ipmb_get_msg_rsp(intf, msg); |
| 3386 | } else { | 3532 | } else { |
| 3387 | /* It's a command to the SMS from some other | 3533 | /* |
| 3388 | entity. Handle that. */ | 3534 | * It's a command to the SMS from some other |
| 3535 | * entity. Handle that. | ||
| 3536 | */ | ||
| 3389 | requeue = handle_ipmb_get_msg_cmd(intf, msg); | 3537 | requeue = handle_ipmb_get_msg_cmd(intf, msg); |
| 3390 | } | 3538 | } |
| 3391 | break; | 3539 | break; |
| @@ -3393,25 +3541,30 @@ static int handle_new_recv_msg(ipmi_smi_t intf, | |||
| 3393 | case IPMI_CHANNEL_MEDIUM_8023LAN: | 3541 | case IPMI_CHANNEL_MEDIUM_8023LAN: |
| 3394 | case IPMI_CHANNEL_MEDIUM_ASYNC: | 3542 | case IPMI_CHANNEL_MEDIUM_ASYNC: |
| 3395 | if (msg->rsp[6] & 0x04) { | 3543 | if (msg->rsp[6] & 0x04) { |
| 3396 | /* It's a response, so find the | 3544 | /* |
| 3397 | requesting message and send it up. */ | 3545 | * It's a response, so find the |
| 3546 | * requesting message and send it up. | ||
| 3547 | */ | ||
| 3398 | requeue = handle_lan_get_msg_rsp(intf, msg); | 3548 | requeue = handle_lan_get_msg_rsp(intf, msg); |
| 3399 | } else { | 3549 | } else { |
| 3400 | /* It's a command to the SMS from some other | 3550 | /* |
| 3401 | entity. Handle that. */ | 3551 | * It's a command to the SMS from some other |
| 3552 | * entity. Handle that. | ||
| 3553 | */ | ||
| 3402 | requeue = handle_lan_get_msg_cmd(intf, msg); | 3554 | requeue = handle_lan_get_msg_cmd(intf, msg); |
| 3403 | } | 3555 | } |
| 3404 | break; | 3556 | break; |
| 3405 | 3557 | ||
| 3406 | default: | 3558 | default: |
| 3407 | /* We don't handle the channel type, so just | 3559 | /* |
| 3408 | * free the message. */ | 3560 | * We don't handle the channel type, so just |
| 3561 | * free the message. | ||
| 3562 | */ | ||
| 3409 | requeue = 0; | 3563 | requeue = 0; |
| 3410 | } | 3564 | } |
| 3411 | 3565 | ||
| 3412 | } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) | 3566 | } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) |
| 3413 | && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD)) | 3567 | && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD)) { |
| 3414 | { | ||
| 3415 | /* It's an asyncronous event. */ | 3568 | /* It's an asyncronous event. */ |
| 3416 | requeue = handle_read_event_rsp(intf, msg); | 3569 | requeue = handle_read_event_rsp(intf, msg); |
| 3417 | } else { | 3570 | } else { |
| @@ -3435,23 +3588,25 @@ void ipmi_smi_msg_received(ipmi_smi_t intf, | |||
| 3435 | if ((msg->data_size >= 2) | 3588 | if ((msg->data_size >= 2) |
| 3436 | && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) | 3589 | && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) |
| 3437 | && (msg->data[1] == IPMI_SEND_MSG_CMD) | 3590 | && (msg->data[1] == IPMI_SEND_MSG_CMD) |
| 3438 | && (msg->user_data == NULL)) | 3591 | && (msg->user_data == NULL)) { |
| 3439 | { | 3592 | /* |
| 3440 | /* This is the local response to a command send, start | 3593 | * This is the local response to a command send, start |
| 3441 | the timer for these. The user_data will not be | 3594 | * the timer for these. The user_data will not be |
| 3442 | NULL if this is a response send, and we will let | 3595 | * NULL if this is a response send, and we will let |
| 3443 | response sends just go through. */ | 3596 | * response sends just go through. |
| 3444 | 3597 | */ | |
| 3445 | /* Check for errors, if we get certain errors (ones | 3598 | |
| 3446 | that mean basically we can try again later), we | 3599 | /* |
| 3447 | ignore them and start the timer. Otherwise we | 3600 | * Check for errors, if we get certain errors (ones |
| 3448 | report the error immediately. */ | 3601 | * that mean basically we can try again later), we |
| 3602 | * ignore them and start the timer. Otherwise we | ||
| 3603 | * report the error immediately. | ||
| 3604 | */ | ||
| 3449 | if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) | 3605 | if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) |
| 3450 | && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) | 3606 | && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) |
| 3451 | && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) | 3607 | && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) |
| 3452 | && (msg->rsp[2] != IPMI_BUS_ERR) | 3608 | && (msg->rsp[2] != IPMI_BUS_ERR) |
| 3453 | && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) | 3609 | && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) { |
| 3454 | { | ||
| 3455 | int chan = msg->rsp[3] & 0xf; | 3610 | int chan = msg->rsp[3] & 0xf; |
| 3456 | 3611 | ||
| 3457 | /* Got an error sending the message, handle it. */ | 3612 | /* Got an error sending the message, handle it. */ |
| @@ -3465,17 +3620,18 @@ void ipmi_smi_msg_received(ipmi_smi_t intf, | |||
| 3465 | else | 3620 | else |
| 3466 | ipmi_inc_stat(intf, sent_ipmb_command_errs); | 3621 | ipmi_inc_stat(intf, sent_ipmb_command_errs); |
| 3467 | intf_err_seq(intf, msg->msgid, msg->rsp[2]); | 3622 | intf_err_seq(intf, msg->msgid, msg->rsp[2]); |
| 3468 | } else { | 3623 | } else |
| 3469 | /* The message was sent, start the timer. */ | 3624 | /* The message was sent, start the timer. */ |
| 3470 | intf_start_seq_timer(intf, msg->msgid); | 3625 | intf_start_seq_timer(intf, msg->msgid); |
| 3471 | } | ||
| 3472 | 3626 | ||
| 3473 | ipmi_free_smi_msg(msg); | 3627 | ipmi_free_smi_msg(msg); |
| 3474 | goto out; | 3628 | goto out; |
| 3475 | } | 3629 | } |
| 3476 | 3630 | ||
| 3477 | /* To preserve message order, if the list is not empty, we | 3631 | /* |
| 3478 | tack this message onto the end of the list. */ | 3632 | * To preserve message order, if the list is not empty, we |
| 3633 | * tack this message onto the end of the list. | ||
| 3634 | */ | ||
| 3479 | run_to_completion = intf->run_to_completion; | 3635 | run_to_completion = intf->run_to_completion; |
| 3480 | if (!run_to_completion) | 3636 | if (!run_to_completion) |
| 3481 | spin_lock_irqsave(&intf->waiting_msgs_lock, flags); | 3637 | spin_lock_irqsave(&intf->waiting_msgs_lock, flags); |
| @@ -3487,11 +3643,13 @@ void ipmi_smi_msg_received(ipmi_smi_t intf, | |||
| 3487 | } | 3643 | } |
| 3488 | if (!run_to_completion) | 3644 | if (!run_to_completion) |
| 3489 | spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); | 3645 | spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); |
| 3490 | 3646 | ||
| 3491 | rv = handle_new_recv_msg(intf, msg); | 3647 | rv = handle_new_recv_msg(intf, msg); |
| 3492 | if (rv > 0) { | 3648 | if (rv > 0) { |
| 3493 | /* Could not handle the message now, just add it to a | 3649 | /* |
| 3494 | list to handle later. */ | 3650 | * Could not handle the message now, just add it to a |
| 3651 | * list to handle later. | ||
| 3652 | */ | ||
| 3495 | run_to_completion = intf->run_to_completion; | 3653 | run_to_completion = intf->run_to_completion; |
| 3496 | if (!run_to_completion) | 3654 | if (!run_to_completion) |
| 3497 | spin_lock_irqsave(&intf->waiting_msgs_lock, flags); | 3655 | spin_lock_irqsave(&intf->waiting_msgs_lock, flags); |
| @@ -3505,6 +3663,7 @@ void ipmi_smi_msg_received(ipmi_smi_t intf, | |||
| 3505 | out: | 3663 | out: |
| 3506 | return; | 3664 | return; |
| 3507 | } | 3665 | } |
| 3666 | EXPORT_SYMBOL(ipmi_smi_msg_received); | ||
| 3508 | 3667 | ||
| 3509 | void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf) | 3668 | void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf) |
| 3510 | { | 3669 | { |
| @@ -3519,7 +3678,7 @@ void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf) | |||
| 3519 | } | 3678 | } |
| 3520 | rcu_read_unlock(); | 3679 | rcu_read_unlock(); |
| 3521 | } | 3680 | } |
| 3522 | 3681 | EXPORT_SYMBOL(ipmi_smi_watchdog_pretimeout); | |
| 3523 | 3682 | ||
| 3524 | static struct ipmi_smi_msg * | 3683 | static struct ipmi_smi_msg * |
| 3525 | smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg, | 3684 | smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg, |
| @@ -3527,14 +3686,16 @@ smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg, | |||
| 3527 | { | 3686 | { |
| 3528 | struct ipmi_smi_msg *smi_msg = ipmi_alloc_smi_msg(); | 3687 | struct ipmi_smi_msg *smi_msg = ipmi_alloc_smi_msg(); |
| 3529 | if (!smi_msg) | 3688 | if (!smi_msg) |
| 3530 | /* If we can't allocate the message, then just return, we | 3689 | /* |
| 3531 | get 4 retries, so this should be ok. */ | 3690 | * If we can't allocate the message, then just return, we |
| 3691 | * get 4 retries, so this should be ok. | ||
| 3692 | */ | ||
| 3532 | return NULL; | 3693 | return NULL; |
| 3533 | 3694 | ||
| 3534 | memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len); | 3695 | memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len); |
| 3535 | smi_msg->data_size = recv_msg->msg.data_len; | 3696 | smi_msg->data_size = recv_msg->msg.data_len; |
| 3536 | smi_msg->msgid = STORE_SEQ_IN_MSGID(seq, seqid); | 3697 | smi_msg->msgid = STORE_SEQ_IN_MSGID(seq, seqid); |
| 3537 | 3698 | ||
| 3538 | #ifdef DEBUG_MSGING | 3699 | #ifdef DEBUG_MSGING |
| 3539 | { | 3700 | { |
| 3540 | int m; | 3701 | int m; |
| @@ -3579,8 +3740,10 @@ static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent, | |||
| 3579 | struct ipmi_smi_msg *smi_msg; | 3740 | struct ipmi_smi_msg *smi_msg; |
| 3580 | /* More retries, send again. */ | 3741 | /* More retries, send again. */ |
| 3581 | 3742 | ||
| 3582 | /* Start with the max timer, set to normal | 3743 | /* |
| 3583 | timer after the message is sent. */ | 3744 | * Start with the max timer, set to normal timer after |
| 3745 | * the message is sent. | ||
| 3746 | */ | ||
| 3584 | ent->timeout = MAX_MSG_TIMEOUT; | 3747 | ent->timeout = MAX_MSG_TIMEOUT; |
| 3585 | ent->retries_left--; | 3748 | ent->retries_left--; |
| 3586 | if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE) | 3749 | if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE) |
| @@ -3595,11 +3758,13 @@ static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent, | |||
| 3595 | 3758 | ||
| 3596 | spin_unlock_irqrestore(&intf->seq_lock, *flags); | 3759 | spin_unlock_irqrestore(&intf->seq_lock, *flags); |
| 3597 | 3760 | ||
| 3598 | /* Send the new message. We send with a zero | 3761 | /* |
| 3599 | * priority. It timed out, I doubt time is | 3762 | * Send the new message. We send with a zero |
| 3600 | * that critical now, and high priority | 3763 | * priority. It timed out, I doubt time is that |
| 3601 | * messages are really only for messages to the | 3764 | * critical now, and high priority messages are really |
| 3602 | * local MC, which don't get resent. */ | 3765 | * only for messages to the local MC, which don't get |
| 3766 | * resent. | ||
| 3767 | */ | ||
| 3603 | handlers = intf->handlers; | 3768 | handlers = intf->handlers; |
| 3604 | if (handlers) | 3769 | if (handlers) |
| 3605 | intf->handlers->sender(intf->send_info, | 3770 | intf->handlers->sender(intf->send_info, |
| @@ -3630,16 +3795,20 @@ static void ipmi_timeout_handler(long timeout_period) | |||
| 3630 | list_del(&smi_msg->link); | 3795 | list_del(&smi_msg->link); |
| 3631 | ipmi_free_smi_msg(smi_msg); | 3796 | ipmi_free_smi_msg(smi_msg); |
| 3632 | } else { | 3797 | } else { |
| 3633 | /* To preserve message order, quit if we | 3798 | /* |
| 3634 | can't handle a message. */ | 3799 | * To preserve message order, quit if we |
| 3800 | * can't handle a message. | ||
| 3801 | */ | ||
| 3635 | break; | 3802 | break; |
| 3636 | } | 3803 | } |
| 3637 | } | 3804 | } |
| 3638 | spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); | 3805 | spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); |
| 3639 | 3806 | ||
| 3640 | /* Go through the seq table and find any messages that | 3807 | /* |
| 3641 | have timed out, putting them in the timeouts | 3808 | * Go through the seq table and find any messages that |
| 3642 | list. */ | 3809 | * have timed out, putting them in the timeouts |
| 3810 | * list. | ||
| 3811 | */ | ||
| 3643 | INIT_LIST_HEAD(&timeouts); | 3812 | INIT_LIST_HEAD(&timeouts); |
| 3644 | spin_lock_irqsave(&intf->seq_lock, flags); | 3813 | spin_lock_irqsave(&intf->seq_lock, flags); |
| 3645 | for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) | 3814 | for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) |
| @@ -3665,8 +3834,7 @@ static void ipmi_timeout_handler(long timeout_period) | |||
| 3665 | intf->auto_maintenance_timeout | 3834 | intf->auto_maintenance_timeout |
| 3666 | -= timeout_period; | 3835 | -= timeout_period; |
| 3667 | if (!intf->maintenance_mode | 3836 | if (!intf->maintenance_mode |
| 3668 | && (intf->auto_maintenance_timeout <= 0)) | 3837 | && (intf->auto_maintenance_timeout <= 0)) { |
| 3669 | { | ||
| 3670 | intf->maintenance_mode_enable = 0; | 3838 | intf->maintenance_mode_enable = 0; |
| 3671 | maintenance_mode_update(intf); | 3839 | maintenance_mode_update(intf); |
| 3672 | } | 3840 | } |
| @@ -3684,8 +3852,10 @@ static void ipmi_request_event(void) | |||
| 3684 | struct ipmi_smi_handlers *handlers; | 3852 | struct ipmi_smi_handlers *handlers; |
| 3685 | 3853 | ||
| 3686 | rcu_read_lock(); | 3854 | rcu_read_lock(); |
| 3687 | /* Called from the timer, no need to check if handlers is | 3855 | /* |
| 3688 | * valid. */ | 3856 | * Called from the timer, no need to check if handlers is |
| 3857 | * valid. | ||
| 3858 | */ | ||
| 3689 | list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { | 3859 | list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { |
| 3690 | /* No event requests when in maintenance mode. */ | 3860 | /* No event requests when in maintenance mode. */ |
| 3691 | if (intf->maintenance_mode_enable) | 3861 | if (intf->maintenance_mode_enable) |
| @@ -3706,10 +3876,12 @@ static struct timer_list ipmi_timer; | |||
| 3706 | /* How many jiffies does it take to get to the timeout time. */ | 3876 | /* How many jiffies does it take to get to the timeout time. */ |
| 3707 | #define IPMI_TIMEOUT_JIFFIES ((IPMI_TIMEOUT_TIME * HZ) / 1000) | 3877 | #define IPMI_TIMEOUT_JIFFIES ((IPMI_TIMEOUT_TIME * HZ) / 1000) |
| 3708 | 3878 | ||
| 3709 | /* Request events from the queue every second (this is the number of | 3879 | /* |
| 3710 | IPMI_TIMEOUT_TIMES between event requests). Hopefully, in the | 3880 | * Request events from the queue every second (this is the number of |
| 3711 | future, IPMI will add a way to know immediately if an event is in | 3881 | * IPMI_TIMEOUT_TIMES between event requests). Hopefully, in the |
| 3712 | the queue and this silliness can go away. */ | 3882 | * future, IPMI will add a way to know immediately if an event is in |
| 3883 | * the queue and this silliness can go away. | ||
| 3884 | */ | ||
| 3713 | #define IPMI_REQUEST_EV_TIME (1000 / (IPMI_TIMEOUT_TIME)) | 3885 | #define IPMI_REQUEST_EV_TIME (1000 / (IPMI_TIMEOUT_TIME)) |
| 3714 | 3886 | ||
| 3715 | static atomic_t stop_operation; | 3887 | static atomic_t stop_operation; |
| @@ -3753,6 +3925,7 @@ struct ipmi_smi_msg *ipmi_alloc_smi_msg(void) | |||
| 3753 | } | 3925 | } |
| 3754 | return rv; | 3926 | return rv; |
| 3755 | } | 3927 | } |
| 3928 | EXPORT_SYMBOL(ipmi_alloc_smi_msg); | ||
| 3756 | 3929 | ||
| 3757 | static void free_recv_msg(struct ipmi_recv_msg *msg) | 3930 | static void free_recv_msg(struct ipmi_recv_msg *msg) |
| 3758 | { | 3931 | { |
| @@ -3779,6 +3952,7 @@ void ipmi_free_recv_msg(struct ipmi_recv_msg *msg) | |||
| 3779 | kref_put(&msg->user->refcount, free_user); | 3952 | kref_put(&msg->user->refcount, free_user); |
| 3780 | msg->done(msg); | 3953 | msg->done(msg); |
| 3781 | } | 3954 | } |
| 3955 | EXPORT_SYMBOL(ipmi_free_recv_msg); | ||
| 3782 | 3956 | ||
| 3783 | #ifdef CONFIG_IPMI_PANIC_EVENT | 3957 | #ifdef CONFIG_IPMI_PANIC_EVENT |
| 3784 | 3958 | ||
| @@ -3796,8 +3970,7 @@ static void event_receiver_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg) | |||
| 3796 | if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) | 3970 | if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) |
| 3797 | && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE) | 3971 | && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE) |
| 3798 | && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD) | 3972 | && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD) |
| 3799 | && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) | 3973 | && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) { |
| 3800 | { | ||
| 3801 | /* A get event receiver command, save it. */ | 3974 | /* A get event receiver command, save it. */ |
| 3802 | intf->event_receiver = msg->msg.data[1]; | 3975 | intf->event_receiver = msg->msg.data[1]; |
| 3803 | intf->event_receiver_lun = msg->msg.data[2] & 0x3; | 3976 | intf->event_receiver_lun = msg->msg.data[2] & 0x3; |
| @@ -3809,10 +3982,11 @@ static void device_id_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg) | |||
| 3809 | if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) | 3982 | if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) |
| 3810 | && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) | 3983 | && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) |
| 3811 | && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD) | 3984 | && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD) |
| 3812 | && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) | 3985 | && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) { |
| 3813 | { | 3986 | /* |
| 3814 | /* A get device id command, save if we are an event | 3987 | * A get device id command, save if we are an event |
| 3815 | receiver or generator. */ | 3988 | * receiver or generator. |
| 3989 | */ | ||
| 3816 | intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; | 3990 | intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; |
| 3817 | intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; | 3991 | intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; |
| 3818 | } | 3992 | } |
| @@ -3845,8 +4019,10 @@ static void send_panic_events(char *str) | |||
| 3845 | data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */ | 4019 | data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */ |
| 3846 | data[5] = 0xa1; /* Runtime stop OEM bytes 2 & 3. */ | 4020 | data[5] = 0xa1; /* Runtime stop OEM bytes 2 & 3. */ |
| 3847 | 4021 | ||
| 3848 | /* Put a few breadcrumbs in. Hopefully later we can add more things | 4022 | /* |
| 3849 | to make the panic events more useful. */ | 4023 | * Put a few breadcrumbs in. Hopefully later we can add more things |
| 4024 | * to make the panic events more useful. | ||
| 4025 | */ | ||
| 3850 | if (str) { | 4026 | if (str) { |
| 3851 | data[3] = str[0]; | 4027 | data[3] = str[0]; |
| 3852 | data[6] = str[1]; | 4028 | data[6] = str[1]; |
| @@ -3880,9 +4056,11 @@ static void send_panic_events(char *str) | |||
| 3880 | } | 4056 | } |
| 3881 | 4057 | ||
| 3882 | #ifdef CONFIG_IPMI_PANIC_STRING | 4058 | #ifdef CONFIG_IPMI_PANIC_STRING |
| 3883 | /* On every interface, dump a bunch of OEM event holding the | 4059 | /* |
| 3884 | string. */ | 4060 | * On every interface, dump a bunch of OEM event holding the |
| 3885 | if (!str) | 4061 | * string. |
| 4062 | */ | ||
| 4063 | if (!str) | ||
| 3886 | return; | 4064 | return; |
| 3887 | 4065 | ||
| 3888 | /* For every registered interface, send the event. */ | 4066 | /* For every registered interface, send the event. */ |
| @@ -3903,11 +4081,13 @@ static void send_panic_events(char *str) | |||
| 3903 | */ | 4081 | */ |
| 3904 | smp_rmb(); | 4082 | smp_rmb(); |
| 3905 | 4083 | ||
| 3906 | /* First job here is to figure out where to send the | 4084 | /* |
| 3907 | OEM events. There's no way in IPMI to send OEM | 4085 | * First job here is to figure out where to send the |
| 3908 | events using an event send command, so we have to | 4086 | * OEM events. There's no way in IPMI to send OEM |
| 3909 | find the SEL to put them in and stick them in | 4087 | * events using an event send command, so we have to |
| 3910 | there. */ | 4088 | * find the SEL to put them in and stick them in |
| 4089 | * there. | ||
| 4090 | */ | ||
| 3911 | 4091 | ||
| 3912 | /* Get capabilities from the get device id. */ | 4092 | /* Get capabilities from the get device id. */ |
| 3913 | intf->local_sel_device = 0; | 4093 | intf->local_sel_device = 0; |
| @@ -3955,24 +4135,29 @@ static void send_panic_events(char *str) | |||
| 3955 | } | 4135 | } |
| 3956 | intf->null_user_handler = NULL; | 4136 | intf->null_user_handler = NULL; |
| 3957 | 4137 | ||
| 3958 | /* Validate the event receiver. The low bit must not | 4138 | /* |
| 3959 | be 1 (it must be a valid IPMB address), it cannot | 4139 | * Validate the event receiver. The low bit must not |
| 3960 | be zero, and it must not be my address. */ | 4140 | * be 1 (it must be a valid IPMB address), it cannot |
| 3961 | if (((intf->event_receiver & 1) == 0) | 4141 | * be zero, and it must not be my address. |
| 4142 | */ | ||
| 4143 | if (((intf->event_receiver & 1) == 0) | ||
| 3962 | && (intf->event_receiver != 0) | 4144 | && (intf->event_receiver != 0) |
| 3963 | && (intf->event_receiver != intf->channels[0].address)) | 4145 | && (intf->event_receiver != intf->channels[0].address)) { |
| 3964 | { | 4146 | /* |
| 3965 | /* The event receiver is valid, send an IPMB | 4147 | * The event receiver is valid, send an IPMB |
| 3966 | message. */ | 4148 | * message. |
| 4149 | */ | ||
| 3967 | ipmb = (struct ipmi_ipmb_addr *) &addr; | 4150 | ipmb = (struct ipmi_ipmb_addr *) &addr; |
| 3968 | ipmb->addr_type = IPMI_IPMB_ADDR_TYPE; | 4151 | ipmb->addr_type = IPMI_IPMB_ADDR_TYPE; |
| 3969 | ipmb->channel = 0; /* FIXME - is this right? */ | 4152 | ipmb->channel = 0; /* FIXME - is this right? */ |
| 3970 | ipmb->lun = intf->event_receiver_lun; | 4153 | ipmb->lun = intf->event_receiver_lun; |
| 3971 | ipmb->slave_addr = intf->event_receiver; | 4154 | ipmb->slave_addr = intf->event_receiver; |
| 3972 | } else if (intf->local_sel_device) { | 4155 | } else if (intf->local_sel_device) { |
| 3973 | /* The event receiver was not valid (or was | 4156 | /* |
| 3974 | me), but I am an SEL device, just dump it | 4157 | * The event receiver was not valid (or was |
| 3975 | in my SEL. */ | 4158 | * me), but I am an SEL device, just dump it |
| 4159 | * in my SEL. | ||
| 4160 | */ | ||
| 3976 | si = (struct ipmi_system_interface_addr *) &addr; | 4161 | si = (struct ipmi_system_interface_addr *) &addr; |
| 3977 | si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; | 4162 | si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; |
| 3978 | si->channel = IPMI_BMC_CHANNEL; | 4163 | si->channel = IPMI_BMC_CHANNEL; |
| @@ -3980,7 +4165,6 @@ static void send_panic_events(char *str) | |||
| 3980 | } else | 4165 | } else |
| 3981 | continue; /* No where to send the event. */ | 4166 | continue; /* No where to send the event. */ |
| 3982 | 4167 | ||
| 3983 | |||
| 3984 | msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */ | 4168 | msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */ |
| 3985 | msg.cmd = IPMI_ADD_SEL_ENTRY_CMD; | 4169 | msg.cmd = IPMI_ADD_SEL_ENTRY_CMD; |
| 3986 | msg.data = data; | 4170 | msg.data = data; |
| @@ -3997,8 +4181,10 @@ static void send_panic_events(char *str) | |||
| 3997 | data[2] = 0xf0; /* OEM event without timestamp. */ | 4181 | data[2] = 0xf0; /* OEM event without timestamp. */ |
| 3998 | data[3] = intf->channels[0].address; | 4182 | data[3] = intf->channels[0].address; |
| 3999 | data[4] = j++; /* sequence # */ | 4183 | data[4] = j++; /* sequence # */ |
| 4000 | /* Always give 11 bytes, so strncpy will fill | 4184 | /* |
| 4001 | it with zeroes for me. */ | 4185 | * Always give 11 bytes, so strncpy will fill |
| 4186 | * it with zeroes for me. | ||
| 4187 | */ | ||
| 4002 | strncpy(data+5, p, 11); | 4188 | strncpy(data+5, p, 11); |
| 4003 | p += size; | 4189 | p += size; |
| 4004 | 4190 | ||
| @@ -4015,7 +4201,7 @@ static void send_panic_events(char *str) | |||
| 4015 | intf->channels[0].lun, | 4201 | intf->channels[0].lun, |
| 4016 | 0, 1); /* no retry, and no wait. */ | 4202 | 0, 1); /* no retry, and no wait. */ |
| 4017 | } | 4203 | } |
| 4018 | } | 4204 | } |
| 4019 | #endif /* CONFIG_IPMI_PANIC_STRING */ | 4205 | #endif /* CONFIG_IPMI_PANIC_STRING */ |
| 4020 | } | 4206 | } |
| 4021 | #endif /* CONFIG_IPMI_PANIC_EVENT */ | 4207 | #endif /* CONFIG_IPMI_PANIC_EVENT */ |
| @@ -4024,7 +4210,7 @@ static int has_panicked; | |||
| 4024 | 4210 | ||
| 4025 | static int panic_event(struct notifier_block *this, | 4211 | static int panic_event(struct notifier_block *this, |
| 4026 | unsigned long event, | 4212 | unsigned long event, |
| 4027 | void *ptr) | 4213 | void *ptr) |
| 4028 | { | 4214 | { |
| 4029 | ipmi_smi_t intf; | 4215 | ipmi_smi_t intf; |
| 4030 | 4216 | ||
| @@ -4106,11 +4292,16 @@ static __exit void cleanup_ipmi(void) | |||
| 4106 | 4292 | ||
| 4107 | atomic_notifier_chain_unregister(&panic_notifier_list, &panic_block); | 4293 | atomic_notifier_chain_unregister(&panic_notifier_list, &panic_block); |
| 4108 | 4294 | ||
| 4109 | /* This can't be called if any interfaces exist, so no worry about | 4295 | /* |
| 4110 | shutting down the interfaces. */ | 4296 | * This can't be called if any interfaces exist, so no worry |
| 4297 | * about shutting down the interfaces. | ||
| 4298 | */ | ||
| 4111 | 4299 | ||
| 4112 | /* Tell the timer to stop, then wait for it to stop. This avoids | 4300 | /* |
| 4113 | problems with race conditions removing the timer here. */ | 4301 | * Tell the timer to stop, then wait for it to stop. This |
| 4302 | * avoids problems with race conditions removing the timer | ||
| 4303 | * here. | ||
| 4304 | */ | ||
| 4114 | atomic_inc(&stop_operation); | 4305 | atomic_inc(&stop_operation); |
| 4115 | del_timer_sync(&ipmi_timer); | 4306 | del_timer_sync(&ipmi_timer); |
| 4116 | 4307 | ||
| @@ -4137,30 +4328,6 @@ module_exit(cleanup_ipmi); | |||
| 4137 | module_init(ipmi_init_msghandler_mod); | 4328 | module_init(ipmi_init_msghandler_mod); |
| 4138 | MODULE_LICENSE("GPL"); | 4329 | MODULE_LICENSE("GPL"); |
| 4139 | MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>"); | 4330 | MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>"); |
| 4140 | MODULE_DESCRIPTION("Incoming and outgoing message routing for an IPMI interface."); | 4331 | MODULE_DESCRIPTION("Incoming and outgoing message routing for an IPMI" |
| 4332 | " interface."); | ||
| 4141 | MODULE_VERSION(IPMI_DRIVER_VERSION); | 4333 | MODULE_VERSION(IPMI_DRIVER_VERSION); |
| 4142 | |||
| 4143 | EXPORT_SYMBOL(ipmi_create_user); | ||
| 4144 | EXPORT_SYMBOL(ipmi_destroy_user); | ||
| 4145 | EXPORT_SYMBOL(ipmi_get_version); | ||
| 4146 | EXPORT_SYMBOL(ipmi_request_settime); | ||
| 4147 | EXPORT_SYMBOL(ipmi_request_supply_msgs); | ||
| 4148 | EXPORT_SYMBOL(ipmi_poll_interface); | ||
| 4149 | EXPORT_SYMBOL(ipmi_register_smi); | ||
| 4150 | EXPORT_SYMBOL(ipmi_unregister_smi); | ||
| 4151 | EXPORT_SYMBOL(ipmi_register_for_cmd); | ||
| 4152 | EXPORT_SYMBOL(ipmi_unregister_for_cmd); | ||
| 4153 | EXPORT_SYMBOL(ipmi_smi_msg_received); | ||
| 4154 | EXPORT_SYMBOL(ipmi_smi_watchdog_pretimeout); | ||
| 4155 | EXPORT_SYMBOL(ipmi_alloc_smi_msg); | ||
| 4156 | EXPORT_SYMBOL(ipmi_addr_length); | ||
| 4157 | EXPORT_SYMBOL(ipmi_validate_addr); | ||
| 4158 | EXPORT_SYMBOL(ipmi_set_gets_events); | ||
| 4159 | EXPORT_SYMBOL(ipmi_smi_watcher_register); | ||
| 4160 | EXPORT_SYMBOL(ipmi_smi_watcher_unregister); | ||
| 4161 | EXPORT_SYMBOL(ipmi_set_my_address); | ||
| 4162 | EXPORT_SYMBOL(ipmi_get_my_address); | ||
| 4163 | EXPORT_SYMBOL(ipmi_set_my_LUN); | ||
| 4164 | EXPORT_SYMBOL(ipmi_get_my_LUN); | ||
| 4165 | EXPORT_SYMBOL(ipmi_smi_add_proc_entry); | ||
| 4166 | EXPORT_SYMBOL(ipmi_free_recv_msg); | ||
diff --git a/include/linux/ipmi.h b/include/linux/ipmi.h index 1144b32f5310..2f75c4640b45 100644 --- a/include/linux/ipmi.h +++ b/include/linux/ipmi.h | |||
| @@ -75,8 +75,7 @@ | |||
| 75 | * work for sockets. | 75 | * work for sockets. |
| 76 | */ | 76 | */ |
| 77 | #define IPMI_MAX_ADDR_SIZE 32 | 77 | #define IPMI_MAX_ADDR_SIZE 32 |
| 78 | struct ipmi_addr | 78 | struct ipmi_addr { |
| 79 | { | ||
| 80 | /* Try to take these from the "Channel Medium Type" table | 79 | /* Try to take these from the "Channel Medium Type" table |
| 81 | in section 6.5 of the IPMI 1.5 manual. */ | 80 | in section 6.5 of the IPMI 1.5 manual. */ |
| 82 | int addr_type; | 81 | int addr_type; |
| @@ -90,8 +89,7 @@ struct ipmi_addr | |||
| 90 | * 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. | 89 | * 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. |
| 91 | */ | 90 | */ |
| 92 | #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE 0x0c | 91 | #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE 0x0c |
| 93 | struct ipmi_system_interface_addr | 92 | struct ipmi_system_interface_addr { |
| 94 | { | ||
| 95 | int addr_type; | 93 | int addr_type; |
| 96 | short channel; | 94 | short channel; |
| 97 | unsigned char lun; | 95 | unsigned char lun; |
| @@ -100,10 +98,9 @@ struct ipmi_system_interface_addr | |||
| 100 | /* An IPMB Address. */ | 98 | /* An IPMB Address. */ |
| 101 | #define IPMI_IPMB_ADDR_TYPE 0x01 | 99 | #define IPMI_IPMB_ADDR_TYPE 0x01 |
| 102 | /* Used for broadcast get device id as described in section 17.9 of the | 100 | /* Used for broadcast get device id as described in section 17.9 of the |
| 103 | IPMI 1.5 manual. */ | 101 | IPMI 1.5 manual. */ |
| 104 | #define IPMI_IPMB_BROADCAST_ADDR_TYPE 0x41 | 102 | #define IPMI_IPMB_BROADCAST_ADDR_TYPE 0x41 |
| 105 | struct ipmi_ipmb_addr | 103 | struct ipmi_ipmb_addr { |
| 106 | { | ||
| 107 | int addr_type; | 104 | int addr_type; |
| 108 | short channel; | 105 | short channel; |
| 109 | unsigned char slave_addr; | 106 | unsigned char slave_addr; |
| @@ -128,8 +125,7 @@ struct ipmi_ipmb_addr | |||
| 128 | * message is a little weird, but this is required. | 125 | * message is a little weird, but this is required. |
| 129 | */ | 126 | */ |
| 130 | #define IPMI_LAN_ADDR_TYPE 0x04 | 127 | #define IPMI_LAN_ADDR_TYPE 0x04 |
| 131 | struct ipmi_lan_addr | 128 | struct ipmi_lan_addr { |
| 132 | { | ||
| 133 | int addr_type; | 129 | int addr_type; |
| 134 | short channel; | 130 | short channel; |
| 135 | unsigned char privilege; | 131 | unsigned char privilege; |
| @@ -162,16 +158,14 @@ struct ipmi_lan_addr | |||
| 162 | * byte of data in the response (as the spec shows the messages laid | 158 | * byte of data in the response (as the spec shows the messages laid |
| 163 | * out). | 159 | * out). |
| 164 | */ | 160 | */ |
| 165 | struct ipmi_msg | 161 | struct ipmi_msg { |
| 166 | { | ||
| 167 | unsigned char netfn; | 162 | unsigned char netfn; |
| 168 | unsigned char cmd; | 163 | unsigned char cmd; |
| 169 | unsigned short data_len; | 164 | unsigned short data_len; |
| 170 | unsigned char __user *data; | 165 | unsigned char __user *data; |
| 171 | }; | 166 | }; |
| 172 | 167 | ||
| 173 | struct kernel_ipmi_msg | 168 | struct kernel_ipmi_msg { |
| 174 | { | ||
| 175 | unsigned char netfn; | 169 | unsigned char netfn; |
| 176 | unsigned char cmd; | 170 | unsigned char cmd; |
| 177 | unsigned short data_len; | 171 | unsigned short data_len; |
| @@ -239,12 +233,11 @@ typedef struct ipmi_user *ipmi_user_t; | |||
| 239 | * used after the message is delivered, so the upper layer may use the | 233 | * used after the message is delivered, so the upper layer may use the |
| 240 | * link to build a linked list, if it likes. | 234 | * link to build a linked list, if it likes. |
| 241 | */ | 235 | */ |
| 242 | struct ipmi_recv_msg | 236 | struct ipmi_recv_msg { |
| 243 | { | ||
| 244 | struct list_head link; | 237 | struct list_head link; |
| 245 | 238 | ||
| 246 | /* The type of message as defined in the "Receive Types" | 239 | /* The type of message as defined in the "Receive Types" |
| 247 | defines above. */ | 240 | defines above. */ |
| 248 | int recv_type; | 241 | int recv_type; |
| 249 | 242 | ||
| 250 | ipmi_user_t user; | 243 | ipmi_user_t user; |
| @@ -271,9 +264,8 @@ struct ipmi_recv_msg | |||
| 271 | /* Allocate and free the receive message. */ | 264 | /* Allocate and free the receive message. */ |
| 272 | void ipmi_free_recv_msg(struct ipmi_recv_msg *msg); | 265 | void ipmi_free_recv_msg(struct ipmi_recv_msg *msg); |
| 273 | 266 | ||
| 274 | struct ipmi_user_hndl | 267 | struct ipmi_user_hndl { |
| 275 | { | 268 | /* Routine type to call when a message needs to be routed to |
| 276 | /* Routine type to call when a message needs to be routed to | ||
| 277 | the upper layer. This will be called with some locks held, | 269 | the upper layer. This will be called with some locks held, |
| 278 | the only IPMI routines that can be called are ipmi_request | 270 | the only IPMI routines that can be called are ipmi_request |
| 279 | and the alloc/free operations. The handler_data is the | 271 | and the alloc/free operations. The handler_data is the |
| @@ -433,8 +425,7 @@ int ipmi_set_gets_events(ipmi_user_t user, int val); | |||
| 433 | * every existing interface when a new watcher is registered with | 425 | * every existing interface when a new watcher is registered with |
| 434 | * ipmi_smi_watcher_register(). | 426 | * ipmi_smi_watcher_register(). |
| 435 | */ | 427 | */ |
| 436 | struct ipmi_smi_watcher | 428 | struct ipmi_smi_watcher { |
| 437 | { | ||
| 438 | struct list_head link; | 429 | struct list_head link; |
| 439 | 430 | ||
| 440 | /* You must set the owner to the current module, if you are in | 431 | /* You must set the owner to the current module, if you are in |
| @@ -505,8 +496,7 @@ int ipmi_validate_addr(struct ipmi_addr *addr, int len); | |||
| 505 | 496 | ||
| 506 | 497 | ||
| 507 | /* Messages sent to the interface are this format. */ | 498 | /* Messages sent to the interface are this format. */ |
| 508 | struct ipmi_req | 499 | struct ipmi_req { |
| 509 | { | ||
| 510 | unsigned char __user *addr; /* Address to send the message to. */ | 500 | unsigned char __user *addr; /* Address to send the message to. */ |
| 511 | unsigned int addr_len; | 501 | unsigned int addr_len; |
| 512 | 502 | ||
| @@ -531,12 +521,11 @@ struct ipmi_req | |||
| 531 | 521 | ||
| 532 | /* Messages sent to the interface with timing parameters are this | 522 | /* Messages sent to the interface with timing parameters are this |
| 533 | format. */ | 523 | format. */ |
| 534 | struct ipmi_req_settime | 524 | struct ipmi_req_settime { |
| 535 | { | ||
| 536 | struct ipmi_req req; | 525 | struct ipmi_req req; |
| 537 | 526 | ||
| 538 | /* See ipmi_request_settime() above for details on these | 527 | /* See ipmi_request_settime() above for details on these |
| 539 | values. */ | 528 | values. */ |
| 540 | int retries; | 529 | int retries; |
| 541 | unsigned int retry_time_ms; | 530 | unsigned int retry_time_ms; |
| 542 | }; | 531 | }; |
| @@ -553,8 +542,7 @@ struct ipmi_req_settime | |||
| 553 | struct ipmi_req_settime) | 542 | struct ipmi_req_settime) |
| 554 | 543 | ||
| 555 | /* Messages received from the interface are this format. */ | 544 | /* Messages received from the interface are this format. */ |
| 556 | struct ipmi_recv | 545 | struct ipmi_recv { |
| 557 | { | ||
| 558 | int recv_type; /* Is this a command, response or an | 546 | int recv_type; /* Is this a command, response or an |
| 559 | asyncronous event. */ | 547 | asyncronous event. */ |
| 560 | 548 | ||
| @@ -600,13 +588,12 @@ struct ipmi_recv | |||
| 600 | struct ipmi_recv) | 588 | struct ipmi_recv) |
| 601 | 589 | ||
| 602 | /* Register to get commands from other entities on this interface. */ | 590 | /* Register to get commands from other entities on this interface. */ |
| 603 | struct ipmi_cmdspec | 591 | struct ipmi_cmdspec { |
| 604 | { | ||
| 605 | unsigned char netfn; | 592 | unsigned char netfn; |
| 606 | unsigned char cmd; | 593 | unsigned char cmd; |
| 607 | }; | 594 | }; |
| 608 | 595 | ||
| 609 | /* | 596 | /* |
| 610 | * Register to receive a specific command. error values: | 597 | * Register to receive a specific command. error values: |
| 611 | * - EFAULT - an address supplied was invalid. | 598 | * - EFAULT - an address supplied was invalid. |
| 612 | * - EBUSY - The netfn/cmd supplied was already in use. | 599 | * - EBUSY - The netfn/cmd supplied was already in use. |
| @@ -629,8 +616,7 @@ struct ipmi_cmdspec | |||
| 629 | * else. The chans field is a bitmask, (1 << channel) for each channel. | 616 | * else. The chans field is a bitmask, (1 << channel) for each channel. |
| 630 | * It may be IPMI_CHAN_ALL for all channels. | 617 | * It may be IPMI_CHAN_ALL for all channels. |
| 631 | */ | 618 | */ |
| 632 | struct ipmi_cmdspec_chans | 619 | struct ipmi_cmdspec_chans { |
| 633 | { | ||
| 634 | unsigned int netfn; | 620 | unsigned int netfn; |
| 635 | unsigned int cmd; | 621 | unsigned int cmd; |
| 636 | unsigned int chans; | 622 | unsigned int chans; |
| @@ -652,7 +638,7 @@ struct ipmi_cmdspec_chans | |||
| 652 | #define IPMICTL_UNREGISTER_FOR_CMD_CHANS _IOR(IPMI_IOC_MAGIC, 29, \ | 638 | #define IPMICTL_UNREGISTER_FOR_CMD_CHANS _IOR(IPMI_IOC_MAGIC, 29, \ |
| 653 | struct ipmi_cmdspec_chans) | 639 | struct ipmi_cmdspec_chans) |
| 654 | 640 | ||
| 655 | /* | 641 | /* |
| 656 | * Set whether this interface receives events. Note that the first | 642 | * Set whether this interface receives events. Note that the first |
| 657 | * user registered for events will get all pending events for the | 643 | * user registered for events will get all pending events for the |
| 658 | * interface. error values: | 644 | * interface. error values: |
| @@ -668,15 +654,18 @@ struct ipmi_cmdspec_chans | |||
| 668 | * things it takes to determine your address (if not the BMC) and set | 654 | * things it takes to determine your address (if not the BMC) and set |
| 669 | * it for everyone else. You should probably leave the LUN alone. | 655 | * it for everyone else. You should probably leave the LUN alone. |
| 670 | */ | 656 | */ |
| 671 | struct ipmi_channel_lun_address_set | 657 | struct ipmi_channel_lun_address_set { |
| 672 | { | ||
| 673 | unsigned short channel; | 658 | unsigned short channel; |
| 674 | unsigned char value; | 659 | unsigned char value; |
| 675 | }; | 660 | }; |
| 676 | #define IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 24, struct ipmi_channel_lun_address_set) | 661 | #define IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD \ |
| 677 | #define IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 25, struct ipmi_channel_lun_address_set) | 662 | _IOR(IPMI_IOC_MAGIC, 24, struct ipmi_channel_lun_address_set) |
| 678 | #define IPMICTL_SET_MY_CHANNEL_LUN_CMD _IOR(IPMI_IOC_MAGIC, 26, struct ipmi_channel_lun_address_set) | 663 | #define IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD \ |
| 679 | #define IPMICTL_GET_MY_CHANNEL_LUN_CMD _IOR(IPMI_IOC_MAGIC, 27, struct ipmi_channel_lun_address_set) | 664 | _IOR(IPMI_IOC_MAGIC, 25, struct ipmi_channel_lun_address_set) |
| 665 | #define IPMICTL_SET_MY_CHANNEL_LUN_CMD \ | ||
| 666 | _IOR(IPMI_IOC_MAGIC, 26, struct ipmi_channel_lun_address_set) | ||
| 667 | #define IPMICTL_GET_MY_CHANNEL_LUN_CMD \ | ||
| 668 | _IOR(IPMI_IOC_MAGIC, 27, struct ipmi_channel_lun_address_set) | ||
| 680 | /* Legacy interfaces, these only set IPMB 0. */ | 669 | /* Legacy interfaces, these only set IPMB 0. */ |
| 681 | #define IPMICTL_SET_MY_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 17, unsigned int) | 670 | #define IPMICTL_SET_MY_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 17, unsigned int) |
| 682 | #define IPMICTL_GET_MY_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 18, unsigned int) | 671 | #define IPMICTL_GET_MY_ADDRESS_CMD _IOR(IPMI_IOC_MAGIC, 18, unsigned int) |
| @@ -687,8 +676,7 @@ struct ipmi_channel_lun_address_set | |||
| 687 | * Get/set the default timing values for an interface. You shouldn't | 676 | * Get/set the default timing values for an interface. You shouldn't |
| 688 | * generally mess with these. | 677 | * generally mess with these. |
| 689 | */ | 678 | */ |
| 690 | struct ipmi_timing_parms | 679 | struct ipmi_timing_parms { |
| 691 | { | ||
| 692 | int retries; | 680 | int retries; |
| 693 | unsigned int retry_time_ms; | 681 | unsigned int retry_time_ms; |
| 694 | }; | 682 | }; |
diff --git a/include/linux/ipmi_smi.h b/include/linux/ipmi_smi.h index 6e8cec503380..845a8473ee5d 100644 --- a/include/linux/ipmi_smi.h +++ b/include/linux/ipmi_smi.h | |||
| @@ -60,8 +60,7 @@ typedef struct ipmi_smi *ipmi_smi_t; | |||
| 60 | * asynchronous data and messages and request them from the | 60 | * asynchronous data and messages and request them from the |
| 61 | * interface. | 61 | * interface. |
| 62 | */ | 62 | */ |
| 63 | struct ipmi_smi_msg | 63 | struct ipmi_smi_msg { |
| 64 | { | ||
| 65 | struct list_head link; | 64 | struct list_head link; |
| 66 | 65 | ||
| 67 | long msgid; | 66 | long msgid; |
| @@ -74,12 +73,11 @@ struct ipmi_smi_msg | |||
| 74 | unsigned char rsp[IPMI_MAX_MSG_LENGTH]; | 73 | unsigned char rsp[IPMI_MAX_MSG_LENGTH]; |
| 75 | 74 | ||
| 76 | /* Will be called when the system is done with the message | 75 | /* Will be called when the system is done with the message |
| 77 | (presumably to free it). */ | 76 | (presumably to free it). */ |
| 78 | void (*done)(struct ipmi_smi_msg *msg); | 77 | void (*done)(struct ipmi_smi_msg *msg); |
| 79 | }; | 78 | }; |
| 80 | 79 | ||
| 81 | struct ipmi_smi_handlers | 80 | struct ipmi_smi_handlers { |
| 82 | { | ||
| 83 | struct module *owner; | 81 | struct module *owner; |
| 84 | 82 | ||
| 85 | /* The low-level interface cannot start sending messages to | 83 | /* The low-level interface cannot start sending messages to |
