Lines Matching refs:intf
57 static void handle_new_recv_msgs(ipmi_smi_t intf);
92 ipmi_smi_t intf; member
408 void (*null_user_handler)(ipmi_smi_t intf, struct ipmi_recv_msg *msg);
455 #define ipmi_inc_stat(intf, stat) \ argument
456 atomic_inc(&(intf)->stats[IPMI_STAT_ ## stat])
457 #define ipmi_get_stat(intf, stat) \ argument
458 ((unsigned int) atomic_read(&(intf)->stats[IPMI_STAT_ ## stat]))
495 static void clean_up_interface_data(ipmi_smi_t intf) in clean_up_interface_data() argument
501 tasklet_kill(&intf->recv_tasklet); in clean_up_interface_data()
503 free_smi_msg_list(&intf->waiting_msgs); in clean_up_interface_data()
504 free_recv_msg_list(&intf->waiting_events); in clean_up_interface_data()
510 mutex_lock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
512 list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu); in clean_up_interface_data()
513 mutex_unlock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
519 if ((intf->seq_table[i].inuse) in clean_up_interface_data()
520 && (intf->seq_table[i].recv_msg)) in clean_up_interface_data()
521 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in clean_up_interface_data()
527 ipmi_smi_t intf = container_of(ref, struct ipmi_smi, refcount); in intf_free() local
529 clean_up_interface_data(intf); in intf_free()
530 kfree(intf); in intf_free()
535 ipmi_smi_t intf; member
541 ipmi_smi_t intf; in ipmi_smi_watcher_register() local
550 list_for_each_entry(intf, &ipmi_interfaces, link) { in ipmi_smi_watcher_register()
551 if (intf->intf_num == -1) in ipmi_smi_watcher_register()
556 kref_get(&intf->refcount); in ipmi_smi_watcher_register()
557 e->intf = intf; in ipmi_smi_watcher_register()
558 e->intf_num = intf->intf_num; in ipmi_smi_watcher_register()
569 watcher->new_smi(e->intf_num, e->intf->si_dev); in ipmi_smi_watcher_register()
570 kref_put(&e->intf->refcount, intf_free); in ipmi_smi_watcher_register()
583 kref_put(&e->intf->refcount, intf_free); in ipmi_smi_watcher_register()
709 ipmi_smi_t intf = msg->user_msg_data; in deliver_response() local
712 if (intf->null_user_handler) { in deliver_response()
713 intf->null_user_handler(intf, msg); in deliver_response()
714 ipmi_inc_stat(intf, handled_local_responses); in deliver_response()
717 ipmi_inc_stat(intf, unhandled_local_responses); in deliver_response()
742 static int intf_next_seq(ipmi_smi_t intf, in intf_next_seq() argument
753 for (i = intf->curr_seq; (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; in intf_next_seq()
755 if (!intf->seq_table[i].inuse) in intf_next_seq()
759 if (!intf->seq_table[i].inuse) { in intf_next_seq()
760 intf->seq_table[i].recv_msg = recv_msg; in intf_next_seq()
766 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; in intf_next_seq()
767 intf->seq_table[i].orig_timeout = timeout; in intf_next_seq()
768 intf->seq_table[i].retries_left = retries; in intf_next_seq()
769 intf->seq_table[i].broadcast = broadcast; in intf_next_seq()
770 intf->seq_table[i].inuse = 1; in intf_next_seq()
771 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid); in intf_next_seq()
773 *seqid = intf->seq_table[i].seqid; in intf_next_seq()
774 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ; in intf_next_seq()
789 static int intf_find_seq(ipmi_smi_t intf, in intf_find_seq() argument
803 spin_lock_irqsave(&(intf->seq_lock), flags); in intf_find_seq()
804 if (intf->seq_table[seq].inuse) { in intf_find_seq()
805 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; in intf_find_seq()
811 intf->seq_table[seq].inuse = 0; in intf_find_seq()
815 spin_unlock_irqrestore(&(intf->seq_lock), flags); in intf_find_seq()
822 static int intf_start_seq_timer(ipmi_smi_t intf, in intf_start_seq_timer() argument
833 spin_lock_irqsave(&(intf->seq_lock), flags); in intf_start_seq_timer()
838 if ((intf->seq_table[seq].inuse) in intf_start_seq_timer()
839 && (intf->seq_table[seq].seqid == seqid)) { in intf_start_seq_timer()
840 struct seq_table *ent = &(intf->seq_table[seq]); in intf_start_seq_timer()
844 spin_unlock_irqrestore(&(intf->seq_lock), flags); in intf_start_seq_timer()
850 static int intf_err_seq(ipmi_smi_t intf, in intf_err_seq() argument
863 spin_lock_irqsave(&(intf->seq_lock), flags); in intf_err_seq()
868 if ((intf->seq_table[seq].inuse) in intf_err_seq()
869 && (intf->seq_table[seq].seqid == seqid)) { in intf_err_seq()
870 struct seq_table *ent = &(intf->seq_table[seq]); in intf_err_seq()
876 spin_unlock_irqrestore(&(intf->seq_lock), flags); in intf_err_seq()
893 ipmi_smi_t intf; in ipmi_create_user() local
928 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_create_user()
929 if (intf->intf_num == if_num) in ipmi_create_user()
938 kref_get(&intf->refcount); in ipmi_create_user()
943 new_user->intf = intf; in ipmi_create_user()
946 if (!try_module_get(intf->handlers->owner)) { in ipmi_create_user()
951 if (intf->handlers->inc_usecount) { in ipmi_create_user()
952 rv = intf->handlers->inc_usecount(intf->send_info); in ipmi_create_user()
954 module_put(intf->handlers->owner); in ipmi_create_user()
966 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_create_user()
967 list_add_rcu(&new_user->link, &intf->users); in ipmi_create_user()
968 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_create_user()
973 kref_put(&intf->refcount, intf_free); in ipmi_create_user()
984 ipmi_smi_t intf; in ipmi_get_smi_info() local
988 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_get_smi_info()
989 if (intf->intf_num == if_num) in ipmi_get_smi_info()
998 handlers = intf->handlers; in ipmi_get_smi_info()
1001 rv = handlers->get_smi_info(intf->send_info, data); in ipmi_get_smi_info()
1016 ipmi_smi_t intf = user->intf; in ipmi_destroy_user() local
1025 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_destroy_user()
1029 if (intf->seq_table[i].inuse in ipmi_destroy_user()
1030 && (intf->seq_table[i].recv_msg->user == user)) { in ipmi_destroy_user()
1031 intf->seq_table[i].inuse = 0; in ipmi_destroy_user()
1032 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in ipmi_destroy_user()
1035 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_destroy_user()
1043 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_destroy_user()
1044 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { in ipmi_destroy_user()
1051 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_destroy_user()
1060 if (intf->handlers) { in ipmi_destroy_user()
1061 module_put(intf->handlers->owner); in ipmi_destroy_user()
1062 if (intf->handlers->dec_usecount) in ipmi_destroy_user()
1063 intf->handlers->dec_usecount(intf->send_info); in ipmi_destroy_user()
1067 kref_put(&intf->refcount, intf_free); in ipmi_destroy_user()
1079 *major = user->intf->ipmi_version_major; in ipmi_get_version()
1080 *minor = user->intf->ipmi_version_minor; in ipmi_get_version()
1090 user->intf->channels[channel].address = address; in ipmi_set_my_address()
1101 *address = user->intf->channels[channel].address; in ipmi_get_my_address()
1112 user->intf->channels[channel].lun = LUN & 0x3; in ipmi_set_my_LUN()
1123 *address = user->intf->channels[channel].lun; in ipmi_get_my_LUN()
1133 spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1134 mode = user->intf->maintenance_mode; in ipmi_get_maintenance_mode()
1135 spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1141 static void maintenance_mode_update(ipmi_smi_t intf) in maintenance_mode_update() argument
1143 if (intf->handlers->set_maintenance_mode) in maintenance_mode_update()
1144 intf->handlers->set_maintenance_mode( in maintenance_mode_update()
1145 intf->send_info, intf->maintenance_mode_enable); in maintenance_mode_update()
1152 ipmi_smi_t intf = user->intf; in ipmi_set_maintenance_mode() local
1154 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1155 if (intf->maintenance_mode != mode) { in ipmi_set_maintenance_mode()
1158 intf->maintenance_mode = mode; in ipmi_set_maintenance_mode()
1159 intf->maintenance_mode_enable in ipmi_set_maintenance_mode()
1160 = (intf->auto_maintenance_timeout > 0); in ipmi_set_maintenance_mode()
1164 intf->maintenance_mode = mode; in ipmi_set_maintenance_mode()
1165 intf->maintenance_mode_enable = 0; in ipmi_set_maintenance_mode()
1169 intf->maintenance_mode = mode; in ipmi_set_maintenance_mode()
1170 intf->maintenance_mode_enable = 1; in ipmi_set_maintenance_mode()
1178 maintenance_mode_update(intf); in ipmi_set_maintenance_mode()
1181 spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1190 ipmi_smi_t intf = user->intf; in ipmi_set_gets_events() local
1196 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1199 if (intf->delivering_events) in ipmi_set_gets_events()
1207 while (user->gets_events && !list_empty(&intf->waiting_events)) { in ipmi_set_gets_events()
1208 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link) in ipmi_set_gets_events()
1210 intf->waiting_events_count = 0; in ipmi_set_gets_events()
1211 if (intf->event_msg_printed) { in ipmi_set_gets_events()
1214 intf->event_msg_printed = 0; in ipmi_set_gets_events()
1217 intf->delivering_events = 1; in ipmi_set_gets_events()
1218 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1226 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1227 intf->delivering_events = 0; in ipmi_set_gets_events()
1231 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1237 static struct cmd_rcvr *find_cmd_rcvr(ipmi_smi_t intf, in find_cmd_rcvr() argument
1244 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { in find_cmd_rcvr()
1252 static int is_cmd_rcvr_exclusive(ipmi_smi_t intf, in is_cmd_rcvr_exclusive() argument
1259 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { in is_cmd_rcvr_exclusive()
1272 ipmi_smi_t intf = user->intf; in ipmi_register_for_cmd() local
1285 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1287 if (!is_cmd_rcvr_exclusive(intf, netfn, cmd, chans)) { in ipmi_register_for_cmd()
1292 list_add_rcu(&rcvr->link, &intf->cmd_rcvrs); in ipmi_register_for_cmd()
1295 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1308 ipmi_smi_t intf = user->intf; in ipmi_unregister_for_cmd() local
1313 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1317 rcvr = find_cmd_rcvr(intf, netfn, cmd, i); in ipmi_unregister_for_cmd()
1330 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1442 ipmi_smi_t intf, in i_ipmi_request() argument
1482 handlers = intf->handlers; in i_ipmi_request()
1509 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1524 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1533 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in i_ipmi_request()
1534 intf->auto_maintenance_timeout in i_ipmi_request()
1536 if (!intf->maintenance_mode in i_ipmi_request()
1537 && !intf->maintenance_mode_enable) { in i_ipmi_request()
1538 intf->maintenance_mode_enable = 1; in i_ipmi_request()
1539 maintenance_mode_update(intf); in i_ipmi_request()
1541 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in i_ipmi_request()
1546 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1558 ipmi_inc_stat(intf, sent_local_commands); in i_ipmi_request()
1566 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1571 if (intf->channels[addr->channel].medium in i_ipmi_request()
1573 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1604 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1611 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1623 ipmi_inc_stat(intf, sent_ipmb_responses); in i_ipmi_request()
1636 spin_lock_irqsave(&(intf->seq_lock), flags); in i_ipmi_request()
1642 rv = intf_next_seq(intf, in i_ipmi_request()
1654 spin_unlock_irqrestore(&(intf->seq_lock), in i_ipmi_request()
1659 ipmi_inc_stat(intf, sent_ipmb_commands); in i_ipmi_request()
1688 spin_unlock_irqrestore(&(intf->seq_lock), flags); in i_ipmi_request()
1696 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1701 if ((intf->channels[addr->channel].medium in i_ipmi_request()
1703 && (intf->channels[addr->channel].medium in i_ipmi_request()
1705 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1718 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1725 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1737 ipmi_inc_stat(intf, sent_lan_responses); in i_ipmi_request()
1749 spin_lock_irqsave(&(intf->seq_lock), flags); in i_ipmi_request()
1755 rv = intf_next_seq(intf, in i_ipmi_request()
1767 spin_unlock_irqrestore(&(intf->seq_lock), in i_ipmi_request()
1772 ipmi_inc_stat(intf, sent_lan_commands); in i_ipmi_request()
1800 spin_unlock_irqrestore(&(intf->seq_lock), flags); in i_ipmi_request()
1804 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
1818 handlers->sender(intf->send_info, smi_msg, priority); in i_ipmi_request()
1830 static int check_addr(ipmi_smi_t intf, in check_addr() argument
1837 *lun = intf->channels[addr->channel].lun; in check_addr()
1838 *saddr = intf->channels[addr->channel].address; in check_addr()
1856 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_settime()
1860 user->intf, in ipmi_request_settime()
1888 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_supply_msgs()
1892 user->intf, in ipmi_request_supply_msgs()
1909 ipmi_smi_t intf = m->private; in smi_ipmb_proc_show() local
1912 seq_printf(m, "%x", intf->channels[0].address); in smi_ipmb_proc_show()
1914 seq_printf(m, " %x", intf->channels[i].address); in smi_ipmb_proc_show()
1932 ipmi_smi_t intf = m->private; in smi_version_proc_show() local
1935 ipmi_version_major(&intf->bmc->id), in smi_version_proc_show()
1936 ipmi_version_minor(&intf->bmc->id)); in smi_version_proc_show()
1953 ipmi_smi_t intf = m->private; in smi_stats_proc_show() local
1956 ipmi_get_stat(intf, sent_invalid_commands)); in smi_stats_proc_show()
1958 ipmi_get_stat(intf, sent_local_commands)); in smi_stats_proc_show()
1960 ipmi_get_stat(intf, handled_local_responses)); in smi_stats_proc_show()
1962 ipmi_get_stat(intf, unhandled_local_responses)); in smi_stats_proc_show()
1964 ipmi_get_stat(intf, sent_ipmb_commands)); in smi_stats_proc_show()
1966 ipmi_get_stat(intf, sent_ipmb_command_errs)); in smi_stats_proc_show()
1968 ipmi_get_stat(intf, retransmitted_ipmb_commands)); in smi_stats_proc_show()
1970 ipmi_get_stat(intf, timed_out_ipmb_commands)); in smi_stats_proc_show()
1972 ipmi_get_stat(intf, timed_out_ipmb_broadcasts)); in smi_stats_proc_show()
1974 ipmi_get_stat(intf, sent_ipmb_responses)); in smi_stats_proc_show()
1976 ipmi_get_stat(intf, handled_ipmb_responses)); in smi_stats_proc_show()
1978 ipmi_get_stat(intf, invalid_ipmb_responses)); in smi_stats_proc_show()
1980 ipmi_get_stat(intf, unhandled_ipmb_responses)); in smi_stats_proc_show()
1982 ipmi_get_stat(intf, sent_lan_commands)); in smi_stats_proc_show()
1984 ipmi_get_stat(intf, sent_lan_command_errs)); in smi_stats_proc_show()
1986 ipmi_get_stat(intf, retransmitted_lan_commands)); in smi_stats_proc_show()
1988 ipmi_get_stat(intf, timed_out_lan_commands)); in smi_stats_proc_show()
1990 ipmi_get_stat(intf, sent_lan_responses)); in smi_stats_proc_show()
1992 ipmi_get_stat(intf, handled_lan_responses)); in smi_stats_proc_show()
1994 ipmi_get_stat(intf, invalid_lan_responses)); in smi_stats_proc_show()
1996 ipmi_get_stat(intf, unhandled_lan_responses)); in smi_stats_proc_show()
1998 ipmi_get_stat(intf, handled_commands)); in smi_stats_proc_show()
2000 ipmi_get_stat(intf, invalid_commands)); in smi_stats_proc_show()
2002 ipmi_get_stat(intf, unhandled_commands)); in smi_stats_proc_show()
2004 ipmi_get_stat(intf, invalid_events)); in smi_stats_proc_show()
2006 ipmi_get_stat(intf, events)); in smi_stats_proc_show()
2008 ipmi_get_stat(intf, dropped_rexmit_lan_commands)); in smi_stats_proc_show()
2010 ipmi_get_stat(intf, dropped_rexmit_ipmb_commands)); in smi_stats_proc_show()
2304 static void ipmi_bmc_unregister(ipmi_smi_t intf) in ipmi_bmc_unregister() argument
2306 struct bmc_device *bmc = intf->bmc; in ipmi_bmc_unregister()
2308 if (intf->sysfs_name) { in ipmi_bmc_unregister()
2309 sysfs_remove_link(&intf->si_dev->kobj, intf->sysfs_name); in ipmi_bmc_unregister()
2310 kfree(intf->sysfs_name); in ipmi_bmc_unregister()
2311 intf->sysfs_name = NULL; in ipmi_bmc_unregister()
2313 if (intf->my_dev_name) { in ipmi_bmc_unregister()
2314 sysfs_remove_link(&bmc->dev->dev.kobj, intf->my_dev_name); in ipmi_bmc_unregister()
2315 kfree(intf->my_dev_name); in ipmi_bmc_unregister()
2316 intf->my_dev_name = NULL; in ipmi_bmc_unregister()
2321 intf->bmc = NULL; in ipmi_bmc_unregister()
2458 static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, in ipmi_bmc_register() argument
2462 struct bmc_device *bmc = intf->bmc; in ipmi_bmc_register()
2486 intf->bmc = old_bmc; in ipmi_bmc_register()
2565 dev_info(intf->si_dev, "Found new BMC (man_id: 0x%6.6x, " in ipmi_bmc_register()
2576 intf->sysfs_name = kstrdup(sysfs_name, GFP_KERNEL); in ipmi_bmc_register()
2577 if (!intf->sysfs_name) { in ipmi_bmc_register()
2585 rv = sysfs_create_link(&intf->si_dev->kobj, in ipmi_bmc_register()
2586 &bmc->dev->dev.kobj, intf->sysfs_name); in ipmi_bmc_register()
2588 kfree(intf->sysfs_name); in ipmi_bmc_register()
2589 intf->sysfs_name = NULL; in ipmi_bmc_register()
2597 intf->my_dev_name = kmalloc(size+1, GFP_KERNEL); in ipmi_bmc_register()
2598 if (!intf->my_dev_name) { in ipmi_bmc_register()
2599 kfree(intf->sysfs_name); in ipmi_bmc_register()
2600 intf->sysfs_name = NULL; in ipmi_bmc_register()
2607 snprintf(intf->my_dev_name, size+1, "ipmi%d", ifnum); in ipmi_bmc_register()
2609 rv = sysfs_create_link(&bmc->dev->dev.kobj, &intf->si_dev->kobj, in ipmi_bmc_register()
2610 intf->my_dev_name); in ipmi_bmc_register()
2612 kfree(intf->sysfs_name); in ipmi_bmc_register()
2613 intf->sysfs_name = NULL; in ipmi_bmc_register()
2614 kfree(intf->my_dev_name); in ipmi_bmc_register()
2615 intf->my_dev_name = NULL; in ipmi_bmc_register()
2626 ipmi_bmc_unregister(intf); in ipmi_bmc_register()
2631 send_guid_cmd(ipmi_smi_t intf, int chan) in send_guid_cmd() argument
2645 intf, in send_guid_cmd()
2649 intf, in send_guid_cmd()
2653 intf->channels[0].address, in send_guid_cmd()
2654 intf->channels[0].lun, in send_guid_cmd()
2659 guid_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg) in guid_handler() argument
2669 intf->bmc->guid_set = 0; in guid_handler()
2674 intf->bmc->guid_set = 0; in guid_handler()
2683 memcpy(intf->bmc->guid, msg->msg.data, 16); in guid_handler()
2684 intf->bmc->guid_set = 1; in guid_handler()
2686 wake_up(&intf->waitq); in guid_handler()
2690 get_guid(ipmi_smi_t intf) in get_guid() argument
2694 intf->bmc->guid_set = 0x2; in get_guid()
2695 intf->null_user_handler = guid_handler; in get_guid()
2696 rv = send_guid_cmd(intf, 0); in get_guid()
2699 intf->bmc->guid_set = 0; in get_guid()
2700 wait_event(intf->waitq, intf->bmc->guid_set != 2); in get_guid()
2701 intf->null_user_handler = NULL; in get_guid()
2705 send_channel_info_cmd(ipmi_smi_t intf, int chan) in send_channel_info_cmd() argument
2721 intf, in send_channel_info_cmd()
2725 intf, in send_channel_info_cmd()
2729 intf->channels[0].address, in send_channel_info_cmd()
2730 intf->channels[0].lun, in send_channel_info_cmd()
2735 channel_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg) in channel_handler() argument
2754 intf->channels[0].medium in channel_handler()
2756 intf->channels[0].protocol in channel_handler()
2760 intf->curr_channel = IPMI_MAX_CHANNELS; in channel_handler()
2761 wake_up(&intf->waitq); in channel_handler()
2770 chan = intf->curr_channel; in channel_handler()
2771 intf->channels[chan].medium = msg->msg.data[2] & 0x7f; in channel_handler()
2772 intf->channels[chan].protocol = msg->msg.data[3] & 0x1f; in channel_handler()
2775 intf->curr_channel++; in channel_handler()
2776 if (intf->curr_channel >= IPMI_MAX_CHANNELS) in channel_handler()
2777 wake_up(&intf->waitq); in channel_handler()
2779 rv = send_channel_info_cmd(intf, intf->curr_channel); in channel_handler()
2783 intf->curr_channel = IPMI_MAX_CHANNELS; in channel_handler()
2784 wake_up(&intf->waitq); in channel_handler()
2795 static void ipmi_poll(ipmi_smi_t intf) in ipmi_poll() argument
2797 if (intf->handlers->poll) in ipmi_poll()
2798 intf->handlers->poll(intf->send_info); in ipmi_poll()
2800 handle_new_recv_msgs(intf); in ipmi_poll()
2805 ipmi_poll(user->intf); in ipmi_poll_interface()
2818 ipmi_smi_t intf; in ipmi_register_smi() local
2838 intf = kzalloc(sizeof(*intf), GFP_KERNEL); in ipmi_register_smi()
2839 if (!intf) in ipmi_register_smi()
2842 intf->ipmi_version_major = ipmi_version_major(device_id); in ipmi_register_smi()
2843 intf->ipmi_version_minor = ipmi_version_minor(device_id); in ipmi_register_smi()
2845 intf->bmc = kzalloc(sizeof(*intf->bmc), GFP_KERNEL); in ipmi_register_smi()
2846 if (!intf->bmc) { in ipmi_register_smi()
2847 kfree(intf); in ipmi_register_smi()
2850 intf->intf_num = -1; /* Mark it invalid for now. */ in ipmi_register_smi()
2851 kref_init(&intf->refcount); in ipmi_register_smi()
2852 intf->bmc->id = *device_id; in ipmi_register_smi()
2853 intf->si_dev = si_dev; in ipmi_register_smi()
2855 intf->channels[j].address = IPMI_BMC_SLAVE_ADDR; in ipmi_register_smi()
2856 intf->channels[j].lun = 2; in ipmi_register_smi()
2859 intf->channels[0].address = slave_addr; in ipmi_register_smi()
2860 INIT_LIST_HEAD(&intf->users); in ipmi_register_smi()
2861 intf->handlers = handlers; in ipmi_register_smi()
2862 intf->send_info = send_info; in ipmi_register_smi()
2863 spin_lock_init(&intf->seq_lock); in ipmi_register_smi()
2865 intf->seq_table[j].inuse = 0; in ipmi_register_smi()
2866 intf->seq_table[j].seqid = 0; in ipmi_register_smi()
2868 intf->curr_seq = 0; in ipmi_register_smi()
2870 mutex_init(&intf->proc_entry_lock); in ipmi_register_smi()
2872 spin_lock_init(&intf->waiting_msgs_lock); in ipmi_register_smi()
2873 INIT_LIST_HEAD(&intf->waiting_msgs); in ipmi_register_smi()
2874 tasklet_init(&intf->recv_tasklet, in ipmi_register_smi()
2876 (unsigned long) intf); in ipmi_register_smi()
2877 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 0); in ipmi_register_smi()
2878 spin_lock_init(&intf->events_lock); in ipmi_register_smi()
2879 INIT_LIST_HEAD(&intf->waiting_events); in ipmi_register_smi()
2880 intf->waiting_events_count = 0; in ipmi_register_smi()
2881 mutex_init(&intf->cmd_rcvrs_mutex); in ipmi_register_smi()
2882 spin_lock_init(&intf->maintenance_mode_lock); in ipmi_register_smi()
2883 INIT_LIST_HEAD(&intf->cmd_rcvrs); in ipmi_register_smi()
2884 init_waitqueue_head(&intf->waitq); in ipmi_register_smi()
2886 atomic_set(&intf->stats[i], 0); in ipmi_register_smi()
2888 intf->proc_dir = NULL; in ipmi_register_smi()
2904 list_add_rcu(&intf->link, &ipmi_interfaces); in ipmi_register_smi()
2906 list_add_tail_rcu(&intf->link, link); in ipmi_register_smi()
2908 rv = handlers->start_processing(send_info, intf); in ipmi_register_smi()
2912 get_guid(intf); in ipmi_register_smi()
2914 if ((intf->ipmi_version_major > 1) in ipmi_register_smi()
2915 || ((intf->ipmi_version_major == 1) in ipmi_register_smi()
2916 && (intf->ipmi_version_minor >= 5))) { in ipmi_register_smi()
2921 intf->null_user_handler = channel_handler; in ipmi_register_smi()
2922 intf->curr_channel = 0; in ipmi_register_smi()
2923 rv = send_channel_info_cmd(intf, 0); in ipmi_register_smi()
2928 wait_event(intf->waitq, in ipmi_register_smi()
2929 intf->curr_channel >= IPMI_MAX_CHANNELS); in ipmi_register_smi()
2930 intf->null_user_handler = NULL; in ipmi_register_smi()
2933 intf->channels[0].medium = IPMI_CHANNEL_MEDIUM_IPMB; in ipmi_register_smi()
2934 intf->channels[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB; in ipmi_register_smi()
2935 intf->curr_channel = IPMI_MAX_CHANNELS; in ipmi_register_smi()
2939 rv = add_proc_entries(intf, i); in ipmi_register_smi()
2941 rv = ipmi_bmc_register(intf, i, sysfs_name); in ipmi_register_smi()
2945 if (intf->proc_dir) in ipmi_register_smi()
2946 remove_proc_entries(intf); in ipmi_register_smi()
2947 intf->handlers = NULL; in ipmi_register_smi()
2948 list_del_rcu(&intf->link); in ipmi_register_smi()
2952 kref_put(&intf->refcount, intf_free); in ipmi_register_smi()
2960 intf->intf_num = i; in ipmi_register_smi()
2963 call_smi_watchers(i, intf->si_dev); in ipmi_register_smi()
2971 static void cleanup_smi_msgs(ipmi_smi_t intf) in cleanup_smi_msgs() argument
2978 ent = &(intf->seq_table[i]); in cleanup_smi_msgs()
2985 int ipmi_unregister_smi(ipmi_smi_t intf) in ipmi_unregister_smi() argument
2988 int intf_num = intf->intf_num; in ipmi_unregister_smi()
2990 ipmi_bmc_unregister(intf); in ipmi_unregister_smi()
2994 intf->intf_num = -1; in ipmi_unregister_smi()
2995 intf->handlers = NULL; in ipmi_unregister_smi()
2996 list_del_rcu(&intf->link); in ipmi_unregister_smi()
3000 cleanup_smi_msgs(intf); in ipmi_unregister_smi()
3002 remove_proc_entries(intf); in ipmi_unregister_smi()
3012 kref_put(&intf->refcount, intf_free); in ipmi_unregister_smi()
3017 static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf, in handle_ipmb_get_msg_rsp() argument
3029 ipmi_inc_stat(intf, invalid_ipmb_responses); in handle_ipmb_get_msg_rsp()
3047 if (intf_find_seq(intf, in handle_ipmb_get_msg_rsp()
3058 ipmi_inc_stat(intf, unhandled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3074 ipmi_inc_stat(intf, handled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3080 static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, in handle_ipmb_get_msg_cmd() argument
3095 ipmi_inc_stat(intf, invalid_commands); in handle_ipmb_get_msg_cmd()
3109 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_ipmb_get_msg_cmd()
3119 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_get_msg_cmd()
3127 msg->data[6] = intf->channels[msg->rsp[3] & 0xf].address; in handle_ipmb_get_msg_cmd()
3145 handlers = intf->handlers; in handle_ipmb_get_msg_cmd()
3147 handlers->sender(intf->send_info, msg, 0); in handle_ipmb_get_msg_cmd()
3158 ipmi_inc_stat(intf, handled_commands); in handle_ipmb_get_msg_cmd()
3203 static int handle_lan_get_msg_rsp(ipmi_smi_t intf, in handle_lan_get_msg_rsp() argument
3216 ipmi_inc_stat(intf, invalid_lan_responses); in handle_lan_get_msg_rsp()
3237 if (intf_find_seq(intf, in handle_lan_get_msg_rsp()
3248 ipmi_inc_stat(intf, unhandled_lan_responses); in handle_lan_get_msg_rsp()
3264 ipmi_inc_stat(intf, handled_lan_responses); in handle_lan_get_msg_rsp()
3270 static int handle_lan_get_msg_cmd(ipmi_smi_t intf, in handle_lan_get_msg_cmd() argument
3284 ipmi_inc_stat(intf, invalid_commands); in handle_lan_get_msg_cmd()
3298 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_lan_get_msg_cmd()
3308 ipmi_inc_stat(intf, unhandled_commands); in handle_lan_get_msg_cmd()
3317 ipmi_inc_stat(intf, handled_commands); in handle_lan_get_msg_cmd()
3370 static int handle_oem_get_msg_cmd(ipmi_smi_t intf, in handle_oem_get_msg_cmd() argument
3388 ipmi_inc_stat(intf, invalid_commands); in handle_oem_get_msg_cmd()
3406 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_oem_get_msg_cmd()
3416 ipmi_inc_stat(intf, unhandled_commands); in handle_oem_get_msg_cmd()
3426 ipmi_inc_stat(intf, handled_commands); in handle_oem_get_msg_cmd()
3490 static int handle_read_event_rsp(ipmi_smi_t intf, in handle_read_event_rsp() argument
3502 ipmi_inc_stat(intf, invalid_events); in handle_read_event_rsp()
3513 spin_lock_irqsave(&intf->events_lock, flags); in handle_read_event_rsp()
3515 ipmi_inc_stat(intf, events); in handle_read_event_rsp()
3522 list_for_each_entry_rcu(user, &intf->users, link) { in handle_read_event_rsp()
3558 } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { in handle_read_event_rsp()
3575 list_add_tail(&(recv_msg->link), &(intf->waiting_events)); in handle_read_event_rsp()
3576 intf->waiting_events_count++; in handle_read_event_rsp()
3577 } else if (!intf->event_msg_printed) { in handle_read_event_rsp()
3584 intf->event_msg_printed = 1; in handle_read_event_rsp()
3588 spin_unlock_irqrestore(&(intf->events_lock), flags); in handle_read_event_rsp()
3593 static int handle_bmc_rsp(ipmi_smi_t intf, in handle_bmc_rsp() argument
3613 ipmi_inc_stat(intf, unhandled_local_responses); in handle_bmc_rsp()
3618 ipmi_inc_stat(intf, handled_local_responses); in handle_bmc_rsp()
3644 static int handle_one_recv_msg(ipmi_smi_t intf, in handle_one_recv_msg() argument
3733 if (intf->curr_channel < IPMI_MAX_CHANNELS) { in handle_one_recv_msg()
3738 switch (intf->channels[chan].medium) { in handle_one_recv_msg()
3745 requeue = handle_ipmb_get_msg_rsp(intf, msg); in handle_one_recv_msg()
3751 requeue = handle_ipmb_get_msg_cmd(intf, msg); in handle_one_recv_msg()
3762 requeue = handle_lan_get_msg_rsp(intf, msg); in handle_one_recv_msg()
3768 requeue = handle_lan_get_msg_cmd(intf, msg); in handle_one_recv_msg()
3775 if ((intf->channels[chan].medium in handle_one_recv_msg()
3777 && (intf->channels[chan].medium in handle_one_recv_msg()
3779 requeue = handle_oem_get_msg_cmd(intf, msg); in handle_one_recv_msg()
3792 requeue = handle_read_event_rsp(intf, msg); in handle_one_recv_msg()
3795 requeue = handle_bmc_rsp(intf, msg); in handle_one_recv_msg()
3805 static void handle_new_recv_msgs(ipmi_smi_t intf) in handle_new_recv_msgs() argument
3810 int run_to_completion = intf->run_to_completion; in handle_new_recv_msgs()
3814 spin_lock_irqsave(&intf->waiting_msgs_lock, flags); in handle_new_recv_msgs()
3815 while (!list_empty(&intf->waiting_msgs)) { in handle_new_recv_msgs()
3816 smi_msg = list_entry(intf->waiting_msgs.next, in handle_new_recv_msgs()
3820 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); in handle_new_recv_msgs()
3821 rv = handle_one_recv_msg(intf, smi_msg); in handle_new_recv_msgs()
3823 spin_lock_irqsave(&intf->waiting_msgs_lock, flags); in handle_new_recv_msgs()
3834 list_add(&smi_msg->link, &intf->waiting_msgs); in handle_new_recv_msgs()
3839 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); in handle_new_recv_msgs()
3845 if (atomic_add_unless(&intf->watchdog_pretimeouts_to_deliver, -1, 0)) { in handle_new_recv_msgs()
3849 list_for_each_entry_rcu(user, &intf->users, link) { in handle_new_recv_msgs()
3864 void ipmi_smi_msg_received(ipmi_smi_t intf, in ipmi_smi_msg_received() argument
3898 else if ((intf->channels[chan].medium in ipmi_smi_msg_received()
3900 || (intf->channels[chan].medium in ipmi_smi_msg_received()
3902 ipmi_inc_stat(intf, sent_lan_command_errs); in ipmi_smi_msg_received()
3904 ipmi_inc_stat(intf, sent_ipmb_command_errs); in ipmi_smi_msg_received()
3905 intf_err_seq(intf, msg->msgid, msg->rsp[2]); in ipmi_smi_msg_received()
3908 intf_start_seq_timer(intf, msg->msgid); in ipmi_smi_msg_received()
3918 run_to_completion = intf->run_to_completion; in ipmi_smi_msg_received()
3920 spin_lock_irqsave(&intf->waiting_msgs_lock, flags); in ipmi_smi_msg_received()
3921 list_add_tail(&msg->link, &intf->waiting_msgs); in ipmi_smi_msg_received()
3923 spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); in ipmi_smi_msg_received()
3925 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_msg_received()
3931 void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf) in ipmi_smi_watchdog_pretimeout() argument
3933 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 1); in ipmi_smi_watchdog_pretimeout()
3934 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_watchdog_pretimeout()
3939 smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg, in smi_from_recv_msg() argument
3966 static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent, in check_msg_timeout() argument
3973 if (intf->intf_num == -1) in check_msg_timeout()
3989 ipmi_inc_stat(intf, timed_out_ipmb_broadcasts); in check_msg_timeout()
3991 ipmi_inc_stat(intf, timed_out_lan_commands); in check_msg_timeout()
3993 ipmi_inc_stat(intf, timed_out_ipmb_commands); in check_msg_timeout()
4004 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot, in check_msg_timeout()
4008 ipmi_inc_stat(intf, in check_msg_timeout()
4011 ipmi_inc_stat(intf, in check_msg_timeout()
4016 spin_unlock_irqrestore(&intf->seq_lock, *flags); in check_msg_timeout()
4025 handlers = intf->handlers; in check_msg_timeout()
4028 ipmi_inc_stat(intf, in check_msg_timeout()
4031 ipmi_inc_stat(intf, in check_msg_timeout()
4034 intf->handlers->sender(intf->send_info, in check_msg_timeout()
4039 spin_lock_irqsave(&intf->seq_lock, *flags); in check_msg_timeout()
4045 ipmi_smi_t intf; in ipmi_timeout_handler() local
4052 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_timeout_handler()
4053 tasklet_schedule(&intf->recv_tasklet); in ipmi_timeout_handler()
4061 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_timeout_handler()
4063 check_msg_timeout(intf, &(intf->seq_table[i]), in ipmi_timeout_handler()
4066 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_timeout_handler()
4079 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4080 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_timeout_handler()
4081 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4082 intf->auto_maintenance_timeout in ipmi_timeout_handler()
4084 if (!intf->maintenance_mode in ipmi_timeout_handler()
4085 && (intf->auto_maintenance_timeout <= 0)) { in ipmi_timeout_handler()
4086 intf->maintenance_mode_enable = 0; in ipmi_timeout_handler()
4087 maintenance_mode_update(intf); in ipmi_timeout_handler()
4090 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in ipmi_timeout_handler()
4099 ipmi_smi_t intf; in ipmi_request_event() local
4107 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_request_event()
4109 if (intf->maintenance_mode_enable) in ipmi_request_event()
4112 handlers = intf->handlers; in ipmi_request_event()
4114 handlers->request_events(intf->send_info); in ipmi_request_event()
4222 static void ipmi_panic_request_and_wait(ipmi_smi_t intf, in ipmi_panic_request_and_wait() argument
4234 intf, in ipmi_panic_request_and_wait()
4238 intf, in ipmi_panic_request_and_wait()
4242 intf->channels[0].address, in ipmi_panic_request_and_wait()
4243 intf->channels[0].lun, in ipmi_panic_request_and_wait()
4248 ipmi_poll(intf); in ipmi_panic_request_and_wait()
4252 static void event_receiver_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg) in event_receiver_fetcher() argument
4259 intf->event_receiver = msg->msg.data[1]; in event_receiver_fetcher()
4260 intf->event_receiver_lun = msg->msg.data[2] & 0x3; in event_receiver_fetcher()
4264 static void device_id_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg) in device_id_fetcher() argument
4274 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; in device_id_fetcher()
4275 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; in device_id_fetcher()
4283 ipmi_smi_t intf; in send_panic_events() local
4315 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in send_panic_events()
4316 if (!intf->handlers) in send_panic_events()
4320 intf->run_to_completion = 1; in send_panic_events()
4322 intf->handlers->set_run_to_completion(intf->send_info, 1); in send_panic_events()
4323 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4335 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in send_panic_events()
4340 if (intf->intf_num == -1) in send_panic_events()
4361 intf->local_sel_device = 0; in send_panic_events()
4362 intf->local_event_generator = 0; in send_panic_events()
4363 intf->event_receiver = 0; in send_panic_events()
4370 intf->null_user_handler = device_id_fetcher; in send_panic_events()
4371 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4373 if (intf->local_event_generator) { in send_panic_events()
4379 intf->null_user_handler = event_receiver_fetcher; in send_panic_events()
4380 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4382 intf->null_user_handler = NULL; in send_panic_events()
4389 if (((intf->event_receiver & 1) == 0) in send_panic_events()
4390 && (intf->event_receiver != 0) in send_panic_events()
4391 && (intf->event_receiver != intf->channels[0].address)) { in send_panic_events()
4399 ipmb->lun = intf->event_receiver_lun; in send_panic_events()
4400 ipmb->slave_addr = intf->event_receiver; in send_panic_events()
4401 } else if (intf->local_sel_device) { in send_panic_events()
4428 data[3] = intf->channels[0].address; in send_panic_events()
4437 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4450 ipmi_smi_t intf; in panic_event() local
4457 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in panic_event()
4458 if (!intf->handlers) in panic_event()
4462 intf->run_to_completion = 1; in panic_event()
4463 intf->handlers->set_run_to_completion(intf->send_info, 1); in panic_event()