Lines Matching refs:intf
45 static void handle_new_recv_msgs(struct ipmi_smi *intf);
46 static void need_waiter(struct ipmi_smi *intf);
47 static int handle_one_recv_msg(struct ipmi_smi *intf,
185 struct ipmi_smi *intf; member
316 static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc,
564 void (*null_user_handler)(struct ipmi_smi *intf,
591 static void __get_guid(struct ipmi_smi *intf);
592 static void __ipmi_bmc_unregister(struct ipmi_smi *intf);
593 static int __ipmi_bmc_register(struct ipmi_smi *intf,
596 static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id);
625 #define ipmi_inc_stat(intf, stat) \ argument
626 atomic_inc(&(intf)->stats[IPMI_STAT_ ## stat])
627 #define ipmi_get_stat(intf, stat) \ argument
628 ((unsigned int) atomic_read(&(intf)->stats[IPMI_STAT_ ## stat]))
683 static void clean_up_interface_data(struct ipmi_smi *intf) in clean_up_interface_data() argument
689 tasklet_kill(&intf->recv_tasklet); in clean_up_interface_data()
691 free_smi_msg_list(&intf->waiting_rcv_msgs); in clean_up_interface_data()
692 free_recv_msg_list(&intf->waiting_events); in clean_up_interface_data()
698 mutex_lock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
700 list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu); in clean_up_interface_data()
701 mutex_unlock(&intf->cmd_rcvrs_mutex); in clean_up_interface_data()
707 if ((intf->seq_table[i].inuse) in clean_up_interface_data()
708 && (intf->seq_table[i].recv_msg)) in clean_up_interface_data()
709 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in clean_up_interface_data()
715 struct ipmi_smi *intf = container_of(ref, struct ipmi_smi, refcount); in intf_free() local
717 clean_up_interface_data(intf); in intf_free()
718 kfree(intf); in intf_free()
723 struct ipmi_smi *intf; member
729 struct ipmi_smi *intf; in ipmi_smi_watcher_register() local
745 list_for_each_entry_rcu(intf, &ipmi_interfaces, link, in ipmi_smi_watcher_register()
747 int intf_num = READ_ONCE(intf->intf_num); in ipmi_smi_watcher_register()
751 watcher->new_smi(intf_num, intf->si_dev); in ipmi_smi_watcher_register()
910 static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in deliver_response() argument
916 if (intf->null_user_handler) { in deliver_response()
917 intf->null_user_handler(intf, msg); in deliver_response()
947 static void deliver_local_response(struct ipmi_smi *intf, in deliver_local_response() argument
950 if (deliver_response(intf, msg)) in deliver_local_response()
951 ipmi_inc_stat(intf, unhandled_local_responses); in deliver_local_response()
953 ipmi_inc_stat(intf, handled_local_responses); in deliver_local_response()
956 static void deliver_err_response(struct ipmi_smi *intf, in deliver_err_response() argument
964 deliver_local_response(intf, msg); in deliver_err_response()
967 static void smi_add_watch(struct ipmi_smi *intf, unsigned int flags) in smi_add_watch() argument
971 if (!intf->handlers->set_need_watch) in smi_add_watch()
974 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_add_watch()
976 intf->response_waiters++; in smi_add_watch()
979 intf->watchdog_waiters++; in smi_add_watch()
982 intf->command_waiters++; in smi_add_watch()
984 if ((intf->last_watch_mask & flags) != flags) { in smi_add_watch()
985 intf->last_watch_mask |= flags; in smi_add_watch()
986 intf->handlers->set_need_watch(intf->send_info, in smi_add_watch()
987 intf->last_watch_mask); in smi_add_watch()
989 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_add_watch()
992 static void smi_remove_watch(struct ipmi_smi *intf, unsigned int flags) in smi_remove_watch() argument
996 if (!intf->handlers->set_need_watch) in smi_remove_watch()
999 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_remove_watch()
1001 intf->response_waiters--; in smi_remove_watch()
1004 intf->watchdog_waiters--; in smi_remove_watch()
1007 intf->command_waiters--; in smi_remove_watch()
1010 if (intf->response_waiters) in smi_remove_watch()
1012 if (intf->watchdog_waiters) in smi_remove_watch()
1014 if (intf->command_waiters) in smi_remove_watch()
1017 if (intf->last_watch_mask != flags) { in smi_remove_watch()
1018 intf->last_watch_mask = flags; in smi_remove_watch()
1019 intf->handlers->set_need_watch(intf->send_info, in smi_remove_watch()
1020 intf->last_watch_mask); in smi_remove_watch()
1022 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_remove_watch()
1030 static int intf_next_seq(struct ipmi_smi *intf, in intf_next_seq() argument
1046 for (i = intf->curr_seq; (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; in intf_next_seq()
1048 if (!intf->seq_table[i].inuse) in intf_next_seq()
1052 if (!intf->seq_table[i].inuse) { in intf_next_seq()
1053 intf->seq_table[i].recv_msg = recv_msg; in intf_next_seq()
1059 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; in intf_next_seq()
1060 intf->seq_table[i].orig_timeout = timeout; in intf_next_seq()
1061 intf->seq_table[i].retries_left = retries; in intf_next_seq()
1062 intf->seq_table[i].broadcast = broadcast; in intf_next_seq()
1063 intf->seq_table[i].inuse = 1; in intf_next_seq()
1064 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid); in intf_next_seq()
1066 *seqid = intf->seq_table[i].seqid; in intf_next_seq()
1067 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ; in intf_next_seq()
1068 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_next_seq()
1069 need_waiter(intf); in intf_next_seq()
1084 static int intf_find_seq(struct ipmi_smi *intf, in intf_find_seq() argument
1098 spin_lock_irqsave(&intf->seq_lock, flags); in intf_find_seq()
1099 if (intf->seq_table[seq].inuse) { in intf_find_seq()
1100 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; in intf_find_seq()
1106 intf->seq_table[seq].inuse = 0; in intf_find_seq()
1107 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_find_seq()
1111 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_find_seq()
1118 static int intf_start_seq_timer(struct ipmi_smi *intf, in intf_start_seq_timer() argument
1129 spin_lock_irqsave(&intf->seq_lock, flags); in intf_start_seq_timer()
1134 if ((intf->seq_table[seq].inuse) in intf_start_seq_timer()
1135 && (intf->seq_table[seq].seqid == seqid)) { in intf_start_seq_timer()
1136 struct seq_table *ent = &intf->seq_table[seq]; in intf_start_seq_timer()
1140 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_start_seq_timer()
1146 static int intf_err_seq(struct ipmi_smi *intf, in intf_err_seq() argument
1159 spin_lock_irqsave(&intf->seq_lock, flags); in intf_err_seq()
1164 if ((intf->seq_table[seq].inuse) in intf_err_seq()
1165 && (intf->seq_table[seq].seqid == seqid)) { in intf_err_seq()
1166 struct seq_table *ent = &intf->seq_table[seq]; in intf_err_seq()
1169 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in intf_err_seq()
1173 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_err_seq()
1176 deliver_err_response(intf, msg, err); in intf_err_seq()
1198 struct ipmi_smi *intf; in ipmi_create_user() local
1224 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_create_user()
1225 if (intf->intf_num == if_num) in ipmi_create_user()
1239 if (!try_module_get(intf->owner)) { in ipmi_create_user()
1245 kref_get(&intf->refcount); in ipmi_create_user()
1250 new_user->intf = intf; in ipmi_create_user()
1254 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_create_user()
1255 list_add_rcu(&new_user->link, &intf->users); in ipmi_create_user()
1256 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_create_user()
1259 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); in ipmi_create_user()
1274 struct ipmi_smi *intf; in ipmi_get_smi_info() local
1277 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_get_smi_info()
1278 if (intf->intf_num == if_num) in ipmi_get_smi_info()
1287 if (!intf->handlers->get_smi_info) in ipmi_get_smi_info()
1290 rv = intf->handlers->get_smi_info(intf->send_info, data); in ipmi_get_smi_info()
1307 struct ipmi_smi *intf = user->intf; in _ipmi_destroy_user() local
1331 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_WATCHDOG); in _ipmi_destroy_user()
1334 atomic_dec(&intf->event_waiters); in _ipmi_destroy_user()
1337 spin_lock_irqsave(&intf->seq_lock, flags); in _ipmi_destroy_user()
1341 if (intf->seq_table[i].inuse in _ipmi_destroy_user()
1342 && (intf->seq_table[i].recv_msg->user == user)) { in _ipmi_destroy_user()
1343 intf->seq_table[i].inuse = 0; in _ipmi_destroy_user()
1344 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in _ipmi_destroy_user()
1345 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in _ipmi_destroy_user()
1348 spin_unlock_irqrestore(&intf->seq_lock, flags); in _ipmi_destroy_user()
1356 mutex_lock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1357 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in _ipmi_destroy_user()
1358 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in _ipmi_destroy_user()
1365 mutex_unlock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1373 kref_put(&intf->refcount, intf_free); in _ipmi_destroy_user()
1374 module_put(intf->owner); in _ipmi_destroy_user()
1398 rv = bmc_get_device_id(user->intf, NULL, &id, NULL, NULL); in ipmi_get_version()
1423 user->intf->addrinfo[channel].address = address; in ipmi_set_my_address()
1445 *address = user->intf->addrinfo[channel].address; in ipmi_get_my_address()
1467 user->intf->addrinfo[channel].lun = LUN & 0x3; in ipmi_set_my_LUN()
1489 *address = user->intf->addrinfo[channel].lun; in ipmi_get_my_LUN()
1506 spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1507 mode = user->intf->maintenance_mode; in ipmi_get_maintenance_mode()
1508 spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1515 static void maintenance_mode_update(struct ipmi_smi *intf) in maintenance_mode_update() argument
1517 if (intf->handlers->set_maintenance_mode) in maintenance_mode_update()
1518 intf->handlers->set_maintenance_mode( in maintenance_mode_update()
1519 intf->send_info, intf->maintenance_mode_enable); in maintenance_mode_update()
1526 struct ipmi_smi *intf = user->intf; in ipmi_set_maintenance_mode() local
1532 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1533 if (intf->maintenance_mode != mode) { in ipmi_set_maintenance_mode()
1536 intf->maintenance_mode_enable in ipmi_set_maintenance_mode()
1537 = (intf->auto_maintenance_timeout > 0); in ipmi_set_maintenance_mode()
1541 intf->maintenance_mode_enable = false; in ipmi_set_maintenance_mode()
1545 intf->maintenance_mode_enable = true; in ipmi_set_maintenance_mode()
1552 intf->maintenance_mode = mode; in ipmi_set_maintenance_mode()
1554 maintenance_mode_update(intf); in ipmi_set_maintenance_mode()
1557 spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1567 struct ipmi_smi *intf = user->intf; in ipmi_set_gets_events() local
1578 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1585 if (atomic_inc_return(&intf->event_waiters) == 1) in ipmi_set_gets_events()
1586 need_waiter(intf); in ipmi_set_gets_events()
1588 atomic_dec(&intf->event_waiters); in ipmi_set_gets_events()
1591 if (intf->delivering_events) in ipmi_set_gets_events()
1599 while (user->gets_events && !list_empty(&intf->waiting_events)) { in ipmi_set_gets_events()
1600 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link) in ipmi_set_gets_events()
1602 intf->waiting_events_count = 0; in ipmi_set_gets_events()
1603 if (intf->event_msg_printed) { in ipmi_set_gets_events()
1604 dev_warn(intf->si_dev, "Event queue no longer full\n"); in ipmi_set_gets_events()
1605 intf->event_msg_printed = 0; in ipmi_set_gets_events()
1608 intf->delivering_events = 1; in ipmi_set_gets_events()
1609 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1614 deliver_local_response(intf, msg); in ipmi_set_gets_events()
1617 spin_lock_irqsave(&intf->events_lock, flags); in ipmi_set_gets_events()
1618 intf->delivering_events = 0; in ipmi_set_gets_events()
1622 spin_unlock_irqrestore(&intf->events_lock, flags); in ipmi_set_gets_events()
1629 static struct cmd_rcvr *find_cmd_rcvr(struct ipmi_smi *intf, in find_cmd_rcvr() argument
1636 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in find_cmd_rcvr()
1637 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in find_cmd_rcvr()
1645 static int is_cmd_rcvr_exclusive(struct ipmi_smi *intf, in is_cmd_rcvr_exclusive() argument
1652 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in is_cmd_rcvr_exclusive()
1653 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in is_cmd_rcvr_exclusive()
1666 struct ipmi_smi *intf = user->intf; in ipmi_register_for_cmd() local
1684 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1686 if (!is_cmd_rcvr_exclusive(intf, netfn, cmd, chans)) { in ipmi_register_for_cmd()
1691 smi_add_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS); in ipmi_register_for_cmd()
1693 list_add_rcu(&rcvr->link, &intf->cmd_rcvrs); in ipmi_register_for_cmd()
1696 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1711 struct ipmi_smi *intf = user->intf; in ipmi_unregister_for_cmd() local
1720 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1724 rcvr = find_cmd_rcvr(intf, netfn, cmd, i); in ipmi_unregister_for_cmd()
1737 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1741 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_COMMANDS); in ipmi_unregister_for_cmd()
1842 static struct ipmi_smi_msg *smi_add_send_msg(struct ipmi_smi *intf, in smi_add_send_msg() argument
1846 if (intf->curr_msg) { in smi_add_send_msg()
1848 list_add_tail(&smi_msg->link, &intf->hp_xmit_msgs); in smi_add_send_msg()
1850 list_add_tail(&smi_msg->link, &intf->xmit_msgs); in smi_add_send_msg()
1853 intf->curr_msg = smi_msg; in smi_add_send_msg()
1859 static void smi_send(struct ipmi_smi *intf, in smi_send() argument
1863 int run_to_completion = intf->run_to_completion; in smi_send()
1867 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in smi_send()
1868 smi_msg = smi_add_send_msg(intf, smi_msg, priority); in smi_send()
1871 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in smi_send()
1874 handlers->sender(intf->send_info, smi_msg); in smi_send()
1885 static int i_ipmi_req_sysintf(struct ipmi_smi *intf, in i_ipmi_req_sysintf() argument
1902 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_sysintf()
1916 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_sysintf()
1923 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in i_ipmi_req_sysintf()
1924 intf->auto_maintenance_timeout in i_ipmi_req_sysintf()
1926 if (!intf->maintenance_mode in i_ipmi_req_sysintf()
1927 && !intf->maintenance_mode_enable) { in i_ipmi_req_sysintf()
1928 intf->maintenance_mode_enable = true; in i_ipmi_req_sysintf()
1929 maintenance_mode_update(intf); in i_ipmi_req_sysintf()
1931 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in i_ipmi_req_sysintf()
1936 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_sysintf()
1947 ipmi_inc_stat(intf, sent_local_commands); in i_ipmi_req_sysintf()
1952 static int i_ipmi_req_ipmb(struct ipmi_smi *intf, in i_ipmi_req_ipmb() argument
1971 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
1975 chans = READ_ONCE(intf->channel_list)->c; in i_ipmi_req_ipmb()
1978 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
1998 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
2004 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb()
2015 ipmi_inc_stat(intf, sent_ipmb_responses); in i_ipmi_req_ipmb()
2029 spin_lock_irqsave(&intf->seq_lock, flags); in i_ipmi_req_ipmb()
2032 intf->ipmb_maintenance_mode_timeout = in i_ipmi_req_ipmb()
2035 if (intf->ipmb_maintenance_mode_timeout && retry_time_ms == 0) in i_ipmi_req_ipmb()
2043 rv = intf_next_seq(intf, in i_ipmi_req_ipmb()
2057 ipmi_inc_stat(intf, sent_ipmb_commands); in i_ipmi_req_ipmb()
2087 spin_unlock_irqrestore(&intf->seq_lock, flags); in i_ipmi_req_ipmb()
2093 static int i_ipmi_req_ipmb_direct(struct ipmi_smi *intf, in i_ipmi_req_ipmb_direct() argument
2104 if (!(intf->handlers->flags & IPMI_SMI_CAN_HANDLE_IPMB_DIRECT)) in i_ipmi_req_ipmb_direct()
2109 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb_direct()
2114 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb_direct()
2120 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_ipmb_direct()
2145 static int i_ipmi_req_lan(struct ipmi_smi *intf, in i_ipmi_req_lan() argument
2162 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2166 chans = READ_ONCE(intf->channel_list)->c; in i_ipmi_req_lan()
2172 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2178 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2184 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_req_lan()
2195 ipmi_inc_stat(intf, sent_lan_responses); in i_ipmi_req_lan()
2208 spin_lock_irqsave(&intf->seq_lock, flags); in i_ipmi_req_lan()
2214 rv = intf_next_seq(intf, in i_ipmi_req_lan()
2228 ipmi_inc_stat(intf, sent_lan_commands); in i_ipmi_req_lan()
2257 spin_unlock_irqrestore(&intf->seq_lock, flags); in i_ipmi_req_lan()
2270 struct ipmi_smi *intf, in i_ipmi_request() argument
2311 if (intf->in_shutdown) { in i_ipmi_request()
2328 rv = i_ipmi_req_sysintf(intf, addr, msgid, msg, smi_msg, in i_ipmi_request()
2331 rv = i_ipmi_req_ipmb(intf, addr, msgid, msg, smi_msg, recv_msg, in i_ipmi_request()
2335 rv = i_ipmi_req_ipmb_direct(intf, addr, msgid, msg, smi_msg, in i_ipmi_request()
2338 rv = i_ipmi_req_lan(intf, addr, msgid, msg, smi_msg, recv_msg, in i_ipmi_request()
2342 ipmi_inc_stat(intf, sent_invalid_commands); in i_ipmi_request()
2353 smi_send(intf, intf->handlers, smi_msg, priority); in i_ipmi_request()
2361 static int check_addr(struct ipmi_smi *intf, in check_addr() argument
2369 *lun = intf->addrinfo[addr->channel].lun; in check_addr()
2370 *saddr = intf->addrinfo[addr->channel].address; in check_addr()
2393 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_settime()
2396 user->intf, in ipmi_request_settime()
2432 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_supply_msgs()
2435 user->intf, in ipmi_request_supply_msgs()
2452 static void bmc_device_id_handler(struct ipmi_smi *intf, in bmc_device_id_handler() argument
2460 dev_warn(intf->si_dev, in bmc_device_id_handler()
2467 dev_warn(intf->si_dev, "device id fetch failed: 0x%2.2x\n", in bmc_device_id_handler()
2469 intf->bmc->dyn_id_set = 0; in bmc_device_id_handler()
2474 msg->msg.data, msg->msg.data_len, &intf->bmc->fetch_id); in bmc_device_id_handler()
2476 dev_warn(intf->si_dev, "device id demangle failed: %d\n", rv); in bmc_device_id_handler()
2478 intf->bmc->cc = msg->msg.data[0]; in bmc_device_id_handler()
2479 intf->bmc->dyn_id_set = 0; in bmc_device_id_handler()
2486 intf->bmc->dyn_id_set = 1; in bmc_device_id_handler()
2489 wake_up(&intf->waitq); in bmc_device_id_handler()
2493 send_get_device_id_cmd(struct ipmi_smi *intf) in send_get_device_id_cmd() argument
2508 intf, in send_get_device_id_cmd()
2512 intf, in send_get_device_id_cmd()
2516 intf->addrinfo[0].address, in send_get_device_id_cmd()
2517 intf->addrinfo[0].lun, in send_get_device_id_cmd()
2521 static int __get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc) in __get_device_id() argument
2526 intf->null_user_handler = bmc_device_id_handler; in __get_device_id()
2532 rv = send_get_device_id_cmd(intf); in __get_device_id()
2536 wait_event(intf->waitq, bmc->dyn_id_set != 2); in __get_device_id()
2542 dev_warn(intf->si_dev, in __get_device_id()
2555 intf->null_user_handler = NULL; in __get_device_id()
2569 static int __bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc, in __bmc_get_device_id() argument
2575 bool intf_set = intf != NULL; in __bmc_get_device_id()
2577 if (!intf) { in __bmc_get_device_id()
2584 intf = list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2586 kref_get(&intf->refcount); in __bmc_get_device_id()
2588 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2590 if (intf != list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2592 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2593 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2597 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2598 bmc = intf->bmc; in __bmc_get_device_id()
2600 kref_get(&intf->refcount); in __bmc_get_device_id()
2604 if (intf->in_bmc_register || in __bmc_get_device_id()
2609 __get_guid(intf); in __bmc_get_device_id()
2612 rv = __get_device_id(intf, bmc); in __bmc_get_device_id()
2620 if (!intf->bmc_registered in __bmc_get_device_id()
2635 __ipmi_bmc_unregister(intf); in __bmc_get_device_id()
2637 intf->bmc->id = id; in __bmc_get_device_id()
2638 intf->bmc->dyn_guid_set = guid_set; in __bmc_get_device_id()
2639 intf->bmc->guid = guid; in __bmc_get_device_id()
2640 if (__ipmi_bmc_register(intf, &id, guid_set, &guid, intf_num)) in __bmc_get_device_id()
2641 need_waiter(intf); /* Retry later on an error. */ in __bmc_get_device_id()
2643 __scan_channels(intf, &id); in __bmc_get_device_id()
2652 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2658 bmc = intf->bmc; in __bmc_get_device_id()
2663 __scan_channels(intf, &bmc->fetch_id); in __bmc_get_device_id()
2696 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2698 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2702 static int bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc, in bmc_get_device_id() argument
2706 return __bmc_get_device_id(intf, bmc, id, guid_set, guid, -1); in bmc_get_device_id()
3040 static void __ipmi_bmc_unregister(struct ipmi_smi *intf) in __ipmi_bmc_unregister() argument
3042 struct bmc_device *bmc = intf->bmc; in __ipmi_bmc_unregister()
3044 if (!intf->bmc_registered) in __ipmi_bmc_unregister()
3047 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_unregister()
3048 sysfs_remove_link(&bmc->pdev.dev.kobj, intf->my_dev_name); in __ipmi_bmc_unregister()
3049 kfree(intf->my_dev_name); in __ipmi_bmc_unregister()
3050 intf->my_dev_name = NULL; in __ipmi_bmc_unregister()
3053 list_del(&intf->bmc_link); in __ipmi_bmc_unregister()
3055 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_unregister()
3057 intf->bmc_registered = false; in __ipmi_bmc_unregister()
3060 static void ipmi_bmc_unregister(struct ipmi_smi *intf) in ipmi_bmc_unregister() argument
3062 mutex_lock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
3063 __ipmi_bmc_unregister(intf); in ipmi_bmc_unregister()
3064 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
3070 static int __ipmi_bmc_register(struct ipmi_smi *intf, in __ipmi_bmc_register() argument
3084 intf->in_bmc_register = true; in __ipmi_bmc_register()
3085 mutex_unlock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3109 intf->bmc = old_bmc; in __ipmi_bmc_register()
3111 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3114 dev_info(intf->si_dev, in __ipmi_bmc_register()
3149 intf->bmc = bmc; in __ipmi_bmc_register()
3151 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3156 dev_err(intf->si_dev, in __ipmi_bmc_register()
3162 dev_info(intf->si_dev, in __ipmi_bmc_register()
3173 rv = sysfs_create_link(&intf->si_dev->kobj, &bmc->pdev.dev.kobj, "bmc"); in __ipmi_bmc_register()
3175 dev_err(intf->si_dev, "Unable to create bmc symlink: %d\n", rv); in __ipmi_bmc_register()
3180 intf_num = intf->intf_num; in __ipmi_bmc_register()
3181 intf->my_dev_name = kasprintf(GFP_KERNEL, "ipmi%d", intf_num); in __ipmi_bmc_register()
3182 if (!intf->my_dev_name) { in __ipmi_bmc_register()
3184 dev_err(intf->si_dev, "Unable to allocate link from BMC: %d\n", in __ipmi_bmc_register()
3189 rv = sysfs_create_link(&bmc->pdev.dev.kobj, &intf->si_dev->kobj, in __ipmi_bmc_register()
3190 intf->my_dev_name); in __ipmi_bmc_register()
3192 dev_err(intf->si_dev, "Unable to create symlink to bmc: %d\n", in __ipmi_bmc_register()
3197 intf->bmc_registered = true; in __ipmi_bmc_register()
3201 mutex_lock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3202 intf->in_bmc_register = false; in __ipmi_bmc_register()
3207 kfree(intf->my_dev_name); in __ipmi_bmc_register()
3208 intf->my_dev_name = NULL; in __ipmi_bmc_register()
3211 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_register()
3215 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3217 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3223 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3225 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3231 send_guid_cmd(struct ipmi_smi *intf, int chan) in send_guid_cmd() argument
3245 intf, in send_guid_cmd()
3249 intf, in send_guid_cmd()
3253 intf->addrinfo[0].address, in send_guid_cmd()
3254 intf->addrinfo[0].lun, in send_guid_cmd()
3258 static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in guid_handler() argument
3260 struct bmc_device *bmc = intf->bmc; in guid_handler()
3276 dev_warn(intf->si_dev, in guid_handler()
3290 wake_up(&intf->waitq); in guid_handler()
3293 static void __get_guid(struct ipmi_smi *intf) in __get_guid() argument
3296 struct bmc_device *bmc = intf->bmc; in __get_guid()
3299 intf->null_user_handler = guid_handler; in __get_guid()
3300 rv = send_guid_cmd(intf, 0); in __get_guid()
3305 wait_event(intf->waitq, bmc->dyn_guid_set != 2); in __get_guid()
3310 intf->null_user_handler = NULL; in __get_guid()
3314 send_channel_info_cmd(struct ipmi_smi *intf, int chan) in send_channel_info_cmd() argument
3330 intf, in send_channel_info_cmd()
3334 intf, in send_channel_info_cmd()
3338 intf->addrinfo[0].address, in send_channel_info_cmd()
3339 intf->addrinfo[0].lun, in send_channel_info_cmd()
3344 channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in channel_handler() argument
3348 unsigned int set = intf->curr_working_cset; in channel_handler()
3364 intf->wchannels[set].c[0].medium in channel_handler()
3366 intf->wchannels[set].c[0].protocol in channel_handler()
3369 intf->channel_list = intf->wchannels + set; in channel_handler()
3370 intf->channels_ready = true; in channel_handler()
3371 wake_up(&intf->waitq); in channel_handler()
3380 ch = intf->curr_channel; in channel_handler()
3381 chans = intf->wchannels[set].c; in channel_handler()
3386 intf->curr_channel++; in channel_handler()
3387 if (intf->curr_channel >= IPMI_MAX_CHANNELS) { in channel_handler()
3388 intf->channel_list = intf->wchannels + set; in channel_handler()
3389 intf->channels_ready = true; in channel_handler()
3390 wake_up(&intf->waitq); in channel_handler()
3392 intf->channel_list = intf->wchannels + set; in channel_handler()
3393 intf->channels_ready = true; in channel_handler()
3394 rv = send_channel_info_cmd(intf, intf->curr_channel); in channel_handler()
3399 dev_warn(intf->si_dev, in channel_handler()
3401 intf->curr_channel, rv); in channel_handler()
3403 intf->channel_list = intf->wchannels + set; in channel_handler()
3404 intf->channels_ready = true; in channel_handler()
3405 wake_up(&intf->waitq); in channel_handler()
3415 static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id) in __scan_channels() argument
3428 set = !intf->curr_working_cset; in __scan_channels()
3429 intf->curr_working_cset = set; in __scan_channels()
3430 memset(&intf->wchannels[set], 0, in __scan_channels()
3433 intf->null_user_handler = channel_handler; in __scan_channels()
3434 intf->curr_channel = 0; in __scan_channels()
3435 rv = send_channel_info_cmd(intf, 0); in __scan_channels()
3437 dev_warn(intf->si_dev, in __scan_channels()
3440 intf->null_user_handler = NULL; in __scan_channels()
3445 wait_event(intf->waitq, intf->channels_ready); in __scan_channels()
3446 intf->null_user_handler = NULL; in __scan_channels()
3448 unsigned int set = intf->curr_working_cset; in __scan_channels()
3451 intf->wchannels[set].c[0].medium = IPMI_CHANNEL_MEDIUM_IPMB; in __scan_channels()
3452 intf->wchannels[set].c[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB; in __scan_channels()
3453 intf->channel_list = intf->wchannels + set; in __scan_channels()
3454 intf->channels_ready = true; in __scan_channels()
3460 static void ipmi_poll(struct ipmi_smi *intf) in ipmi_poll() argument
3462 if (intf->handlers->poll) in ipmi_poll()
3463 intf->handlers->poll(intf->send_info); in ipmi_poll()
3465 handle_new_recv_msgs(intf); in ipmi_poll()
3470 ipmi_poll(user->intf); in ipmi_poll_interface()
3476 struct ipmi_smi *intf = container_of(work, struct ipmi_smi, in redo_bmc_reg() local
3479 if (!intf->in_shutdown) in redo_bmc_reg()
3480 bmc_get_device_id(intf, NULL, NULL, NULL, NULL); in redo_bmc_reg()
3482 kref_put(&intf->refcount, intf_free); in redo_bmc_reg()
3493 struct ipmi_smi *intf, *tintf; in ipmi_add_smi() local
3505 intf = kzalloc(sizeof(*intf), GFP_KERNEL); in ipmi_add_smi()
3506 if (!intf) in ipmi_add_smi()
3509 rv = init_srcu_struct(&intf->users_srcu); in ipmi_add_smi()
3511 kfree(intf); in ipmi_add_smi()
3515 intf->owner = owner; in ipmi_add_smi()
3516 intf->bmc = &intf->tmp_bmc; in ipmi_add_smi()
3517 INIT_LIST_HEAD(&intf->bmc->intfs); in ipmi_add_smi()
3518 mutex_init(&intf->bmc->dyn_mutex); in ipmi_add_smi()
3519 INIT_LIST_HEAD(&intf->bmc_link); in ipmi_add_smi()
3520 mutex_init(&intf->bmc_reg_mutex); in ipmi_add_smi()
3521 intf->intf_num = -1; /* Mark it invalid for now. */ in ipmi_add_smi()
3522 kref_init(&intf->refcount); in ipmi_add_smi()
3523 INIT_WORK(&intf->bmc_reg_work, redo_bmc_reg); in ipmi_add_smi()
3524 intf->si_dev = si_dev; in ipmi_add_smi()
3526 intf->addrinfo[j].address = IPMI_BMC_SLAVE_ADDR; in ipmi_add_smi()
3527 intf->addrinfo[j].lun = 2; in ipmi_add_smi()
3530 intf->addrinfo[0].address = slave_addr; in ipmi_add_smi()
3531 INIT_LIST_HEAD(&intf->users); in ipmi_add_smi()
3532 intf->handlers = handlers; in ipmi_add_smi()
3533 intf->send_info = send_info; in ipmi_add_smi()
3534 spin_lock_init(&intf->seq_lock); in ipmi_add_smi()
3536 intf->seq_table[j].inuse = 0; in ipmi_add_smi()
3537 intf->seq_table[j].seqid = 0; in ipmi_add_smi()
3539 intf->curr_seq = 0; in ipmi_add_smi()
3540 spin_lock_init(&intf->waiting_rcv_msgs_lock); in ipmi_add_smi()
3541 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in ipmi_add_smi()
3542 tasklet_setup(&intf->recv_tasklet, in ipmi_add_smi()
3544 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 0); in ipmi_add_smi()
3545 spin_lock_init(&intf->xmit_msgs_lock); in ipmi_add_smi()
3546 INIT_LIST_HEAD(&intf->xmit_msgs); in ipmi_add_smi()
3547 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in ipmi_add_smi()
3548 spin_lock_init(&intf->events_lock); in ipmi_add_smi()
3549 spin_lock_init(&intf->watch_lock); in ipmi_add_smi()
3550 atomic_set(&intf->event_waiters, 0); in ipmi_add_smi()
3551 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_add_smi()
3552 INIT_LIST_HEAD(&intf->waiting_events); in ipmi_add_smi()
3553 intf->waiting_events_count = 0; in ipmi_add_smi()
3554 mutex_init(&intf->cmd_rcvrs_mutex); in ipmi_add_smi()
3555 spin_lock_init(&intf->maintenance_mode_lock); in ipmi_add_smi()
3556 INIT_LIST_HEAD(&intf->cmd_rcvrs); in ipmi_add_smi()
3557 init_waitqueue_head(&intf->waitq); in ipmi_add_smi()
3559 atomic_set(&intf->stats[i], 0); in ipmi_add_smi()
3575 list_add_rcu(&intf->link, &ipmi_interfaces); in ipmi_add_smi()
3577 list_add_tail_rcu(&intf->link, link); in ipmi_add_smi()
3579 rv = handlers->start_processing(send_info, intf); in ipmi_add_smi()
3583 rv = __bmc_get_device_id(intf, NULL, &id, NULL, NULL, i); in ipmi_add_smi()
3589 mutex_lock(&intf->bmc_reg_mutex); in ipmi_add_smi()
3590 rv = __scan_channels(intf, &id); in ipmi_add_smi()
3591 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_add_smi()
3601 intf->intf_num = i; in ipmi_add_smi()
3605 call_smi_watchers(i, intf->si_dev); in ipmi_add_smi()
3610 ipmi_bmc_unregister(intf); in ipmi_add_smi()
3612 if (intf->handlers->shutdown) in ipmi_add_smi()
3613 intf->handlers->shutdown(intf->send_info); in ipmi_add_smi()
3615 list_del_rcu(&intf->link); in ipmi_add_smi()
3618 cleanup_srcu_struct(&intf->users_srcu); in ipmi_add_smi()
3619 kref_put(&intf->refcount, intf_free); in ipmi_add_smi()
3625 static void deliver_smi_err_response(struct ipmi_smi *intf, in deliver_smi_err_response() argument
3634 handle_one_recv_msg(intf, msg); in deliver_smi_err_response()
3637 static void cleanup_smi_msgs(struct ipmi_smi *intf) in cleanup_smi_msgs() argument
3647 list_splice_tail(&intf->hp_xmit_msgs, &tmplist); in cleanup_smi_msgs()
3648 list_splice_tail(&intf->xmit_msgs, &tmplist); in cleanup_smi_msgs()
3651 while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) { in cleanup_smi_msgs()
3666 deliver_smi_err_response(intf, msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3670 ent = &intf->seq_table[i]; in cleanup_smi_msgs()
3673 deliver_err_response(intf, ent->recv_msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3677 void ipmi_unregister_smi(struct ipmi_smi *intf) in ipmi_unregister_smi() argument
3680 int intf_num = intf->intf_num, index; in ipmi_unregister_smi()
3683 intf->intf_num = -1; in ipmi_unregister_smi()
3684 intf->in_shutdown = true; in ipmi_unregister_smi()
3685 list_del_rcu(&intf->link); in ipmi_unregister_smi()
3700 index = srcu_read_lock(&intf->users_srcu); in ipmi_unregister_smi()
3701 while (!list_empty(&intf->users)) { in ipmi_unregister_smi()
3703 container_of(list_next_rcu(&intf->users), in ipmi_unregister_smi()
3708 srcu_read_unlock(&intf->users_srcu, index); in ipmi_unregister_smi()
3710 if (intf->handlers->shutdown) in ipmi_unregister_smi()
3711 intf->handlers->shutdown(intf->send_info); in ipmi_unregister_smi()
3713 cleanup_smi_msgs(intf); in ipmi_unregister_smi()
3715 ipmi_bmc_unregister(intf); in ipmi_unregister_smi()
3717 cleanup_srcu_struct(&intf->users_srcu); in ipmi_unregister_smi()
3718 kref_put(&intf->refcount, intf_free); in ipmi_unregister_smi()
3722 static int handle_ipmb_get_msg_rsp(struct ipmi_smi *intf, in handle_ipmb_get_msg_rsp() argument
3734 ipmi_inc_stat(intf, invalid_ipmb_responses); in handle_ipmb_get_msg_rsp()
3752 if (intf_find_seq(intf, in handle_ipmb_get_msg_rsp()
3763 ipmi_inc_stat(intf, unhandled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3777 if (deliver_response(intf, recv_msg)) in handle_ipmb_get_msg_rsp()
3778 ipmi_inc_stat(intf, unhandled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3780 ipmi_inc_stat(intf, handled_ipmb_responses); in handle_ipmb_get_msg_rsp()
3785 static int handle_ipmb_get_msg_cmd(struct ipmi_smi *intf, in handle_ipmb_get_msg_cmd() argument
3799 ipmi_inc_stat(intf, invalid_commands); in handle_ipmb_get_msg_cmd()
3813 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_ipmb_get_msg_cmd()
3823 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_get_msg_cmd()
3831 msg->data[6] = intf->addrinfo[msg->rsp[3] & 0xf].address; in handle_ipmb_get_msg_cmd()
3842 if (!intf->in_shutdown) { in handle_ipmb_get_msg_cmd()
3843 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_get_msg_cmd()
3888 if (deliver_response(intf, recv_msg)) in handle_ipmb_get_msg_cmd()
3889 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_get_msg_cmd()
3891 ipmi_inc_stat(intf, handled_commands); in handle_ipmb_get_msg_cmd()
3898 static int handle_ipmb_direct_rcv_cmd(struct ipmi_smi *intf, in handle_ipmb_direct_rcv_cmd() argument
3911 rcvr = find_cmd_rcvr(intf, netfn, cmd, 0); in handle_ipmb_direct_rcv_cmd()
3921 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_direct_rcv_cmd()
3933 if (!intf->in_shutdown) { in handle_ipmb_direct_rcv_cmd()
3934 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_direct_rcv_cmd()
3976 if (deliver_response(intf, recv_msg)) in handle_ipmb_direct_rcv_cmd()
3977 ipmi_inc_stat(intf, unhandled_commands); in handle_ipmb_direct_rcv_cmd()
3979 ipmi_inc_stat(intf, handled_commands); in handle_ipmb_direct_rcv_cmd()
3986 static int handle_ipmb_direct_rcv_rsp(struct ipmi_smi *intf, in handle_ipmb_direct_rcv_rsp() argument
3994 dev_warn(intf->si_dev, in handle_ipmb_direct_rcv_rsp()
4012 deliver_local_response(intf, recv_msg); in handle_ipmb_direct_rcv_rsp()
4017 static int handle_lan_get_msg_rsp(struct ipmi_smi *intf, in handle_lan_get_msg_rsp() argument
4030 ipmi_inc_stat(intf, invalid_lan_responses); in handle_lan_get_msg_rsp()
4051 if (intf_find_seq(intf, in handle_lan_get_msg_rsp()
4062 ipmi_inc_stat(intf, unhandled_lan_responses); in handle_lan_get_msg_rsp()
4076 if (deliver_response(intf, recv_msg)) in handle_lan_get_msg_rsp()
4077 ipmi_inc_stat(intf, unhandled_lan_responses); in handle_lan_get_msg_rsp()
4079 ipmi_inc_stat(intf, handled_lan_responses); in handle_lan_get_msg_rsp()
4084 static int handle_lan_get_msg_cmd(struct ipmi_smi *intf, in handle_lan_get_msg_cmd() argument
4098 ipmi_inc_stat(intf, invalid_commands); in handle_lan_get_msg_cmd()
4112 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_lan_get_msg_cmd()
4122 ipmi_inc_stat(intf, unhandled_commands); in handle_lan_get_msg_cmd()
4167 if (deliver_response(intf, recv_msg)) in handle_lan_get_msg_cmd()
4168 ipmi_inc_stat(intf, unhandled_commands); in handle_lan_get_msg_cmd()
4170 ipmi_inc_stat(intf, handled_commands); in handle_lan_get_msg_cmd()
4183 static int handle_oem_get_msg_cmd(struct ipmi_smi *intf, in handle_oem_get_msg_cmd() argument
4201 ipmi_inc_stat(intf, invalid_commands); in handle_oem_get_msg_cmd()
4219 rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); in handle_oem_get_msg_cmd()
4229 ipmi_inc_stat(intf, unhandled_commands); in handle_oem_get_msg_cmd()
4274 if (deliver_response(intf, recv_msg)) in handle_oem_get_msg_cmd()
4275 ipmi_inc_stat(intf, unhandled_commands); in handle_oem_get_msg_cmd()
4277 ipmi_inc_stat(intf, handled_commands); in handle_oem_get_msg_cmd()
4302 static int handle_read_event_rsp(struct ipmi_smi *intf, in handle_read_event_rsp() argument
4313 ipmi_inc_stat(intf, invalid_events); in handle_read_event_rsp()
4324 spin_lock_irqsave(&intf->events_lock, flags); in handle_read_event_rsp()
4326 ipmi_inc_stat(intf, events); in handle_read_event_rsp()
4332 index = srcu_read_lock(&intf->users_srcu); in handle_read_event_rsp()
4333 list_for_each_entry_rcu(user, &intf->users, link) { in handle_read_event_rsp()
4361 srcu_read_unlock(&intf->users_srcu, index); in handle_read_event_rsp()
4367 deliver_local_response(intf, recv_msg); in handle_read_event_rsp()
4369 } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { in handle_read_event_rsp()
4386 list_add_tail(&recv_msg->link, &intf->waiting_events); in handle_read_event_rsp()
4387 intf->waiting_events_count++; in handle_read_event_rsp()
4388 } else if (!intf->event_msg_printed) { in handle_read_event_rsp()
4393 dev_warn(intf->si_dev, in handle_read_event_rsp()
4395 intf->event_msg_printed = 1; in handle_read_event_rsp()
4399 spin_unlock_irqrestore(&intf->events_lock, flags); in handle_read_event_rsp()
4404 static int handle_bmc_rsp(struct ipmi_smi *intf, in handle_bmc_rsp() argument
4412 dev_warn(intf->si_dev, in handle_bmc_rsp()
4429 deliver_local_response(intf, recv_msg); in handle_bmc_rsp()
4439 static int handle_one_recv_msg(struct ipmi_smi *intf, in handle_one_recv_msg() argument
4451 dev_warn(intf->si_dev, in handle_one_recv_msg()
4464 ipmi_inc_stat(intf, invalid_commands); in handle_one_recv_msg()
4468 ipmi_inc_stat(intf, invalid_ipmb_responses); in handle_one_recv_msg()
4485 if (intf->in_shutdown) in handle_one_recv_msg()
4511 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4514 ipmi_inc_stat(intf, sent_lan_command_errs); in handle_one_recv_msg()
4516 ipmi_inc_stat(intf, sent_ipmb_command_errs); in handle_one_recv_msg()
4517 intf_err_seq(intf, msg->msgid, msg->rsp[2]); in handle_one_recv_msg()
4520 intf_start_seq_timer(intf, msg->msgid); in handle_one_recv_msg()
4527 dev_warn(intf->si_dev, in handle_one_recv_msg()
4543 requeue = handle_ipmb_direct_rcv_cmd(intf, msg); in handle_one_recv_msg()
4545 requeue = handle_ipmb_direct_rcv_rsp(intf, msg); in handle_one_recv_msg()
4572 deliver_local_response(intf, recv_msg); in handle_one_recv_msg()
4591 if (!intf->channels_ready) { in handle_one_recv_msg()
4596 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4605 requeue = handle_ipmb_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4611 requeue = handle_ipmb_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4622 requeue = handle_lan_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4628 requeue = handle_lan_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4638 requeue = handle_oem_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4651 requeue = handle_read_event_rsp(intf, msg); in handle_one_recv_msg()
4654 requeue = handle_bmc_rsp(intf, msg); in handle_one_recv_msg()
4664 static void handle_new_recv_msgs(struct ipmi_smi *intf) in handle_new_recv_msgs() argument
4669 int run_to_completion = intf->run_to_completion; in handle_new_recv_msgs()
4673 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4674 while (!list_empty(&intf->waiting_rcv_msgs)) { in handle_new_recv_msgs()
4675 smi_msg = list_entry(intf->waiting_rcv_msgs.next, in handle_new_recv_msgs()
4679 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in handle_new_recv_msgs()
4681 rv = handle_one_recv_msg(intf, smi_msg); in handle_new_recv_msgs()
4683 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4692 list_add(&smi_msg->link, &intf->waiting_rcv_msgs); in handle_new_recv_msgs()
4702 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4708 if (atomic_add_unless(&intf->watchdog_pretimeouts_to_deliver, -1, 0)) { in handle_new_recv_msgs()
4712 index = srcu_read_lock(&intf->users_srcu); in handle_new_recv_msgs()
4713 list_for_each_entry_rcu(user, &intf->users, link) { in handle_new_recv_msgs()
4718 srcu_read_unlock(&intf->users_srcu, index); in handle_new_recv_msgs()
4725 struct ipmi_smi *intf = from_tasklet(intf, t, recv_tasklet); in smi_recv_tasklet() local
4726 int run_to_completion = intf->run_to_completion; in smi_recv_tasklet()
4740 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in smi_recv_tasklet()
4741 if (intf->curr_msg == NULL && !intf->in_shutdown) { in smi_recv_tasklet()
4745 if (!list_empty(&intf->hp_xmit_msgs)) in smi_recv_tasklet()
4746 entry = intf->hp_xmit_msgs.next; in smi_recv_tasklet()
4747 else if (!list_empty(&intf->xmit_msgs)) in smi_recv_tasklet()
4748 entry = intf->xmit_msgs.next; in smi_recv_tasklet()
4753 intf->curr_msg = newmsg; in smi_recv_tasklet()
4758 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in smi_recv_tasklet()
4760 intf->handlers->sender(intf->send_info, newmsg); in smi_recv_tasklet()
4764 handle_new_recv_msgs(intf); in smi_recv_tasklet()
4768 void ipmi_smi_msg_received(struct ipmi_smi *intf, in ipmi_smi_msg_received() argument
4772 int run_to_completion = intf->run_to_completion; in ipmi_smi_msg_received()
4779 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in ipmi_smi_msg_received()
4780 list_add_tail(&msg->link, &intf->waiting_rcv_msgs); in ipmi_smi_msg_received()
4782 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in ipmi_smi_msg_received()
4786 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4791 if (msg == intf->curr_msg) in ipmi_smi_msg_received()
4792 intf->curr_msg = NULL; in ipmi_smi_msg_received()
4794 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4797 smi_recv_tasklet(&intf->recv_tasklet); in ipmi_smi_msg_received()
4799 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_msg_received()
4803 void ipmi_smi_watchdog_pretimeout(struct ipmi_smi *intf) in ipmi_smi_watchdog_pretimeout() argument
4805 if (intf->in_shutdown) in ipmi_smi_watchdog_pretimeout()
4808 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 1); in ipmi_smi_watchdog_pretimeout()
4809 tasklet_schedule(&intf->recv_tasklet); in ipmi_smi_watchdog_pretimeout()
4814 smi_from_recv_msg(struct ipmi_smi *intf, struct ipmi_recv_msg *recv_msg, in smi_from_recv_msg() argument
4834 static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent, in check_msg_timeout() argument
4842 if (intf->in_shutdown) in check_msg_timeout()
4857 smi_remove_watch(intf, IPMI_WATCH_MASK_CHECK_MESSAGES); in check_msg_timeout()
4861 ipmi_inc_stat(intf, timed_out_ipmb_broadcasts); in check_msg_timeout()
4863 ipmi_inc_stat(intf, timed_out_lan_commands); in check_msg_timeout()
4865 ipmi_inc_stat(intf, timed_out_ipmb_commands); in check_msg_timeout()
4878 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot, in check_msg_timeout()
4882 ipmi_inc_stat(intf, in check_msg_timeout()
4885 ipmi_inc_stat(intf, in check_msg_timeout()
4890 spin_unlock_irqrestore(&intf->seq_lock, *flags); in check_msg_timeout()
4899 if (intf->handlers) { in check_msg_timeout()
4901 ipmi_inc_stat(intf, in check_msg_timeout()
4904 ipmi_inc_stat(intf, in check_msg_timeout()
4907 smi_send(intf, intf->handlers, smi_msg, 0); in check_msg_timeout()
4911 spin_lock_irqsave(&intf->seq_lock, *flags); in check_msg_timeout()
4915 static bool ipmi_timeout_handler(struct ipmi_smi *intf, in ipmi_timeout_handler() argument
4924 if (!intf->bmc_registered) { in ipmi_timeout_handler()
4925 kref_get(&intf->refcount); in ipmi_timeout_handler()
4926 if (!schedule_work(&intf->bmc_reg_work)) { in ipmi_timeout_handler()
4927 kref_put(&intf->refcount, intf_free); in ipmi_timeout_handler()
4938 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_timeout_handler()
4939 if (intf->ipmb_maintenance_mode_timeout) { in ipmi_timeout_handler()
4940 if (intf->ipmb_maintenance_mode_timeout <= timeout_period) in ipmi_timeout_handler()
4941 intf->ipmb_maintenance_mode_timeout = 0; in ipmi_timeout_handler()
4943 intf->ipmb_maintenance_mode_timeout -= timeout_period; in ipmi_timeout_handler()
4946 check_msg_timeout(intf, &intf->seq_table[i], in ipmi_timeout_handler()
4949 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_timeout_handler()
4952 deliver_err_response(intf, msg, IPMI_TIMEOUT_COMPLETION_CODE); in ipmi_timeout_handler()
4962 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4963 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_timeout_handler()
4964 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
4965 intf->auto_maintenance_timeout in ipmi_timeout_handler()
4967 if (!intf->maintenance_mode in ipmi_timeout_handler()
4968 && (intf->auto_maintenance_timeout <= 0)) { in ipmi_timeout_handler()
4969 intf->maintenance_mode_enable = false; in ipmi_timeout_handler()
4970 maintenance_mode_update(intf); in ipmi_timeout_handler()
4973 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in ipmi_timeout_handler()
4977 tasklet_schedule(&intf->recv_tasklet); in ipmi_timeout_handler()
4982 static void ipmi_request_event(struct ipmi_smi *intf) in ipmi_request_event() argument
4985 if (intf->maintenance_mode_enable) in ipmi_request_event()
4988 if (!intf->in_shutdown) in ipmi_request_event()
4989 intf->handlers->request_events(intf->send_info); in ipmi_request_event()
4998 struct ipmi_smi *intf; in ipmi_timeout() local
5006 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in ipmi_timeout()
5007 if (atomic_read(&intf->event_waiters)) { in ipmi_timeout()
5008 intf->ticks_to_req_ev--; in ipmi_timeout()
5009 if (intf->ticks_to_req_ev == 0) { in ipmi_timeout()
5010 ipmi_request_event(intf); in ipmi_timeout()
5011 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_timeout()
5016 need_timer |= ipmi_timeout_handler(intf, IPMI_TIMEOUT_TIME); in ipmi_timeout()
5024 static void need_waiter(struct ipmi_smi *intf) in need_waiter() argument
5100 static void ipmi_panic_request_and_wait(struct ipmi_smi *intf, in ipmi_panic_request_and_wait() argument
5112 intf, in ipmi_panic_request_and_wait()
5116 intf, in ipmi_panic_request_and_wait()
5120 intf->addrinfo[0].address, in ipmi_panic_request_and_wait()
5121 intf->addrinfo[0].lun, in ipmi_panic_request_and_wait()
5125 else if (intf->handlers->flush_messages) in ipmi_panic_request_and_wait()
5126 intf->handlers->flush_messages(intf->send_info); in ipmi_panic_request_and_wait()
5129 ipmi_poll(intf); in ipmi_panic_request_and_wait()
5132 static void event_receiver_fetcher(struct ipmi_smi *intf, in event_receiver_fetcher() argument
5140 intf->event_receiver = msg->msg.data[1]; in event_receiver_fetcher()
5141 intf->event_receiver_lun = msg->msg.data[2] & 0x3; in event_receiver_fetcher()
5145 static void device_id_fetcher(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in device_id_fetcher() argument
5155 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; in device_id_fetcher()
5156 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; in device_id_fetcher()
5160 static void send_panic_events(struct ipmi_smi *intf, char *str) in send_panic_events() argument
5200 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5226 intf->local_sel_device = 0; in send_panic_events()
5227 intf->local_event_generator = 0; in send_panic_events()
5228 intf->event_receiver = 0; in send_panic_events()
5235 intf->null_user_handler = device_id_fetcher; in send_panic_events()
5236 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5238 if (intf->local_event_generator) { in send_panic_events()
5244 intf->null_user_handler = event_receiver_fetcher; in send_panic_events()
5245 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5247 intf->null_user_handler = NULL; in send_panic_events()
5254 if (((intf->event_receiver & 1) == 0) in send_panic_events()
5255 && (intf->event_receiver != 0) in send_panic_events()
5256 && (intf->event_receiver != intf->addrinfo[0].address)) { in send_panic_events()
5264 ipmb->lun = intf->event_receiver_lun; in send_panic_events()
5265 ipmb->slave_addr = intf->event_receiver; in send_panic_events()
5266 } else if (intf->local_sel_device) { in send_panic_events()
5293 data[3] = intf->addrinfo[0].address; in send_panic_events()
5302 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5312 struct ipmi_smi *intf; in panic_event() local
5320 list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { in panic_event()
5321 if (!intf->handlers || intf->intf_num == -1) in panic_event()
5325 if (!intf->handlers->poll) in panic_event()
5334 if (!spin_trylock(&intf->xmit_msgs_lock)) { in panic_event()
5335 INIT_LIST_HEAD(&intf->xmit_msgs); in panic_event()
5336 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in panic_event()
5338 spin_unlock(&intf->xmit_msgs_lock); in panic_event()
5340 if (!spin_trylock(&intf->waiting_rcv_msgs_lock)) in panic_event()
5341 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in panic_event()
5343 spin_unlock(&intf->waiting_rcv_msgs_lock); in panic_event()
5345 intf->run_to_completion = 1; in panic_event()
5346 if (intf->handlers->set_run_to_completion) in panic_event()
5347 intf->handlers->set_run_to_completion(intf->send_info, in panic_event()
5350 list_for_each_entry_rcu(user, &intf->users, link) { in panic_event()
5356 send_panic_events(intf, ptr); in panic_event()