Lines Matching +full:ipmb +full:- +full:dev

1 // SPDX-License-Identifier: GPL-2.0+
81 e = match_string(ipmi_panic_event_str, -1, strstrip(valcp)); in panic_op_write_handler()
111 /* Remain in auto-maintenance mode for this amount of time (in ms). */
300 #define to_bmc_device(x) container_of((x), struct bmc_device, pdev.dev)
325 /* Commands we sent out to the IPMB bus. */
328 /* Commands sent on the IPMB that had errors on the SEND CMD */
347 /* Responses I have sent to the IPMB bus. */
359 /* Commands we sent out to the IPMB bus. */
362 /* Commands sent on the IPMB that had errors on the SEND CMD */
374 /* Responses I have sent to the IPMB bus. */
401 /* Retransmissions on IPMB that failed. */
458 /* Driver-model device for the system interface. */
463 * sequence numbers for IPMB messages that go out of the
547 * If we are doing maintenance on something on IPMB, extend
554 * A cheap hack, if this is non-null and a message to an
586 #define to_si_intf_from_dev(device) container_of(device, struct ipmi_smi, dev)
600 owner = user->intf->owner; in free_ipmi_user()
601 kref_put(&user->intf->refcount, intf_free); in free_ipmi_user()
608 kref_put(&user->refcount, free_ipmi_user); in release_ipmi_user()
613 if (!kref_get_unless_zero(&user->refcount)) in acquire_ipmi_user()
642 atomic_inc(&(intf)->stats[IPMI_STAT_ ## stat])
644 ((unsigned int) atomic_read(&(intf)->stats[IPMI_STAT_ ## stat]))
648 "device-tree", "platform"
661 return addr->addr_type == IPMI_LAN_ADDR_TYPE; in is_lan_addr()
666 return addr->addr_type == IPMI_IPMB_ADDR_TYPE; in is_ipmb_addr()
671 return addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE; in is_ipmb_bcast_addr()
676 return addr->addr_type == IPMI_IPMB_DIRECT_ADDR_TYPE; in is_ipmb_direct_addr()
684 list_del(&msg->link); in free_recv_msg_list()
694 list_del(&msg->link); in free_smi_msg_list()
705 free_smi_msg_list(&intf->waiting_rcv_msgs); in intf_free()
706 free_recv_msg_list(&intf->waiting_events); in intf_free()
710 * interface. No need for locks, this is single-threaded. in intf_free()
712 list_for_each_entry_safe(rcvr, rcvr2, &intf->cmd_rcvrs, link) in intf_free()
716 if ((intf->seq_table[i].inuse) in intf_free()
717 && (intf->seq_table[i].recv_msg)) in intf_free()
718 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in intf_free()
742 list_add(&watcher->link, &smi_watchers); in ipmi_smi_watcher_register()
757 rv = -ENOMEM; in ipmi_smi_watcher_register()
764 rv = -ENOMEM; in ipmi_smi_watcher_register()
771 int intf_num = READ_ONCE(intf->intf_num); in ipmi_smi_watcher_register()
773 if (intf_num == -1) in ipmi_smi_watcher_register()
775 devices[count] = intf->si_dev; in ipmi_smi_watcher_register()
783 watcher->new_smi(interfaces[i], devices[i]); in ipmi_smi_watcher_register()
797 list_del(&watcher->link); in ipmi_smi_watcher_unregister()
804 call_smi_watchers(int i, struct device *dev) in call_smi_watchers() argument
809 if (try_module_get(w->owner)) { in call_smi_watchers()
810 w->new_smi(i, dev); in call_smi_watchers()
811 module_put(w->owner); in call_smi_watchers()
819 if (addr1->addr_type != addr2->addr_type) in ipmi_addr_equal()
822 if (addr1->channel != addr2->channel) in ipmi_addr_equal()
825 if (addr1->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { in ipmi_addr_equal()
830 return (smi_addr1->lun == smi_addr2->lun); in ipmi_addr_equal()
839 return ((ipmb_addr1->slave_addr == ipmb_addr2->slave_addr) in ipmi_addr_equal()
840 && (ipmb_addr1->lun == ipmb_addr2->lun)); in ipmi_addr_equal()
849 return daddr1->slave_addr == daddr2->slave_addr && in ipmi_addr_equal()
850 daddr1->rq_lun == daddr2->rq_lun && in ipmi_addr_equal()
851 daddr1->rs_lun == daddr2->rs_lun; in ipmi_addr_equal()
860 return ((lan_addr1->remote_SWID == lan_addr2->remote_SWID) in ipmi_addr_equal()
861 && (lan_addr1->local_SWID == lan_addr2->local_SWID) in ipmi_addr_equal()
862 && (lan_addr1->session_handle in ipmi_addr_equal()
863 == lan_addr2->session_handle) in ipmi_addr_equal()
864 && (lan_addr1->lun == lan_addr2->lun)); in ipmi_addr_equal()
873 return -EINVAL; in ipmi_validate_addr()
875 if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { in ipmi_validate_addr()
876 if (addr->channel != IPMI_BMC_CHANNEL) in ipmi_validate_addr()
877 return -EINVAL; in ipmi_validate_addr()
881 if ((addr->channel == IPMI_BMC_CHANNEL) in ipmi_validate_addr()
882 || (addr->channel >= IPMI_MAX_CHANNELS) in ipmi_validate_addr()
883 || (addr->channel < 0)) in ipmi_validate_addr()
884 return -EINVAL; in ipmi_validate_addr()
888 return -EINVAL; in ipmi_validate_addr()
895 if (addr->channel != 0) in ipmi_validate_addr()
896 return -EINVAL; in ipmi_validate_addr()
898 return -EINVAL; in ipmi_validate_addr()
900 if (daddr->slave_addr & 0x01) in ipmi_validate_addr()
901 return -EINVAL; in ipmi_validate_addr()
902 if (daddr->rq_lun >= 4) in ipmi_validate_addr()
903 return -EINVAL; in ipmi_validate_addr()
904 if (daddr->rs_lun >= 4) in ipmi_validate_addr()
905 return -EINVAL; in ipmi_validate_addr()
911 return -EINVAL; in ipmi_validate_addr()
915 return -EINVAL; in ipmi_validate_addr()
942 if (!msg->user) { in deliver_response()
944 if (intf->null_user_handler) { in deliver_response()
945 intf->null_user_handler(intf, msg); in deliver_response()
948 rv = -EINVAL; in deliver_response()
958 atomic_dec(&msg->user->nr_msgs); in deliver_response()
964 mutex_lock(&intf->user_msgs_mutex); in deliver_response()
965 list_add_tail(&msg->link, &intf->user_msgs); in deliver_response()
966 mutex_unlock(&intf->user_msgs_mutex); in deliver_response()
967 queue_work(system_wq, &intf->smi_work); in deliver_response()
985 msg->recv_type = IPMI_RESPONSE_RECV_TYPE; in deliver_err_response()
986 msg->msg_data[0] = err; in deliver_err_response()
987 msg->msg.netfn |= 1; /* Convert to a response. */ in deliver_err_response()
988 msg->msg.data_len = 1; in deliver_err_response()
989 msg->msg.data = msg->msg_data; in deliver_err_response()
997 if (!intf->handlers->set_need_watch) in smi_add_watch()
1000 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_add_watch()
1002 intf->response_waiters++; in smi_add_watch()
1005 intf->watchdog_waiters++; in smi_add_watch()
1008 intf->command_waiters++; in smi_add_watch()
1010 if ((intf->last_watch_mask & flags) != flags) { in smi_add_watch()
1011 intf->last_watch_mask |= flags; in smi_add_watch()
1012 intf->handlers->set_need_watch(intf->send_info, in smi_add_watch()
1013 intf->last_watch_mask); in smi_add_watch()
1015 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_add_watch()
1022 if (!intf->handlers->set_need_watch) in smi_remove_watch()
1025 spin_lock_irqsave(&intf->watch_lock, iflags); in smi_remove_watch()
1027 intf->response_waiters--; in smi_remove_watch()
1030 intf->watchdog_waiters--; in smi_remove_watch()
1033 intf->command_waiters--; in smi_remove_watch()
1036 if (intf->response_waiters) in smi_remove_watch()
1038 if (intf->watchdog_waiters) in smi_remove_watch()
1040 if (intf->command_waiters) in smi_remove_watch()
1043 if (intf->last_watch_mask != flags) { in smi_remove_watch()
1044 intf->last_watch_mask = flags; in smi_remove_watch()
1045 intf->handlers->set_need_watch(intf->send_info, in smi_remove_watch()
1046 intf->last_watch_mask); in smi_remove_watch()
1048 spin_unlock_irqrestore(&intf->watch_lock, iflags); in smi_remove_watch()
1072 for (i = intf->curr_seq; (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; in intf_next_seq()
1074 if (!intf->seq_table[i].inuse) in intf_next_seq()
1078 if (!intf->seq_table[i].inuse) { in intf_next_seq()
1079 intf->seq_table[i].recv_msg = recv_msg; in intf_next_seq()
1085 intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; in intf_next_seq()
1086 intf->seq_table[i].orig_timeout = timeout; in intf_next_seq()
1087 intf->seq_table[i].retries_left = retries; in intf_next_seq()
1088 intf->seq_table[i].broadcast = broadcast; in intf_next_seq()
1089 intf->seq_table[i].inuse = 1; in intf_next_seq()
1090 intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid); in intf_next_seq()
1092 *seqid = intf->seq_table[i].seqid; in intf_next_seq()
1093 intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ; in intf_next_seq()
1097 rv = -EAGAIN; in intf_next_seq()
1118 int rv = -ENODEV; in intf_find_seq()
1122 return -EINVAL; in intf_find_seq()
1124 spin_lock_irqsave(&intf->seq_lock, flags); in intf_find_seq()
1125 if (intf->seq_table[seq].inuse) { in intf_find_seq()
1126 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; in intf_find_seq()
1128 if ((msg->addr.channel == channel) && (msg->msg.cmd == cmd) in intf_find_seq()
1129 && (msg->msg.netfn == netfn) in intf_find_seq()
1130 && (ipmi_addr_equal(addr, &msg->addr))) { in intf_find_seq()
1132 intf->seq_table[seq].inuse = 0; in intf_find_seq()
1137 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_find_seq()
1147 int rv = -ENODEV; in intf_start_seq_timer()
1155 spin_lock_irqsave(&intf->seq_lock, flags); in intf_start_seq_timer()
1160 if ((intf->seq_table[seq].inuse) in intf_start_seq_timer()
1161 && (intf->seq_table[seq].seqid == seqid)) { in intf_start_seq_timer()
1162 struct seq_table *ent = &intf->seq_table[seq]; in intf_start_seq_timer()
1163 ent->timeout = ent->orig_timeout; in intf_start_seq_timer()
1166 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_start_seq_timer()
1176 int rv = -ENODEV; in intf_err_seq()
1185 spin_lock_irqsave(&intf->seq_lock, flags); in intf_err_seq()
1190 if ((intf->seq_table[seq].inuse) in intf_err_seq()
1191 && (intf->seq_table[seq].seqid == seqid)) { in intf_err_seq()
1192 struct seq_table *ent = &intf->seq_table[seq]; in intf_err_seq()
1194 ent->inuse = 0; in intf_err_seq()
1196 msg = ent->recv_msg; in intf_err_seq()
1199 spin_unlock_irqrestore(&intf->seq_lock, flags); in intf_err_seq()
1226 return -EINVAL; in ipmi_create_user()
1238 if (intf->intf_num == if_num) in ipmi_create_user()
1242 rv = -EINVAL; in ipmi_create_user()
1246 if (intf->in_shutdown) { in ipmi_create_user()
1247 rv = -ENODEV; in ipmi_create_user()
1251 if (atomic_add_return(1, &intf->nr_users) > max_users) { in ipmi_create_user()
1252 rv = -EBUSY; in ipmi_create_user()
1258 rv = -ENOMEM; in ipmi_create_user()
1262 if (!try_module_get(intf->owner)) { in ipmi_create_user()
1263 rv = -ENODEV; in ipmi_create_user()
1268 kref_get(&intf->refcount); in ipmi_create_user()
1270 atomic_set(&new_user->nr_msgs, 0); in ipmi_create_user()
1271 kref_init(&new_user->refcount); in ipmi_create_user()
1272 refcount_set(&new_user->destroyed, 1); in ipmi_create_user()
1273 kref_get(&new_user->refcount); /* Destroy owns a refcount. */ in ipmi_create_user()
1274 new_user->handler = handler; in ipmi_create_user()
1275 new_user->handler_data = handler_data; in ipmi_create_user()
1276 new_user->intf = intf; in ipmi_create_user()
1277 new_user->gets_events = false; in ipmi_create_user()
1279 mutex_lock(&intf->users_mutex); in ipmi_create_user()
1280 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_create_user()
1281 list_add(&new_user->link, &intf->users); in ipmi_create_user()
1282 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_create_user()
1283 mutex_unlock(&intf->users_mutex); in ipmi_create_user()
1285 if (handler->ipmi_watchdog_pretimeout) in ipmi_create_user()
1291 atomic_dec(&intf->nr_users); in ipmi_create_user()
1304 int rv = -EINVAL; in ipmi_get_smi_info()
1309 if (intf->intf_num == if_num) { in ipmi_get_smi_info()
1310 if (!intf->handlers->get_smi_info) in ipmi_get_smi_info()
1311 rv = -ENOTTY; in ipmi_get_smi_info()
1313 rv = intf->handlers->get_smi_info(intf->send_info, data); in ipmi_get_smi_info()
1323 /* Must be called with intf->users_mutex held. */
1326 struct ipmi_smi *intf = user->intf; in _ipmi_destroy_user()
1333 if (!refcount_dec_if_one(&user->destroyed)) in _ipmi_destroy_user()
1336 if (user->handler->shutdown) in _ipmi_destroy_user()
1337 user->handler->shutdown(user->handler_data); in _ipmi_destroy_user()
1339 if (user->handler->ipmi_watchdog_pretimeout) in _ipmi_destroy_user()
1342 if (user->gets_events) in _ipmi_destroy_user()
1343 atomic_dec(&intf->event_waiters); in _ipmi_destroy_user()
1346 list_del(&user->link); in _ipmi_destroy_user()
1347 atomic_dec(&intf->nr_users); in _ipmi_destroy_user()
1349 spin_lock_irqsave(&intf->seq_lock, flags); in _ipmi_destroy_user()
1351 if (intf->seq_table[i].inuse in _ipmi_destroy_user()
1352 && (intf->seq_table[i].recv_msg->user == user)) { in _ipmi_destroy_user()
1353 intf->seq_table[i].inuse = 0; in _ipmi_destroy_user()
1355 ipmi_free_recv_msg(intf->seq_table[i].recv_msg); in _ipmi_destroy_user()
1358 spin_unlock_irqrestore(&intf->seq_lock, flags); in _ipmi_destroy_user()
1366 mutex_lock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1367 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in _ipmi_destroy_user()
1368 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in _ipmi_destroy_user()
1369 if (rcvr->user == user) { in _ipmi_destroy_user()
1370 list_del_rcu(&rcvr->link); in _ipmi_destroy_user()
1371 rcvr->next = rcvrs; in _ipmi_destroy_user()
1375 mutex_unlock(&intf->cmd_rcvrs_mutex); in _ipmi_destroy_user()
1378 rcvrs = rcvr->next; in _ipmi_destroy_user()
1382 mutex_lock(&intf->user_msgs_mutex); in _ipmi_destroy_user()
1383 list_for_each_entry_safe(msg, msg2, &intf->user_msgs, link) { in _ipmi_destroy_user()
1384 if (msg->user != user) in _ipmi_destroy_user()
1386 list_del(&msg->link); in _ipmi_destroy_user()
1389 mutex_unlock(&intf->user_msgs_mutex); in _ipmi_destroy_user()
1396 struct ipmi_smi *intf = user->intf; in ipmi_destroy_user()
1398 mutex_lock(&intf->users_mutex); in ipmi_destroy_user()
1400 mutex_unlock(&intf->users_mutex); in ipmi_destroy_user()
1402 kref_put(&user->refcount, free_ipmi_user); in ipmi_destroy_user()
1415 return -ENODEV; in ipmi_get_version()
1417 rv = bmc_get_device_id(user->intf, NULL, &id, NULL, NULL); in ipmi_get_version()
1436 return -ENODEV; in ipmi_set_my_address()
1439 rv = -EINVAL; in ipmi_set_my_address()
1442 user->intf->addrinfo[channel].address = address; in ipmi_set_my_address()
1458 return -ENODEV; in ipmi_get_my_address()
1461 rv = -EINVAL; in ipmi_get_my_address()
1464 *address = user->intf->addrinfo[channel].address; in ipmi_get_my_address()
1480 return -ENODEV; in ipmi_set_my_LUN()
1483 rv = -EINVAL; in ipmi_set_my_LUN()
1486 user->intf->addrinfo[channel].lun = LUN & 0x3; in ipmi_set_my_LUN()
1502 return -ENODEV; in ipmi_get_my_LUN()
1505 rv = -EINVAL; in ipmi_get_my_LUN()
1508 *address = user->intf->addrinfo[channel].lun; in ipmi_get_my_LUN()
1523 return -ENODEV; in ipmi_get_maintenance_mode()
1525 spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1526 mode = user->intf->maintenance_mode; in ipmi_get_maintenance_mode()
1527 spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags); in ipmi_get_maintenance_mode()
1536 if (intf->handlers->set_maintenance_mode) in maintenance_mode_update()
1537 intf->handlers->set_maintenance_mode( in maintenance_mode_update()
1538 intf->send_info, intf->maintenance_mode_enable); in maintenance_mode_update()
1545 struct ipmi_smi *intf = user->intf; in ipmi_set_maintenance_mode()
1549 return -ENODEV; in ipmi_set_maintenance_mode()
1551 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1552 if (intf->maintenance_mode != mode) { in ipmi_set_maintenance_mode()
1555 intf->maintenance_mode_enable in ipmi_set_maintenance_mode()
1556 = (intf->auto_maintenance_timeout > 0); in ipmi_set_maintenance_mode()
1560 intf->maintenance_mode_enable = false; in ipmi_set_maintenance_mode()
1564 intf->maintenance_mode_enable = true; in ipmi_set_maintenance_mode()
1568 rv = -EINVAL; in ipmi_set_maintenance_mode()
1571 intf->maintenance_mode = mode; in ipmi_set_maintenance_mode()
1576 spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags); in ipmi_set_maintenance_mode()
1585 struct ipmi_smi *intf = user->intf; in ipmi_set_gets_events()
1591 return -ENODEV; in ipmi_set_gets_events()
1595 mutex_lock(&intf->events_mutex); in ipmi_set_gets_events()
1596 if (user->gets_events == val) in ipmi_set_gets_events()
1599 user->gets_events = val; in ipmi_set_gets_events()
1602 if (atomic_inc_return(&intf->event_waiters) == 1) in ipmi_set_gets_events()
1605 atomic_dec(&intf->event_waiters); in ipmi_set_gets_events()
1609 while (user->gets_events && !list_empty(&intf->waiting_events)) { in ipmi_set_gets_events()
1610 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link) in ipmi_set_gets_events()
1611 list_move_tail(&msg->link, &msgs); in ipmi_set_gets_events()
1612 intf->waiting_events_count = 0; in ipmi_set_gets_events()
1613 if (intf->event_msg_printed) { in ipmi_set_gets_events()
1614 dev_warn(intf->si_dev, "Event queue no longer full\n"); in ipmi_set_gets_events()
1615 intf->event_msg_printed = 0; in ipmi_set_gets_events()
1619 msg->user = user; in ipmi_set_gets_events()
1620 kref_get(&user->refcount); in ipmi_set_gets_events()
1626 mutex_unlock(&intf->events_mutex); in ipmi_set_gets_events()
1640 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in find_cmd_rcvr()
1641 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in find_cmd_rcvr()
1642 if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd) in find_cmd_rcvr()
1643 && (rcvr->chans & (1 << chan))) in find_cmd_rcvr()
1656 list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link, in is_cmd_rcvr_exclusive()
1657 lockdep_is_held(&intf->cmd_rcvrs_mutex)) { in is_cmd_rcvr_exclusive()
1658 if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd) in is_cmd_rcvr_exclusive()
1659 && (rcvr->chans & chans)) in is_cmd_rcvr_exclusive()
1670 struct ipmi_smi *intf = user->intf; in ipmi_register_for_cmd()
1676 return -ENODEV; in ipmi_register_for_cmd()
1680 rv = -ENOMEM; in ipmi_register_for_cmd()
1683 rcvr->cmd = cmd; in ipmi_register_for_cmd()
1684 rcvr->netfn = netfn; in ipmi_register_for_cmd()
1685 rcvr->chans = chans; in ipmi_register_for_cmd()
1686 rcvr->user = user; in ipmi_register_for_cmd()
1688 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1691 rv = -EBUSY; in ipmi_register_for_cmd()
1697 list_add_rcu(&rcvr->link, &intf->cmd_rcvrs); in ipmi_register_for_cmd()
1700 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_register_for_cmd()
1715 struct ipmi_smi *intf = user->intf; in ipmi_unregister_for_cmd()
1718 int i, rv = -ENOENT; in ipmi_unregister_for_cmd()
1722 return -ENODEV; in ipmi_unregister_for_cmd()
1724 mutex_lock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1731 if (rcvr->user == user) { in ipmi_unregister_for_cmd()
1733 rcvr->chans &= ~chans; in ipmi_unregister_for_cmd()
1734 if (rcvr->chans == 0) { in ipmi_unregister_for_cmd()
1735 list_del_rcu(&rcvr->link); in ipmi_unregister_for_cmd()
1736 rcvr->next = rcvrs; in ipmi_unregister_for_cmd()
1741 mutex_unlock(&intf->cmd_rcvrs_mutex); in ipmi_unregister_for_cmd()
1747 rcvrs = rcvr->next; in ipmi_unregister_for_cmd()
1760 for (; size > 0; size--, data++) in ipmb_checksum()
1763 return -csum; in ipmb_checksum()
1778 /* Format the IPMB header data. */ in format_ipmb_msg()
1779 smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in format_ipmb_msg()
1780 smi_msg->data[1] = IPMI_SEND_MSG_CMD; in format_ipmb_msg()
1781 smi_msg->data[2] = ipmb_addr->channel; in format_ipmb_msg()
1783 smi_msg->data[3] = 0; in format_ipmb_msg()
1784 smi_msg->data[i+3] = ipmb_addr->slave_addr; in format_ipmb_msg()
1785 smi_msg->data[i+4] = (msg->netfn << 2) | (ipmb_addr->lun & 0x3); in format_ipmb_msg()
1786 smi_msg->data[i+5] = ipmb_checksum(&smi_msg->data[i + 3], 2); in format_ipmb_msg()
1787 smi_msg->data[i+6] = source_address; in format_ipmb_msg()
1788 smi_msg->data[i+7] = (ipmb_seq << 2) | source_lun; in format_ipmb_msg()
1789 smi_msg->data[i+8] = msg->cmd; in format_ipmb_msg()
1792 if (msg->data_len > 0) in format_ipmb_msg()
1793 memcpy(&smi_msg->data[i + 9], msg->data, msg->data_len); in format_ipmb_msg()
1794 smi_msg->data_size = msg->data_len + 9; in format_ipmb_msg()
1797 smi_msg->data[i+smi_msg->data_size] in format_ipmb_msg()
1798 = ipmb_checksum(&smi_msg->data[i + 6], smi_msg->data_size - 6); in format_ipmb_msg()
1804 smi_msg->data_size += 1 + i; in format_ipmb_msg()
1806 smi_msg->msgid = msgid; in format_ipmb_msg()
1816 /* Format the IPMB header data. */ in format_lan_msg()
1817 smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in format_lan_msg()
1818 smi_msg->data[1] = IPMI_SEND_MSG_CMD; in format_lan_msg()
1819 smi_msg->data[2] = lan_addr->channel; in format_lan_msg()
1820 smi_msg->data[3] = lan_addr->session_handle; in format_lan_msg()
1821 smi_msg->data[4] = lan_addr->remote_SWID; in format_lan_msg()
1822 smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3); in format_lan_msg()
1823 smi_msg->data[6] = ipmb_checksum(&smi_msg->data[4], 2); in format_lan_msg()
1824 smi_msg->data[7] = lan_addr->local_SWID; in format_lan_msg()
1825 smi_msg->data[8] = (ipmb_seq << 2) | source_lun; in format_lan_msg()
1826 smi_msg->data[9] = msg->cmd; in format_lan_msg()
1829 if (msg->data_len > 0) in format_lan_msg()
1830 memcpy(&smi_msg->data[10], msg->data, msg->data_len); in format_lan_msg()
1831 smi_msg->data_size = msg->data_len + 10; in format_lan_msg()
1834 smi_msg->data[smi_msg->data_size] in format_lan_msg()
1835 = ipmb_checksum(&smi_msg->data[7], smi_msg->data_size - 7); in format_lan_msg()
1841 smi_msg->data_size += 1; in format_lan_msg()
1843 smi_msg->msgid = msgid; in format_lan_msg()
1850 if (intf->curr_msg) { in smi_add_send_msg()
1852 list_add_tail(&smi_msg->link, &intf->hp_xmit_msgs); in smi_add_send_msg()
1854 list_add_tail(&smi_msg->link, &intf->xmit_msgs); in smi_add_send_msg()
1857 intf->curr_msg = smi_msg; in smi_add_send_msg()
1867 int run_to_completion = READ_ONCE(intf->run_to_completion); in smi_send()
1871 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in smi_send()
1874 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in smi_send()
1877 handlers->sender(intf->send_info, smi_msg); in smi_send()
1882 return (((msg->netfn == IPMI_NETFN_APP_REQUEST) in is_maintenance_mode_cmd()
1883 && ((msg->cmd == IPMI_COLD_RESET_CMD) in is_maintenance_mode_cmd()
1884 || (msg->cmd == IPMI_WARM_RESET_CMD))) in is_maintenance_mode_cmd()
1885 || (msg->netfn == IPMI_NETFN_FIRMWARE_REQUEST)); in is_maintenance_mode_cmd()
1899 if (msg->netfn & 1) in i_ipmi_req_sysintf()
1901 return -EINVAL; in i_ipmi_req_sysintf()
1904 if (smi_addr->lun > 3) { in i_ipmi_req_sysintf()
1906 return -EINVAL; in i_ipmi_req_sysintf()
1909 memcpy(&recv_msg->addr, smi_addr, sizeof(*smi_addr)); in i_ipmi_req_sysintf()
1911 if ((msg->netfn == IPMI_NETFN_APP_REQUEST) in i_ipmi_req_sysintf()
1912 && ((msg->cmd == IPMI_SEND_MSG_CMD) in i_ipmi_req_sysintf()
1913 || (msg->cmd == IPMI_GET_MSG_CMD) in i_ipmi_req_sysintf()
1914 || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD))) { in i_ipmi_req_sysintf()
1920 return -EINVAL; in i_ipmi_req_sysintf()
1926 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in i_ipmi_req_sysintf()
1927 intf->auto_maintenance_timeout in i_ipmi_req_sysintf()
1929 if (!intf->maintenance_mode in i_ipmi_req_sysintf()
1930 && !intf->maintenance_mode_enable) { in i_ipmi_req_sysintf()
1931 intf->maintenance_mode_enable = true; in i_ipmi_req_sysintf()
1934 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in i_ipmi_req_sysintf()
1938 if (msg->data_len + 2 > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_sysintf()
1940 return -EMSGSIZE; in i_ipmi_req_sysintf()
1943 smi_msg->data[0] = (msg->netfn << 2) | (smi_addr->lun & 0x3); in i_ipmi_req_sysintf()
1944 smi_msg->data[1] = msg->cmd; in i_ipmi_req_sysintf()
1945 smi_msg->msgid = msgid; in i_ipmi_req_sysintf()
1946 smi_msg->user_data = recv_msg; in i_ipmi_req_sysintf()
1947 if (msg->data_len > 0) in i_ipmi_req_sysintf()
1948 memcpy(&smi_msg->data[2], msg->data, msg->data_len); in i_ipmi_req_sysintf()
1949 smi_msg->data_size = msg->data_len + 2; in i_ipmi_req_sysintf()
1973 if (addr->channel >= IPMI_MAX_CHANNELS) { in i_ipmi_req_ipmb()
1975 return -EINVAL; in i_ipmi_req_ipmb()
1978 chans = READ_ONCE(intf->channel_list)->c; in i_ipmi_req_ipmb()
1980 if (chans[addr->channel].medium != IPMI_CHANNEL_MEDIUM_IPMB) { in i_ipmi_req_ipmb()
1982 return -EINVAL; in i_ipmi_req_ipmb()
1985 if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) { in i_ipmi_req_ipmb()
1988 * message, but otherwise is the same as an IPMB in i_ipmi_req_ipmb()
1991 addr->addr_type = IPMI_IPMB_ADDR_TYPE; in i_ipmi_req_ipmb()
2000 if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_ipmb()
2002 return -EMSGSIZE; in i_ipmi_req_ipmb()
2006 if (ipmb_addr->lun > 3) { in i_ipmi_req_ipmb()
2008 return -EINVAL; in i_ipmi_req_ipmb()
2011 memcpy(&recv_msg->addr, ipmb_addr, sizeof(*ipmb_addr)); in i_ipmi_req_ipmb()
2013 if (recv_msg->msg.netfn & 0x1) { in i_ipmi_req_ipmb()
2027 smi_msg->user_data = recv_msg; in i_ipmi_req_ipmb()
2032 spin_lock_irqsave(&intf->seq_lock, flags); in i_ipmi_req_ipmb()
2035 intf->ipmb_maintenance_mode_timeout = in i_ipmi_req_ipmb()
2038 if (intf->ipmb_maintenance_mode_timeout && retry_time_ms == 0) in i_ipmi_req_ipmb()
2076 memcpy(recv_msg->msg_data, smi_msg->data, in i_ipmi_req_ipmb()
2077 smi_msg->data_size); in i_ipmi_req_ipmb()
2078 recv_msg->msg.data = recv_msg->msg_data; in i_ipmi_req_ipmb()
2079 recv_msg->msg.data_len = smi_msg->data_size; in i_ipmi_req_ipmb()
2090 spin_unlock_irqrestore(&intf->seq_lock, flags); in i_ipmi_req_ipmb()
2105 bool is_cmd = !(recv_msg->msg.netfn & 0x1); in i_ipmi_req_ipmb_direct()
2107 if (!(intf->handlers->flags & IPMI_SMI_CAN_HANDLE_IPMB_DIRECT)) in i_ipmi_req_ipmb_direct()
2108 return -EAFNOSUPPORT; in i_ipmi_req_ipmb_direct()
2111 if (!is_cmd && msg->data_len < 1) { in i_ipmi_req_ipmb_direct()
2113 return -EINVAL; in i_ipmi_req_ipmb_direct()
2116 if ((msg->data_len + 4) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_ipmb_direct()
2118 return -EMSGSIZE; in i_ipmi_req_ipmb_direct()
2122 if (daddr->rq_lun > 3 || daddr->rs_lun > 3) { in i_ipmi_req_ipmb_direct()
2124 return -EINVAL; in i_ipmi_req_ipmb_direct()
2127 smi_msg->type = IPMI_SMI_MSG_TYPE_IPMB_DIRECT; in i_ipmi_req_ipmb_direct()
2128 smi_msg->msgid = msgid; in i_ipmi_req_ipmb_direct()
2131 smi_msg->data[0] = msg->netfn << 2 | daddr->rs_lun; in i_ipmi_req_ipmb_direct()
2132 smi_msg->data[2] = recv_msg->msgid << 2 | daddr->rq_lun; in i_ipmi_req_ipmb_direct()
2134 smi_msg->data[0] = msg->netfn << 2 | daddr->rq_lun; in i_ipmi_req_ipmb_direct()
2135 smi_msg->data[2] = recv_msg->msgid << 2 | daddr->rs_lun; in i_ipmi_req_ipmb_direct()
2137 smi_msg->data[1] = daddr->slave_addr; in i_ipmi_req_ipmb_direct()
2138 smi_msg->data[3] = msg->cmd; in i_ipmi_req_ipmb_direct()
2140 memcpy(smi_msg->data + 4, msg->data, msg->data_len); in i_ipmi_req_ipmb_direct()
2141 smi_msg->data_size = msg->data_len + 4; in i_ipmi_req_ipmb_direct()
2143 smi_msg->user_data = recv_msg; in i_ipmi_req_ipmb_direct()
2164 if (addr->channel >= IPMI_MAX_CHANNELS) { in i_ipmi_req_lan()
2166 return -EINVAL; in i_ipmi_req_lan()
2169 chans = READ_ONCE(intf->channel_list)->c; in i_ipmi_req_lan()
2171 if ((chans[addr->channel].medium in i_ipmi_req_lan()
2173 && (chans[addr->channel].medium in i_ipmi_req_lan()
2176 return -EINVAL; in i_ipmi_req_lan()
2180 if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_lan()
2182 return -EMSGSIZE; in i_ipmi_req_lan()
2186 if (lan_addr->lun > 3) { in i_ipmi_req_lan()
2188 return -EINVAL; in i_ipmi_req_lan()
2191 memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr)); in i_ipmi_req_lan()
2193 if (recv_msg->msg.netfn & 0x1) { in i_ipmi_req_lan()
2206 smi_msg->user_data = recv_msg; in i_ipmi_req_lan()
2211 spin_lock_irqsave(&intf->seq_lock, flags); in i_ipmi_req_lan()
2246 memcpy(recv_msg->msg_data, smi_msg->data, in i_ipmi_req_lan()
2247 smi_msg->data_size); in i_ipmi_req_lan()
2248 recv_msg->msg.data = recv_msg->msg_data; in i_ipmi_req_lan()
2249 recv_msg->msg.data_len = smi_msg->data_size; in i_ipmi_req_lan()
2260 spin_unlock_irqrestore(&intf->seq_lock, flags); in i_ipmi_req_lan()
2288 int run_to_completion = READ_ONCE(intf->run_to_completion); in i_ipmi_request()
2292 if (atomic_add_return(1, &user->nr_msgs) > max_msgs_per_user) { in i_ipmi_request()
2294 rv = -EBUSY; in i_ipmi_request()
2304 rv = -ENOMEM; in i_ipmi_request()
2308 recv_msg->user_msg_data = user_msg_data; in i_ipmi_request()
2317 rv = -ENOMEM; in i_ipmi_request()
2323 mutex_lock(&intf->users_mutex); in i_ipmi_request()
2324 if (intf->in_shutdown) { in i_ipmi_request()
2325 rv = -ENODEV; in i_ipmi_request()
2329 recv_msg->user = user; in i_ipmi_request()
2332 kref_get(&user->refcount); in i_ipmi_request()
2333 recv_msg->msgid = msgid; in i_ipmi_request()
2338 recv_msg->msg = *msg; in i_ipmi_request()
2340 if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { in i_ipmi_request()
2356 rv = -EINVAL; in i_ipmi_request()
2364 dev_dbg(intf->si_dev, "Send: %*ph\n", in i_ipmi_request()
2365 smi_msg->data_size, smi_msg->data); in i_ipmi_request()
2367 smi_send(intf, intf->handlers, smi_msg, priority); in i_ipmi_request()
2370 mutex_unlock(&intf->users_mutex); in i_ipmi_request()
2374 atomic_dec(&user->nr_msgs); in i_ipmi_request()
2383 if (addr->channel >= IPMI_MAX_CHANNELS) in check_addr()
2384 return -EINVAL; in check_addr()
2385 addr->channel = array_index_nospec(addr->channel, IPMI_MAX_CHANNELS); in check_addr()
2386 *lun = intf->addrinfo[addr->channel].lun; in check_addr()
2387 *saddr = intf->addrinfo[addr->channel].address; in check_addr()
2404 return -EINVAL; in ipmi_request_settime()
2408 return -ENODEV; in ipmi_request_settime()
2410 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_settime()
2413 user->intf, in ipmi_request_settime()
2443 return -EINVAL; in ipmi_request_supply_msgs()
2447 return -ENODEV; in ipmi_request_supply_msgs()
2449 rv = check_addr(user->intf, addr, &saddr, &lun); in ipmi_request_supply_msgs()
2452 user->intf, in ipmi_request_supply_msgs()
2462 -1, 0); in ipmi_request_supply_msgs()
2474 if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in bmc_device_id_handler()
2475 || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE) in bmc_device_id_handler()
2476 || (msg->msg.cmd != IPMI_GET_DEVICE_ID_CMD)) { in bmc_device_id_handler()
2477 dev_warn(intf->si_dev, in bmc_device_id_handler()
2479 msg->addr.addr_type, msg->msg.netfn, msg->msg.cmd); in bmc_device_id_handler()
2483 if (msg->msg.data[0]) { in bmc_device_id_handler()
2484 dev_warn(intf->si_dev, "device id fetch failed: 0x%2.2x\n", in bmc_device_id_handler()
2485 msg->msg.data[0]); in bmc_device_id_handler()
2486 intf->bmc->dyn_id_set = 0; in bmc_device_id_handler()
2490 rv = ipmi_demangle_device_id(msg->msg.netfn, msg->msg.cmd, in bmc_device_id_handler()
2491 msg->msg.data, msg->msg.data_len, &intf->bmc->fetch_id); in bmc_device_id_handler()
2493 dev_warn(intf->si_dev, "device id demangle failed: %d\n", rv); in bmc_device_id_handler()
2495 intf->bmc->cc = msg->msg.data[0]; in bmc_device_id_handler()
2496 intf->bmc->dyn_id_set = 0; in bmc_device_id_handler()
2503 intf->bmc->dyn_id_set = 1; in bmc_device_id_handler()
2506 wake_up(&intf->waitq); in bmc_device_id_handler()
2533 intf->addrinfo[0].address, in send_get_device_id_cmd()
2534 intf->addrinfo[0].lun, in send_get_device_id_cmd()
2535 -1, 0); in send_get_device_id_cmd()
2543 intf->null_user_handler = bmc_device_id_handler; in __get_device_id()
2546 bmc->cc = 0; in __get_device_id()
2547 bmc->dyn_id_set = 2; in __get_device_id()
2553 wait_event(intf->waitq, bmc->dyn_id_set != 2); in __get_device_id()
2555 if (!bmc->dyn_id_set) { in __get_device_id()
2556 if (bmc->cc != IPMI_CC_NO_ERROR && in __get_device_id()
2559 dev_warn(intf->si_dev, in __get_device_id()
2561 bmc->cc); in __get_device_id()
2565 rv = -EIO; /* Something went wrong in the fetch. */ in __get_device_id()
2572 intf->null_user_handler = NULL; in __get_device_id()
2595 mutex_lock(&bmc->dyn_mutex); in __bmc_get_device_id()
2597 if (list_empty(&bmc->intfs)) { in __bmc_get_device_id()
2598 mutex_unlock(&bmc->dyn_mutex); in __bmc_get_device_id()
2599 return -ENOENT; in __bmc_get_device_id()
2601 intf = list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2603 kref_get(&intf->refcount); in __bmc_get_device_id()
2604 mutex_unlock(&bmc->dyn_mutex); in __bmc_get_device_id()
2605 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2606 mutex_lock(&bmc->dyn_mutex); in __bmc_get_device_id()
2607 if (intf != list_first_entry(&bmc->intfs, struct ipmi_smi, in __bmc_get_device_id()
2609 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2610 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2614 mutex_lock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2615 bmc = intf->bmc; in __bmc_get_device_id()
2616 mutex_lock(&bmc->dyn_mutex); in __bmc_get_device_id()
2617 kref_get(&intf->refcount); in __bmc_get_device_id()
2621 if (intf->in_bmc_register || in __bmc_get_device_id()
2622 (bmc->dyn_id_set && time_is_after_jiffies(bmc->dyn_id_expiry))) in __bmc_get_device_id()
2625 prev_guid_set = bmc->dyn_guid_set; in __bmc_get_device_id()
2628 prev_dyn_id_set = bmc->dyn_id_set; in __bmc_get_device_id()
2637 if (!intf->bmc_registered in __bmc_get_device_id()
2638 || (!prev_guid_set && bmc->dyn_guid_set) in __bmc_get_device_id()
2639 || (!prev_dyn_id_set && bmc->dyn_id_set) in __bmc_get_device_id()
2640 || (prev_guid_set && bmc->dyn_guid_set in __bmc_get_device_id()
2641 && !guid_equal(&bmc->guid, &bmc->fetch_guid)) in __bmc_get_device_id()
2642 || bmc->id.device_id != bmc->fetch_id.device_id in __bmc_get_device_id()
2643 || bmc->id.manufacturer_id != bmc->fetch_id.manufacturer_id in __bmc_get_device_id()
2644 || bmc->id.product_id != bmc->fetch_id.product_id) { in __bmc_get_device_id()
2645 struct ipmi_device_id id = bmc->fetch_id; in __bmc_get_device_id()
2646 int guid_set = bmc->dyn_guid_set; in __bmc_get_device_id()
2649 guid = bmc->fetch_guid; in __bmc_get_device_id()
2650 mutex_unlock(&bmc->dyn_mutex); in __bmc_get_device_id()
2654 intf->bmc->id = id; in __bmc_get_device_id()
2655 intf->bmc->dyn_guid_set = guid_set; in __bmc_get_device_id()
2656 intf->bmc->guid = guid; in __bmc_get_device_id()
2669 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2670 mutex_lock(&bmc->dyn_mutex); in __bmc_get_device_id()
2675 bmc = intf->bmc; in __bmc_get_device_id()
2676 mutex_lock(&bmc->dyn_mutex); in __bmc_get_device_id()
2678 } else if (memcmp(&bmc->fetch_id, &bmc->id, sizeof(bmc->id))) in __bmc_get_device_id()
2680 __scan_channels(intf, &bmc->fetch_id); in __bmc_get_device_id()
2682 bmc->dyn_id_expiry = jiffies + IPMI_DYN_DEV_ID_EXPIRY; in __bmc_get_device_id()
2687 bmc->dyn_id_set = prev_dyn_id_set; in __bmc_get_device_id()
2690 bmc->id = bmc->fetch_id; in __bmc_get_device_id()
2691 if (bmc->dyn_guid_set) in __bmc_get_device_id()
2692 bmc->guid = bmc->fetch_guid; in __bmc_get_device_id()
2698 bmc->dyn_guid_set = prev_guid_set; in __bmc_get_device_id()
2703 *id = bmc->id; in __bmc_get_device_id()
2706 *guid_set = bmc->dyn_guid_set; in __bmc_get_device_id()
2708 if (guid && bmc->dyn_guid_set) in __bmc_get_device_id()
2709 *guid = bmc->guid; in __bmc_get_device_id()
2712 mutex_unlock(&bmc->dyn_mutex); in __bmc_get_device_id()
2713 mutex_unlock(&intf->bmc_reg_mutex); in __bmc_get_device_id()
2715 kref_put(&intf->refcount, intf_free); in __bmc_get_device_id()
2723 return __bmc_get_device_id(intf, bmc, id, guid_set, guid, -1); in bmc_get_device_id()
2726 static ssize_t device_id_show(struct device *dev, in device_id_show() argument
2730 struct bmc_device *bmc = to_bmc_device(dev); in device_id_show()
2742 static ssize_t provides_device_sdrs_show(struct device *dev, in provides_device_sdrs_show() argument
2746 struct bmc_device *bmc = to_bmc_device(dev); in provides_device_sdrs_show()
2758 static ssize_t revision_show(struct device *dev, struct device_attribute *attr, in revision_show() argument
2761 struct bmc_device *bmc = to_bmc_device(dev); in revision_show()
2773 static ssize_t firmware_revision_show(struct device *dev, in firmware_revision_show() argument
2777 struct bmc_device *bmc = to_bmc_device(dev); in firmware_revision_show()
2790 static ssize_t ipmi_version_show(struct device *dev, in ipmi_version_show() argument
2794 struct bmc_device *bmc = to_bmc_device(dev); in ipmi_version_show()
2808 static ssize_t add_dev_support_show(struct device *dev, in add_dev_support_show() argument
2812 struct bmc_device *bmc = to_bmc_device(dev); in add_dev_support_show()
2825 static ssize_t manufacturer_id_show(struct device *dev, in manufacturer_id_show() argument
2829 struct bmc_device *bmc = to_bmc_device(dev); in manufacturer_id_show()
2841 static ssize_t product_id_show(struct device *dev, in product_id_show() argument
2845 struct bmc_device *bmc = to_bmc_device(dev); in product_id_show()
2857 static ssize_t aux_firmware_rev_show(struct device *dev, in aux_firmware_rev_show() argument
2861 struct bmc_device *bmc = to_bmc_device(dev); in aux_firmware_rev_show()
2877 static ssize_t guid_show(struct device *dev, struct device_attribute *attr, in guid_show() argument
2880 struct bmc_device *bmc = to_bmc_device(dev); in guid_show()
2889 return -ENOENT; in guid_show()
2912 struct device *dev = kobj_to_dev(kobj); in bmc_dev_attr_is_visible() local
2913 struct bmc_device *bmc = to_bmc_device(dev); in bmc_dev_attr_is_visible()
2914 umode_t mode = attr->mode; in bmc_dev_attr_is_visible()
2946 static int __find_bmc_guid(struct device *dev, const void *data) in __find_bmc_guid() argument
2952 if (dev->type != &bmc_device_type) in __find_bmc_guid()
2955 bmc = to_bmc_device(dev); in __find_bmc_guid()
2956 rv = bmc->dyn_guid_set && guid_equal(&bmc->guid, guid); in __find_bmc_guid()
2958 rv = kref_get_unless_zero(&bmc->usecount); in __find_bmc_guid()
2963 * Returns with the bmc's usecount incremented, if it is non-NULL.
2968 struct device *dev; in ipmi_find_bmc_guid() local
2971 dev = driver_find_device(drv, NULL, guid, __find_bmc_guid); in ipmi_find_bmc_guid()
2972 if (dev) { in ipmi_find_bmc_guid()
2973 bmc = to_bmc_device(dev); in ipmi_find_bmc_guid()
2974 put_device(dev); in ipmi_find_bmc_guid()
2984 static int __find_bmc_prod_dev_id(struct device *dev, const void *data) in __find_bmc_prod_dev_id() argument
2990 if (dev->type != &bmc_device_type) in __find_bmc_prod_dev_id()
2993 bmc = to_bmc_device(dev); in __find_bmc_prod_dev_id()
2994 rv = (bmc->id.product_id == cid->product_id in __find_bmc_prod_dev_id()
2995 && bmc->id.device_id == cid->device_id); in __find_bmc_prod_dev_id()
2997 rv = kref_get_unless_zero(&bmc->usecount); in __find_bmc_prod_dev_id()
3002 * Returns with the bmc's usecount incremented, if it is non-NULL.
3012 struct device *dev; in ipmi_find_bmc_prod_dev_id() local
3015 dev = driver_find_device(drv, NULL, &id, __find_bmc_prod_dev_id); in ipmi_find_bmc_prod_dev_id()
3016 if (dev) { in ipmi_find_bmc_prod_dev_id()
3017 bmc = to_bmc_device(dev); in ipmi_find_bmc_prod_dev_id()
3018 put_device(dev); in ipmi_find_bmc_prod_dev_id()
3026 release_bmc_device(struct device *dev) in release_bmc_device() argument
3028 kfree(to_bmc_device(dev)); in release_bmc_device()
3035 int id = bmc->pdev.id; /* Unregister overwrites id */ in cleanup_bmc_work()
3037 platform_device_unregister(&bmc->pdev); in cleanup_bmc_work()
3051 queue_work(bmc_remove_work_wq, &bmc->remove_work); in cleanup_bmc_device()
3055 * Must be called with intf->bmc_reg_mutex held.
3059 struct bmc_device *bmc = intf->bmc; in __ipmi_bmc_unregister()
3061 if (!intf->bmc_registered) in __ipmi_bmc_unregister()
3064 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_unregister()
3065 sysfs_remove_link(&bmc->pdev.dev.kobj, intf->my_dev_name); in __ipmi_bmc_unregister()
3066 kfree(intf->my_dev_name); in __ipmi_bmc_unregister()
3067 intf->my_dev_name = NULL; in __ipmi_bmc_unregister()
3069 mutex_lock(&bmc->dyn_mutex); in __ipmi_bmc_unregister()
3070 list_del(&intf->bmc_link); in __ipmi_bmc_unregister()
3071 mutex_unlock(&bmc->dyn_mutex); in __ipmi_bmc_unregister()
3072 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_unregister()
3073 kref_put(&bmc->usecount, cleanup_bmc_device); in __ipmi_bmc_unregister()
3074 intf->bmc_registered = false; in __ipmi_bmc_unregister()
3079 mutex_lock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
3081 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_bmc_unregister()
3085 * Must be called with intf->bmc_reg_mutex held.
3101 intf->in_bmc_register = true; in __ipmi_bmc_register()
3102 mutex_unlock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3113 id->product_id, in __ipmi_bmc_register()
3114 id->device_id); in __ipmi_bmc_register()
3126 intf->bmc = old_bmc; in __ipmi_bmc_register()
3127 mutex_lock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3128 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3129 mutex_unlock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3131 dev_info(intf->si_dev, in __ipmi_bmc_register()
3133 bmc->id.manufacturer_id, in __ipmi_bmc_register()
3134 bmc->id.product_id, in __ipmi_bmc_register()
3135 bmc->id.device_id); in __ipmi_bmc_register()
3139 rv = -ENOMEM; in __ipmi_bmc_register()
3142 INIT_LIST_HEAD(&bmc->intfs); in __ipmi_bmc_register()
3143 mutex_init(&bmc->dyn_mutex); in __ipmi_bmc_register()
3144 INIT_WORK(&bmc->remove_work, cleanup_bmc_work); in __ipmi_bmc_register()
3146 bmc->id = *id; in __ipmi_bmc_register()
3147 bmc->dyn_id_set = 1; in __ipmi_bmc_register()
3148 bmc->dyn_guid_set = guid_set; in __ipmi_bmc_register()
3149 bmc->guid = *guid; in __ipmi_bmc_register()
3150 bmc->dyn_id_expiry = jiffies + IPMI_DYN_DEV_ID_EXPIRY; in __ipmi_bmc_register()
3152 bmc->pdev.name = "ipmi_bmc"; in __ipmi_bmc_register()
3160 bmc->pdev.dev.driver = &ipmidriver.driver; in __ipmi_bmc_register()
3161 bmc->pdev.id = rv; in __ipmi_bmc_register()
3162 bmc->pdev.dev.release = release_bmc_device; in __ipmi_bmc_register()
3163 bmc->pdev.dev.type = &bmc_device_type; in __ipmi_bmc_register()
3164 kref_init(&bmc->usecount); in __ipmi_bmc_register()
3166 intf->bmc = bmc; in __ipmi_bmc_register()
3167 mutex_lock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3168 list_add_tail(&intf->bmc_link, &bmc->intfs); in __ipmi_bmc_register()
3169 mutex_unlock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3171 rv = platform_device_register(&bmc->pdev); in __ipmi_bmc_register()
3173 dev_err(intf->si_dev, in __ipmi_bmc_register()
3179 dev_info(intf->si_dev, in __ipmi_bmc_register()
3181 bmc->id.manufacturer_id, in __ipmi_bmc_register()
3182 bmc->id.product_id, in __ipmi_bmc_register()
3183 bmc->id.device_id); in __ipmi_bmc_register()
3190 rv = sysfs_create_link(&intf->si_dev->kobj, &bmc->pdev.dev.kobj, "bmc"); in __ipmi_bmc_register()
3192 dev_err(intf->si_dev, "Unable to create bmc symlink: %d\n", rv); in __ipmi_bmc_register()
3196 if (intf_num == -1) in __ipmi_bmc_register()
3197 intf_num = intf->intf_num; in __ipmi_bmc_register()
3198 intf->my_dev_name = kasprintf(GFP_KERNEL, "ipmi%d", intf_num); in __ipmi_bmc_register()
3199 if (!intf->my_dev_name) { in __ipmi_bmc_register()
3200 rv = -ENOMEM; in __ipmi_bmc_register()
3201 dev_err(intf->si_dev, "Unable to allocate link from BMC: %d\n", in __ipmi_bmc_register()
3206 rv = sysfs_create_link(&bmc->pdev.dev.kobj, &intf->si_dev->kobj, in __ipmi_bmc_register()
3207 intf->my_dev_name); in __ipmi_bmc_register()
3209 dev_err(intf->si_dev, "Unable to create symlink to bmc: %d\n", in __ipmi_bmc_register()
3214 intf->bmc_registered = true; in __ipmi_bmc_register()
3218 mutex_lock(&intf->bmc_reg_mutex); in __ipmi_bmc_register()
3219 intf->in_bmc_register = false; in __ipmi_bmc_register()
3224 kfree(intf->my_dev_name); in __ipmi_bmc_register()
3225 intf->my_dev_name = NULL; in __ipmi_bmc_register()
3228 sysfs_remove_link(&intf->si_dev->kobj, "bmc"); in __ipmi_bmc_register()
3231 mutex_lock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3232 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3233 mutex_unlock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3234 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3235 kref_put(&bmc->usecount, cleanup_bmc_device); in __ipmi_bmc_register()
3239 mutex_lock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3240 list_del(&intf->bmc_link); in __ipmi_bmc_register()
3241 mutex_unlock(&bmc->dyn_mutex); in __ipmi_bmc_register()
3242 intf->bmc = &intf->tmp_bmc; in __ipmi_bmc_register()
3243 put_device(&bmc->pdev.dev); in __ipmi_bmc_register()
3270 intf->addrinfo[0].address, in send_guid_cmd()
3271 intf->addrinfo[0].lun, in send_guid_cmd()
3272 -1, 0); in send_guid_cmd()
3277 struct bmc_device *bmc = intf->bmc; in guid_handler()
3279 if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in guid_handler()
3280 || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE) in guid_handler()
3281 || (msg->msg.cmd != IPMI_GET_DEVICE_GUID_CMD)) in guid_handler()
3285 if (msg->msg.data[0] != 0) { in guid_handler()
3287 bmc->dyn_guid_set = 0; in guid_handler()
3291 if (msg->msg.data_len < UUID_SIZE + 1) { in guid_handler()
3292 bmc->dyn_guid_set = 0; in guid_handler()
3293 dev_warn(intf->si_dev, in guid_handler()
3295 msg->msg.data_len, UUID_SIZE + 1); in guid_handler()
3299 import_guid(&bmc->fetch_guid, msg->msg.data + 1); in guid_handler()
3305 bmc->dyn_guid_set = 1; in guid_handler()
3307 wake_up(&intf->waitq); in guid_handler()
3313 struct bmc_device *bmc = intf->bmc; in __get_guid()
3315 bmc->dyn_guid_set = 2; in __get_guid()
3316 intf->null_user_handler = guid_handler; in __get_guid()
3320 bmc->dyn_guid_set = 0; in __get_guid()
3322 wait_event(intf->waitq, bmc->dyn_guid_set != 2); in __get_guid()
3327 intf->null_user_handler = NULL; in __get_guid()
3355 intf->addrinfo[0].address, in send_channel_info_cmd()
3356 intf->addrinfo[0].lun, in send_channel_info_cmd()
3357 -1, 0); in send_channel_info_cmd()
3365 unsigned int set = intf->curr_working_cset; in channel_handler()
3368 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in channel_handler()
3369 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) in channel_handler()
3370 && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD)) { in channel_handler()
3372 if (msg->msg.data[0] != 0) { in channel_handler()
3374 if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) { in channel_handler()
3378 * assume it has one IPMB at channel in channel_handler()
3381 intf->wchannels[set].c[0].medium in channel_handler()
3383 intf->wchannels[set].c[0].protocol in channel_handler()
3386 intf->channel_list = intf->wchannels + set; in channel_handler()
3387 intf->channels_ready = true; in channel_handler()
3388 wake_up(&intf->waitq); in channel_handler()
3393 if (msg->msg.data_len < 4) { in channel_handler()
3397 ch = intf->curr_channel; in channel_handler()
3398 chans = intf->wchannels[set].c; in channel_handler()
3399 chans[ch].medium = msg->msg.data[2] & 0x7f; in channel_handler()
3400 chans[ch].protocol = msg->msg.data[3] & 0x1f; in channel_handler()
3403 intf->curr_channel++; in channel_handler()
3404 if (intf->curr_channel >= IPMI_MAX_CHANNELS) { in channel_handler()
3405 intf->channel_list = intf->wchannels + set; in channel_handler()
3406 intf->channels_ready = true; in channel_handler()
3407 wake_up(&intf->waitq); in channel_handler()
3409 intf->channel_list = intf->wchannels + set; in channel_handler()
3410 intf->channels_ready = true; in channel_handler()
3411 rv = send_channel_info_cmd(intf, intf->curr_channel); in channel_handler()
3416 dev_warn(intf->si_dev, in channel_handler()
3418 intf->curr_channel, rv); in channel_handler()
3420 intf->channel_list = intf->wchannels + set; in channel_handler()
3421 intf->channels_ready = true; in channel_handler()
3422 wake_up(&intf->waitq); in channel_handler()
3430 * Must be holding intf->bmc_reg_mutex to call this.
3445 set = !intf->curr_working_cset; in __scan_channels()
3446 intf->curr_working_cset = set; in __scan_channels()
3447 memset(&intf->wchannels[set], 0, in __scan_channels()
3450 intf->null_user_handler = channel_handler; in __scan_channels()
3451 intf->curr_channel = 0; in __scan_channels()
3454 dev_warn(intf->si_dev, in __scan_channels()
3457 intf->null_user_handler = NULL; in __scan_channels()
3458 return -EIO; in __scan_channels()
3462 wait_event(intf->waitq, intf->channels_ready); in __scan_channels()
3463 intf->null_user_handler = NULL; in __scan_channels()
3465 unsigned int set = intf->curr_working_cset; in __scan_channels()
3467 /* Assume a single IPMB channel at zero. */ in __scan_channels()
3468 intf->wchannels[set].c[0].medium = IPMI_CHANNEL_MEDIUM_IPMB; in __scan_channels()
3469 intf->wchannels[set].c[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB; in __scan_channels()
3470 intf->channel_list = intf->wchannels + set; in __scan_channels()
3471 intf->channels_ready = true; in __scan_channels()
3479 if (intf->handlers->poll) in ipmi_poll()
3480 intf->handlers->poll(intf->send_info); in ipmi_poll()
3487 ipmi_poll(user->intf); in ipmi_poll_interface()
3491 static ssize_t nr_users_show(struct device *dev, in nr_users_show() argument
3498 return sysfs_emit(buf, "%d\n", atomic_read(&intf->nr_users)); in nr_users_show()
3502 static ssize_t nr_msgs_show(struct device *dev, in nr_msgs_show() argument
3511 mutex_lock(&intf->users_mutex); in nr_msgs_show()
3512 list_for_each_entry(user, &intf->users, link) in nr_msgs_show()
3513 count += atomic_read(&user->nr_msgs); in nr_msgs_show()
3514 mutex_unlock(&intf->users_mutex); in nr_msgs_show()
3525 if (!intf->in_shutdown) in redo_bmc_reg()
3528 kref_put(&intf->refcount, intf_free); in redo_bmc_reg()
3553 return -ENOMEM; in ipmi_add_smi()
3555 intf->owner = owner; in ipmi_add_smi()
3556 intf->bmc = &intf->tmp_bmc; in ipmi_add_smi()
3557 INIT_LIST_HEAD(&intf->bmc->intfs); in ipmi_add_smi()
3558 mutex_init(&intf->bmc->dyn_mutex); in ipmi_add_smi()
3559 INIT_LIST_HEAD(&intf->bmc_link); in ipmi_add_smi()
3560 mutex_init(&intf->bmc_reg_mutex); in ipmi_add_smi()
3561 intf->intf_num = -1; /* Mark it invalid for now. */ in ipmi_add_smi()
3562 kref_init(&intf->refcount); in ipmi_add_smi()
3563 INIT_WORK(&intf->bmc_reg_work, redo_bmc_reg); in ipmi_add_smi()
3564 intf->si_dev = si_dev; in ipmi_add_smi()
3566 intf->addrinfo[j].address = IPMI_BMC_SLAVE_ADDR; in ipmi_add_smi()
3567 intf->addrinfo[j].lun = 2; in ipmi_add_smi()
3570 intf->addrinfo[0].address = slave_addr; in ipmi_add_smi()
3571 INIT_LIST_HEAD(&intf->user_msgs); in ipmi_add_smi()
3572 mutex_init(&intf->user_msgs_mutex); in ipmi_add_smi()
3573 INIT_LIST_HEAD(&intf->users); in ipmi_add_smi()
3574 mutex_init(&intf->users_mutex); in ipmi_add_smi()
3575 atomic_set(&intf->nr_users, 0); in ipmi_add_smi()
3576 intf->handlers = handlers; in ipmi_add_smi()
3577 intf->send_info = send_info; in ipmi_add_smi()
3578 spin_lock_init(&intf->seq_lock); in ipmi_add_smi()
3580 intf->seq_table[j].inuse = 0; in ipmi_add_smi()
3581 intf->seq_table[j].seqid = 0; in ipmi_add_smi()
3583 intf->curr_seq = 0; in ipmi_add_smi()
3584 spin_lock_init(&intf->waiting_rcv_msgs_lock); in ipmi_add_smi()
3585 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in ipmi_add_smi()
3586 INIT_WORK(&intf->smi_work, smi_work); in ipmi_add_smi()
3587 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 0); in ipmi_add_smi()
3588 spin_lock_init(&intf->xmit_msgs_lock); in ipmi_add_smi()
3589 INIT_LIST_HEAD(&intf->xmit_msgs); in ipmi_add_smi()
3590 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in ipmi_add_smi()
3591 mutex_init(&intf->events_mutex); in ipmi_add_smi()
3592 spin_lock_init(&intf->watch_lock); in ipmi_add_smi()
3593 atomic_set(&intf->event_waiters, 0); in ipmi_add_smi()
3594 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_add_smi()
3595 INIT_LIST_HEAD(&intf->waiting_events); in ipmi_add_smi()
3596 intf->waiting_events_count = 0; in ipmi_add_smi()
3597 mutex_init(&intf->cmd_rcvrs_mutex); in ipmi_add_smi()
3598 spin_lock_init(&intf->maintenance_mode_lock); in ipmi_add_smi()
3599 INIT_LIST_HEAD(&intf->cmd_rcvrs); in ipmi_add_smi()
3600 init_waitqueue_head(&intf->waitq); in ipmi_add_smi()
3602 atomic_set(&intf->stats[i], 0); in ipmi_add_smi()
3614 if (tintf->intf_num != i) { in ipmi_add_smi()
3615 link = &tintf->link; in ipmi_add_smi()
3622 list_add(&intf->link, &ipmi_interfaces); in ipmi_add_smi()
3624 list_add_tail(&intf->link, link); in ipmi_add_smi()
3626 rv = handlers->start_processing(send_info, intf); in ipmi_add_smi()
3636 mutex_lock(&intf->bmc_reg_mutex); in ipmi_add_smi()
3638 mutex_unlock(&intf->bmc_reg_mutex); in ipmi_add_smi()
3642 intf->nr_users_devattr = dev_attr_nr_users; in ipmi_add_smi()
3643 sysfs_attr_init(&intf->nr_users_devattr.attr); in ipmi_add_smi()
3644 rv = device_create_file(intf->si_dev, &intf->nr_users_devattr); in ipmi_add_smi()
3648 intf->nr_msgs_devattr = dev_attr_nr_msgs; in ipmi_add_smi()
3649 sysfs_attr_init(&intf->nr_msgs_devattr.attr); in ipmi_add_smi()
3650 rv = device_create_file(intf->si_dev, &intf->nr_msgs_devattr); in ipmi_add_smi()
3652 device_remove_file(intf->si_dev, &intf->nr_users_devattr); in ipmi_add_smi()
3656 intf->intf_num = i; in ipmi_add_smi()
3660 call_smi_watchers(i, intf->si_dev); in ipmi_add_smi()
3669 if (intf->handlers->shutdown) in ipmi_add_smi()
3670 intf->handlers->shutdown(intf->send_info); in ipmi_add_smi()
3672 list_del(&intf->link); in ipmi_add_smi()
3675 kref_put(&intf->refcount, intf_free); in ipmi_add_smi()
3686 msg->rsp[0] = msg->data[0] | 4; in deliver_smi_err_response()
3687 msg->rsp[1] = msg->data[1]; in deliver_smi_err_response()
3688 msg->rsp[2] = err; in deliver_smi_err_response()
3689 msg->rsp_size = 3; in deliver_smi_err_response()
3707 list_splice_tail(&intf->hp_xmit_msgs, &tmplist); in cleanup_smi_msgs()
3708 list_splice_tail(&intf->xmit_msgs, &tmplist); in cleanup_smi_msgs()
3711 while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) { in cleanup_smi_msgs()
3730 ent = &intf->seq_table[i]; in cleanup_smi_msgs()
3731 if (!ent->inuse) in cleanup_smi_msgs()
3733 deliver_err_response(intf, ent->recv_msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3745 intf_num = intf->intf_num; in ipmi_unregister_smi()
3747 cancel_work_sync(&intf->smi_work); in ipmi_unregister_smi()
3750 intf->intf_num = -1; in ipmi_unregister_smi()
3751 intf->in_shutdown = true; in ipmi_unregister_smi()
3752 list_del(&intf->link); in ipmi_unregister_smi()
3760 if (intf->handlers->shutdown) in ipmi_unregister_smi()
3761 intf->handlers->shutdown(intf->send_info); in ipmi_unregister_smi()
3763 device_remove_file(intf->si_dev, &intf->nr_msgs_devattr); in ipmi_unregister_smi()
3764 device_remove_file(intf->si_dev, &intf->nr_users_devattr); in ipmi_unregister_smi()
3772 w->smi_gone(intf_num); in ipmi_unregister_smi()
3775 mutex_lock(&intf->users_mutex); in ipmi_unregister_smi()
3776 while (!list_empty(&intf->users)) { in ipmi_unregister_smi()
3777 struct ipmi_user *user = list_first_entry(&intf->users, in ipmi_unregister_smi()
3782 mutex_unlock(&intf->users_mutex); in ipmi_unregister_smi()
3788 kref_put(&intf->refcount, intf_free); in ipmi_unregister_smi()
3802 if (msg->rsp_size < 11) { in handle_ipmb_get_msg_rsp()
3808 if (msg->rsp[2] != 0) { in handle_ipmb_get_msg_rsp()
3814 ipmb_addr.slave_addr = msg->rsp[6]; in handle_ipmb_get_msg_rsp()
3815 ipmb_addr.channel = msg->rsp[3] & 0x0f; in handle_ipmb_get_msg_rsp()
3816 ipmb_addr.lun = msg->rsp[7] & 3; in handle_ipmb_get_msg_rsp()
3823 msg->rsp[7] >> 2, in handle_ipmb_get_msg_rsp()
3824 msg->rsp[3] & 0x0f, in handle_ipmb_get_msg_rsp()
3825 msg->rsp[8], in handle_ipmb_get_msg_rsp()
3826 (msg->rsp[4] >> 2) & (~1), in handle_ipmb_get_msg_rsp()
3837 memcpy(recv_msg->msg_data, &msg->rsp[9], msg->rsp_size - 9); in handle_ipmb_get_msg_rsp()
3843 recv_msg->msg.netfn = msg->rsp[4] >> 2; in handle_ipmb_get_msg_rsp()
3844 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_get_msg_rsp()
3845 recv_msg->msg.data_len = msg->rsp_size - 10; in handle_ipmb_get_msg_rsp()
3846 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE; in handle_ipmb_get_msg_rsp()
3867 if (msg->rsp_size < 10) { in handle_ipmb_get_msg_cmd()
3873 if (msg->rsp[2] != 0) { in handle_ipmb_get_msg_cmd()
3878 netfn = msg->rsp[4] >> 2; in handle_ipmb_get_msg_cmd()
3879 cmd = msg->rsp[8]; in handle_ipmb_get_msg_cmd()
3880 chan = msg->rsp[3] & 0xf; in handle_ipmb_get_msg_cmd()
3885 user = rcvr->user; in handle_ipmb_get_msg_cmd()
3886 kref_get(&user->refcount); in handle_ipmb_get_msg_cmd()
3895 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in handle_ipmb_get_msg_cmd()
3896 msg->data[1] = IPMI_SEND_MSG_CMD; in handle_ipmb_get_msg_cmd()
3897 msg->data[2] = msg->rsp[3]; in handle_ipmb_get_msg_cmd()
3898 msg->data[3] = msg->rsp[6]; in handle_ipmb_get_msg_cmd()
3899 msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3); in handle_ipmb_get_msg_cmd()
3900 msg->data[5] = ipmb_checksum(&msg->data[3], 2); in handle_ipmb_get_msg_cmd()
3901 msg->data[6] = intf->addrinfo[msg->rsp[3] & 0xf].address; in handle_ipmb_get_msg_cmd()
3903 msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3); in handle_ipmb_get_msg_cmd()
3904 msg->data[8] = msg->rsp[8]; /* cmd */ in handle_ipmb_get_msg_cmd()
3905 msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE; in handle_ipmb_get_msg_cmd()
3906 msg->data[10] = ipmb_checksum(&msg->data[6], 4); in handle_ipmb_get_msg_cmd()
3907 msg->data_size = 11; in handle_ipmb_get_msg_cmd()
3909 dev_dbg(intf->si_dev, "Invalid command: %*ph\n", in handle_ipmb_get_msg_cmd()
3910 msg->data_size, msg->data); in handle_ipmb_get_msg_cmd()
3912 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_get_msg_cmd()
3917 rv = -1; in handle_ipmb_get_msg_cmd()
3927 kref_put(&user->refcount, free_ipmi_user); in handle_ipmb_get_msg_cmd()
3930 ipmb_addr = (struct ipmi_ipmb_addr *) &recv_msg->addr; in handle_ipmb_get_msg_cmd()
3931 ipmb_addr->addr_type = IPMI_IPMB_ADDR_TYPE; in handle_ipmb_get_msg_cmd()
3932 ipmb_addr->slave_addr = msg->rsp[6]; in handle_ipmb_get_msg_cmd()
3933 ipmb_addr->lun = msg->rsp[7] & 3; in handle_ipmb_get_msg_cmd()
3934 ipmb_addr->channel = msg->rsp[3] & 0xf; in handle_ipmb_get_msg_cmd()
3938 * from the IPMB header. in handle_ipmb_get_msg_cmd()
3940 recv_msg->user = user; in handle_ipmb_get_msg_cmd()
3941 recv_msg->recv_type = IPMI_CMD_RECV_TYPE; in handle_ipmb_get_msg_cmd()
3942 recv_msg->msgid = msg->rsp[7] >> 2; in handle_ipmb_get_msg_cmd()
3943 recv_msg->msg.netfn = msg->rsp[4] >> 2; in handle_ipmb_get_msg_cmd()
3944 recv_msg->msg.cmd = msg->rsp[8]; in handle_ipmb_get_msg_cmd()
3945 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_get_msg_cmd()
3951 recv_msg->msg.data_len = msg->rsp_size - 10; in handle_ipmb_get_msg_cmd()
3952 memcpy(recv_msg->msg_data, &msg->rsp[9], in handle_ipmb_get_msg_cmd()
3953 msg->rsp_size - 10); in handle_ipmb_get_msg_cmd()
3972 unsigned char netfn = msg->rsp[0] >> 2; in handle_ipmb_direct_rcv_cmd()
3973 unsigned char cmd = msg->rsp[3]; in handle_ipmb_direct_rcv_cmd()
3979 user = rcvr->user; in handle_ipmb_direct_rcv_cmd()
3980 kref_get(&user->refcount); in handle_ipmb_direct_rcv_cmd()
3989 msg->data[0] = (netfn + 1) << 2; in handle_ipmb_direct_rcv_cmd()
3990 msg->data[0] |= msg->rsp[2] & 0x3; /* rqLUN */ in handle_ipmb_direct_rcv_cmd()
3991 msg->data[1] = msg->rsp[1]; /* Addr */ in handle_ipmb_direct_rcv_cmd()
3992 msg->data[2] = msg->rsp[2] & ~0x3; /* rqSeq */ in handle_ipmb_direct_rcv_cmd()
3993 msg->data[2] |= msg->rsp[0] & 0x3; /* rsLUN */ in handle_ipmb_direct_rcv_cmd()
3994 msg->data[3] = cmd; in handle_ipmb_direct_rcv_cmd()
3995 msg->data[4] = IPMI_INVALID_CMD_COMPLETION_CODE; in handle_ipmb_direct_rcv_cmd()
3996 msg->data_size = 5; in handle_ipmb_direct_rcv_cmd()
3998 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_direct_rcv_cmd()
4003 rv = -1; in handle_ipmb_direct_rcv_cmd()
4013 kref_put(&user->refcount, free_ipmi_user); in handle_ipmb_direct_rcv_cmd()
4016 daddr = (struct ipmi_ipmb_direct_addr *)&recv_msg->addr; in handle_ipmb_direct_rcv_cmd()
4017 daddr->addr_type = IPMI_IPMB_DIRECT_ADDR_TYPE; in handle_ipmb_direct_rcv_cmd()
4018 daddr->channel = 0; in handle_ipmb_direct_rcv_cmd()
4019 daddr->slave_addr = msg->rsp[1]; in handle_ipmb_direct_rcv_cmd()
4020 daddr->rs_lun = msg->rsp[0] & 3; in handle_ipmb_direct_rcv_cmd()
4021 daddr->rq_lun = msg->rsp[2] & 3; in handle_ipmb_direct_rcv_cmd()
4025 * from the IPMB header. in handle_ipmb_direct_rcv_cmd()
4027 recv_msg->user = user; in handle_ipmb_direct_rcv_cmd()
4028 recv_msg->recv_type = IPMI_CMD_RECV_TYPE; in handle_ipmb_direct_rcv_cmd()
4029 recv_msg->msgid = (msg->rsp[2] >> 2); in handle_ipmb_direct_rcv_cmd()
4030 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_ipmb_direct_rcv_cmd()
4031 recv_msg->msg.cmd = msg->rsp[3]; in handle_ipmb_direct_rcv_cmd()
4032 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_direct_rcv_cmd()
4034 recv_msg->msg.data_len = msg->rsp_size - 4; in handle_ipmb_direct_rcv_cmd()
4035 memcpy(recv_msg->msg_data, msg->rsp + 4, in handle_ipmb_direct_rcv_cmd()
4036 msg->rsp_size - 4); in handle_ipmb_direct_rcv_cmd()
4053 recv_msg = msg->user_data; in handle_ipmb_direct_rcv_rsp()
4055 dev_warn(intf->si_dev, in handle_ipmb_direct_rcv_rsp()
4060 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE; in handle_ipmb_direct_rcv_rsp()
4061 recv_msg->msgid = msg->msgid; in handle_ipmb_direct_rcv_rsp()
4062 daddr = (struct ipmi_ipmb_direct_addr *) &recv_msg->addr; in handle_ipmb_direct_rcv_rsp()
4063 daddr->addr_type = IPMI_IPMB_DIRECT_ADDR_TYPE; in handle_ipmb_direct_rcv_rsp()
4064 daddr->channel = 0; in handle_ipmb_direct_rcv_rsp()
4065 daddr->slave_addr = msg->rsp[1]; in handle_ipmb_direct_rcv_rsp()
4066 daddr->rq_lun = msg->rsp[0] & 3; in handle_ipmb_direct_rcv_rsp()
4067 daddr->rs_lun = msg->rsp[2] & 3; in handle_ipmb_direct_rcv_rsp()
4068 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_ipmb_direct_rcv_rsp()
4069 recv_msg->msg.cmd = msg->rsp[3]; in handle_ipmb_direct_rcv_rsp()
4070 memcpy(recv_msg->msg_data, &msg->rsp[4], msg->rsp_size - 4); in handle_ipmb_direct_rcv_rsp()
4071 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_direct_rcv_rsp()
4072 recv_msg->msg.data_len = msg->rsp_size - 4; in handle_ipmb_direct_rcv_rsp()
4089 if (msg->rsp_size < 13) { in handle_lan_get_msg_rsp()
4095 if (msg->rsp[2] != 0) { in handle_lan_get_msg_rsp()
4101 lan_addr.session_handle = msg->rsp[4]; in handle_lan_get_msg_rsp()
4102 lan_addr.remote_SWID = msg->rsp[8]; in handle_lan_get_msg_rsp()
4103 lan_addr.local_SWID = msg->rsp[5]; in handle_lan_get_msg_rsp()
4104 lan_addr.channel = msg->rsp[3] & 0x0f; in handle_lan_get_msg_rsp()
4105 lan_addr.privilege = msg->rsp[3] >> 4; in handle_lan_get_msg_rsp()
4106 lan_addr.lun = msg->rsp[9] & 3; in handle_lan_get_msg_rsp()
4113 msg->rsp[9] >> 2, in handle_lan_get_msg_rsp()
4114 msg->rsp[3] & 0x0f, in handle_lan_get_msg_rsp()
4115 msg->rsp[10], in handle_lan_get_msg_rsp()
4116 (msg->rsp[6] >> 2) & (~1), in handle_lan_get_msg_rsp()
4127 memcpy(recv_msg->msg_data, &msg->rsp[11], msg->rsp_size - 11); in handle_lan_get_msg_rsp()
4133 recv_msg->msg.netfn = msg->rsp[6] >> 2; in handle_lan_get_msg_rsp()
4134 recv_msg->msg.data = recv_msg->msg_data; in handle_lan_get_msg_rsp()
4135 recv_msg->msg.data_len = msg->rsp_size - 12; in handle_lan_get_msg_rsp()
4136 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE; in handle_lan_get_msg_rsp()
4157 if (msg->rsp_size < 12) { in handle_lan_get_msg_cmd()
4163 if (msg->rsp[2] != 0) { in handle_lan_get_msg_cmd()
4168 netfn = msg->rsp[6] >> 2; in handle_lan_get_msg_cmd()
4169 cmd = msg->rsp[10]; in handle_lan_get_msg_cmd()
4170 chan = msg->rsp[3] & 0xf; in handle_lan_get_msg_cmd()
4175 user = rcvr->user; in handle_lan_get_msg_cmd()
4176 kref_get(&user->refcount); in handle_lan_get_msg_cmd()
4185 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in handle_lan_get_msg_cmd()
4186 msg->data[1] = IPMI_SEND_MSG_CMD; in handle_lan_get_msg_cmd()
4187 msg->data[2] = chan; in handle_lan_get_msg_cmd()
4188 msg->data[3] = msg->rsp[4]; /* handle */ in handle_lan_get_msg_cmd()
4189 msg->data[4] = msg->rsp[8]; /* rsSWID */ in handle_lan_get_msg_cmd()
4190 msg->data[5] = ((netfn + 1) << 2) | (msg->rsp[9] & 0x3); in handle_lan_get_msg_cmd()
4191 msg->data[6] = ipmb_checksum(&msg->data[3], 3); in handle_lan_get_msg_cmd()
4192 msg->data[7] = msg->rsp[5]; /* rqSWID */ in handle_lan_get_msg_cmd()
4194 msg->data[8] = (msg->rsp[9] & 0xfc) | (msg->rsp[6] & 0x3); in handle_lan_get_msg_cmd()
4195 msg->data[9] = cmd; in handle_lan_get_msg_cmd()
4196 msg->data[10] = IPMI_INVALID_CMD_COMPLETION_CODE; in handle_lan_get_msg_cmd()
4197 msg->data[11] = ipmb_checksum(&msg->data[7], 4); in handle_lan_get_msg_cmd()
4198 msg->data_size = 12; in handle_lan_get_msg_cmd()
4200 dev_dbg(intf->si_dev, "Invalid command: %*ph\n", in handle_lan_get_msg_cmd()
4201 msg->data_size, msg->data); in handle_lan_get_msg_cmd()
4203 smi_send(intf, intf->handlers, msg, 0); in handle_lan_get_msg_cmd()
4208 rv = -1; in handle_lan_get_msg_cmd()
4217 kref_put(&user->refcount, free_ipmi_user); in handle_lan_get_msg_cmd()
4220 lan_addr = (struct ipmi_lan_addr *) &recv_msg->addr; in handle_lan_get_msg_cmd()
4221 lan_addr->addr_type = IPMI_LAN_ADDR_TYPE; in handle_lan_get_msg_cmd()
4222 lan_addr->session_handle = msg->rsp[4]; in handle_lan_get_msg_cmd()
4223 lan_addr->remote_SWID = msg->rsp[8]; in handle_lan_get_msg_cmd()
4224 lan_addr->local_SWID = msg->rsp[5]; in handle_lan_get_msg_cmd()
4225 lan_addr->lun = msg->rsp[9] & 3; in handle_lan_get_msg_cmd()
4226 lan_addr->channel = msg->rsp[3] & 0xf; in handle_lan_get_msg_cmd()
4227 lan_addr->privilege = msg->rsp[3] >> 4; in handle_lan_get_msg_cmd()
4231 * from the IPMB header. in handle_lan_get_msg_cmd()
4233 recv_msg->user = user; in handle_lan_get_msg_cmd()
4234 recv_msg->recv_type = IPMI_CMD_RECV_TYPE; in handle_lan_get_msg_cmd()
4235 recv_msg->msgid = msg->rsp[9] >> 2; in handle_lan_get_msg_cmd()
4236 recv_msg->msg.netfn = msg->rsp[6] >> 2; in handle_lan_get_msg_cmd()
4237 recv_msg->msg.cmd = msg->rsp[10]; in handle_lan_get_msg_cmd()
4238 recv_msg->msg.data = recv_msg->msg_data; in handle_lan_get_msg_cmd()
4244 recv_msg->msg.data_len = msg->rsp_size - 12; in handle_lan_get_msg_cmd()
4245 memcpy(recv_msg->msg_data, &msg->rsp[11], in handle_lan_get_msg_cmd()
4246 msg->rsp_size - 12); in handle_lan_get_msg_cmd()
4279 if (msg->rsp_size < 4) { in handle_oem_get_msg_cmd()
4285 if (msg->rsp[2] != 0) { in handle_oem_get_msg_cmd()
4294 netfn = msg->rsp[0] >> 2; in handle_oem_get_msg_cmd()
4295 cmd = msg->rsp[1]; in handle_oem_get_msg_cmd()
4296 chan = msg->rsp[3] & 0xf; in handle_oem_get_msg_cmd()
4301 user = rcvr->user; in handle_oem_get_msg_cmd()
4302 kref_get(&user->refcount); in handle_oem_get_msg_cmd()
4326 kref_put(&user->refcount, free_ipmi_user); in handle_oem_get_msg_cmd()
4335 &recv_msg->addr); in handle_oem_get_msg_cmd()
4336 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in handle_oem_get_msg_cmd()
4337 smi_addr->channel = IPMI_BMC_CHANNEL; in handle_oem_get_msg_cmd()
4338 smi_addr->lun = msg->rsp[0] & 3; in handle_oem_get_msg_cmd()
4340 recv_msg->user = user; in handle_oem_get_msg_cmd()
4341 recv_msg->user_msg_data = NULL; in handle_oem_get_msg_cmd()
4342 recv_msg->recv_type = IPMI_OEM_RECV_TYPE; in handle_oem_get_msg_cmd()
4343 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_oem_get_msg_cmd()
4344 recv_msg->msg.cmd = msg->rsp[1]; in handle_oem_get_msg_cmd()
4345 recv_msg->msg.data = recv_msg->msg_data; in handle_oem_get_msg_cmd()
4351 recv_msg->msg.data_len = msg->rsp_size - 4; in handle_oem_get_msg_cmd()
4352 memcpy(recv_msg->msg_data, &msg->rsp[4], in handle_oem_get_msg_cmd()
4353 msg->rsp_size - 4); in handle_oem_get_msg_cmd()
4369 recv_msg->msgid = 0; in copy_event_into_recv_msg()
4370 smi_addr = (struct ipmi_system_interface_addr *) &recv_msg->addr; in copy_event_into_recv_msg()
4371 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in copy_event_into_recv_msg()
4372 smi_addr->channel = IPMI_BMC_CHANNEL; in copy_event_into_recv_msg()
4373 smi_addr->lun = msg->rsp[0] & 3; in copy_event_into_recv_msg()
4374 recv_msg->recv_type = IPMI_ASYNC_EVENT_RECV_TYPE; in copy_event_into_recv_msg()
4375 recv_msg->msg.netfn = msg->rsp[0] >> 2; in copy_event_into_recv_msg()
4376 recv_msg->msg.cmd = msg->rsp[1]; in copy_event_into_recv_msg()
4377 memcpy(recv_msg->msg_data, &msg->rsp[3], msg->rsp_size - 3); in copy_event_into_recv_msg()
4378 recv_msg->msg.data = recv_msg->msg_data; in copy_event_into_recv_msg()
4379 recv_msg->msg.data_len = msg->rsp_size - 3; in copy_event_into_recv_msg()
4390 if (msg->rsp_size < 19) { in handle_read_event_rsp()
4391 /* Message is too small to be an IPMB event. */ in handle_read_event_rsp()
4396 if (msg->rsp[2] != 0) { in handle_read_event_rsp()
4403 mutex_lock(&intf->events_mutex); in handle_read_event_rsp()
4411 mutex_lock(&intf->users_mutex); in handle_read_event_rsp()
4412 list_for_each_entry(user, &intf->users, link) { in handle_read_event_rsp()
4413 if (!user->gets_events) in handle_read_event_rsp()
4418 mutex_unlock(&intf->users_mutex); in handle_read_event_rsp()
4421 user = recv_msg->user; in handle_read_event_rsp()
4422 list_del(&recv_msg->link); in handle_read_event_rsp()
4424 kref_put(&user->refcount, free_ipmi_user); in handle_read_event_rsp()
4438 recv_msg->user = user; in handle_read_event_rsp()
4439 kref_get(&user->refcount); in handle_read_event_rsp()
4440 list_add_tail(&recv_msg->link, &msgs); in handle_read_event_rsp()
4442 mutex_unlock(&intf->users_mutex); in handle_read_event_rsp()
4447 list_del(&recv_msg->link); in handle_read_event_rsp()
4450 } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { in handle_read_event_rsp()
4467 list_add_tail(&recv_msg->link, &intf->waiting_events); in handle_read_event_rsp()
4468 intf->waiting_events_count++; in handle_read_event_rsp()
4469 } else if (!intf->event_msg_printed) { in handle_read_event_rsp()
4474 dev_warn(intf->si_dev, in handle_read_event_rsp()
4476 intf->event_msg_printed = 1; in handle_read_event_rsp()
4480 mutex_unlock(&intf->events_mutex); in handle_read_event_rsp()
4491 recv_msg = msg->user_data; in handle_bmc_rsp()
4493 dev_warn(intf->si_dev, in handle_bmc_rsp()
4498 recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE; in handle_bmc_rsp()
4499 recv_msg->msgid = msg->msgid; in handle_bmc_rsp()
4501 &recv_msg->addr); in handle_bmc_rsp()
4502 smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in handle_bmc_rsp()
4503 smi_addr->channel = IPMI_BMC_CHANNEL; in handle_bmc_rsp()
4504 smi_addr->lun = msg->rsp[0] & 3; in handle_bmc_rsp()
4505 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_bmc_rsp()
4506 recv_msg->msg.cmd = msg->rsp[1]; in handle_bmc_rsp()
4507 memcpy(recv_msg->msg_data, &msg->rsp[2], msg->rsp_size - 2); in handle_bmc_rsp()
4508 recv_msg->msg.data = recv_msg->msg_data; in handle_bmc_rsp()
4509 recv_msg->msg.data_len = msg->rsp_size - 2; in handle_bmc_rsp()
4517 * 0 if the message should be freed, or -1 if the message should not
4526 bool is_cmd = !((msg->rsp[0] >> 2) & 1); in handle_one_recv_msg()
4528 dev_dbg(intf->si_dev, "Recv: %*ph\n", msg->rsp_size, msg->rsp); in handle_one_recv_msg()
4530 if (msg->rsp_size < 2) { in handle_one_recv_msg()
4532 dev_warn(intf->si_dev, in handle_one_recv_msg()
4534 (msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size); in handle_one_recv_msg()
4538 msg->rsp[0] = msg->data[0] | (1 << 2); in handle_one_recv_msg()
4539 msg->rsp[1] = msg->data[1]; in handle_one_recv_msg()
4540 msg->rsp[2] = IPMI_ERR_UNSPECIFIED; in handle_one_recv_msg()
4541 msg->rsp_size = 3; in handle_one_recv_msg()
4542 } else if (msg->type == IPMI_SMI_MSG_TYPE_IPMB_DIRECT) { in handle_one_recv_msg()
4544 if (is_cmd && (msg->rsp_size < 4)) { in handle_one_recv_msg()
4548 if (!is_cmd && (msg->rsp_size < 5)) { in handle_one_recv_msg()
4551 msg->rsp[0] = msg->data[0] & 0xfc; /* NetFN */ in handle_one_recv_msg()
4552 msg->rsp[0] |= (1 << 2); /* Make it a response */ in handle_one_recv_msg()
4553 msg->rsp[0] |= msg->data[2] & 3; /* rqLUN */ in handle_one_recv_msg()
4554 msg->rsp[1] = msg->data[1]; /* Addr */ in handle_one_recv_msg()
4555 msg->rsp[2] = msg->data[2] & 0xfc; /* rqSeq */ in handle_one_recv_msg()
4556 msg->rsp[2] |= msg->data[0] & 0x3; /* rsLUN */ in handle_one_recv_msg()
4557 msg->rsp[3] = msg->data[3]; /* Cmd */ in handle_one_recv_msg()
4558 msg->rsp[4] = IPMI_ERR_UNSPECIFIED; in handle_one_recv_msg()
4559 msg->rsp_size = 5; in handle_one_recv_msg()
4561 } else if ((msg->data_size >= 2) in handle_one_recv_msg()
4562 && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) in handle_one_recv_msg()
4563 && (msg->data[1] == IPMI_SEND_MSG_CMD) in handle_one_recv_msg()
4564 && (msg->user_data == NULL)) { in handle_one_recv_msg()
4566 if (intf->in_shutdown || intf->run_to_completion) in handle_one_recv_msg()
4582 if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) in handle_one_recv_msg()
4583 && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) in handle_one_recv_msg()
4584 && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) in handle_one_recv_msg()
4585 && (msg->rsp[2] != IPMI_BUS_ERR) in handle_one_recv_msg()
4586 && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) { in handle_one_recv_msg()
4587 int ch = msg->rsp[3] & 0xf; in handle_one_recv_msg()
4592 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4598 intf_err_seq(intf, msg->msgid, msg->rsp[2]); in handle_one_recv_msg()
4601 intf_start_seq_timer(intf, msg->msgid); in handle_one_recv_msg()
4604 } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1)) in handle_one_recv_msg()
4605 || (msg->rsp[1] != msg->data[1])) { in handle_one_recv_msg()
4610 dev_warn_ratelimited(intf->si_dev, in handle_one_recv_msg()
4612 (msg->data[0] >> 2) | 1, msg->data[1], in handle_one_recv_msg()
4613 msg->rsp[0] >> 2, msg->rsp[1]); in handle_one_recv_msg()
4618 if (msg->type == IPMI_SMI_MSG_TYPE_IPMB_DIRECT) { in handle_one_recv_msg()
4619 if ((msg->data[0] >> 2) & 1) { in handle_one_recv_msg()
4622 cc = msg->rsp[4]; in handle_one_recv_msg()
4629 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) in handle_one_recv_msg()
4630 && (msg->rsp[1] == IPMI_SEND_MSG_CMD) in handle_one_recv_msg()
4631 && (msg->user_data != NULL)) { in handle_one_recv_msg()
4638 if (intf->run_to_completion) in handle_one_recv_msg()
4641 chan = msg->data[2] & 0x0f; in handle_one_recv_msg()
4645 cc = msg->rsp[2]; in handle_one_recv_msg()
4648 recv_msg = msg->user_data; in handle_one_recv_msg()
4654 recv_msg->recv_type = IPMI_RESPONSE_RESPONSE_TYPE; in handle_one_recv_msg()
4655 recv_msg->msg.data = recv_msg->msg_data; in handle_one_recv_msg()
4656 recv_msg->msg_data[0] = cc; in handle_one_recv_msg()
4657 recv_msg->msg.data_len = 1; in handle_one_recv_msg()
4659 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) in handle_one_recv_msg()
4660 && (msg->rsp[1] == IPMI_GET_MSG_CMD)) { in handle_one_recv_msg()
4663 if (intf->run_to_completion) in handle_one_recv_msg()
4667 chan = msg->rsp[3] & 0xf; in handle_one_recv_msg()
4680 if (!intf->channels_ready) { in handle_one_recv_msg()
4685 chans = READ_ONCE(intf->channel_list)->c; in handle_one_recv_msg()
4689 if (msg->rsp[4] & 0x04) { in handle_one_recv_msg()
4706 if (msg->rsp[6] & 0x04) { in handle_one_recv_msg()
4737 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) in handle_one_recv_msg()
4738 && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD)) { in handle_one_recv_msg()
4740 if (intf->run_to_completion) in handle_one_recv_msg()
4761 int run_to_completion = READ_ONCE(intf->run_to_completion); in handle_new_recv_msgs()
4765 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4766 while (!list_empty(&intf->waiting_rcv_msgs)) { in handle_new_recv_msgs()
4767 smi_msg = list_entry(intf->waiting_rcv_msgs.next, in handle_new_recv_msgs()
4769 list_del(&smi_msg->link); in handle_new_recv_msgs()
4771 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in handle_new_recv_msgs()
4775 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4784 list_add(&smi_msg->link, &intf->waiting_rcv_msgs); in handle_new_recv_msgs()
4794 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, flags); in handle_new_recv_msgs()
4799 unsigned long flags = 0; /* keep us warning-free. */ in smi_work()
4801 int run_to_completion = READ_ONCE(intf->run_to_completion); in smi_work()
4814 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in smi_work()
4815 if (intf->curr_msg == NULL && !intf->in_shutdown) { in smi_work()
4819 if (!list_empty(&intf->hp_xmit_msgs)) in smi_work()
4820 entry = intf->hp_xmit_msgs.next; in smi_work()
4821 else if (!list_empty(&intf->xmit_msgs)) in smi_work()
4822 entry = intf->xmit_msgs.next; in smi_work()
4827 intf->curr_msg = newmsg; in smi_work()
4831 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in smi_work()
4834 intf->handlers->sender(intf->send_info, newmsg); in smi_work()
4843 * If the pretimout count is non-zero, decrement one from it and in smi_work()
4846 if (atomic_add_unless(&intf->watchdog_pretimeouts_to_deliver, -1, 0)) { in smi_work()
4849 mutex_lock(&intf->users_mutex); in smi_work()
4850 list_for_each_entry(user, &intf->users, link) { in smi_work()
4851 if (user->handler->ipmi_watchdog_pretimeout) in smi_work()
4852 user->handler->ipmi_watchdog_pretimeout( in smi_work()
4853 user->handler_data); in smi_work()
4855 mutex_unlock(&intf->users_mutex); in smi_work()
4863 kref_get(&intf->refcount); in smi_work()
4865 mutex_lock(&intf->user_msgs_mutex); in smi_work()
4866 list_for_each_entry_safe(msg, msg2, &intf->user_msgs, link) { in smi_work()
4867 struct ipmi_user *user = msg->user; in smi_work()
4869 list_del(&msg->link); in smi_work()
4871 if (refcount_read(&user->destroyed) == 0) { in smi_work()
4874 atomic_dec(&user->nr_msgs); in smi_work()
4875 user->handler->ipmi_recv_hndl(msg, user->handler_data); in smi_work()
4878 mutex_unlock(&intf->user_msgs_mutex); in smi_work()
4880 kref_put(&intf->refcount, intf_free); in smi_work()
4887 unsigned long flags = 0; /* keep us warning-free. */ in ipmi_smi_msg_received()
4888 int run_to_completion = READ_ONCE(intf->run_to_completion); in ipmi_smi_msg_received()
4895 spin_lock_irqsave(&intf->waiting_rcv_msgs_lock, flags); in ipmi_smi_msg_received()
4896 list_add_tail(&msg->link, &intf->waiting_rcv_msgs); in ipmi_smi_msg_received()
4898 spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, in ipmi_smi_msg_received()
4902 spin_lock_irqsave(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4907 if (msg == intf->curr_msg) in ipmi_smi_msg_received()
4908 intf->curr_msg = NULL; in ipmi_smi_msg_received()
4910 spin_unlock_irqrestore(&intf->xmit_msgs_lock, flags); in ipmi_smi_msg_received()
4913 smi_work(&intf->smi_work); in ipmi_smi_msg_received()
4915 queue_work(system_wq, &intf->smi_work); in ipmi_smi_msg_received()
4921 if (intf->in_shutdown) in ipmi_smi_watchdog_pretimeout()
4924 atomic_set(&intf->watchdog_pretimeouts_to_deliver, 1); in ipmi_smi_watchdog_pretimeout()
4925 queue_work(system_wq, &intf->smi_work); in ipmi_smi_watchdog_pretimeout()
4941 memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len); in smi_from_recv_msg()
4942 smi_msg->data_size = recv_msg->msg.data_len; in smi_from_recv_msg()
4943 smi_msg->msgid = STORE_SEQ_IN_MSGID(seq, seqid); in smi_from_recv_msg()
4945 dev_dbg(intf->si_dev, "Resend: %*ph\n", in smi_from_recv_msg()
4946 smi_msg->data_size, smi_msg->data); in smi_from_recv_msg()
4959 if (intf->in_shutdown) in check_msg_timeout()
4962 if (!ent->inuse) in check_msg_timeout()
4965 if (timeout_period < ent->timeout) { in check_msg_timeout()
4966 ent->timeout -= timeout_period; in check_msg_timeout()
4971 if (ent->retries_left == 0) { in check_msg_timeout()
4973 ent->inuse = 0; in check_msg_timeout()
4975 msg = ent->recv_msg; in check_msg_timeout()
4976 list_add_tail(&msg->link, timeouts); in check_msg_timeout()
4977 if (ent->broadcast) in check_msg_timeout()
4979 else if (is_lan_addr(&ent->recv_msg->addr)) in check_msg_timeout()
4993 ent->timeout = MAX_MSG_TIMEOUT; in check_msg_timeout()
4994 ent->retries_left--; in check_msg_timeout()
4995 smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot, in check_msg_timeout()
4996 ent->seqid); in check_msg_timeout()
4998 if (is_lan_addr(&ent->recv_msg->addr)) in check_msg_timeout()
5007 spin_unlock_irqrestore(&intf->seq_lock, *flags); in check_msg_timeout()
5016 if (intf->handlers) { in check_msg_timeout()
5017 if (is_lan_addr(&ent->recv_msg->addr)) in check_msg_timeout()
5024 smi_send(intf, intf->handlers, smi_msg, 0); in check_msg_timeout()
5028 spin_lock_irqsave(&intf->seq_lock, *flags); in check_msg_timeout()
5041 if (!intf->bmc_registered) { in ipmi_timeout_handler()
5042 kref_get(&intf->refcount); in ipmi_timeout_handler()
5043 if (!schedule_work(&intf->bmc_reg_work)) { in ipmi_timeout_handler()
5044 kref_put(&intf->refcount, intf_free); in ipmi_timeout_handler()
5055 spin_lock_irqsave(&intf->seq_lock, flags); in ipmi_timeout_handler()
5056 if (intf->ipmb_maintenance_mode_timeout) { in ipmi_timeout_handler()
5057 if (intf->ipmb_maintenance_mode_timeout <= timeout_period) in ipmi_timeout_handler()
5058 intf->ipmb_maintenance_mode_timeout = 0; in ipmi_timeout_handler()
5060 intf->ipmb_maintenance_mode_timeout -= timeout_period; in ipmi_timeout_handler()
5063 check_msg_timeout(intf, &intf->seq_table[i], in ipmi_timeout_handler()
5066 spin_unlock_irqrestore(&intf->seq_lock, flags); in ipmi_timeout_handler()
5079 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
5080 spin_lock_irqsave(&intf->maintenance_mode_lock, flags); in ipmi_timeout_handler()
5081 if (intf->auto_maintenance_timeout > 0) { in ipmi_timeout_handler()
5082 intf->auto_maintenance_timeout in ipmi_timeout_handler()
5083 -= timeout_period; in ipmi_timeout_handler()
5084 if (!intf->maintenance_mode in ipmi_timeout_handler()
5085 && (intf->auto_maintenance_timeout <= 0)) { in ipmi_timeout_handler()
5086 intf->maintenance_mode_enable = false; in ipmi_timeout_handler()
5090 spin_unlock_irqrestore(&intf->maintenance_mode_lock, in ipmi_timeout_handler()
5094 queue_work(system_wq, &intf->smi_work); in ipmi_timeout_handler()
5102 if (intf->maintenance_mode_enable) in ipmi_request_event()
5105 if (!intf->in_shutdown) in ipmi_request_event()
5106 intf->handlers->request_events(intf->send_info); in ipmi_request_event()
5126 if (atomic_read(&intf->event_waiters)) { in ipmi_timeout_work()
5127 intf->ticks_to_req_ev--; in ipmi_timeout_work()
5128 if (intf->ticks_to_req_ev == 0) { in ipmi_timeout_work()
5130 intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME; in ipmi_timeout_work()
5176 rv->done = free_smi_msg; in ipmi_alloc_smi_msg()
5177 rv->user_data = NULL; in ipmi_alloc_smi_msg()
5178 rv->type = IPMI_SMI_MSG_TYPE_NORMAL; in ipmi_alloc_smi_msg()
5199 rv->user = NULL; in ipmi_alloc_recv_msg()
5200 rv->done = free_recv_msg; in ipmi_alloc_recv_msg()
5208 if (msg->user && !oops_in_progress) in ipmi_free_recv_msg()
5209 kref_put(&msg->user->refcount, free_ipmi_user); in ipmi_free_recv_msg()
5210 msg->done(msg); in ipmi_free_recv_msg()
5249 intf->addrinfo[0].address, in _ipmi_panic_request_and_wait()
5250 intf->addrinfo[0].lun, in _ipmi_panic_request_and_wait()
5254 else if (intf->handlers->flush_messages) in _ipmi_panic_request_and_wait()
5255 intf->handlers->flush_messages(intf->send_info); in _ipmi_panic_request_and_wait()
5265 user->intf->run_to_completion = 1; in ipmi_panic_request_and_wait()
5266 _ipmi_panic_request_and_wait(user->intf, addr, msg); in ipmi_panic_request_and_wait()
5273 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in event_receiver_fetcher()
5274 && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE) in event_receiver_fetcher()
5275 && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD) in event_receiver_fetcher()
5276 && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) { in event_receiver_fetcher()
5278 intf->event_receiver = msg->msg.data[1]; in event_receiver_fetcher()
5279 intf->event_receiver_lun = msg->msg.data[2] & 0x3; in event_receiver_fetcher()
5285 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in device_id_fetcher()
5286 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) in device_id_fetcher()
5287 && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD) in device_id_fetcher()
5288 && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) { in device_id_fetcher()
5293 intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; in device_id_fetcher()
5294 intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; in device_id_fetcher()
5305 struct ipmi_ipmb_addr *ipmb; in send_panic_events() local
5312 si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in send_panic_events()
5313 si->channel = IPMI_BMC_CHANNEL; in send_panic_events()
5314 si->lun = 0; in send_panic_events()
5321 data[0] = 0x41; /* Kernel generator ID, IPMI table 5-4 */ in send_panic_events()
5323 data[2] = 0x20; /* OS Critical Stop, IPMI table 36-3 */ in send_panic_events()
5324 data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */ in send_panic_events()
5364 intf->local_sel_device = 0; in send_panic_events()
5365 intf->local_event_generator = 0; in send_panic_events()
5366 intf->event_receiver = 0; in send_panic_events()
5373 intf->null_user_handler = device_id_fetcher; in send_panic_events()
5376 if (intf->local_event_generator) { in send_panic_events()
5382 intf->null_user_handler = event_receiver_fetcher; in send_panic_events()
5385 intf->null_user_handler = NULL; in send_panic_events()
5389 * be 1 (it must be a valid IPMB address), it cannot in send_panic_events()
5392 if (((intf->event_receiver & 1) == 0) in send_panic_events()
5393 && (intf->event_receiver != 0) in send_panic_events()
5394 && (intf->event_receiver != intf->addrinfo[0].address)) { in send_panic_events()
5396 * The event receiver is valid, send an IPMB in send_panic_events()
5399 ipmb = (struct ipmi_ipmb_addr *) &addr; in send_panic_events()
5400 ipmb->addr_type = IPMI_IPMB_ADDR_TYPE; in send_panic_events()
5401 ipmb->channel = 0; /* FIXME - is this right? */ in send_panic_events()
5402 ipmb->lun = intf->event_receiver_lun; in send_panic_events()
5403 ipmb->slave_addr = intf->event_receiver; in send_panic_events()
5404 } else if (intf->local_sel_device) { in send_panic_events()
5411 si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in send_panic_events()
5412 si->channel = IPMI_BMC_CHANNEL; in send_panic_events()
5413 si->lun = 0; in send_panic_events()
5429 data[3] = intf->addrinfo[0].address; in send_panic_events()
5454 if (!intf->handlers || intf->intf_num == -1) in panic_event()
5458 if (!intf->handlers->poll) in panic_event()
5467 if (!spin_trylock(&intf->xmit_msgs_lock)) { in panic_event()
5468 INIT_LIST_HEAD(&intf->xmit_msgs); in panic_event()
5469 INIT_LIST_HEAD(&intf->hp_xmit_msgs); in panic_event()
5471 spin_unlock(&intf->xmit_msgs_lock); in panic_event()
5473 if (!spin_trylock(&intf->waiting_rcv_msgs_lock)) in panic_event()
5474 INIT_LIST_HEAD(&intf->waiting_rcv_msgs); in panic_event()
5476 spin_unlock(&intf->waiting_rcv_msgs_lock); in panic_event()
5478 intf->run_to_completion = 1; in panic_event()
5479 if (intf->handlers->set_run_to_completion) in panic_event()
5480 intf->handlers->set_run_to_completion(intf->send_info, in panic_event()
5483 list_for_each_entry(user, &intf->users, link) { in panic_event()
5484 if (user->handler->ipmi_panic_handler) in panic_event()
5485 user->handler->ipmi_panic_handler( in panic_event()
5486 user->handler_data); in panic_event()
5528 bmc_remove_work_wq = create_singlethread_workqueue("ipmi-msghandler-remove-wq"); in ipmi_init_msghandler()
5530 pr_err("unable to create ipmi-msghandler-remove-wq workqueue"); in ipmi_init_msghandler()
5531 rv = -ENOMEM; in ipmi_init_msghandler()