Lines Matching refs:intf
44 static void handle_new_recv_msgs(struct ipmi_smi *intf);
45 static void need_waiter(struct ipmi_smi *intf);
46 static int handle_one_recv_msg(struct ipmi_smi *intf,
197 struct ipmi_smi *intf; member
328 static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc,
576 void (*null_user_handler)(struct ipmi_smi *intf,
603 static void __get_guid(struct ipmi_smi *intf);
604 static void __ipmi_bmc_unregister(struct ipmi_smi *intf);
605 static int __ipmi_bmc_register(struct ipmi_smi *intf,
608 static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id);
637 #define ipmi_inc_stat(intf, stat) \ argument
638 atomic_inc(&(intf)->stats[IPMI_STAT_ ## stat])
639 #define ipmi_get_stat(intf, stat) \ argument
640 ((unsigned int) atomic_read(&(intf)->stats[IPMI_STAT_ ## stat]))
690 static void clean_up_interface_data(struct ipmi_smi *intf) in clean_up_interface_data() argument
696 tasklet_kill(&intf->recv_tasklet); in clean_up_interface_data()
698 free_smi_msg_list(&intf->waiting_rcv_msgs); in clean_up_interface_data()
699 free_recv_msg_list(&intf->waiting_events); in clean_up_interface_data()
705 mutex_lock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
707 list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu); in clean_up_interface_data()
708 mutex_unlock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
714 if ((intf->seq_table[i].inuse) in clean_up_interface_data()
715 && (intf->seq_table[i].recv_msg)) in clean_up_interface_data()
716 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in clean_up_interface_data()
722 struct ipmi_smi *intf = container_of(ref, struct ipmi_smi, refcount); in intf_free() local
724 clean_up_interface_data(intf); in intf_free()
725 kfree(intf); in intf_free()
730 struct ipmi_smi *intf; member
736 struct ipmi_smi *intf; in ipmi_smi_watcher_register() local
752 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_smi_watcher_register()
753 int intf_num = READ_ONCE(intf->intf_num); in ipmi_smi_watcher_register()
757 watcher->new_smi(intf_num, intf->si_dev); in ipmi_smi_watcher_register()
885 static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in deliver_response() argument
891 if (intf->null_user_handler) { in deliver_response()
892 intf->null_user_handler(intf, msg); in deliver_response()
922 static void deliver_local_response(struct ipmi_smi *intf, in deliver_local_response() argument
925 if (deliver_response(intf, msg)) in deliver_local_response()
926 ipmi_inc_stat(intf, unhandled_local_responses); in deliver_local_response()
928 ipmi_inc_stat(intf, handled_local_responses); in deliver_local_response()
931 static void deliver_err_response(struct ipmi_smi *intf, in deliver_err_response() argument
939 deliver_local_response(intf, msg); in deliver_err_response()
942 static void smi_add_watch(struct ipmi_smi *intf, unsigned int flags) in smi_add_watch() argument
946 if (!intf->handlers->set_need_watch) in smi_add_watch()
949 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_add_watch()
951 intf->response_waiters++; in smi_add_watch()
954 intf->watchdog_waiters++; in smi_add_watch()
957 intf->command_waiters++; in smi_add_watch()
959 if ((intf->last_watch_mask & flags) != flags) { in smi_add_watch()
960 intf->last_watch_mask |= flags; in smi_add_watch()
961 intf->handlers->set_need_watch(intf->send_info, in smi_add_watch()
962 intf->last_watch_mask); in smi_add_watch()
964 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_add_watch()
967 static void smi_remove_watch(struct ipmi_smi *intf, unsigned int flags) in smi_remove_watch() argument
971 if (!intf->handlers->set_need_watch) in smi_remove_watch()
974 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_remove_watch()
976 intf->response_waiters--; in smi_remove_watch()
979 intf->watchdog_waiters--; in smi_remove_watch()
982 intf->command_waiters--; in smi_remove_watch()
985 if (intf->response_waiters) in smi_remove_watch()
987 if (intf->watchdog_waiters) in smi_remove_watch()
989 if (intf->command_waiters) in smi_remove_watch()
992 if (intf->last_watch_mask != flags) { in smi_remove_watch()
993 intf->last_watch_mask = flags; in smi_remove_watch()
994 intf->handlers->set_need_watch(intf->send_info, in smi_remove_watch()
995 intf->last_watch_mask); in smi_remove_watch()
997 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_remove_watch()
1005 static int intf_next_seq(struct ipmi_smi *intf, in intf_next_seq() argument
1021 for (i = intf->curr_seq; (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; in intf_next_seq()
1023 if (!intf->seq_table[i].inuse) in intf_next_seq()
1027 if (!intf->seq_table[i].inuse) { in intf_next_seq()
1028 intf->seq_table[i].recv_msg = recv_msg; in intf_next_seq()
1034 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; in intf_next_seq()
1035 intf->seq_table[i].orig_timeout = timeout; in intf_next_seq()
1036 intf->seq_table[i].retries_left = retries; in intf_next_seq()
1037 intf->seq_table[i].broadcast = broadcast; in intf_next_seq()
1038 intf->seq_table[i].inuse = 1; in intf_next_seq()
1039 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid); in intf_next_seq()
1041 *seqid = intf->seq_table[i].seqid; in intf_next_seq()
1042 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ; in intf_next_seq()
1043 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_next_seq()
1044 need_waiter(intf); in intf_next_seq()
1059 static int intf_find_seq(struct ipmi_smi *intf, in intf_find_seq() argument
1073 spin_lock_irqsave(&intf->seq_lock, flags); in intf_find_seq()
1074 if (intf->seq_table[seq].inuse) { in intf_find_seq()
1075 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; in intf_find_seq()
1081 intf->seq_table[seq].inuse = 0; in intf_find_seq()
1082 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_find_seq()
1086 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_find_seq()
1093 static int intf_start_seq_timer(struct ipmi_smi *intf, in intf_start_seq_timer() argument
1104 spin_lock_irqsave(&intf->seq_lock, flags); in intf_start_seq_timer()
1109 if ((intf->seq_table[seq].inuse) in intf_start_seq_timer()
1110 && (intf->seq_table[seq].seqid == seqid)) { in intf_start_seq_timer()
1111 struct seq_table *ent = &intf->seq_table[seq]; in intf_start_seq_timer()
1115 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_start_seq_timer()
1121 static int intf_err_seq(struct ipmi_smi *intf, in intf_err_seq() argument
1134 spin_lock_irqsave(&intf->seq_lock, flags); in intf_err_seq()
1139 if ((intf->seq_table[seq].inuse) in intf_err_seq()
1140 && (intf->seq_table[seq].seqid == seqid)) { in intf_err_seq()
1141 struct seq_table *ent = &intf->seq_table[seq]; in intf_err_seq()
1144 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_err_seq()
1148 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_err_seq()
1151 deliver_err_response(intf, msg, err); in intf_err_seq()
1173 struct ipmi_smi *intf; in ipmi_create_user() local
1199 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_create_user()
1200 if (intf->intf_num == if_num) in ipmi_create_user()
1214 if (!try_module_get(intf->owner)) { in ipmi_create_user()
1220 kref_get(&intf->refcount); in ipmi_create_user()
1225 new_user->intf = intf; in ipmi_create_user()
1229 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_create_user()
1230 list_add_rcu(&new_user->link, &intf->users); in ipmi_create_user()
1231 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_create_user()
1234 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); in ipmi_create_user()
1249 struct ipmi_smi *intf; in ipmi_get_smi_info() local
1252 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_get_smi_info()
1253 if (intf->intf_num == if_num) in ipmi_get_smi_info()
1262 if (!intf->handlers->get_smi_info) in ipmi_get_smi_info()
1265 rv = intf->handlers->get_smi_info(intf->send_info, data); in ipmi_get_smi_info()
1282 struct ipmi_smi *intf = user->intf; in _ipmi_destroy_user() local
1306 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); in _ipmi_destroy_user()
1309 atomic_dec(&intf->event_waiters); in _ipmi_destroy_user()
1312 spin_lock_irqsave(&intf->seq_lock, flags); in _ipmi_destroy_user()
1316 if (intf->seq_table[i].inuse in _ipmi_destroy_user()
1317 && (intf->seq_table[i].recv_msg->user == user)) { in _ipmi_destroy_user()
1318 intf->seq_table[i].inuse = 0; in _ipmi_destroy_user()
1319 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in _ipmi_destroy_user()
1320 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in _ipmi_destroy_user()
1323 spin_unlock_irqrestore(&intf->seq_lock, flags); in _ipmi_destroy_user()
1331 mutex_lock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1332 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in _ipmi_destroy_user()
1333 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in _ipmi_destroy_user()
1340 mutex_unlock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1348 kref_put(&intf->refcount, intf_free); in _ipmi_destroy_user()
1349 module_put(intf->owner); in _ipmi_destroy_user()
1373 rv = bmc_get_device_id(user->intf, NULL, &id, NULL, NULL); in ipmi_get_version()
1398 user->intf->addrinfo[channel].address = address; in ipmi_set_my_address()
1420 *address = user->intf->addrinfo[channel].address; in ipmi_get_my_address()
1442 user->intf->addrinfo[channel].lun = LUN & 0x3; in ipmi_set_my_LUN()
1464 *address = user->intf->addrinfo[channel].lun; in ipmi_get_my_LUN()
1481 spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1482 mode = user->intf->maintenance_mode; in ipmi_get_maintenance_mode()
1483 spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1490 static void maintenance_mode_update(struct ipmi_smi *intf) in maintenance_mode_update() argument
1492 if (intf->handlers->set_maintenance_mode) in maintenance_mode_update()
1493 intf->handlers->set_maintenance_mode( in maintenance_mode_update()
1494 intf->send_info, intf->maintenance_mode_enable); in maintenance_mode_update()
1501 struct ipmi_smi *intf = user->intf; in ipmi_set_maintenance_mode() local
1507 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1508 if (intf->maintenance_mode != mode) { in ipmi_set_maintenance_mode()
1511 intf->maintenance_mode_enable in ipmi_set_maintenance_mode()
1512 = (intf->auto_maintenance_timeout > 0); in ipmi_set_maintenance_mode()
1516 intf->maintenance_mode_enable = false; in ipmi_set_maintenance_mode()
1520 intf->maintenance_mode_enable = true; in ipmi_set_maintenance_mode()
1527 intf->maintenance_mode = mode; in ipmi_set_maintenance_mode()
1529 maintenance_mode_update(intf); in ipmi_set_maintenance_mode()
1532 spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1542 struct ipmi_smi *intf = user->intf; in ipmi_set_gets_events() local
1553 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1560 if (atomic_inc_return(&intf->event_waiters) == 1) in ipmi_set_gets_events()
1561 need_waiter(intf); in ipmi_set_gets_events()
1563 atomic_dec(&intf->event_waiters); in ipmi_set_gets_events()
1566 if (intf->delivering_events) in ipmi_set_gets_events()
1574 while (user->gets_events && !list_empty(&intf->waiting_events)) { in ipmi_set_gets_events()
1575 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link) in ipmi_set_gets_events()
1577 intf->waiting_events_count = 0; in ipmi_set_gets_events()
1578 if (intf->event_msg_printed) { in ipmi_set_gets_events()
1579 dev_warn(intf->si_dev, "Event queue no longer full\n"); in ipmi_set_gets_events()
1580 intf->event_msg_printed = 0; in ipmi_set_gets_events()
1583 intf->delivering_events = 1; in ipmi_set_gets_events()
1584 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1589 deliver_local_response(intf, msg); in ipmi_set_gets_events()
1592 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1593 intf->delivering_events = 0; in ipmi_set_gets_events()
1597 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1604 static struct cmd_rcvr *find_cmd_rcvr(struct ipmi_smi *intf, in find_cmd_rcvr() argument
1611 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in find_cmd_rcvr()
1612 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in find_cmd_rcvr()
1620 static int is_cmd_rcvr_exclusive(struct ipmi_smi *intf, in is_cmd_rcvr_exclusive() argument
1627 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in is_cmd_rcvr_exclusive()
1628 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { 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()
2390 intf->bmc->cc = msg->msg.data[0]; in bmc_device_id_handler()
2391 intf->bmc->dyn_id_set = 0; in bmc_device_id_handler()
2398 intf->bmc->dyn_id_set = 1; in bmc_device_id_handler()
2401 wake_up(&intf->waitq); in bmc_device_id_handler()
2405 send_get_device_id_cmd(struct ipmi_smi *intf) in send_get_device_id_cmd() argument
2420 intf, in send_get_device_id_cmd()
2424 intf, in send_get_device_id_cmd()
2428 intf->addrinfo[0].address, in send_get_device_id_cmd()
2429 intf->addrinfo[0].lun, in send_get_device_id_cmd()
2433 static int __get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc) in __get_device_id() argument
2438 intf->null_user_handler = bmc_device_id_handler; in __get_device_id()
2444 rv = send_get_device_id_cmd(intf); in __get_device_id()
2448 wait_event(intf->waitq, bmc->dyn_id_set != 2); in __get_device_id()
2456 dev_warn(intf->si_dev, in __get_device_id()
2469 intf->null_user_handler = NULL; in __get_device_id()
2483 static int __bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc, in __bmc_get_device_id() argument
2489 bool intf_set = intf != NULL; in __bmc_get_device_id()
2491 if (!intf) { in __bmc_get_device_id()
2498 intf = list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2500 kref_get(&intf->refcount); in __bmc_get_device_id()
2502 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2504 if (intf != list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2506 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2507 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2511 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2512 bmc = intf->bmc; in __bmc_get_device_id()
2514 kref_get(&intf->refcount); in __bmc_get_device_id()
2518 if (intf->in_bmc_register || in __bmc_get_device_id()
2523 __get_guid(intf); in __bmc_get_device_id()
2526 rv = __get_device_id(intf, bmc); in __bmc_get_device_id()
2534 if (!intf->bmc_registered in __bmc_get_device_id()
2549 __ipmi_bmc_unregister(intf); in __bmc_get_device_id()
2551 intf->bmc->id = id; in __bmc_get_device_id()
2552 intf->bmc->dyn_guid_set = guid_set; in __bmc_get_device_id()
2553 intf->bmc->guid = guid; in __bmc_get_device_id()
2554 if (__ipmi_bmc_register(intf, &id, guid_set, &guid, intf_num)) in __bmc_get_device_id()
2555 need_waiter(intf); /* Retry later on an error. */ in __bmc_get_device_id()
2557 __scan_channels(intf, &id); in __bmc_get_device_id()
2566 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2572 bmc = intf->bmc; in __bmc_get_device_id()
2577 __scan_channels(intf, &bmc->fetch_id); in __bmc_get_device_id()
2610 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2612 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2616 static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc, in bmc_get_device_id() argument
2620 return __bmc_get_device_id(intf, bmc, id, guid_set, guid, -1); in bmc_get_device_id()
2954 static void __ipmi_bmc_unregister(struct ipmi_smi *intf) in __ipmi_bmc_unregister() argument
2956 struct bmc_device *bmc = intf->bmc; in __ipmi_bmc_unregister()
2958 if (!intf->bmc_registered) in __ipmi_bmc_unregister()
2961 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_unregister()
2962 sysfs_remove_link(&bmc->pdev.dev.kobj, intf->my_dev_name); in __ipmi_bmc_unregister()
2963 kfree(intf->my_dev_name); in __ipmi_bmc_unregister()
2964 intf->my_dev_name = NULL; in __ipmi_bmc_unregister()
2967 list_del(&intf->bmc_link); in __ipmi_bmc_unregister()
2969 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_unregister()
2971 intf->bmc_registered = false; in __ipmi_bmc_unregister()
2974 static void ipmi_bmc_unregister(struct ipmi_smi *intf) in ipmi_bmc_unregister() argument
2976 mutex_lock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
2977 __ipmi_bmc_unregister(intf); in ipmi_bmc_unregister()
2978 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
2984 static int __ipmi_bmc_register(struct ipmi_smi *intf, in __ipmi_bmc_register() argument
2998 intf->in_bmc_register = true; in __ipmi_bmc_register()
2999 mutex_unlock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3023 intf->bmc = old_bmc; in __ipmi_bmc_register()
3025 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3028 dev_info(intf->si_dev, in __ipmi_bmc_register()
3063 intf->bmc = bmc; in __ipmi_bmc_register()
3065 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3070 dev_err(intf->si_dev, in __ipmi_bmc_register()
3076 dev_info(intf->si_dev, in __ipmi_bmc_register()
3087 rv = sysfs_create_link(&intf->si_dev->kobj, &bmc->pdev.dev.kobj, "bmc"); in __ipmi_bmc_register()
3089 dev_err(intf->si_dev, "Unable to create bmc symlink: %d\n", rv); in __ipmi_bmc_register()
3094 intf_num = intf->intf_num; in __ipmi_bmc_register()
3095 intf->my_dev_name = kasprintf(GFP_KERNEL, "ipmi%d", intf_num); in __ipmi_bmc_register()
3096 if (!intf->my_dev_name) { in __ipmi_bmc_register()
3098 dev_err(intf->si_dev, "Unable to allocate link from BMC: %d\n", in __ipmi_bmc_register()
3103 rv = sysfs_create_link(&bmc->pdev.dev.kobj, &intf->si_dev->kobj, in __ipmi_bmc_register()
3104 intf->my_dev_name); in __ipmi_bmc_register()
3106 dev_err(intf->si_dev, "Unable to create symlink to bmc: %d\n", in __ipmi_bmc_register()
3111 intf->bmc_registered = true; in __ipmi_bmc_register()
3115 mutex_lock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3116 intf->in_bmc_register = false; in __ipmi_bmc_register()
3121 kfree(intf->my_dev_name); in __ipmi_bmc_register()
3122 intf->my_dev_name = NULL; in __ipmi_bmc_register()
3125 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_register()
3129 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3131 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3137 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3139 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3145 send_guid_cmd(struct ipmi_smi *intf, int chan) in send_guid_cmd() argument
3159 intf, in send_guid_cmd()
3163 intf, in send_guid_cmd()
3167 intf->addrinfo[0].address, in send_guid_cmd()
3168 intf->addrinfo[0].lun, in send_guid_cmd()
3172 static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in guid_handler() argument
3174 struct bmc_device *bmc = intf->bmc; in guid_handler()
3190 dev_warn(intf->si_dev, in guid_handler()
3204 wake_up(&intf->waitq); in guid_handler()
3207 static void __get_guid(struct ipmi_smi *intf) in __get_guid() argument
3210 struct bmc_device *bmc = intf->bmc; in __get_guid()
3213 intf->null_user_handler = guid_handler; in __get_guid()
3214 rv = send_guid_cmd(intf, 0); in __get_guid()
3219 wait_event(intf->waitq, bmc->dyn_guid_set != 2); in __get_guid()
3224 intf->null_user_handler = NULL; in __get_guid()
3228 send_channel_info_cmd(struct ipmi_smi *intf, int chan) in send_channel_info_cmd() argument
3244 intf, in send_channel_info_cmd()
3248 intf, in send_channel_info_cmd()
3252 intf->addrinfo[0].address, in send_channel_info_cmd()
3253 intf->addrinfo[0].lun, in send_channel_info_cmd()
3258 channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in channel_handler() argument
3262 unsigned int set = intf->curr_working_cset; in channel_handler()
3278 intf->wchannels[set].c[0].medium in channel_handler()
3280 intf->wchannels[set].c[0].protocol in channel_handler()
3283 intf->channel_list = intf->wchannels + set; in channel_handler()
3284 intf->channels_ready = true; in channel_handler()
3285 wake_up(&intf->waitq); in channel_handler()
3294 ch = intf->curr_channel; in channel_handler()
3295 chans = intf->wchannels[set].c; in channel_handler()
3300 intf->curr_channel++; in channel_handler()
3301 if (intf->curr_channel >= IPMI_MAX_CHANNELS) { in channel_handler()
3302 intf->channel_list = intf->wchannels + set; in channel_handler()
3303 intf->channels_ready = true; in channel_handler()
3304 wake_up(&intf->waitq); in channel_handler()
3306 intf->channel_list = intf->wchannels + set; in channel_handler()
3307 intf->channels_ready = true; in channel_handler()
3308 rv = send_channel_info_cmd(intf, intf->curr_channel); in channel_handler()
3313 dev_warn(intf->si_dev, in channel_handler()
3315 intf->curr_channel, rv); in channel_handler()
3317 intf->channel_list = intf->wchannels + set; in channel_handler()
3318 intf->channels_ready = true; in channel_handler()
3319 wake_up(&intf->waitq); in channel_handler()
3329 static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id) in __scan_channels() argument
3342 set = !intf->curr_working_cset; in __scan_channels()
3343 intf->curr_working_cset = set; in __scan_channels()
3344 memset(&intf->wchannels[set], 0, in __scan_channels()
3347 intf->null_user_handler = channel_handler; in __scan_channels()
3348 intf->curr_channel = 0; in __scan_channels()
3349 rv = send_channel_info_cmd(intf, 0); in __scan_channels()
3351 dev_warn(intf->si_dev, in __scan_channels()
3354 intf->null_user_handler = NULL; in __scan_channels()
3359 wait_event(intf->waitq, intf->channels_ready); in __scan_channels()
3360 intf->null_user_handler = NULL; in __scan_channels()
3362 unsigned int set = intf->curr_working_cset; in __scan_channels()
3365 intf->wchannels[set].c[0].medium = IPMI_CHANNEL_MEDIUM_IPMB; in __scan_channels()
3366 intf->wchannels[set].c[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB; in __scan_channels()
3367 intf->channel_list = intf->wchannels + set; in __scan_channels()
3368 intf->channels_ready = true; in __scan_channels()
3374 static void ipmi_poll(struct ipmi_smi *intf) in ipmi_poll() argument
3376 if (intf->handlers->poll) in ipmi_poll()
3377 intf->handlers->poll(intf->send_info); in ipmi_poll()
3379 handle_new_recv_msgs(intf); in ipmi_poll()
3384 ipmi_poll(user->intf); in ipmi_poll_interface()
3390 struct ipmi_smi *intf = container_of(work, struct ipmi_smi, in redo_bmc_reg() local
3393 if (!intf->in_shutdown) in redo_bmc_reg()
3394 bmc_get_device_id(intf, NULL, NULL, NULL, NULL); in redo_bmc_reg()
3396 kref_put(&intf->refcount, intf_free); in redo_bmc_reg()
3407 struct ipmi_smi *intf, *tintf; in ipmi_add_smi() local
3419 intf = kzalloc(sizeof(*intf), GFP_KERNEL); in ipmi_add_smi()
3420 if (!intf) in ipmi_add_smi()
3423 rv = init_srcu_struct(&intf->users_srcu); in ipmi_add_smi()
3425 kfree(intf); in ipmi_add_smi()
3429 intf->owner = owner; in ipmi_add_smi()
3430 intf->bmc = &intf->tmp_bmc; in ipmi_add_smi()
3431 INIT_LIST_HEAD(&intf->bmc->intfs); in ipmi_add_smi()
3432 mutex_init(&intf->bmc->dyn_mutex); in ipmi_add_smi()
3433 INIT_LIST_HEAD(&intf->bmc_link); in ipmi_add_smi()
3434 mutex_init(&intf->bmc_reg_mutex); in ipmi_add_smi()
3435 intf->intf_num = -1; /* Mark it invalid for now. */ in ipmi_add_smi()
3436 kref_init(&intf->refcount); in ipmi_add_smi()
3437 INIT_WORK(&intf->bmc_reg_work, redo_bmc_reg); in ipmi_add_smi()
3438 intf->si_dev = si_dev; in ipmi_add_smi()
3440 intf->addrinfo[j].address = IPMI_BMC_SLAVE_ADDR; in ipmi_add_smi()
3441 intf->addrinfo[j].lun = 2; in ipmi_add_smi()
3444 intf->addrinfo[0].address = slave_addr; in ipmi_add_smi()
3445 INIT_LIST_HEAD(&intf->users); in ipmi_add_smi()
3446 intf->handlers = handlers; in ipmi_add_smi()
3447 intf->send_info = send_info; in ipmi_add_smi()
3448 spin_lock_init(&intf->seq_lock); in ipmi_add_smi()
3450 intf->seq_table[j].inuse = 0; in ipmi_add_smi()
3451 intf->seq_table[j].seqid = 0; in ipmi_add_smi()
3453 intf->curr_seq = 0; in ipmi_add_smi()
3454 spin_lock_init(&intf->waiting_rcv_msgs_lock); in ipmi_add_smi()
3455 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in ipmi_add_smi()
3456 tasklet_setup(&intf->recv_tasklet, in ipmi_add_smi()
3458 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 0); in ipmi_add_smi()
3459 spin_lock_init(&intf->xmit_msgs_lock); in ipmi_add_smi()
3460 INIT_LIST_HEAD(&intf->xmit_msgs); in ipmi_add_smi()
3461 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in ipmi_add_smi()
3462 spin_lock_init(&intf->events_lock); in ipmi_add_smi()
3463 spin_lock_init(&intf->watch_lock); in ipmi_add_smi()
3464 atomic_set(&intf->event_waiters, 0); in ipmi_add_smi()
3465 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_add_smi()
3466 INIT_LIST_HEAD(&intf->waiting_events); in ipmi_add_smi()
3467 intf->waiting_events_count = 0; in ipmi_add_smi()
3468 mutex_init(&intf->cmd_rcvrs_mutex); in ipmi_add_smi()
3469 spin_lock_init(&intf->maintenance_mode_lock); in ipmi_add_smi()
3470 INIT_LIST_HEAD(&intf->cmd_rcvrs); in ipmi_add_smi()
3471 init_waitqueue_head(&intf->waitq); in ipmi_add_smi()
3473 atomic_set(&intf->stats[i], 0); in ipmi_add_smi()
3489 list_add_rcu(&intf->link, &ipmi_interfaces); in ipmi_add_smi()
3491 list_add_tail_rcu(&intf->link, link); in ipmi_add_smi()
3493 rv = handlers->start_processing(send_info, intf); in ipmi_add_smi()
3497 rv = __bmc_get_device_id(intf, NULL, &id, NULL, NULL, i); in ipmi_add_smi()
3503 mutex_lock(&intf->bmc_reg_mutex); in ipmi_add_smi()
3504 rv = __scan_channels(intf, &id); in ipmi_add_smi()
3505 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_add_smi()
3515 intf->intf_num = i; in ipmi_add_smi()
3519 call_smi_watchers(i, intf->si_dev); in ipmi_add_smi()
3524 ipmi_bmc_unregister(intf); in ipmi_add_smi()
3526 if (intf->handlers->shutdown) in ipmi_add_smi()
3527 intf->handlers->shutdown(intf->send_info); in ipmi_add_smi()
3529 list_del_rcu(&intf->link); in ipmi_add_smi()
3532 cleanup_srcu_struct(&intf->users_srcu); in ipmi_add_smi()
3533 kref_put(&intf->refcount, intf_free); in ipmi_add_smi()
3539 static void deliver_smi_err_response(struct ipmi_smi *intf, in deliver_smi_err_response() argument
3548 handle_one_recv_msg(intf, msg); in deliver_smi_err_response()
3551 static void cleanup_smi_msgs(struct ipmi_smi *intf) in cleanup_smi_msgs() argument
3561 list_splice_tail(&intf->hp_xmit_msgs, &tmplist); in cleanup_smi_msgs()
3562 list_splice_tail(&intf->xmit_msgs, &tmplist); in cleanup_smi_msgs()
3565 while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) { in cleanup_smi_msgs()
3580 deliver_smi_err_response(intf, msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3584 ent = &intf->seq_table[i]; in cleanup_smi_msgs()
3587 deliver_err_response(intf, ent->recv_msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3591 void ipmi_unregister_smi(struct ipmi_smi *intf) in ipmi_unregister_smi() argument
3594 int intf_num = intf->intf_num, index; in ipmi_unregister_smi()
3597 intf->intf_num = -1; in ipmi_unregister_smi()
3598 intf->in_shutdown = true; in ipmi_unregister_smi()
3599 list_del_rcu(&intf->link); in ipmi_unregister_smi()
3614 index = srcu_read_lock(&intf->users_srcu); in ipmi_unregister_smi()
3615 while (!list_empty(&intf->users)) { in ipmi_unregister_smi()
3617 container_of(list_next_rcu(&intf->users), in ipmi_unregister_smi()
3622 srcu_read_unlock(&intf->users_srcu, index); in ipmi_unregister_smi()
3624 if (intf->handlers->shutdown) in ipmi_unregister_smi()
3625 intf->handlers->shutdown(intf->send_info); in ipmi_unregister_smi()
3627 cleanup_smi_msgs(intf); in ipmi_unregister_smi()
3629 ipmi_bmc_unregister(intf); in ipmi_unregister_smi()
3631 cleanup_srcu_struct(&intf->users_srcu); in ipmi_unregister_smi()
3632 kref_put(&intf->refcount, intf_free); in ipmi_unregister_smi()
3636 static int handle_ipmb_get_msg_rsp(struct ipmi_smi *intf, in handle_ipmb_get_msg_rsp() argument
3648 ipmi_inc_stat(intf, invalid_ipmb_responses); in handle_ipmb_get_msg_rsp()
3666 if (intf_find_seq(intf, in handle_ipmb_get_msg_rsp()
3677 ipmi_inc_stat(intf, unhandled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3691 if (deliver_response(intf, recv_msg)) in handle_ipmb_get_msg_rsp()
3692 ipmi_inc_stat(intf, unhandled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3694 ipmi_inc_stat(intf, handled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3699 static int handle_ipmb_get_msg_cmd(struct ipmi_smi *intf, in handle_ipmb_get_msg_cmd() argument
3713 ipmi_inc_stat(intf, invalid_commands); in handle_ipmb_get_msg_cmd()
3727 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_ipmb_get_msg_cmd()
3737 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_get_msg_cmd()
3745 msg->data[6] = intf->addrinfo[msg->rsp[3] & 0xf].address; in handle_ipmb_get_msg_cmd()
3756 if (!intf->in_shutdown) { in handle_ipmb_get_msg_cmd()
3757 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_get_msg_cmd()
3802 if (deliver_response(intf, recv_msg)) in handle_ipmb_get_msg_cmd()
3803 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_get_msg_cmd()
3805 ipmi_inc_stat(intf, handled_commands); in handle_ipmb_get_msg_cmd()
3812 static int handle_lan_get_msg_rsp(struct ipmi_smi *intf, in handle_lan_get_msg_rsp() argument
3825 ipmi_inc_stat(intf, invalid_lan_responses); in handle_lan_get_msg_rsp()
3846 if (intf_find_seq(intf, in handle_lan_get_msg_rsp()
3857 ipmi_inc_stat(intf, unhandled_lan_responses); in handle_lan_get_msg_rsp()
3871 if (deliver_response(intf, recv_msg)) in handle_lan_get_msg_rsp()
3872 ipmi_inc_stat(intf, unhandled_lan_responses); in handle_lan_get_msg_rsp()
3874 ipmi_inc_stat(intf, handled_lan_responses); in handle_lan_get_msg_rsp()
3879 static int handle_lan_get_msg_cmd(struct ipmi_smi *intf, in handle_lan_get_msg_cmd() argument
3893 ipmi_inc_stat(intf, invalid_commands); in handle_lan_get_msg_cmd()
3907 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_lan_get_msg_cmd()
3917 ipmi_inc_stat(intf, unhandled_commands); in handle_lan_get_msg_cmd()
3962 if (deliver_response(intf, recv_msg)) in handle_lan_get_msg_cmd()
3963 ipmi_inc_stat(intf, unhandled_commands); in handle_lan_get_msg_cmd()
3965 ipmi_inc_stat(intf, handled_commands); in handle_lan_get_msg_cmd()
3978 static int handle_oem_get_msg_cmd(struct ipmi_smi *intf, in handle_oem_get_msg_cmd() argument
3996 ipmi_inc_stat(intf, invalid_commands); in handle_oem_get_msg_cmd()
4014 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_oem_get_msg_cmd()
4024 ipmi_inc_stat(intf, unhandled_commands); in handle_oem_get_msg_cmd()
4069 if (deliver_response(intf, recv_msg)) in handle_oem_get_msg_cmd()
4070 ipmi_inc_stat(intf, unhandled_commands); in handle_oem_get_msg_cmd()
4072 ipmi_inc_stat(intf, handled_commands); in handle_oem_get_msg_cmd()
4097 static int handle_read_event_rsp(struct ipmi_smi *intf, in handle_read_event_rsp() argument
4108 ipmi_inc_stat(intf, invalid_events); in handle_read_event_rsp()
4119 spin_lock_irqsave(&intf->events_lock, flags); in handle_read_event_rsp()
4121 ipmi_inc_stat(intf, events); in handle_read_event_rsp()
4127 index = srcu_read_lock(&intf->users_srcu); in handle_read_event_rsp()
4128 list_for_each_entry_rcu(user, &intf->users, link) { in handle_read_event_rsp()
4156 srcu_read_unlock(&intf->users_srcu, index); in handle_read_event_rsp()
4162 deliver_local_response(intf, recv_msg); in handle_read_event_rsp()
4164 } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { in handle_read_event_rsp()
4181 list_add_tail(&recv_msg->link, &intf->waiting_events); in handle_read_event_rsp()
4182 intf->waiting_events_count++; in handle_read_event_rsp()
4183 } else if (!intf->event_msg_printed) { in handle_read_event_rsp()
4188 dev_warn(intf->si_dev, in handle_read_event_rsp()
4190 intf->event_msg_printed = 1; in handle_read_event_rsp()
4194 spin_unlock_irqrestore(&intf->events_lock, flags); in handle_read_event_rsp()
4199 static int handle_bmc_rsp(struct ipmi_smi *intf, in handle_bmc_rsp() argument
4207 dev_warn(intf->si_dev, in handle_bmc_rsp()
4224 deliver_local_response(intf, recv_msg); in handle_bmc_rsp()
4234 static int handle_one_recv_msg(struct ipmi_smi *intf, in handle_one_recv_msg() argument
4247 if (intf->in_shutdown) in handle_one_recv_msg()
4273 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4276 ipmi_inc_stat(intf, sent_lan_command_errs); in handle_one_recv_msg()
4278 ipmi_inc_stat(intf, sent_ipmb_command_errs); in handle_one_recv_msg()
4279 intf_err_seq(intf, msg->msgid, msg->rsp[2]); in handle_one_recv_msg()
4282 intf_start_seq_timer(intf, msg->msgid); in handle_one_recv_msg()
4289 dev_warn(intf->si_dev, in handle_one_recv_msg()
4304 dev_warn(intf->si_dev, in handle_one_recv_msg()
4342 deliver_local_response(intf, recv_msg); in handle_one_recv_msg()
4361 if (!intf->channels_ready) { in handle_one_recv_msg()
4366 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4375 requeue = handle_ipmb_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4381 requeue = handle_ipmb_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4392 requeue = handle_lan_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4398 requeue = handle_lan_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4408 requeue = handle_oem_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4421 requeue = handle_read_event_rsp(intf, msg); in handle_one_recv_msg()
4424 requeue = handle_bmc_rsp(intf, msg); in handle_one_recv_msg()
4434 static void handle_new_recv_msgs(struct ipmi_smi *intf) in handle_new_recv_msgs() argument
4439 int run_to_completion = intf->run_to_completion; in handle_new_recv_msgs()
4443 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4444 while (!list_empty(&intf->waiting_rcv_msgs)) { in handle_new_recv_msgs()
4445 smi_msg = list_entry(intf->waiting_rcv_msgs.next, in handle_new_recv_msgs()
4449 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in handle_new_recv_msgs()
4451 rv = handle_one_recv_msg(intf, smi_msg); in handle_new_recv_msgs()
4453 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4462 list_add(&smi_msg->link, &intf->waiting_rcv_msgs); in handle_new_recv_msgs()
4472 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4478 if (atomic_add_unless(&intf->watchdog_pretimeouts_to_deliver, -1, 0)) { in handle_new_recv_msgs()
4482 index = srcu_read_lock(&intf->users_srcu); in handle_new_recv_msgs()
4483 list_for_each_entry_rcu(user, &intf->users, link) { in handle_new_recv_msgs()
4488 srcu_read_unlock(&intf->users_srcu, index); in handle_new_recv_msgs()
4495 struct ipmi_smi *intf = from_tasklet(intf, t, recv_tasklet); in smi_recv_tasklet() local
4496 int run_to_completion = intf->run_to_completion; in smi_recv_tasklet()
4510 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in smi_recv_tasklet()
4511 if (intf->curr_msg == NULL && !intf->in_shutdown) { in smi_recv_tasklet()
4515 if (!list_empty(&intf->hp_xmit_msgs)) in smi_recv_tasklet()
4516 entry = intf->hp_xmit_msgs.next; in smi_recv_tasklet()
4517 else if (!list_empty(&intf->xmit_msgs)) in smi_recv_tasklet()
4518 entry = intf->xmit_msgs.next; in smi_recv_tasklet()
4523 intf->curr_msg = newmsg; in smi_recv_tasklet()
4528 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in smi_recv_tasklet()
4530 intf->handlers->sender(intf->send_info, newmsg); in smi_recv_tasklet()
4534 handle_new_recv_msgs(intf); in smi_recv_tasklet()
4538 void ipmi_smi_msg_received(struct ipmi_smi *intf, in ipmi_smi_msg_received() argument
4542 int run_to_completion = intf->run_to_completion; in ipmi_smi_msg_received()
4549 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in ipmi_smi_msg_received()
4550 list_add_tail(&msg->link, &intf->waiting_rcv_msgs); in ipmi_smi_msg_received()
4552 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in ipmi_smi_msg_received()
4556 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4561 if (msg == intf->curr_msg) in ipmi_smi_msg_received()
4562 intf->curr_msg = NULL; in ipmi_smi_msg_received()
4564 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4567 smi_recv_tasklet(&intf->recv_tasklet); in ipmi_smi_msg_received()
4569 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_msg_received()
4573 void ipmi_smi_watchdog_pretimeout(struct ipmi_smi *intf) in ipmi_smi_watchdog_pretimeout() argument
4575 if (intf->in_shutdown) in ipmi_smi_watchdog_pretimeout()
4578 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 1); in ipmi_smi_watchdog_pretimeout()
4579 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_watchdog_pretimeout()
4584 smi_from_recv_msg(struct ipmi_smi *intf, struct ipmi_recv_msg *recv_msg, in smi_from_recv_msg() argument
4604 static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent, in check_msg_timeout() argument
4612 if (intf->in_shutdown) in check_msg_timeout()
4627 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in check_msg_timeout()
4631 ipmi_inc_stat(intf, timed_out_ipmb_broadcasts); in check_msg_timeout()
4633 ipmi_inc_stat(intf, timed_out_lan_commands); in check_msg_timeout()
4635 ipmi_inc_stat(intf, timed_out_ipmb_commands); in check_msg_timeout()
4648 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot, in check_msg_timeout()
4652 ipmi_inc_stat(intf, in check_msg_timeout()
4655 ipmi_inc_stat(intf, in check_msg_timeout()
4660 spin_unlock_irqrestore(&intf->seq_lock, *flags); in check_msg_timeout()
4669 if (intf->handlers) { in check_msg_timeout()
4671 ipmi_inc_stat(intf, in check_msg_timeout()
4674 ipmi_inc_stat(intf, in check_msg_timeout()
4677 smi_send(intf, intf->handlers, smi_msg, 0); in check_msg_timeout()
4681 spin_lock_irqsave(&intf->seq_lock, *flags); in check_msg_timeout()
4685 static bool ipmi_timeout_handler(struct ipmi_smi *intf, in ipmi_timeout_handler() argument
4694 if (!intf->bmc_registered) { in ipmi_timeout_handler()
4695 kref_get(&intf->refcount); in ipmi_timeout_handler()
4696 if (!schedule_work(&intf->bmc_reg_work)) { in ipmi_timeout_handler()
4697 kref_put(&intf->refcount, intf_free); in ipmi_timeout_handler()
4708 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_timeout_handler()
4709 if (intf->ipmb_maintenance_mode_timeout) { in ipmi_timeout_handler()
4710 if (intf->ipmb_maintenance_mode_timeout <= timeout_period) in ipmi_timeout_handler()
4711 intf->ipmb_maintenance_mode_timeout = 0; in ipmi_timeout_handler()
4713 intf->ipmb_maintenance_mode_timeout -= timeout_period; in ipmi_timeout_handler()
4716 check_msg_timeout(intf, &intf->seq_table[i], in ipmi_timeout_handler()
4719 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_timeout_handler()
4722 deliver_err_response(intf, msg, IPMI_TIMEOUT_COMPLETION_CODE); in ipmi_timeout_handler()
4732 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4733 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_timeout_handler()
4734 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4735 intf->auto_maintenance_timeout in ipmi_timeout_handler()
4737 if (!intf->maintenance_mode in ipmi_timeout_handler()
4738 && (intf->auto_maintenance_timeout <= 0)) { in ipmi_timeout_handler()
4739 intf->maintenance_mode_enable = false; in ipmi_timeout_handler()
4740 maintenance_mode_update(intf); in ipmi_timeout_handler()
4743 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in ipmi_timeout_handler()
4747 tasklet_schedule(&intf->recv_tasklet); in ipmi_timeout_handler()
4752 static void ipmi_request_event(struct ipmi_smi *intf) in ipmi_request_event() argument
4755 if (intf->maintenance_mode_enable) in ipmi_request_event()
4758 if (!intf->in_shutdown) in ipmi_request_event()
4759 intf->handlers->request_events(intf->send_info); in ipmi_request_event()
4768 struct ipmi_smi *intf; in ipmi_timeout() local
4776 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_timeout()
4777 if (atomic_read(&intf->event_waiters)) { in ipmi_timeout()
4778 intf->ticks_to_req_ev--; in ipmi_timeout()
4779 if (intf->ticks_to_req_ev == 0) { in ipmi_timeout()
4780 ipmi_request_event(intf); in ipmi_timeout()
4781 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_timeout()
4786 need_timer |= ipmi_timeout_handler(intf, IPMI_TIMEOUT_TIME); in ipmi_timeout()
4794 static void need_waiter(struct ipmi_smi *intf) in need_waiter() argument
4869 static void ipmi_panic_request_and_wait(struct ipmi_smi *intf, in ipmi_panic_request_and_wait() argument
4881 intf, in ipmi_panic_request_and_wait()
4885 intf, in ipmi_panic_request_and_wait()
4889 intf->addrinfo[0].address, in ipmi_panic_request_and_wait()
4890 intf->addrinfo[0].lun, in ipmi_panic_request_and_wait()
4894 else if (intf->handlers->flush_messages) in ipmi_panic_request_and_wait()
4895 intf->handlers->flush_messages(intf->send_info); in ipmi_panic_request_and_wait()
4898 ipmi_poll(intf); in ipmi_panic_request_and_wait()
4901 static void event_receiver_fetcher(struct ipmi_smi *intf, in event_receiver_fetcher() argument
4909 intf->event_receiver = msg->msg.data[1]; in event_receiver_fetcher()
4910 intf->event_receiver_lun = msg->msg.data[2] & 0x3; in event_receiver_fetcher()
4914 static void device_id_fetcher(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in device_id_fetcher() argument
4924 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; in device_id_fetcher()
4925 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; in device_id_fetcher()
4929 static void send_panic_events(struct ipmi_smi *intf, char *str) in send_panic_events() argument
4969 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
4995 intf->local_sel_device = 0; in send_panic_events()
4996 intf->local_event_generator = 0; in send_panic_events()
4997 intf->event_receiver = 0; in send_panic_events()
5004 intf->null_user_handler = device_id_fetcher; in send_panic_events()
5005 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5007 if (intf->local_event_generator) { in send_panic_events()
5013 intf->null_user_handler = event_receiver_fetcher; in send_panic_events()
5014 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5016 intf->null_user_handler = NULL; in send_panic_events()
5023 if (((intf->event_receiver & 1) == 0) in send_panic_events()
5024 && (intf->event_receiver != 0) in send_panic_events()
5025 && (intf->event_receiver != intf->addrinfo[0].address)) { in send_panic_events()
5033 ipmb->lun = intf->event_receiver_lun; in send_panic_events()
5034 ipmb->slave_addr = intf->event_receiver; in send_panic_events()
5035 } else if (intf->local_sel_device) { in send_panic_events()
5062 data[3] = intf->addrinfo[0].address; in send_panic_events()
5071 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5081 struct ipmi_smi *intf; in panic_event() local
5089 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in panic_event()
5090 if (!intf->handlers || intf->intf_num == -1) in panic_event()
5094 if (!intf->handlers->poll) in panic_event()
5103 if (!spin_trylock(&intf->xmit_msgs_lock)) { in panic_event()
5104 INIT_LIST_HEAD(&intf->xmit_msgs); in panic_event()
5105 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in panic_event()
5107 spin_unlock(&intf->xmit_msgs_lock); in panic_event()
5109 if (!spin_trylock(&intf->waiting_rcv_msgs_lock)) in panic_event()
5110 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in panic_event()
5112 spin_unlock(&intf->waiting_rcv_msgs_lock); in panic_event()
5114 intf->run_to_completion = 1; in panic_event()
5115 if (intf->handlers->set_run_to_completion) in panic_event()
5116 intf->handlers->set_run_to_completion(intf->send_info, in panic_event()
5119 list_for_each_entry_rcu(user, &intf->users, link) { in panic_event()
5125 send_panic_events(intf, ptr); in panic_event()