smi_info 146 drivers/char/ipmi/ipmi_si_intf.c int (*oem_data_avail_handler)(struct smi_info *smi_info); smi_info 261 drivers/char/ipmi/ipmi_si_intf.c static int try_smi_init(struct smi_info *smi); smi_info 262 drivers/char/ipmi/ipmi_si_intf.c static void cleanup_one_si(struct smi_info *smi_info); smi_info 283 drivers/char/ipmi/ipmi_si_intf.c static void deliver_recv_msg(struct smi_info *smi_info, smi_info 287 drivers/char/ipmi/ipmi_si_intf.c ipmi_smi_msg_received(smi_info->intf, msg); smi_info 290 drivers/char/ipmi/ipmi_si_intf.c static void return_hosed_msg(struct smi_info *smi_info, int cCode) smi_info 292 drivers/char/ipmi/ipmi_si_intf.c struct ipmi_smi_msg *msg = smi_info->curr_msg; smi_info 304 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = NULL; smi_info 305 drivers/char/ipmi/ipmi_si_intf.c deliver_recv_msg(smi_info, msg); smi_info 308 drivers/char/ipmi/ipmi_si_intf.c static enum si_sm_result start_next_msg(struct smi_info *smi_info) smi_info 312 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->waiting_msg) { smi_info 313 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = NULL; smi_info 318 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = smi_info->waiting_msg; smi_info 319 drivers/char/ipmi/ipmi_si_intf.c smi_info->waiting_msg = NULL; smi_info 322 drivers/char/ipmi/ipmi_si_intf.c 0, smi_info); smi_info 327 drivers/char/ipmi/ipmi_si_intf.c err = smi_info->handlers->start_transaction( smi_info 328 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm, smi_info 329 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data, smi_info 330 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data_size); smi_info 332 drivers/char/ipmi/ipmi_si_intf.c return_hosed_msg(smi_info, err); smi_info 340 drivers/char/ipmi/ipmi_si_intf.c static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val) smi_info 342 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->timer_can_start) smi_info 344 drivers/char/ipmi/ipmi_si_intf.c smi_info->last_timeout_jiffies = jiffies; smi_info 345 drivers/char/ipmi/ipmi_si_intf.c mod_timer(&smi_info->si_timer, new_val); smi_info 346 drivers/char/ipmi/ipmi_si_intf.c smi_info->timer_running = true; smi_info 352 drivers/char/ipmi/ipmi_si_intf.c static void start_new_msg(struct smi_info *smi_info, unsigned char *msg, smi_info 355 drivers/char/ipmi/ipmi_si_intf.c smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); smi_info 357 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->thread) smi_info 358 drivers/char/ipmi/ipmi_si_intf.c wake_up_process(smi_info->thread); smi_info 360 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->start_transaction(smi_info->si_sm, msg, size); smi_info 363 drivers/char/ipmi/ipmi_si_intf.c static void start_check_enables(struct smi_info *smi_info) smi_info 370 drivers/char/ipmi/ipmi_si_intf.c start_new_msg(smi_info, msg, 2); smi_info 371 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_CHECKING_ENABLES; smi_info 374 drivers/char/ipmi/ipmi_si_intf.c static void start_clear_flags(struct smi_info *smi_info) smi_info 383 drivers/char/ipmi/ipmi_si_intf.c start_new_msg(smi_info, msg, 3); smi_info 384 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_CLEARING_FLAGS; smi_info 387 drivers/char/ipmi/ipmi_si_intf.c static void start_getting_msg_queue(struct smi_info *smi_info) smi_info 389 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); smi_info 390 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data[1] = IPMI_GET_MSG_CMD; smi_info 391 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data_size = 2; smi_info 393 drivers/char/ipmi/ipmi_si_intf.c start_new_msg(smi_info, smi_info->curr_msg->data, smi_info 394 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data_size); smi_info 395 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_GETTING_MESSAGES; smi_info 398 drivers/char/ipmi/ipmi_si_intf.c static void start_getting_events(struct smi_info *smi_info) smi_info 400 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); smi_info 401 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD; smi_info 402 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data_size = 2; smi_info 404 drivers/char/ipmi/ipmi_si_intf.c start_new_msg(smi_info, smi_info->curr_msg->data, smi_info 405 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->data_size); smi_info 406 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_GETTING_EVENTS; smi_info 418 drivers/char/ipmi/ipmi_si_intf.c static inline bool disable_si_irq(struct smi_info *smi_info) smi_info 420 drivers/char/ipmi/ipmi_si_intf.c if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) { smi_info 421 drivers/char/ipmi/ipmi_si_intf.c smi_info->interrupt_disabled = true; smi_info 422 drivers/char/ipmi/ipmi_si_intf.c start_check_enables(smi_info); smi_info 428 drivers/char/ipmi/ipmi_si_intf.c static inline bool enable_si_irq(struct smi_info *smi_info) smi_info 430 drivers/char/ipmi/ipmi_si_intf.c if ((smi_info->io.irq) && (smi_info->interrupt_disabled)) { smi_info 431 drivers/char/ipmi/ipmi_si_intf.c smi_info->interrupt_disabled = false; smi_info 432 drivers/char/ipmi/ipmi_si_intf.c start_check_enables(smi_info); smi_info 444 drivers/char/ipmi/ipmi_si_intf.c static struct ipmi_smi_msg *alloc_msg_handle_irq(struct smi_info *smi_info) smi_info 450 drivers/char/ipmi/ipmi_si_intf.c if (!disable_si_irq(smi_info)) smi_info 451 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 452 drivers/char/ipmi/ipmi_si_intf.c } else if (enable_si_irq(smi_info)) { smi_info 459 drivers/char/ipmi/ipmi_si_intf.c static void handle_flags(struct smi_info *smi_info) smi_info 462 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) { smi_info 464 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, watchdog_pretimeouts); smi_info 466 drivers/char/ipmi/ipmi_si_intf.c start_clear_flags(smi_info); smi_info 467 drivers/char/ipmi/ipmi_si_intf.c smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; smi_info 468 drivers/char/ipmi/ipmi_si_intf.c ipmi_smi_watchdog_pretimeout(smi_info->intf); smi_info 469 drivers/char/ipmi/ipmi_si_intf.c } else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) { smi_info 471 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = alloc_msg_handle_irq(smi_info); smi_info 472 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->curr_msg) smi_info 475 drivers/char/ipmi/ipmi_si_intf.c start_getting_msg_queue(smi_info); smi_info 476 drivers/char/ipmi/ipmi_si_intf.c } else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) { smi_info 478 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = alloc_msg_handle_irq(smi_info); smi_info 479 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->curr_msg) smi_info 482 drivers/char/ipmi/ipmi_si_intf.c start_getting_events(smi_info); smi_info 483 drivers/char/ipmi/ipmi_si_intf.c } else if (smi_info->msg_flags & OEM_DATA_AVAIL && smi_info 484 drivers/char/ipmi/ipmi_si_intf.c smi_info->oem_data_avail_handler) { smi_info 485 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->oem_data_avail_handler(smi_info)) smi_info 488 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 497 drivers/char/ipmi/ipmi_si_intf.c static u8 current_global_enables(struct smi_info *smi_info, u8 base, smi_info 502 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->supports_event_msg_buff) smi_info 505 drivers/char/ipmi/ipmi_si_intf.c if (((smi_info->io.irq && !smi_info->interrupt_disabled) || smi_info 506 drivers/char/ipmi/ipmi_si_intf.c smi_info->cannot_disable_irq) && smi_info 507 drivers/char/ipmi/ipmi_si_intf.c !smi_info->irq_enable_broken) smi_info 510 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->supports_event_msg_buff && smi_info 511 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.irq && !smi_info->interrupt_disabled && smi_info 512 drivers/char/ipmi/ipmi_si_intf.c !smi_info->irq_enable_broken) smi_info 520 drivers/char/ipmi/ipmi_si_intf.c static void check_bt_irq(struct smi_info *smi_info, bool irq_on) smi_info 522 drivers/char/ipmi/ipmi_si_intf.c u8 irqstate = smi_info->io.inputb(&smi_info->io, IPMI_BT_INTMASK_REG); smi_info 530 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, smi_info 533 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, 0); smi_info 536 drivers/char/ipmi/ipmi_si_intf.c static void handle_transaction_done(struct smi_info *smi_info) smi_info 541 drivers/char/ipmi/ipmi_si_intf.c switch (smi_info->si_state) { smi_info 543 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->curr_msg) smi_info 546 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->rsp_size smi_info 547 drivers/char/ipmi/ipmi_si_intf.c = smi_info->handlers->get_result( smi_info 548 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm, smi_info 549 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->rsp, smi_info 557 drivers/char/ipmi/ipmi_si_intf.c msg = smi_info->curr_msg; smi_info 558 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = NULL; smi_info 559 drivers/char/ipmi/ipmi_si_intf.c deliver_recv_msg(smi_info, msg); smi_info 568 drivers/char/ipmi/ipmi_si_intf.c len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4); smi_info 571 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 577 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 579 drivers/char/ipmi/ipmi_si_intf.c smi_info->msg_flags = msg[3]; smi_info 580 drivers/char/ipmi/ipmi_si_intf.c handle_flags(smi_info); smi_info 590 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->get_result(smi_info->si_sm, msg, 3); smi_info 593 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 596 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 602 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->rsp_size smi_info 603 drivers/char/ipmi/ipmi_si_intf.c = smi_info->handlers->get_result( smi_info 604 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm, smi_info 605 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->rsp, smi_info 613 drivers/char/ipmi/ipmi_si_intf.c msg = smi_info->curr_msg; smi_info 614 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = NULL; smi_info 620 drivers/char/ipmi/ipmi_si_intf.c smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; smi_info 621 drivers/char/ipmi/ipmi_si_intf.c handle_flags(smi_info); smi_info 623 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, events); smi_info 631 drivers/char/ipmi/ipmi_si_intf.c handle_flags(smi_info); smi_info 633 drivers/char/ipmi/ipmi_si_intf.c deliver_recv_msg(smi_info, msg); smi_info 640 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->rsp_size smi_info 641 drivers/char/ipmi/ipmi_si_intf.c = smi_info->handlers->get_result( smi_info 642 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm, smi_info 643 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg->rsp, smi_info 651 drivers/char/ipmi/ipmi_si_intf.c msg = smi_info->curr_msg; smi_info 652 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = NULL; smi_info 658 drivers/char/ipmi/ipmi_si_intf.c smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL; smi_info 659 drivers/char/ipmi/ipmi_si_intf.c handle_flags(smi_info); smi_info 661 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, incoming_messages); smi_info 669 drivers/char/ipmi/ipmi_si_intf.c handle_flags(smi_info); smi_info 671 drivers/char/ipmi/ipmi_si_intf.c deliver_recv_msg(smi_info, msg); smi_info 683 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->get_result(smi_info->si_sm, msg, 4); smi_info 685 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 687 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 689 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 692 drivers/char/ipmi/ipmi_si_intf.c enables = current_global_enables(smi_info, 0, &irq_on); smi_info 693 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->io.si_type == SI_BT) smi_info 695 drivers/char/ipmi/ipmi_si_intf.c check_bt_irq(smi_info, irq_on); smi_info 701 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->start_transaction( smi_info 702 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm, msg, 3); smi_info 703 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_SETTING_ENABLES; smi_info 704 drivers/char/ipmi/ipmi_si_intf.c } else if (smi_info->supports_event_msg_buff) { smi_info 705 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = ipmi_alloc_smi_msg(); smi_info 706 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->curr_msg) { smi_info 707 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 710 drivers/char/ipmi/ipmi_si_intf.c start_getting_events(smi_info); smi_info 712 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 721 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->get_result(smi_info->si_sm, msg, 4); smi_info 723 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 727 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->supports_event_msg_buff) { smi_info 728 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = ipmi_alloc_smi_msg(); smi_info 729 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->curr_msg) { smi_info 730 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 733 drivers/char/ipmi/ipmi_si_intf.c start_getting_events(smi_info); smi_info 735 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 747 drivers/char/ipmi/ipmi_si_intf.c static enum si_sm_result smi_event_handler(struct smi_info *smi_info, smi_info 761 drivers/char/ipmi/ipmi_si_intf.c si_sm_result = smi_info->handlers->event(smi_info->si_sm, time); smi_info 764 drivers/char/ipmi/ipmi_si_intf.c si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0); smi_info 767 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, complete_transactions); smi_info 769 drivers/char/ipmi/ipmi_si_intf.c handle_transaction_done(smi_info); smi_info 772 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, hosed_count); smi_info 778 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_NORMAL; smi_info 779 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->curr_msg != NULL) { smi_info 785 drivers/char/ipmi/ipmi_si_intf.c return_hosed_msg(smi_info, IPMI_ERR_UNSPECIFIED); smi_info 794 drivers/char/ipmi/ipmi_si_intf.c if (si_sm_result == SI_SM_ATTN || smi_info->got_attn) { smi_info 797 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->si_state != SI_NORMAL) { smi_info 802 drivers/char/ipmi/ipmi_si_intf.c smi_info->got_attn = true; smi_info 804 drivers/char/ipmi/ipmi_si_intf.c smi_info->got_attn = false; smi_info 805 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, attentions); smi_info 817 drivers/char/ipmi/ipmi_si_intf.c start_new_msg(smi_info, msg, 2); smi_info 818 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_state = SI_GETTING_FLAGS; smi_info 825 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, idles); smi_info 827 drivers/char/ipmi/ipmi_si_intf.c si_sm_result = start_next_msg(smi_info); smi_info 833 drivers/char/ipmi/ipmi_si_intf.c && (atomic_read(&smi_info->req_events))) { smi_info 838 drivers/char/ipmi/ipmi_si_intf.c atomic_set(&smi_info->req_events, 0); smi_info 846 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->supports_event_msg_buff || smi_info->io.irq) { smi_info 847 drivers/char/ipmi/ipmi_si_intf.c start_check_enables(smi_info); smi_info 849 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = alloc_msg_handle_irq(smi_info); smi_info 850 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->curr_msg) smi_info 853 drivers/char/ipmi/ipmi_si_intf.c start_getting_events(smi_info); smi_info 858 drivers/char/ipmi/ipmi_si_intf.c if (si_sm_result == SI_SM_IDLE && smi_info->timer_running) { smi_info 860 drivers/char/ipmi/ipmi_si_intf.c if (del_timer(&smi_info->si_timer)) smi_info 861 drivers/char/ipmi/ipmi_si_intf.c smi_info->timer_running = false; smi_info 868 drivers/char/ipmi/ipmi_si_intf.c static void check_start_timer_thread(struct smi_info *smi_info) smi_info 870 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) { smi_info 871 drivers/char/ipmi/ipmi_si_intf.c smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); smi_info 873 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->thread) smi_info 874 drivers/char/ipmi/ipmi_si_intf.c wake_up_process(smi_info->thread); smi_info 876 drivers/char/ipmi/ipmi_si_intf.c start_next_msg(smi_info); smi_info 877 drivers/char/ipmi/ipmi_si_intf.c smi_event_handler(smi_info, 0); smi_info 883 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 890 drivers/char/ipmi/ipmi_si_intf.c result = smi_event_handler(smi_info, 0); smi_info 893 drivers/char/ipmi/ipmi_si_intf.c result = smi_event_handler(smi_info, SI_SHORT_TIMEOUT_USEC); smi_info 900 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 905 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->run_to_completion) { smi_info 910 drivers/char/ipmi/ipmi_si_intf.c smi_info->waiting_msg = msg; smi_info 914 drivers/char/ipmi/ipmi_si_intf.c spin_lock_irqsave(&smi_info->si_lock, flags); smi_info 922 drivers/char/ipmi/ipmi_si_intf.c BUG_ON(smi_info->waiting_msg); smi_info 923 drivers/char/ipmi/ipmi_si_intf.c smi_info->waiting_msg = msg; smi_info 924 drivers/char/ipmi/ipmi_si_intf.c check_start_timer_thread(smi_info); smi_info 925 drivers/char/ipmi/ipmi_si_intf.c spin_unlock_irqrestore(&smi_info->si_lock, flags); smi_info 930 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 932 drivers/char/ipmi/ipmi_si_intf.c smi_info->run_to_completion = i_run_to_completion; smi_info 934 drivers/char/ipmi/ipmi_si_intf.c flush_messages(smi_info); smi_info 952 drivers/char/ipmi/ipmi_si_intf.c const struct smi_info *smi_info, smi_info 957 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->si_num < num_max_busy_us) smi_info 958 drivers/char/ipmi/ipmi_si_intf.c max_busy_us = kipmid_max_busy_us[smi_info->si_num]; smi_info 988 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = data; smi_info 998 drivers/char/ipmi/ipmi_si_intf.c spin_lock_irqsave(&(smi_info->si_lock), flags); smi_info 999 drivers/char/ipmi/ipmi_si_intf.c smi_result = smi_event_handler(smi_info, 0); smi_info 1008 drivers/char/ipmi/ipmi_si_intf.c if (smi_result != SI_SM_IDLE && !smi_info->timer_running) smi_info 1009 drivers/char/ipmi/ipmi_si_intf.c smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); smi_info 1011 drivers/char/ipmi/ipmi_si_intf.c spin_unlock_irqrestore(&(smi_info->si_lock), flags); smi_info 1012 drivers/char/ipmi/ipmi_si_intf.c busy_wait = ipmi_thread_busy_wait(smi_result, smi_info, smi_info 1023 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->in_maintenance_mode) smi_info 1028 drivers/char/ipmi/ipmi_si_intf.c if (atomic_read(&smi_info->need_watch)) { smi_info 1045 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 1047 drivers/char/ipmi/ipmi_si_intf.c bool run_to_completion = smi_info->run_to_completion; smi_info 1055 drivers/char/ipmi/ipmi_si_intf.c spin_lock_irqsave(&smi_info->si_lock, flags); smi_info 1056 drivers/char/ipmi/ipmi_si_intf.c smi_event_handler(smi_info, 10); smi_info 1058 drivers/char/ipmi/ipmi_si_intf.c spin_unlock_irqrestore(&smi_info->si_lock, flags); smi_info 1063 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 1065 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->has_event_buffer) smi_info 1068 drivers/char/ipmi/ipmi_si_intf.c atomic_set(&smi_info->req_events, 1); smi_info 1073 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 1079 drivers/char/ipmi/ipmi_si_intf.c atomic_set(&smi_info->need_watch, enable); smi_info 1080 drivers/char/ipmi/ipmi_si_intf.c spin_lock_irqsave(&smi_info->si_lock, flags); smi_info 1081 drivers/char/ipmi/ipmi_si_intf.c check_start_timer_thread(smi_info); smi_info 1082 drivers/char/ipmi/ipmi_si_intf.c spin_unlock_irqrestore(&smi_info->si_lock, flags); smi_info 1087 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = from_timer(smi_info, t, si_timer); smi_info 1094 drivers/char/ipmi/ipmi_si_intf.c spin_lock_irqsave(&(smi_info->si_lock), flags); smi_info 1098 drivers/char/ipmi/ipmi_si_intf.c time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies) smi_info 1100 drivers/char/ipmi/ipmi_si_intf.c smi_result = smi_event_handler(smi_info, time_diff); smi_info 1102 drivers/char/ipmi/ipmi_si_intf.c if ((smi_info->io.irq) && (!smi_info->interrupt_disabled)) { smi_info 1105 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, long_timeouts); smi_info 1114 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, short_timeouts); smi_info 1117 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, long_timeouts); smi_info 1123 drivers/char/ipmi/ipmi_si_intf.c smi_mod_timer(smi_info, timeout); smi_info 1125 drivers/char/ipmi/ipmi_si_intf.c smi_info->timer_running = false; smi_info 1126 drivers/char/ipmi/ipmi_si_intf.c spin_unlock_irqrestore(&(smi_info->si_lock), flags); smi_info 1131 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = data; smi_info 1134 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->io.si_type == SI_BT) smi_info 1136 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, smi_info 1140 drivers/char/ipmi/ipmi_si_intf.c spin_lock_irqsave(&(smi_info->si_lock), flags); smi_info 1142 drivers/char/ipmi/ipmi_si_intf.c smi_inc_stat(smi_info, interrupts); smi_info 1146 drivers/char/ipmi/ipmi_si_intf.c smi_event_handler(smi_info, 0); smi_info 1147 drivers/char/ipmi/ipmi_si_intf.c spin_unlock_irqrestore(&(smi_info->si_lock), flags); smi_info 1154 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *new_smi = send_info; smi_info 1199 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi = send_info; smi_info 1211 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 1214 drivers/char/ipmi/ipmi_si_intf.c atomic_set(&smi_info->req_events, 0); smi_info 1215 drivers/char/ipmi/ipmi_si_intf.c smi_info->in_maintenance_mode = enable; smi_info 1300 drivers/char/ipmi/ipmi_si_intf.c static int wait_for_msg_done(struct smi_info *smi_info) smi_info 1304 drivers/char/ipmi/ipmi_si_intf.c smi_result = smi_info->handlers->event(smi_info->si_sm, 0); smi_info 1309 drivers/char/ipmi/ipmi_si_intf.c smi_result = smi_info->handlers->event( smi_info 1310 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm, jiffies_to_usecs(1)); smi_info 1312 drivers/char/ipmi/ipmi_si_intf.c smi_result = smi_info->handlers->event( smi_info 1313 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm, 0); smi_info 1327 drivers/char/ipmi/ipmi_si_intf.c static int try_get_dev_id(struct smi_info *smi_info) smi_info 1344 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); smi_info 1346 drivers/char/ipmi/ipmi_si_intf.c rv = wait_for_msg_done(smi_info); smi_info 1350 drivers/char/ipmi/ipmi_si_intf.c resp_len = smi_info->handlers->get_result(smi_info->si_sm, smi_info 1355 drivers/char/ipmi/ipmi_si_intf.c resp + 2, resp_len - 2, &smi_info->device_id); smi_info 1362 drivers/char/ipmi/ipmi_si_intf.c static int get_global_enables(struct smi_info *smi_info, u8 *enables) smi_info 1375 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); smi_info 1377 drivers/char/ipmi/ipmi_si_intf.c rv = wait_for_msg_done(smi_info); smi_info 1379 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 1385 drivers/char/ipmi/ipmi_si_intf.c resp_len = smi_info->handlers->get_result(smi_info->si_sm, smi_info 1392 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 1409 drivers/char/ipmi/ipmi_si_intf.c static int set_global_enables(struct smi_info *smi_info, u8 enables) smi_info 1423 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); smi_info 1425 drivers/char/ipmi/ipmi_si_intf.c rv = wait_for_msg_done(smi_info); smi_info 1427 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 1433 drivers/char/ipmi/ipmi_si_intf.c resp_len = smi_info->handlers->get_result(smi_info->si_sm, smi_info 1439 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 1459 drivers/char/ipmi/ipmi_si_intf.c static void check_clr_rcv_irq(struct smi_info *smi_info) smi_info 1464 drivers/char/ipmi/ipmi_si_intf.c rv = get_global_enables(smi_info, &enables); smi_info 1471 drivers/char/ipmi/ipmi_si_intf.c rv = set_global_enables(smi_info, enables); smi_info 1475 drivers/char/ipmi/ipmi_si_intf.c dev_err(smi_info->io.dev, smi_info 1485 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 1487 drivers/char/ipmi/ipmi_si_intf.c smi_info->cannot_disable_irq = true; smi_info 1496 drivers/char/ipmi/ipmi_si_intf.c static void check_set_rcv_irq(struct smi_info *smi_info) smi_info 1501 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info->io.irq) smi_info 1504 drivers/char/ipmi/ipmi_si_intf.c rv = get_global_enables(smi_info, &enables); smi_info 1507 drivers/char/ipmi/ipmi_si_intf.c rv = set_global_enables(smi_info, enables); smi_info 1511 drivers/char/ipmi/ipmi_si_intf.c dev_err(smi_info->io.dev, smi_info 1521 drivers/char/ipmi/ipmi_si_intf.c dev_warn(smi_info->io.dev, smi_info 1523 drivers/char/ipmi/ipmi_si_intf.c smi_info->cannot_disable_irq = true; smi_info 1524 drivers/char/ipmi/ipmi_si_intf.c smi_info->irq_enable_broken = true; smi_info 1528 drivers/char/ipmi/ipmi_si_intf.c static int try_enable_event_buffer(struct smi_info *smi_info) smi_info 1541 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); smi_info 1543 drivers/char/ipmi/ipmi_si_intf.c rv = wait_for_msg_done(smi_info); smi_info 1549 drivers/char/ipmi/ipmi_si_intf.c resp_len = smi_info->handlers->get_result(smi_info->si_sm, smi_info 1563 drivers/char/ipmi/ipmi_si_intf.c smi_info->supports_event_msg_buff = true; smi_info 1570 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); smi_info 1572 drivers/char/ipmi/ipmi_si_intf.c rv = wait_for_msg_done(smi_info); smi_info 1578 drivers/char/ipmi/ipmi_si_intf.c resp_len = smi_info->handlers->get_result(smi_info->si_sm, smi_info 1596 drivers/char/ipmi/ipmi_si_intf.c smi_info->supports_event_msg_buff = true; smi_info 1608 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = dev_get_drvdata(dev); \ smi_info 1610 drivers/char/ipmi/ipmi_si_intf.c return snprintf(buf, 10, "%u\n", smi_get_stat(smi_info, name)); \ smi_info 1618 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = dev_get_drvdata(dev); smi_info 1620 drivers/char/ipmi/ipmi_si_intf.c return snprintf(buf, 10, "%s\n", si_to_str[smi_info->io.si_type]); smi_info 1628 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = dev_get_drvdata(dev); smi_info 1629 drivers/char/ipmi/ipmi_si_intf.c int enabled = smi_info->io.irq && !smi_info->interrupt_disabled; smi_info 1652 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = dev_get_drvdata(dev); smi_info 1656 drivers/char/ipmi/ipmi_si_intf.c si_to_str[smi_info->io.si_type], smi_info 1657 drivers/char/ipmi/ipmi_si_intf.c addr_space_to_str[smi_info->io.addr_space], smi_info 1658 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.addr_data, smi_info 1659 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.regspacing, smi_info 1660 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.regsize, smi_info 1661 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.regshift, smi_info 1662 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.irq, smi_info 1663 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.slave_addr); smi_info 1696 drivers/char/ipmi/ipmi_si_intf.c static int oem_data_avail_to_receive_msg_avail(struct smi_info *smi_info) smi_info 1698 drivers/char/ipmi/ipmi_si_intf.c smi_info->msg_flags = ((smi_info->msg_flags & ~OEM_DATA_AVAIL) | smi_info 1732 drivers/char/ipmi/ipmi_si_intf.c static void setup_dell_poweredge_oem_data_handler(struct smi_info *smi_info) smi_info 1734 drivers/char/ipmi/ipmi_si_intf.c struct ipmi_device_id *id = &smi_info->device_id; smi_info 1739 drivers/char/ipmi/ipmi_si_intf.c smi_info->oem_data_avail_handler = smi_info 1744 drivers/char/ipmi/ipmi_si_intf.c smi_info->oem_data_avail_handler = smi_info 1751 drivers/char/ipmi/ipmi_si_intf.c static void return_hosed_msg_badsize(struct smi_info *smi_info) smi_info 1753 drivers/char/ipmi/ipmi_si_intf.c struct ipmi_smi_msg *msg = smi_info->curr_msg; smi_info 1760 drivers/char/ipmi/ipmi_si_intf.c smi_info->curr_msg = NULL; smi_info 1761 drivers/char/ipmi/ipmi_si_intf.c deliver_recv_msg(smi_info, msg); smi_info 1781 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = in; smi_info 1782 drivers/char/ipmi/ipmi_si_intf.c unsigned char *data = smi_info->curr_msg->data; smi_info 1783 drivers/char/ipmi/ipmi_si_intf.c unsigned int size = smi_info->curr_msg->data_size; smi_info 1788 drivers/char/ipmi/ipmi_si_intf.c return_hosed_msg_badsize(smi_info); smi_info 1806 drivers/char/ipmi/ipmi_si_intf.c setup_dell_poweredge_bt_xaction_handler(struct smi_info *smi_info) smi_info 1808 drivers/char/ipmi/ipmi_si_intf.c struct ipmi_device_id *id = &smi_info->device_id; smi_info 1810 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.si_type == SI_BT) smi_info 1822 drivers/char/ipmi/ipmi_si_intf.c static void setup_oem_data_handler(struct smi_info *smi_info) smi_info 1824 drivers/char/ipmi/ipmi_si_intf.c setup_dell_poweredge_oem_data_handler(smi_info); smi_info 1827 drivers/char/ipmi/ipmi_si_intf.c static void setup_xaction_handlers(struct smi_info *smi_info) smi_info 1829 drivers/char/ipmi/ipmi_si_intf.c setup_dell_poweredge_bt_xaction_handler(smi_info); smi_info 1832 drivers/char/ipmi/ipmi_si_intf.c static void check_for_broken_irqs(struct smi_info *smi_info) smi_info 1834 drivers/char/ipmi/ipmi_si_intf.c check_clr_rcv_irq(smi_info); smi_info 1835 drivers/char/ipmi/ipmi_si_intf.c check_set_rcv_irq(smi_info); smi_info 1838 drivers/char/ipmi/ipmi_si_intf.c static inline void stop_timer_and_thread(struct smi_info *smi_info) smi_info 1840 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->thread != NULL) { smi_info 1841 drivers/char/ipmi/ipmi_si_intf.c kthread_stop(smi_info->thread); smi_info 1842 drivers/char/ipmi/ipmi_si_intf.c smi_info->thread = NULL; smi_info 1845 drivers/char/ipmi/ipmi_si_intf.c smi_info->timer_can_start = false; smi_info 1846 drivers/char/ipmi/ipmi_si_intf.c del_timer_sync(&smi_info->si_timer); smi_info 1849 drivers/char/ipmi/ipmi_si_intf.c static struct smi_info *find_dup_si(struct smi_info *info) smi_info 1851 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *e; smi_info 1874 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *new_smi, *dup; smi_info 1944 drivers/char/ipmi/ipmi_si_intf.c static int try_smi_init(struct smi_info *new_smi) smi_info 2094 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *e; smi_info 2162 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *smi_info = send_info; smi_info 2164 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->dev_group_added) { smi_info 2165 drivers/char/ipmi/ipmi_si_intf.c device_remove_group(smi_info->io.dev, &ipmi_si_dev_attr_group); smi_info 2166 drivers/char/ipmi/ipmi_si_intf.c smi_info->dev_group_added = false; smi_info 2168 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->io.dev) smi_info 2169 drivers/char/ipmi/ipmi_si_intf.c dev_set_drvdata(smi_info->io.dev, NULL); smi_info 2175 drivers/char/ipmi/ipmi_si_intf.c smi_info->interrupt_disabled = true; smi_info 2176 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->io.irq_cleanup) { smi_info 2177 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.irq_cleanup(&smi_info->io); smi_info 2178 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.irq_cleanup = NULL; smi_info 2180 drivers/char/ipmi/ipmi_si_intf.c stop_timer_and_thread(smi_info); smi_info 2194 drivers/char/ipmi/ipmi_si_intf.c while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { smi_info 2195 drivers/char/ipmi/ipmi_si_intf.c poll(smi_info); smi_info 2198 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->handlers) smi_info 2199 drivers/char/ipmi/ipmi_si_intf.c disable_si_irq(smi_info); smi_info 2200 drivers/char/ipmi/ipmi_si_intf.c while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) { smi_info 2201 drivers/char/ipmi/ipmi_si_intf.c poll(smi_info); smi_info 2204 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->handlers) smi_info 2205 drivers/char/ipmi/ipmi_si_intf.c smi_info->handlers->cleanup(smi_info->si_sm); smi_info 2207 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->io.addr_source_cleanup) { smi_info 2208 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.addr_source_cleanup(&smi_info->io); smi_info 2209 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.addr_source_cleanup = NULL; smi_info 2211 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->io.io_cleanup) { smi_info 2212 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.io_cleanup(&smi_info->io); smi_info 2213 drivers/char/ipmi/ipmi_si_intf.c smi_info->io.io_cleanup = NULL; smi_info 2216 drivers/char/ipmi/ipmi_si_intf.c kfree(smi_info->si_sm); smi_info 2217 drivers/char/ipmi/ipmi_si_intf.c smi_info->si_sm = NULL; smi_info 2219 drivers/char/ipmi/ipmi_si_intf.c smi_info->intf = NULL; smi_info 2226 drivers/char/ipmi/ipmi_si_intf.c static void cleanup_one_si(struct smi_info *smi_info) smi_info 2228 drivers/char/ipmi/ipmi_si_intf.c if (!smi_info) smi_info 2231 drivers/char/ipmi/ipmi_si_intf.c list_del(&smi_info->link); smi_info 2233 drivers/char/ipmi/ipmi_si_intf.c if (smi_info->intf) smi_info 2234 drivers/char/ipmi/ipmi_si_intf.c ipmi_unregister_smi(smi_info->intf); smi_info 2236 drivers/char/ipmi/ipmi_si_intf.c kfree(smi_info); smi_info 2241 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *e; smi_info 2261 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *e, *tmp_e; smi_info 2282 drivers/char/ipmi/ipmi_si_intf.c struct smi_info *e, *tmp_e;