Lines Matching refs:intf
42 static void handle_new_recv_msgs(struct ipmi_smi *intf);
43 static void need_waiter(struct ipmi_smi *intf);
44 static int handle_one_recv_msg(struct ipmi_smi *intf,
213 struct ipmi_smi *intf; member
341 static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc,
587 void (*null_user_handler)(struct ipmi_smi *intf,
614 static void __get_guid(struct ipmi_smi *intf);
615 static void __ipmi_bmc_unregister(struct ipmi_smi *intf);
616 static int __ipmi_bmc_register(struct ipmi_smi *intf,
619 static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id);
646 #define ipmi_inc_stat(intf, stat) \ argument
647 atomic_inc(&(intf)->stats[IPMI_STAT_ ## stat])
648 #define ipmi_get_stat(intf, stat) \ argument
649 ((unsigned int) atomic_read(&(intf)->stats[IPMI_STAT_ ## stat]))
699 static void clean_up_interface_data(struct ipmi_smi *intf) in clean_up_interface_data() argument
705 tasklet_kill(&intf->recv_tasklet); in clean_up_interface_data()
707 free_smi_msg_list(&intf->waiting_rcv_msgs); in clean_up_interface_data()
708 free_recv_msg_list(&intf->waiting_events); in clean_up_interface_data()
714 mutex_lock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
716 list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu); in clean_up_interface_data()
717 mutex_unlock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
723 if ((intf->seq_table[i].inuse) in clean_up_interface_data()
724 && (intf->seq_table[i].recv_msg)) in clean_up_interface_data()
725 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in clean_up_interface_data()
731 struct ipmi_smi *intf = container_of(ref, struct ipmi_smi, refcount); in intf_free() local
733 clean_up_interface_data(intf); in intf_free()
734 kfree(intf); in intf_free()
739 struct ipmi_smi *intf; member
745 struct ipmi_smi *intf; in ipmi_smi_watcher_register() local
761 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_smi_watcher_register()
762 int intf_num = READ_ONCE(intf->intf_num); in ipmi_smi_watcher_register()
766 watcher->new_smi(intf_num, intf->si_dev); in ipmi_smi_watcher_register()
894 static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in deliver_response() argument
900 if (intf->null_user_handler) { in deliver_response()
901 intf->null_user_handler(intf, msg); in deliver_response()
931 static void deliver_local_response(struct ipmi_smi *intf, in deliver_local_response() argument
934 if (deliver_response(intf, msg)) in deliver_local_response()
935 ipmi_inc_stat(intf, unhandled_local_responses); in deliver_local_response()
937 ipmi_inc_stat(intf, handled_local_responses); in deliver_local_response()
940 static void deliver_err_response(struct ipmi_smi *intf, in deliver_err_response() argument
948 deliver_local_response(intf, msg); in deliver_err_response()
951 static void smi_add_watch(struct ipmi_smi *intf, unsigned int flags) in smi_add_watch() argument
955 if (!intf->handlers->set_need_watch) in smi_add_watch()
958 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_add_watch()
960 intf->response_waiters++; in smi_add_watch()
963 intf->watchdog_waiters++; in smi_add_watch()
966 intf->command_waiters++; in smi_add_watch()
968 if ((intf->last_watch_mask & flags) != flags) { in smi_add_watch()
969 intf->last_watch_mask |= flags; in smi_add_watch()
970 intf->handlers->set_need_watch(intf->send_info, in smi_add_watch()
971 intf->last_watch_mask); in smi_add_watch()
973 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_add_watch()
976 static void smi_remove_watch(struct ipmi_smi *intf, unsigned int flags) in smi_remove_watch() argument
980 if (!intf->handlers->set_need_watch) in smi_remove_watch()
983 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_remove_watch()
985 intf->response_waiters--; in smi_remove_watch()
988 intf->watchdog_waiters--; in smi_remove_watch()
991 intf->command_waiters--; in smi_remove_watch()
994 if (intf->response_waiters) in smi_remove_watch()
996 if (intf->watchdog_waiters) in smi_remove_watch()
998 if (intf->command_waiters) in smi_remove_watch()
1001 if (intf->last_watch_mask != flags) { in smi_remove_watch()
1002 intf->last_watch_mask = flags; in smi_remove_watch()
1003 intf->handlers->set_need_watch(intf->send_info, in smi_remove_watch()
1004 intf->last_watch_mask); in smi_remove_watch()
1006 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_remove_watch()
1014 static int intf_next_seq(struct ipmi_smi *intf, in intf_next_seq() argument
1030 for (i = intf->curr_seq; (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; in intf_next_seq()
1032 if (!intf->seq_table[i].inuse) in intf_next_seq()
1036 if (!intf->seq_table[i].inuse) { in intf_next_seq()
1037 intf->seq_table[i].recv_msg = recv_msg; in intf_next_seq()
1043 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; in intf_next_seq()
1044 intf->seq_table[i].orig_timeout = timeout; in intf_next_seq()
1045 intf->seq_table[i].retries_left = retries; in intf_next_seq()
1046 intf->seq_table[i].broadcast = broadcast; in intf_next_seq()
1047 intf->seq_table[i].inuse = 1; in intf_next_seq()
1048 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid); in intf_next_seq()
1050 *seqid = intf->seq_table[i].seqid; in intf_next_seq()
1051 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ; in intf_next_seq()
1052 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_next_seq()
1053 need_waiter(intf); in intf_next_seq()
1068 static int intf_find_seq(struct ipmi_smi *intf, in intf_find_seq() argument
1082 spin_lock_irqsave(&intf->seq_lock, flags); in intf_find_seq()
1083 if (intf->seq_table[seq].inuse) { in intf_find_seq()
1084 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; in intf_find_seq()
1090 intf->seq_table[seq].inuse = 0; in intf_find_seq()
1091 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_find_seq()
1095 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_find_seq()
1102 static int intf_start_seq_timer(struct ipmi_smi *intf, in intf_start_seq_timer() argument
1113 spin_lock_irqsave(&intf->seq_lock, flags); in intf_start_seq_timer()
1118 if ((intf->seq_table[seq].inuse) in intf_start_seq_timer()
1119 && (intf->seq_table[seq].seqid == seqid)) { in intf_start_seq_timer()
1120 struct seq_table *ent = &intf->seq_table[seq]; in intf_start_seq_timer()
1124 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_start_seq_timer()
1130 static int intf_err_seq(struct ipmi_smi *intf, in intf_err_seq() argument
1143 spin_lock_irqsave(&intf->seq_lock, flags); in intf_err_seq()
1148 if ((intf->seq_table[seq].inuse) in intf_err_seq()
1149 && (intf->seq_table[seq].seqid == seqid)) { in intf_err_seq()
1150 struct seq_table *ent = &intf->seq_table[seq]; in intf_err_seq()
1153 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_err_seq()
1157 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_err_seq()
1160 deliver_err_response(intf, msg, err); in intf_err_seq()
1182 struct ipmi_smi *intf; in ipmi_create_user() local
1208 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_create_user()
1209 if (intf->intf_num == if_num) in ipmi_create_user()
1224 kref_get(&intf->refcount); in ipmi_create_user()
1229 new_user->intf = intf; in ipmi_create_user()
1233 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_create_user()
1234 list_add_rcu(&new_user->link, &intf->users); in ipmi_create_user()
1235 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_create_user()
1238 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); in ipmi_create_user()
1253 struct ipmi_smi *intf; in ipmi_get_smi_info() local
1256 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_get_smi_info()
1257 if (intf->intf_num == if_num) in ipmi_get_smi_info()
1266 if (!intf->handlers->get_smi_info) in ipmi_get_smi_info()
1269 rv = intf->handlers->get_smi_info(intf->send_info, data); in ipmi_get_smi_info()
1286 struct ipmi_smi *intf = user->intf; in _ipmi_destroy_user() local
1310 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); in _ipmi_destroy_user()
1313 atomic_dec(&intf->event_waiters); in _ipmi_destroy_user()
1316 spin_lock_irqsave(&intf->seq_lock, flags); in _ipmi_destroy_user()
1320 if (intf->seq_table[i].inuse in _ipmi_destroy_user()
1321 && (intf->seq_table[i].recv_msg->user == user)) { in _ipmi_destroy_user()
1322 intf->seq_table[i].inuse = 0; in _ipmi_destroy_user()
1323 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in _ipmi_destroy_user()
1324 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in _ipmi_destroy_user()
1327 spin_unlock_irqrestore(&intf->seq_lock, flags); in _ipmi_destroy_user()
1335 mutex_lock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1336 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { in _ipmi_destroy_user()
1343 mutex_unlock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1351 kref_put(&intf->refcount, intf_free); in _ipmi_destroy_user()
1375 rv = bmc_get_device_id(user->intf, NULL, &id, NULL, NULL); in ipmi_get_version()
1400 user->intf->addrinfo[channel].address = address; in ipmi_set_my_address()
1422 *address = user->intf->addrinfo[channel].address; in ipmi_get_my_address()
1444 user->intf->addrinfo[channel].lun = LUN & 0x3; in ipmi_set_my_LUN()
1466 *address = user->intf->addrinfo[channel].lun; in ipmi_get_my_LUN()
1483 spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1484 mode = user->intf->maintenance_mode; in ipmi_get_maintenance_mode()
1485 spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1492 static void maintenance_mode_update(struct ipmi_smi *intf) in maintenance_mode_update() argument
1494 if (intf->handlers->set_maintenance_mode) in maintenance_mode_update()
1495 intf->handlers->set_maintenance_mode( in maintenance_mode_update()
1496 intf->send_info, intf->maintenance_mode_enable); in maintenance_mode_update()
1503 struct ipmi_smi *intf = user->intf; in ipmi_set_maintenance_mode() local
1509 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1510 if (intf->maintenance_mode != mode) { in ipmi_set_maintenance_mode()
1513 intf->maintenance_mode_enable in ipmi_set_maintenance_mode()
1514 = (intf->auto_maintenance_timeout > 0); in ipmi_set_maintenance_mode()
1518 intf->maintenance_mode_enable = false; in ipmi_set_maintenance_mode()
1522 intf->maintenance_mode_enable = true; in ipmi_set_maintenance_mode()
1529 intf->maintenance_mode = mode; in ipmi_set_maintenance_mode()
1531 maintenance_mode_update(intf); in ipmi_set_maintenance_mode()
1534 spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1544 struct ipmi_smi *intf = user->intf; in ipmi_set_gets_events() local
1555 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1562 if (atomic_inc_return(&intf->event_waiters) == 1) in ipmi_set_gets_events()
1563 need_waiter(intf); in ipmi_set_gets_events()
1565 atomic_dec(&intf->event_waiters); in ipmi_set_gets_events()
1568 if (intf->delivering_events) in ipmi_set_gets_events()
1576 while (user->gets_events && !list_empty(&intf->waiting_events)) { in ipmi_set_gets_events()
1577 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link) in ipmi_set_gets_events()
1579 intf->waiting_events_count = 0; in ipmi_set_gets_events()
1580 if (intf->event_msg_printed) { in ipmi_set_gets_events()
1581 dev_warn(intf->si_dev, "Event queue no longer full\n"); in ipmi_set_gets_events()
1582 intf->event_msg_printed = 0; in ipmi_set_gets_events()
1585 intf->delivering_events = 1; in ipmi_set_gets_events()
1586 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1591 deliver_local_response(intf, msg); in ipmi_set_gets_events()
1594 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1595 intf->delivering_events = 0; in ipmi_set_gets_events()
1599 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1606 static struct cmd_rcvr *find_cmd_rcvr(struct ipmi_smi *intf, in find_cmd_rcvr() argument
1613 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { in find_cmd_rcvr()
1621 static int is_cmd_rcvr_exclusive(struct ipmi_smi *intf, in is_cmd_rcvr_exclusive() argument
1628 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { in is_cmd_rcvr_exclusive()
1641 struct ipmi_smi *intf = user->intf; in ipmi_register_for_cmd() local
1659 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1661 if (!is_cmd_rcvr_exclusive(intf, netfn, cmd, chans)) { in ipmi_register_for_cmd()
1666 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS); in ipmi_register_for_cmd()
1668 list_add_rcu(&rcvr->link, &intf->cmd_rcvrs); in ipmi_register_for_cmd()
1671 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1686 struct ipmi_smi *intf = user->intf; in ipmi_unregister_for_cmd() local
1695 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1699 rcvr = find_cmd_rcvr(intf, netfn, cmd, i); in ipmi_unregister_for_cmd()
1712 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1716 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS); in ipmi_unregister_for_cmd()
1816 static struct ipmi_smi_msg *smi_add_send_msg(struct ipmi_smi *intf, in smi_add_send_msg() argument
1820 if (intf->curr_msg) { in smi_add_send_msg()
1822 list_add_tail(&smi_msg->link, &intf->hp_xmit_msgs); in smi_add_send_msg()
1824 list_add_tail(&smi_msg->link, &intf->xmit_msgs); in smi_add_send_msg()
1827 intf->curr_msg = smi_msg; in smi_add_send_msg()
1833 static void smi_send(struct ipmi_smi *intf, in smi_send() argument
1837 int run_to_completion = intf->run_to_completion; in smi_send()
1841 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in smi_send()
1842 smi_msg = smi_add_send_msg(intf, smi_msg, priority); in smi_send()
1845 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in smi_send()
1848 handlers->sender(intf->send_info, smi_msg); in smi_send()
1859 static int i_ipmi_req_sysintf(struct ipmi_smi *intf, in i_ipmi_req_sysintf() argument
1876 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_sysintf()
1890 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_sysintf()
1897 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in i_ipmi_req_sysintf()
1898 intf->auto_maintenance_timeout in i_ipmi_req_sysintf()
1900 if (!intf->maintenance_mode in i_ipmi_req_sysintf()
1901 && !intf->maintenance_mode_enable) { in i_ipmi_req_sysintf()
1902 intf->maintenance_mode_enable = true; in i_ipmi_req_sysintf()
1903 maintenance_mode_update(intf); in i_ipmi_req_sysintf()
1905 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in i_ipmi_req_sysintf()
1910 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_sysintf()
1921 ipmi_inc_stat(intf, sent_local_commands); in i_ipmi_req_sysintf()
1926 static int i_ipmi_req_ipmb(struct ipmi_smi *intf, in i_ipmi_req_ipmb() argument
1945 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
1949 chans = READ_ONCE(intf->channel_list)->c; in i_ipmi_req_ipmb()
1952 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
1972 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
1978 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
1989 ipmi_inc_stat(intf, sent_ipmb_responses); in i_ipmi_req_ipmb()
2003 spin_lock_irqsave(&intf->seq_lock, flags); in i_ipmi_req_ipmb()
2006 intf->ipmb_maintenance_mode_timeout = in i_ipmi_req_ipmb()
2009 if (intf->ipmb_maintenance_mode_timeout && retry_time_ms == 0) in i_ipmi_req_ipmb()
2017 rv = intf_next_seq(intf, in i_ipmi_req_ipmb()
2031 ipmi_inc_stat(intf, sent_ipmb_commands); in i_ipmi_req_ipmb()
2061 spin_unlock_irqrestore(&intf->seq_lock, flags); in i_ipmi_req_ipmb()
2067 static int i_ipmi_req_lan(struct ipmi_smi *intf, in i_ipmi_req_lan() argument
2084 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2088 chans = READ_ONCE(intf->channel_list)->c; in i_ipmi_req_lan()
2094 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2100 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2106 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2117 ipmi_inc_stat(intf, sent_lan_responses); in i_ipmi_req_lan()
2130 spin_lock_irqsave(&intf->seq_lock, flags); in i_ipmi_req_lan()
2136 rv = intf_next_seq(intf, in i_ipmi_req_lan()
2150 ipmi_inc_stat(intf, sent_lan_commands); in i_ipmi_req_lan()
2179 spin_unlock_irqrestore(&intf->seq_lock, flags); in i_ipmi_req_lan()
2192 struct ipmi_smi *intf, in i_ipmi_request() argument
2233 if (intf->in_shutdown) { in i_ipmi_request()
2250 rv = i_ipmi_req_sysintf(intf, addr, msgid, msg, smi_msg, in i_ipmi_request()
2253 rv = i_ipmi_req_ipmb(intf, addr, msgid, msg, smi_msg, recv_msg, in i_ipmi_request()
2257 rv = i_ipmi_req_lan(intf, addr, msgid, msg, smi_msg, recv_msg, in i_ipmi_request()
2261 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
2272 smi_send(intf, intf->handlers, smi_msg, priority); in i_ipmi_request()
2280 static int check_addr(struct ipmi_smi *intf, in check_addr() argument
2288 *lun = intf->addrinfo[addr->channel].lun; in check_addr()
2289 *saddr = intf->addrinfo[addr->channel].address; in check_addr()
2312 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_settime()
2315 user->intf, in ipmi_request_settime()
2351 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_supply_msgs()
2354 user->intf, in ipmi_request_supply_msgs()
2371 static void bmc_device_id_handler(struct ipmi_smi *intf, in bmc_device_id_handler() argument
2379 dev_warn(intf->si_dev, in bmc_device_id_handler()
2386 msg->msg.data, msg->msg.data_len, &intf->bmc->fetch_id); in bmc_device_id_handler()
2388 dev_warn(intf->si_dev, "device id demangle failed: %d\n", rv); in bmc_device_id_handler()
2389 intf->bmc->dyn_id_set = 0; in bmc_device_id_handler()
2396 intf->bmc->dyn_id_set = 1; in bmc_device_id_handler()
2399 wake_up(&intf->waitq); in bmc_device_id_handler()
2403 send_get_device_id_cmd(struct ipmi_smi *intf) in send_get_device_id_cmd() argument
2418 intf, in send_get_device_id_cmd()
2422 intf, in send_get_device_id_cmd()
2426 intf->addrinfo[0].address, in send_get_device_id_cmd()
2427 intf->addrinfo[0].lun, in send_get_device_id_cmd()
2431 static int __get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc) in __get_device_id() argument
2437 intf->null_user_handler = bmc_device_id_handler; in __get_device_id()
2439 rv = send_get_device_id_cmd(intf); in __get_device_id()
2443 wait_event(intf->waitq, bmc->dyn_id_set != 2); in __get_device_id()
2451 intf->null_user_handler = NULL; in __get_device_id()
2465 static int __bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc, in __bmc_get_device_id() argument
2471 bool intf_set = intf != NULL; in __bmc_get_device_id()
2473 if (!intf) { in __bmc_get_device_id()
2480 intf = list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2482 kref_get(&intf->refcount); in __bmc_get_device_id()
2484 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2486 if (intf != list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2488 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2489 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2493 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2494 bmc = intf->bmc; in __bmc_get_device_id()
2496 kref_get(&intf->refcount); in __bmc_get_device_id()
2500 if (intf->in_bmc_register || in __bmc_get_device_id()
2505 __get_guid(intf); in __bmc_get_device_id()
2508 rv = __get_device_id(intf, bmc); in __bmc_get_device_id()
2516 if (!intf->bmc_registered in __bmc_get_device_id()
2531 __ipmi_bmc_unregister(intf); in __bmc_get_device_id()
2533 intf->bmc->id = id; in __bmc_get_device_id()
2534 intf->bmc->dyn_guid_set = guid_set; in __bmc_get_device_id()
2535 intf->bmc->guid = guid; in __bmc_get_device_id()
2536 if (__ipmi_bmc_register(intf, &id, guid_set, &guid, intf_num)) in __bmc_get_device_id()
2537 need_waiter(intf); /* Retry later on an error. */ in __bmc_get_device_id()
2539 __scan_channels(intf, &id); in __bmc_get_device_id()
2548 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2554 bmc = intf->bmc; in __bmc_get_device_id()
2559 __scan_channels(intf, &bmc->fetch_id); in __bmc_get_device_id()
2592 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2594 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2598 static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc, in bmc_get_device_id() argument
2602 return __bmc_get_device_id(intf, bmc, id, guid_set, guid, -1); in bmc_get_device_id()
2936 static void __ipmi_bmc_unregister(struct ipmi_smi *intf) in __ipmi_bmc_unregister() argument
2938 struct bmc_device *bmc = intf->bmc; in __ipmi_bmc_unregister()
2940 if (!intf->bmc_registered) in __ipmi_bmc_unregister()
2943 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_unregister()
2944 sysfs_remove_link(&bmc->pdev.dev.kobj, intf->my_dev_name); in __ipmi_bmc_unregister()
2945 kfree(intf->my_dev_name); in __ipmi_bmc_unregister()
2946 intf->my_dev_name = NULL; in __ipmi_bmc_unregister()
2949 list_del(&intf->bmc_link); in __ipmi_bmc_unregister()
2951 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_unregister()
2953 intf->bmc_registered = false; in __ipmi_bmc_unregister()
2956 static void ipmi_bmc_unregister(struct ipmi_smi *intf) in ipmi_bmc_unregister() argument
2958 mutex_lock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
2959 __ipmi_bmc_unregister(intf); in ipmi_bmc_unregister()
2960 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
2966 static int __ipmi_bmc_register(struct ipmi_smi *intf, in __ipmi_bmc_register() argument
2980 intf->in_bmc_register = true; in __ipmi_bmc_register()
2981 mutex_unlock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3005 intf->bmc = old_bmc; in __ipmi_bmc_register()
3007 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3010 dev_info(intf->si_dev, in __ipmi_bmc_register()
3042 intf->bmc = bmc; in __ipmi_bmc_register()
3044 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3049 dev_err(intf->si_dev, in __ipmi_bmc_register()
3055 dev_info(intf->si_dev, in __ipmi_bmc_register()
3066 rv = sysfs_create_link(&intf->si_dev->kobj, &bmc->pdev.dev.kobj, "bmc"); in __ipmi_bmc_register()
3068 dev_err(intf->si_dev, "Unable to create bmc symlink: %d\n", rv); in __ipmi_bmc_register()
3073 intf_num = intf->intf_num; in __ipmi_bmc_register()
3074 intf->my_dev_name = kasprintf(GFP_KERNEL, "ipmi%d", intf_num); in __ipmi_bmc_register()
3075 if (!intf->my_dev_name) { in __ipmi_bmc_register()
3077 dev_err(intf->si_dev, "Unable to allocate link from BMC: %d\n", in __ipmi_bmc_register()
3082 rv = sysfs_create_link(&bmc->pdev.dev.kobj, &intf->si_dev->kobj, in __ipmi_bmc_register()
3083 intf->my_dev_name); in __ipmi_bmc_register()
3085 kfree(intf->my_dev_name); in __ipmi_bmc_register()
3086 intf->my_dev_name = NULL; in __ipmi_bmc_register()
3087 dev_err(intf->si_dev, "Unable to create symlink to bmc: %d\n", in __ipmi_bmc_register()
3092 intf->bmc_registered = true; in __ipmi_bmc_register()
3096 mutex_lock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3097 intf->in_bmc_register = false; in __ipmi_bmc_register()
3102 kfree(intf->my_dev_name); in __ipmi_bmc_register()
3103 intf->my_dev_name = NULL; in __ipmi_bmc_register()
3106 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_register()
3110 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3112 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3118 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3120 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3126 send_guid_cmd(struct ipmi_smi *intf, int chan) in send_guid_cmd() argument
3140 intf, in send_guid_cmd()
3144 intf, in send_guid_cmd()
3148 intf->addrinfo[0].address, in send_guid_cmd()
3149 intf->addrinfo[0].lun, in send_guid_cmd()
3153 static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in guid_handler() argument
3155 struct bmc_device *bmc = intf->bmc; in guid_handler()
3171 dev_warn(intf->si_dev, in guid_handler()
3185 wake_up(&intf->waitq); in guid_handler()
3188 static void __get_guid(struct ipmi_smi *intf) in __get_guid() argument
3191 struct bmc_device *bmc = intf->bmc; in __get_guid()
3194 intf->null_user_handler = guid_handler; in __get_guid()
3195 rv = send_guid_cmd(intf, 0); in __get_guid()
3200 wait_event(intf->waitq, bmc->dyn_guid_set != 2); in __get_guid()
3205 intf->null_user_handler = NULL; in __get_guid()
3209 send_channel_info_cmd(struct ipmi_smi *intf, int chan) in send_channel_info_cmd() argument
3225 intf, in send_channel_info_cmd()
3229 intf, in send_channel_info_cmd()
3233 intf->addrinfo[0].address, in send_channel_info_cmd()
3234 intf->addrinfo[0].lun, in send_channel_info_cmd()
3239 channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in channel_handler() argument
3243 unsigned int set = intf->curr_working_cset; in channel_handler()
3260 intf->wchannels[set].c[0].medium in channel_handler()
3262 intf->wchannels[set].c[0].protocol in channel_handler()
3265 intf->channel_list = intf->wchannels + set; in channel_handler()
3266 intf->channels_ready = true; in channel_handler()
3267 wake_up(&intf->waitq); in channel_handler()
3276 ch = intf->curr_channel; in channel_handler()
3277 chans = intf->wchannels[set].c; in channel_handler()
3282 intf->curr_channel++; in channel_handler()
3283 if (intf->curr_channel >= IPMI_MAX_CHANNELS) { in channel_handler()
3284 intf->channel_list = intf->wchannels + set; in channel_handler()
3285 intf->channels_ready = true; in channel_handler()
3286 wake_up(&intf->waitq); in channel_handler()
3288 intf->channel_list = intf->wchannels + set; in channel_handler()
3289 intf->channels_ready = true; in channel_handler()
3290 rv = send_channel_info_cmd(intf, intf->curr_channel); in channel_handler()
3295 dev_warn(intf->si_dev, in channel_handler()
3297 intf->curr_channel, rv); in channel_handler()
3299 intf->channel_list = intf->wchannels + set; in channel_handler()
3300 intf->channels_ready = true; in channel_handler()
3301 wake_up(&intf->waitq); in channel_handler()
3311 static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id) in __scan_channels() argument
3324 set = !intf->curr_working_cset; in __scan_channels()
3325 intf->curr_working_cset = set; in __scan_channels()
3326 memset(&intf->wchannels[set], 0, in __scan_channels()
3329 intf->null_user_handler = channel_handler; in __scan_channels()
3330 intf->curr_channel = 0; in __scan_channels()
3331 rv = send_channel_info_cmd(intf, 0); in __scan_channels()
3333 dev_warn(intf->si_dev, in __scan_channels()
3340 wait_event(intf->waitq, intf->channels_ready); in __scan_channels()
3341 intf->null_user_handler = NULL; in __scan_channels()
3343 unsigned int set = intf->curr_working_cset; in __scan_channels()
3346 intf->wchannels[set].c[0].medium = IPMI_CHANNEL_MEDIUM_IPMB; in __scan_channels()
3347 intf->wchannels[set].c[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB; in __scan_channels()
3348 intf->channel_list = intf->wchannels + set; in __scan_channels()
3349 intf->channels_ready = true; in __scan_channels()
3355 static void ipmi_poll(struct ipmi_smi *intf) in ipmi_poll() argument
3357 if (intf->handlers->poll) in ipmi_poll()
3358 intf->handlers->poll(intf->send_info); in ipmi_poll()
3360 handle_new_recv_msgs(intf); in ipmi_poll()
3365 ipmi_poll(user->intf); in ipmi_poll_interface()
3371 struct ipmi_smi *intf = container_of(work, struct ipmi_smi, in redo_bmc_reg() local
3374 if (!intf->in_shutdown) in redo_bmc_reg()
3375 bmc_get_device_id(intf, NULL, NULL, NULL, NULL); in redo_bmc_reg()
3377 kref_put(&intf->refcount, intf_free); in redo_bmc_reg()
3387 struct ipmi_smi *intf, *tintf; in ipmi_register_smi() local
3399 intf = kzalloc(sizeof(*intf), GFP_KERNEL); in ipmi_register_smi()
3400 if (!intf) in ipmi_register_smi()
3403 rv = init_srcu_struct(&intf->users_srcu); in ipmi_register_smi()
3405 kfree(intf); in ipmi_register_smi()
3410 intf->bmc = &intf->tmp_bmc; in ipmi_register_smi()
3411 INIT_LIST_HEAD(&intf->bmc->intfs); in ipmi_register_smi()
3412 mutex_init(&intf->bmc->dyn_mutex); in ipmi_register_smi()
3413 INIT_LIST_HEAD(&intf->bmc_link); in ipmi_register_smi()
3414 mutex_init(&intf->bmc_reg_mutex); in ipmi_register_smi()
3415 intf->intf_num = -1; /* Mark it invalid for now. */ in ipmi_register_smi()
3416 kref_init(&intf->refcount); in ipmi_register_smi()
3417 INIT_WORK(&intf->bmc_reg_work, redo_bmc_reg); in ipmi_register_smi()
3418 intf->si_dev = si_dev; in ipmi_register_smi()
3420 intf->addrinfo[j].address = IPMI_BMC_SLAVE_ADDR; in ipmi_register_smi()
3421 intf->addrinfo[j].lun = 2; in ipmi_register_smi()
3424 intf->addrinfo[0].address = slave_addr; in ipmi_register_smi()
3425 INIT_LIST_HEAD(&intf->users); in ipmi_register_smi()
3426 intf->handlers = handlers; in ipmi_register_smi()
3427 intf->send_info = send_info; in ipmi_register_smi()
3428 spin_lock_init(&intf->seq_lock); in ipmi_register_smi()
3430 intf->seq_table[j].inuse = 0; in ipmi_register_smi()
3431 intf->seq_table[j].seqid = 0; in ipmi_register_smi()
3433 intf->curr_seq = 0; in ipmi_register_smi()
3434 spin_lock_init(&intf->waiting_rcv_msgs_lock); in ipmi_register_smi()
3435 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in ipmi_register_smi()
3436 tasklet_init(&intf->recv_tasklet, in ipmi_register_smi()
3438 (unsigned long) intf); in ipmi_register_smi()
3439 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 0); in ipmi_register_smi()
3440 spin_lock_init(&intf->xmit_msgs_lock); in ipmi_register_smi()
3441 INIT_LIST_HEAD(&intf->xmit_msgs); in ipmi_register_smi()
3442 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in ipmi_register_smi()
3443 spin_lock_init(&intf->events_lock); in ipmi_register_smi()
3444 spin_lock_init(&intf->watch_lock); in ipmi_register_smi()
3445 atomic_set(&intf->event_waiters, 0); in ipmi_register_smi()
3446 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_register_smi()
3447 INIT_LIST_HEAD(&intf->waiting_events); in ipmi_register_smi()
3448 intf->waiting_events_count = 0; in ipmi_register_smi()
3449 mutex_init(&intf->cmd_rcvrs_mutex); in ipmi_register_smi()
3450 spin_lock_init(&intf->maintenance_mode_lock); in ipmi_register_smi()
3451 INIT_LIST_HEAD(&intf->cmd_rcvrs); in ipmi_register_smi()
3452 init_waitqueue_head(&intf->waitq); in ipmi_register_smi()
3454 atomic_set(&intf->stats[i], 0); in ipmi_register_smi()
3469 list_add_rcu(&intf->link, &ipmi_interfaces); in ipmi_register_smi()
3471 list_add_tail_rcu(&intf->link, link); in ipmi_register_smi()
3473 rv = handlers->start_processing(send_info, intf); in ipmi_register_smi()
3477 rv = __bmc_get_device_id(intf, NULL, &id, NULL, NULL, i); in ipmi_register_smi()
3483 mutex_lock(&intf->bmc_reg_mutex); in ipmi_register_smi()
3484 rv = __scan_channels(intf, &id); in ipmi_register_smi()
3485 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_register_smi()
3495 intf->intf_num = i; in ipmi_register_smi()
3499 call_smi_watchers(i, intf->si_dev); in ipmi_register_smi()
3504 ipmi_bmc_unregister(intf); in ipmi_register_smi()
3506 if (intf->handlers->shutdown) in ipmi_register_smi()
3507 intf->handlers->shutdown(intf->send_info); in ipmi_register_smi()
3509 list_del_rcu(&intf->link); in ipmi_register_smi()
3512 cleanup_srcu_struct(&intf->users_srcu); in ipmi_register_smi()
3513 kref_put(&intf->refcount, intf_free); in ipmi_register_smi()
3519 static void deliver_smi_err_response(struct ipmi_smi *intf, in deliver_smi_err_response() argument
3528 handle_one_recv_msg(intf, msg); in deliver_smi_err_response()
3531 static void cleanup_smi_msgs(struct ipmi_smi *intf) in cleanup_smi_msgs() argument
3541 list_splice_tail(&intf->hp_xmit_msgs, &tmplist); in cleanup_smi_msgs()
3542 list_splice_tail(&intf->xmit_msgs, &tmplist); in cleanup_smi_msgs()
3545 while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) { in cleanup_smi_msgs()
3560 deliver_smi_err_response(intf, msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3564 ent = &intf->seq_table[i]; in cleanup_smi_msgs()
3567 deliver_err_response(intf, ent->recv_msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3571 void ipmi_unregister_smi(struct ipmi_smi *intf) in ipmi_unregister_smi() argument
3574 int intf_num = intf->intf_num, index; in ipmi_unregister_smi()
3577 intf->intf_num = -1; in ipmi_unregister_smi()
3578 intf->in_shutdown = true; in ipmi_unregister_smi()
3579 list_del_rcu(&intf->link); in ipmi_unregister_smi()
3594 index = srcu_read_lock(&intf->users_srcu); in ipmi_unregister_smi()
3595 while (!list_empty(&intf->users)) { in ipmi_unregister_smi()
3597 container_of(list_next_rcu(&intf->users), in ipmi_unregister_smi()
3602 srcu_read_unlock(&intf->users_srcu, index); in ipmi_unregister_smi()
3604 if (intf->handlers->shutdown) in ipmi_unregister_smi()
3605 intf->handlers->shutdown(intf->send_info); in ipmi_unregister_smi()
3607 cleanup_smi_msgs(intf); in ipmi_unregister_smi()
3609 ipmi_bmc_unregister(intf); in ipmi_unregister_smi()
3611 cleanup_srcu_struct(&intf->users_srcu); in ipmi_unregister_smi()
3612 kref_put(&intf->refcount, intf_free); in ipmi_unregister_smi()
3616 static int handle_ipmb_get_msg_rsp(struct ipmi_smi *intf, in handle_ipmb_get_msg_rsp() argument
3628 ipmi_inc_stat(intf, invalid_ipmb_responses); in handle_ipmb_get_msg_rsp()
3646 if (intf_find_seq(intf, in handle_ipmb_get_msg_rsp()
3657 ipmi_inc_stat(intf, unhandled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3671 if (deliver_response(intf, recv_msg)) in handle_ipmb_get_msg_rsp()
3672 ipmi_inc_stat(intf, unhandled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3674 ipmi_inc_stat(intf, handled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3679 static int handle_ipmb_get_msg_cmd(struct ipmi_smi *intf, in handle_ipmb_get_msg_cmd() argument
3693 ipmi_inc_stat(intf, invalid_commands); in handle_ipmb_get_msg_cmd()
3707 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_ipmb_get_msg_cmd()
3717 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_get_msg_cmd()
3725 msg->data[6] = intf->addrinfo[msg->rsp[3] & 0xf].address; in handle_ipmb_get_msg_cmd()
3736 if (!intf->in_shutdown) { in handle_ipmb_get_msg_cmd()
3737 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_get_msg_cmd()
3782 if (deliver_response(intf, recv_msg)) in handle_ipmb_get_msg_cmd()
3783 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_get_msg_cmd()
3785 ipmi_inc_stat(intf, handled_commands); in handle_ipmb_get_msg_cmd()
3792 static int handle_lan_get_msg_rsp(struct ipmi_smi *intf, in handle_lan_get_msg_rsp() argument
3805 ipmi_inc_stat(intf, invalid_lan_responses); in handle_lan_get_msg_rsp()
3826 if (intf_find_seq(intf, in handle_lan_get_msg_rsp()
3837 ipmi_inc_stat(intf, unhandled_lan_responses); in handle_lan_get_msg_rsp()
3851 if (deliver_response(intf, recv_msg)) in handle_lan_get_msg_rsp()
3852 ipmi_inc_stat(intf, unhandled_lan_responses); in handle_lan_get_msg_rsp()
3854 ipmi_inc_stat(intf, handled_lan_responses); in handle_lan_get_msg_rsp()
3859 static int handle_lan_get_msg_cmd(struct ipmi_smi *intf, in handle_lan_get_msg_cmd() argument
3873 ipmi_inc_stat(intf, invalid_commands); in handle_lan_get_msg_cmd()
3887 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_lan_get_msg_cmd()
3897 ipmi_inc_stat(intf, unhandled_commands); in handle_lan_get_msg_cmd()
3942 if (deliver_response(intf, recv_msg)) in handle_lan_get_msg_cmd()
3943 ipmi_inc_stat(intf, unhandled_commands); in handle_lan_get_msg_cmd()
3945 ipmi_inc_stat(intf, handled_commands); in handle_lan_get_msg_cmd()
3958 static int handle_oem_get_msg_cmd(struct ipmi_smi *intf, in handle_oem_get_msg_cmd() argument
3976 ipmi_inc_stat(intf, invalid_commands); in handle_oem_get_msg_cmd()
3994 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_oem_get_msg_cmd()
4004 ipmi_inc_stat(intf, unhandled_commands); in handle_oem_get_msg_cmd()
4049 if (deliver_response(intf, recv_msg)) in handle_oem_get_msg_cmd()
4050 ipmi_inc_stat(intf, unhandled_commands); in handle_oem_get_msg_cmd()
4052 ipmi_inc_stat(intf, handled_commands); in handle_oem_get_msg_cmd()
4077 static int handle_read_event_rsp(struct ipmi_smi *intf, in handle_read_event_rsp() argument
4088 ipmi_inc_stat(intf, invalid_events); in handle_read_event_rsp()
4099 spin_lock_irqsave(&intf->events_lock, flags); in handle_read_event_rsp()
4101 ipmi_inc_stat(intf, events); in handle_read_event_rsp()
4107 index = srcu_read_lock(&intf->users_srcu); in handle_read_event_rsp()
4108 list_for_each_entry_rcu(user, &intf->users, link) { in handle_read_event_rsp()
4136 srcu_read_unlock(&intf->users_srcu, index); in handle_read_event_rsp()
4142 deliver_local_response(intf, recv_msg); in handle_read_event_rsp()
4144 } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { in handle_read_event_rsp()
4161 list_add_tail(&recv_msg->link, &intf->waiting_events); in handle_read_event_rsp()
4162 intf->waiting_events_count++; in handle_read_event_rsp()
4163 } else if (!intf->event_msg_printed) { in handle_read_event_rsp()
4168 dev_warn(intf->si_dev, in handle_read_event_rsp()
4170 intf->event_msg_printed = 1; in handle_read_event_rsp()
4174 spin_unlock_irqrestore(&intf->events_lock, flags); in handle_read_event_rsp()
4179 static int handle_bmc_rsp(struct ipmi_smi *intf, in handle_bmc_rsp() argument
4187 dev_warn(intf->si_dev, in handle_bmc_rsp()
4204 deliver_local_response(intf, recv_msg); in handle_bmc_rsp()
4214 static int handle_one_recv_msg(struct ipmi_smi *intf, in handle_one_recv_msg() argument
4227 if (intf->in_shutdown) in handle_one_recv_msg()
4253 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4256 ipmi_inc_stat(intf, sent_lan_command_errs); in handle_one_recv_msg()
4258 ipmi_inc_stat(intf, sent_ipmb_command_errs); in handle_one_recv_msg()
4259 intf_err_seq(intf, msg->msgid, msg->rsp[2]); in handle_one_recv_msg()
4262 intf_start_seq_timer(intf, msg->msgid); in handle_one_recv_msg()
4269 dev_warn(intf->si_dev, in handle_one_recv_msg()
4284 dev_warn(intf->si_dev, in handle_one_recv_msg()
4322 deliver_local_response(intf, recv_msg); in handle_one_recv_msg()
4341 if (!intf->channels_ready) { in handle_one_recv_msg()
4346 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4355 requeue = handle_ipmb_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4361 requeue = handle_ipmb_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4372 requeue = handle_lan_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4378 requeue = handle_lan_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4388 requeue = handle_oem_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4401 requeue = handle_read_event_rsp(intf, msg); in handle_one_recv_msg()
4404 requeue = handle_bmc_rsp(intf, msg); in handle_one_recv_msg()
4414 static void handle_new_recv_msgs(struct ipmi_smi *intf) in handle_new_recv_msgs() argument
4419 int run_to_completion = intf->run_to_completion; in handle_new_recv_msgs()
4423 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4424 while (!list_empty(&intf->waiting_rcv_msgs)) { in handle_new_recv_msgs()
4425 smi_msg = list_entry(intf->waiting_rcv_msgs.next, in handle_new_recv_msgs()
4429 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in handle_new_recv_msgs()
4431 rv = handle_one_recv_msg(intf, smi_msg); in handle_new_recv_msgs()
4433 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4442 list_add(&smi_msg->link, &intf->waiting_rcv_msgs); in handle_new_recv_msgs()
4452 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4458 if (atomic_add_unless(&intf->watchdog_pretimeouts_to_deliver, -1, 0)) { in handle_new_recv_msgs()
4462 index = srcu_read_lock(&intf->users_srcu); in handle_new_recv_msgs()
4463 list_for_each_entry_rcu(user, &intf->users, link) { in handle_new_recv_msgs()
4468 srcu_read_unlock(&intf->users_srcu, index); in handle_new_recv_msgs()
4475 struct ipmi_smi *intf = (struct ipmi_smi *) val; in smi_recv_tasklet() local
4476 int run_to_completion = intf->run_to_completion; in smi_recv_tasklet()
4490 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in smi_recv_tasklet()
4491 if (intf->curr_msg == NULL && !intf->in_shutdown) { in smi_recv_tasklet()
4495 if (!list_empty(&intf->hp_xmit_msgs)) in smi_recv_tasklet()
4496 entry = intf->hp_xmit_msgs.next; in smi_recv_tasklet()
4497 else if (!list_empty(&intf->xmit_msgs)) in smi_recv_tasklet()
4498 entry = intf->xmit_msgs.next; in smi_recv_tasklet()
4503 intf->curr_msg = newmsg; in smi_recv_tasklet()
4508 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in smi_recv_tasklet()
4510 intf->handlers->sender(intf->send_info, newmsg); in smi_recv_tasklet()
4514 handle_new_recv_msgs(intf); in smi_recv_tasklet()
4518 void ipmi_smi_msg_received(struct ipmi_smi *intf, in ipmi_smi_msg_received() argument
4522 int run_to_completion = intf->run_to_completion; in ipmi_smi_msg_received()
4529 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in ipmi_smi_msg_received()
4530 list_add_tail(&msg->link, &intf->waiting_rcv_msgs); in ipmi_smi_msg_received()
4532 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in ipmi_smi_msg_received()
4536 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4541 if (msg == intf->curr_msg) in ipmi_smi_msg_received()
4542 intf->curr_msg = NULL; in ipmi_smi_msg_received()
4544 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4547 smi_recv_tasklet((unsigned long) intf); in ipmi_smi_msg_received()
4549 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_msg_received()
4553 void ipmi_smi_watchdog_pretimeout(struct ipmi_smi *intf) in ipmi_smi_watchdog_pretimeout() argument
4555 if (intf->in_shutdown) in ipmi_smi_watchdog_pretimeout()
4558 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 1); in ipmi_smi_watchdog_pretimeout()
4559 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_watchdog_pretimeout()
4564 smi_from_recv_msg(struct ipmi_smi *intf, struct ipmi_recv_msg *recv_msg, in smi_from_recv_msg() argument
4584 static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent, in check_msg_timeout() argument
4592 if (intf->in_shutdown) in check_msg_timeout()
4607 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in check_msg_timeout()
4611 ipmi_inc_stat(intf, timed_out_ipmb_broadcasts); in check_msg_timeout()
4613 ipmi_inc_stat(intf, timed_out_lan_commands); in check_msg_timeout()
4615 ipmi_inc_stat(intf, timed_out_ipmb_commands); in check_msg_timeout()
4628 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot, in check_msg_timeout()
4632 ipmi_inc_stat(intf, in check_msg_timeout()
4635 ipmi_inc_stat(intf, in check_msg_timeout()
4640 spin_unlock_irqrestore(&intf->seq_lock, *flags); in check_msg_timeout()
4649 if (intf->handlers) { in check_msg_timeout()
4651 ipmi_inc_stat(intf, in check_msg_timeout()
4654 ipmi_inc_stat(intf, in check_msg_timeout()
4657 smi_send(intf, intf->handlers, smi_msg, 0); in check_msg_timeout()
4661 spin_lock_irqsave(&intf->seq_lock, *flags); in check_msg_timeout()
4665 static bool ipmi_timeout_handler(struct ipmi_smi *intf, in ipmi_timeout_handler() argument
4674 if (!intf->bmc_registered) { in ipmi_timeout_handler()
4675 kref_get(&intf->refcount); in ipmi_timeout_handler()
4676 if (!schedule_work(&intf->bmc_reg_work)) { in ipmi_timeout_handler()
4677 kref_put(&intf->refcount, intf_free); in ipmi_timeout_handler()
4688 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_timeout_handler()
4689 if (intf->ipmb_maintenance_mode_timeout) { in ipmi_timeout_handler()
4690 if (intf->ipmb_maintenance_mode_timeout <= timeout_period) in ipmi_timeout_handler()
4691 intf->ipmb_maintenance_mode_timeout = 0; in ipmi_timeout_handler()
4693 intf->ipmb_maintenance_mode_timeout -= timeout_period; in ipmi_timeout_handler()
4696 check_msg_timeout(intf, &intf->seq_table[i], in ipmi_timeout_handler()
4699 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_timeout_handler()
4702 deliver_err_response(intf, msg, IPMI_TIMEOUT_COMPLETION_CODE); in ipmi_timeout_handler()
4712 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4713 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_timeout_handler()
4714 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4715 intf->auto_maintenance_timeout in ipmi_timeout_handler()
4717 if (!intf->maintenance_mode in ipmi_timeout_handler()
4718 && (intf->auto_maintenance_timeout <= 0)) { in ipmi_timeout_handler()
4719 intf->maintenance_mode_enable = false; in ipmi_timeout_handler()
4720 maintenance_mode_update(intf); in ipmi_timeout_handler()
4723 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in ipmi_timeout_handler()
4727 tasklet_schedule(&intf->recv_tasklet); in ipmi_timeout_handler()
4732 static void ipmi_request_event(struct ipmi_smi *intf) in ipmi_request_event() argument
4735 if (intf->maintenance_mode_enable) in ipmi_request_event()
4738 if (!intf->in_shutdown) in ipmi_request_event()
4739 intf->handlers->request_events(intf->send_info); in ipmi_request_event()
4748 struct ipmi_smi *intf; in ipmi_timeout() local
4756 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_timeout()
4757 if (atomic_read(&intf->event_waiters)) { in ipmi_timeout()
4758 intf->ticks_to_req_ev--; in ipmi_timeout()
4759 if (intf->ticks_to_req_ev == 0) { in ipmi_timeout()
4760 ipmi_request_event(intf); in ipmi_timeout()
4761 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_timeout()
4766 need_timer |= ipmi_timeout_handler(intf, IPMI_TIMEOUT_TIME); in ipmi_timeout()
4774 static void need_waiter(struct ipmi_smi *intf) in need_waiter() argument
4845 static void ipmi_panic_request_and_wait(struct ipmi_smi *intf, in ipmi_panic_request_and_wait() argument
4857 intf, in ipmi_panic_request_and_wait()
4861 intf, in ipmi_panic_request_and_wait()
4865 intf->addrinfo[0].address, in ipmi_panic_request_and_wait()
4866 intf->addrinfo[0].lun, in ipmi_panic_request_and_wait()
4870 else if (intf->handlers->flush_messages) in ipmi_panic_request_and_wait()
4871 intf->handlers->flush_messages(intf->send_info); in ipmi_panic_request_and_wait()
4874 ipmi_poll(intf); in ipmi_panic_request_and_wait()
4877 static void event_receiver_fetcher(struct ipmi_smi *intf, in event_receiver_fetcher() argument
4885 intf->event_receiver = msg->msg.data[1]; in event_receiver_fetcher()
4886 intf->event_receiver_lun = msg->msg.data[2] & 0x3; in event_receiver_fetcher()
4890 static void device_id_fetcher(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in device_id_fetcher() argument
4900 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; in device_id_fetcher()
4901 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; in device_id_fetcher()
4905 static void send_panic_events(struct ipmi_smi *intf, char *str) in send_panic_events() argument
4945 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4971 intf->local_sel_device = 0; in send_panic_events()
4972 intf->local_event_generator = 0; in send_panic_events()
4973 intf->event_receiver = 0; in send_panic_events()
4980 intf->null_user_handler = device_id_fetcher; in send_panic_events()
4981 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4983 if (intf->local_event_generator) { in send_panic_events()
4989 intf->null_user_handler = event_receiver_fetcher; in send_panic_events()
4990 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4992 intf->null_user_handler = NULL; in send_panic_events()
4999 if (((intf->event_receiver & 1) == 0) in send_panic_events()
5000 && (intf->event_receiver != 0) in send_panic_events()
5001 && (intf->event_receiver != intf->addrinfo[0].address)) { in send_panic_events()
5009 ipmb->lun = intf->event_receiver_lun; in send_panic_events()
5010 ipmb->slave_addr = intf->event_receiver; in send_panic_events()
5011 } else if (intf->local_sel_device) { in send_panic_events()
5038 data[3] = intf->addrinfo[0].address; in send_panic_events()
5047 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5057 struct ipmi_smi *intf; in panic_event() local
5065 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in panic_event()
5066 if (!intf->handlers || intf->intf_num == -1) in panic_event()
5070 if (!intf->handlers->poll) in panic_event()
5079 if (!spin_trylock(&intf->xmit_msgs_lock)) { in panic_event()
5080 INIT_LIST_HEAD(&intf->xmit_msgs); in panic_event()
5081 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in panic_event()
5083 spin_unlock(&intf->xmit_msgs_lock); in panic_event()
5085 if (!spin_trylock(&intf->waiting_rcv_msgs_lock)) in panic_event()
5086 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in panic_event()
5088 spin_unlock(&intf->waiting_rcv_msgs_lock); in panic_event()
5090 intf->run_to_completion = 1; in panic_event()
5091 if (intf->handlers->set_run_to_completion) in panic_event()
5092 intf->handlers->set_run_to_completion(intf->send_info, in panic_event()
5095 list_for_each_entry_rcu(user, &intf->users, link) { in panic_event()
5101 send_panic_events(intf, ptr); in panic_event()