Lines Matching refs:msg

48 			       struct ipmi_smi_msg *msg);
565 struct ipmi_recv_msg *msg);
665 struct ipmi_recv_msg *msg, *msg2; in free_recv_msg_list() local
667 list_for_each_entry_safe(msg, msg2, q, link) { in free_recv_msg_list()
668 list_del(&msg->link); in free_recv_msg_list()
669 ipmi_free_recv_msg(msg); in free_recv_msg_list()
675 struct ipmi_smi_msg *msg, *msg2; in free_smi_msg_list() local
677 list_for_each_entry_safe(msg, msg2, q, link) { in free_smi_msg_list()
678 list_del(&msg->link); in free_smi_msg_list()
679 ipmi_free_smi_msg(msg); in free_smi_msg_list()
910 static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in deliver_response() argument
914 if (!msg->user) { in deliver_response()
917 intf->null_user_handler(intf, msg); in deliver_response()
922 ipmi_free_recv_msg(msg); in deliver_response()
929 ipmi_free_recv_msg(msg); in deliver_response()
932 struct ipmi_user *user = acquire_ipmi_user(msg->user, &index); in deliver_response()
935 user->handler->ipmi_recv_hndl(msg, user->handler_data); in deliver_response()
939 ipmi_free_recv_msg(msg); in deliver_response()
948 struct ipmi_recv_msg *msg) in deliver_local_response() argument
950 if (deliver_response(intf, msg)) in deliver_local_response()
957 struct ipmi_recv_msg *msg, int err) in deliver_err_response() argument
959 msg->recv_type = IPMI_RESPONSE_RECV_TYPE; in deliver_err_response()
960 msg->msg_data[0] = err; in deliver_err_response()
961 msg->msg.netfn |= 1; /* Convert to a response. */ in deliver_err_response()
962 msg->msg.data_len = 1; in deliver_err_response()
963 msg->msg.data = msg->msg_data; in deliver_err_response()
964 deliver_local_response(intf, msg); in deliver_err_response()
1100 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; in intf_find_seq() local
1102 if ((msg->addr.channel == channel) && (msg->msg.cmd == cmd) in intf_find_seq()
1103 && (msg->msg.netfn == netfn) in intf_find_seq()
1104 && (ipmi_addr_equal(addr, &msg->addr))) { in intf_find_seq()
1105 *recv_msg = msg; in intf_find_seq()
1154 struct ipmi_recv_msg *msg = NULL; in intf_err_seq() local
1170 msg = ent->recv_msg; in intf_err_seq()
1175 if (msg) in intf_err_seq()
1176 deliver_err_response(intf, msg, err); in intf_err_seq()
1568 struct ipmi_recv_msg *msg, *msg2; in ipmi_set_gets_events() local
1600 list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link) in ipmi_set_gets_events()
1601 list_move_tail(&msg->link, &msgs); in ipmi_set_gets_events()
1611 list_for_each_entry_safe(msg, msg2, &msgs, link) { in ipmi_set_gets_events()
1612 msg->user = user; in ipmi_set_gets_events()
1614 deliver_local_response(intf, msg); in ipmi_set_gets_events()
1764 struct kernel_ipmi_msg *msg, in format_ipmb_msg() argument
1781 smi_msg->data[i+4] = (msg->netfn << 2) | (ipmb_addr->lun & 0x3); in format_ipmb_msg()
1785 smi_msg->data[i+8] = msg->cmd; in format_ipmb_msg()
1788 if (msg->data_len > 0) in format_ipmb_msg()
1789 memcpy(&smi_msg->data[i + 9], msg->data, msg->data_len); in format_ipmb_msg()
1790 smi_msg->data_size = msg->data_len + 9; in format_ipmb_msg()
1806 struct kernel_ipmi_msg *msg, in format_lan_msg() argument
1818 smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3); in format_lan_msg()
1822 smi_msg->data[9] = msg->cmd; in format_lan_msg()
1825 if (msg->data_len > 0) in format_lan_msg()
1826 memcpy(&smi_msg->data[10], msg->data, msg->data_len); in format_lan_msg()
1827 smi_msg->data_size = msg->data_len + 10; in format_lan_msg()
1877 static bool is_maintenance_mode_cmd(struct kernel_ipmi_msg *msg) in is_maintenance_mode_cmd() argument
1879 return (((msg->netfn == IPMI_NETFN_APP_REQUEST) in is_maintenance_mode_cmd()
1880 && ((msg->cmd == IPMI_COLD_RESET_CMD) in is_maintenance_mode_cmd()
1881 || (msg->cmd == IPMI_WARM_RESET_CMD))) in is_maintenance_mode_cmd()
1882 || (msg->netfn == IPMI_NETFN_FIRMWARE_REQUEST)); in is_maintenance_mode_cmd()
1888 struct kernel_ipmi_msg *msg, in i_ipmi_req_sysintf() argument
1896 if (msg->netfn & 1) in i_ipmi_req_sysintf()
1908 if ((msg->netfn == IPMI_NETFN_APP_REQUEST) in i_ipmi_req_sysintf()
1909 && ((msg->cmd == IPMI_SEND_MSG_CMD) in i_ipmi_req_sysintf()
1910 || (msg->cmd == IPMI_GET_MSG_CMD) in i_ipmi_req_sysintf()
1911 || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD))) { in i_ipmi_req_sysintf()
1920 if (is_maintenance_mode_cmd(msg)) { in i_ipmi_req_sysintf()
1935 if (msg->data_len + 2 > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_sysintf()
1940 smi_msg->data[0] = (msg->netfn << 2) | (smi_addr->lun & 0x3); in i_ipmi_req_sysintf()
1941 smi_msg->data[1] = msg->cmd; in i_ipmi_req_sysintf()
1944 if (msg->data_len > 0) in i_ipmi_req_sysintf()
1945 memcpy(&smi_msg->data[2], msg->data, msg->data_len); in i_ipmi_req_sysintf()
1946 smi_msg->data_size = msg->data_len + 2; in i_ipmi_req_sysintf()
1955 struct kernel_ipmi_msg *msg, in i_ipmi_req_ipmb() argument
1997 if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_ipmb()
2010 if (recv_msg->msg.netfn & 0x1) { in i_ipmi_req_ipmb()
2016 format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid, in i_ipmi_req_ipmb()
2031 if (is_maintenance_mode_cmd(msg)) in i_ipmi_req_ipmb()
2064 format_ipmb_msg(smi_msg, msg, ipmb_addr, in i_ipmi_req_ipmb()
2075 recv_msg->msg.data = recv_msg->msg_data; in i_ipmi_req_ipmb()
2076 recv_msg->msg.data_len = smi_msg->data_size; in i_ipmi_req_ipmb()
2096 struct kernel_ipmi_msg *msg, in i_ipmi_req_ipmb_direct() argument
2102 bool is_cmd = !(recv_msg->msg.netfn & 0x1); in i_ipmi_req_ipmb_direct()
2108 if (!is_cmd && msg->data_len < 1) { in i_ipmi_req_ipmb_direct()
2113 if ((msg->data_len + 4) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_ipmb_direct()
2128 smi_msg->data[0] = msg->netfn << 2 | daddr->rs_lun; in i_ipmi_req_ipmb_direct()
2131 smi_msg->data[0] = msg->netfn << 2 | daddr->rq_lun; in i_ipmi_req_ipmb_direct()
2135 smi_msg->data[3] = msg->cmd; in i_ipmi_req_ipmb_direct()
2137 memcpy(smi_msg->data + 4, msg->data, msg->data_len); in i_ipmi_req_ipmb_direct()
2138 smi_msg->data_size = msg->data_len + 4; in i_ipmi_req_ipmb_direct()
2148 struct kernel_ipmi_msg *msg, in i_ipmi_req_lan() argument
2177 if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_lan()
2190 if (recv_msg->msg.netfn & 0x1) { in i_ipmi_req_lan()
2196 format_lan_msg(smi_msg, msg, lan_addr, msgid, in i_ipmi_req_lan()
2235 format_lan_msg(smi_msg, msg, lan_addr, in i_ipmi_req_lan()
2245 recv_msg->msg.data = recv_msg->msg_data; in i_ipmi_req_lan()
2246 recv_msg->msg.data_len = smi_msg->data_size; in i_ipmi_req_lan()
2273 struct kernel_ipmi_msg *msg, in i_ipmi_request() argument
2325 recv_msg->msg = *msg; 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()
2377 struct kernel_ipmi_msg *msg, in ipmi_request_settime() argument
2399 msg, in ipmi_request_settime()
2416 struct kernel_ipmi_msg *msg, in ipmi_request_supply_msgs() argument
2438 msg, in ipmi_request_supply_msgs()
2453 struct ipmi_recv_msg *msg) in bmc_device_id_handler() argument
2457 if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in bmc_device_id_handler()
2458 || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE) in bmc_device_id_handler()
2459 || (msg->msg.cmd != IPMI_GET_DEVICE_ID_CMD)) { in bmc_device_id_handler()
2462 msg->addr.addr_type, msg->msg.netfn, msg->msg.cmd); in bmc_device_id_handler()
2466 if (msg->msg.data[0]) { in bmc_device_id_handler()
2468 msg->msg.data[0]); in bmc_device_id_handler()
2473 rv = ipmi_demangle_device_id(msg->msg.netfn, msg->msg.cmd, in bmc_device_id_handler()
2474 msg->msg.data, msg->msg.data_len, &intf->bmc->fetch_id); in bmc_device_id_handler()
2478 intf->bmc->cc = msg->msg.data[0]; in bmc_device_id_handler()
2496 struct kernel_ipmi_msg msg; in send_get_device_id_cmd() local
2502 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_get_device_id_cmd()
2503 msg.cmd = IPMI_GET_DEVICE_ID_CMD; in send_get_device_id_cmd()
2504 msg.data = NULL; in send_get_device_id_cmd()
2505 msg.data_len = 0; in send_get_device_id_cmd()
2511 &msg, in send_get_device_id_cmd()
3233 struct kernel_ipmi_msg msg; in send_guid_cmd() local
3240 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_guid_cmd()
3241 msg.cmd = IPMI_GET_DEVICE_GUID_CMD; in send_guid_cmd()
3242 msg.data = NULL; in send_guid_cmd()
3243 msg.data_len = 0; in send_guid_cmd()
3248 &msg, in send_guid_cmd()
3258 static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in guid_handler() argument
3262 if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in guid_handler()
3263 || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE) in guid_handler()
3264 || (msg->msg.cmd != IPMI_GET_DEVICE_GUID_CMD)) in guid_handler()
3268 if (msg->msg.data[0] != 0) { in guid_handler()
3274 if (msg->msg.data_len < UUID_SIZE + 1) { in guid_handler()
3278 msg->msg.data_len, UUID_SIZE + 1); in guid_handler()
3282 import_guid(&bmc->fetch_guid, msg->msg.data + 1); in guid_handler()
3316 struct kernel_ipmi_msg msg; in send_channel_info_cmd() local
3324 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_channel_info_cmd()
3325 msg.cmd = IPMI_GET_CHANNEL_INFO_CMD; in send_channel_info_cmd()
3326 msg.data = data; in send_channel_info_cmd()
3327 msg.data_len = 1; in send_channel_info_cmd()
3333 &msg, in send_channel_info_cmd()
3344 channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in channel_handler() argument
3351 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in channel_handler()
3352 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) in channel_handler()
3353 && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD)) { in channel_handler()
3355 if (msg->msg.data[0] != 0) { in channel_handler()
3357 if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) { in channel_handler()
3376 if (msg->msg.data_len < 4) { in channel_handler()
3382 chans[ch].medium = msg->msg.data[2] & 0x7f; in channel_handler()
3383 chans[ch].protocol = msg->msg.data[3] & 0x1f; in channel_handler()
3626 struct ipmi_smi_msg *msg, in deliver_smi_err_response() argument
3629 msg->rsp[0] = msg->data[0] | 4; in deliver_smi_err_response()
3630 msg->rsp[1] = msg->data[1]; in deliver_smi_err_response()
3631 msg->rsp[2] = err; in deliver_smi_err_response()
3632 msg->rsp_size = 3; in deliver_smi_err_response()
3634 handle_one_recv_msg(intf, msg); in deliver_smi_err_response()
3641 struct ipmi_smi_msg *msg; in cleanup_smi_msgs() local
3665 msg = list_entry(entry, struct ipmi_smi_msg, link); in cleanup_smi_msgs()
3666 deliver_smi_err_response(intf, msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3723 struct ipmi_smi_msg *msg) in handle_ipmb_get_msg_rsp() argument
3732 if (msg->rsp_size < 11) { in handle_ipmb_get_msg_rsp()
3738 if (msg->rsp[2] != 0) { in handle_ipmb_get_msg_rsp()
3744 ipmb_addr.slave_addr = msg->rsp[6]; in handle_ipmb_get_msg_rsp()
3745 ipmb_addr.channel = msg->rsp[3] & 0x0f; in handle_ipmb_get_msg_rsp()
3746 ipmb_addr.lun = msg->rsp[7] & 3; in handle_ipmb_get_msg_rsp()
3753 msg->rsp[7] >> 2, in handle_ipmb_get_msg_rsp()
3754 msg->rsp[3] & 0x0f, in handle_ipmb_get_msg_rsp()
3755 msg->rsp[8], in handle_ipmb_get_msg_rsp()
3756 (msg->rsp[4] >> 2) & (~1), in handle_ipmb_get_msg_rsp()
3767 memcpy(recv_msg->msg_data, &msg->rsp[9], msg->rsp_size - 9); in handle_ipmb_get_msg_rsp()
3773 recv_msg->msg.netfn = msg->rsp[4] >> 2; in handle_ipmb_get_msg_rsp()
3774 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_get_msg_rsp()
3775 recv_msg->msg.data_len = msg->rsp_size - 10; in handle_ipmb_get_msg_rsp()
3786 struct ipmi_smi_msg *msg) in handle_ipmb_get_msg_cmd() argument
3797 if (msg->rsp_size < 10) { in handle_ipmb_get_msg_cmd()
3803 if (msg->rsp[2] != 0) { in handle_ipmb_get_msg_cmd()
3808 netfn = msg->rsp[4] >> 2; in handle_ipmb_get_msg_cmd()
3809 cmd = msg->rsp[8]; in handle_ipmb_get_msg_cmd()
3810 chan = msg->rsp[3] & 0xf; in handle_ipmb_get_msg_cmd()
3825 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in handle_ipmb_get_msg_cmd()
3826 msg->data[1] = IPMI_SEND_MSG_CMD; in handle_ipmb_get_msg_cmd()
3827 msg->data[2] = msg->rsp[3]; in handle_ipmb_get_msg_cmd()
3828 msg->data[3] = msg->rsp[6]; in handle_ipmb_get_msg_cmd()
3829 msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3); in handle_ipmb_get_msg_cmd()
3830 msg->data[5] = ipmb_checksum(&msg->data[3], 2); in handle_ipmb_get_msg_cmd()
3831 msg->data[6] = intf->addrinfo[msg->rsp[3] & 0xf].address; in handle_ipmb_get_msg_cmd()
3833 msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3); in handle_ipmb_get_msg_cmd()
3834 msg->data[8] = msg->rsp[8]; /* cmd */ in handle_ipmb_get_msg_cmd()
3835 msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE; in handle_ipmb_get_msg_cmd()
3836 msg->data[10] = ipmb_checksum(&msg->data[6], 4); in handle_ipmb_get_msg_cmd()
3837 msg->data_size = 11; in handle_ipmb_get_msg_cmd()
3839 pr_debug("Invalid command: %*ph\n", msg->data_size, msg->data); in handle_ipmb_get_msg_cmd()
3843 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_get_msg_cmd()
3866 ipmb_addr->slave_addr = msg->rsp[6]; in handle_ipmb_get_msg_cmd()
3867 ipmb_addr->lun = msg->rsp[7] & 3; in handle_ipmb_get_msg_cmd()
3868 ipmb_addr->channel = msg->rsp[3] & 0xf; in handle_ipmb_get_msg_cmd()
3876 recv_msg->msgid = msg->rsp[7] >> 2; in handle_ipmb_get_msg_cmd()
3877 recv_msg->msg.netfn = msg->rsp[4] >> 2; in handle_ipmb_get_msg_cmd()
3878 recv_msg->msg.cmd = msg->rsp[8]; in handle_ipmb_get_msg_cmd()
3879 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_get_msg_cmd()
3885 recv_msg->msg.data_len = msg->rsp_size - 10; in handle_ipmb_get_msg_cmd()
3886 memcpy(recv_msg->msg_data, &msg->rsp[9], in handle_ipmb_get_msg_cmd()
3887 msg->rsp_size - 10); in handle_ipmb_get_msg_cmd()
3899 struct ipmi_smi_msg *msg) in handle_ipmb_direct_rcv_cmd() argument
3906 unsigned char netfn = msg->rsp[0] >> 2; in handle_ipmb_direct_rcv_cmd()
3907 unsigned char cmd = msg->rsp[3]; in handle_ipmb_direct_rcv_cmd()
3923 msg->data[0] = (netfn + 1) << 2; in handle_ipmb_direct_rcv_cmd()
3924 msg->data[0] |= msg->rsp[2] & 0x3; /* rqLUN */ in handle_ipmb_direct_rcv_cmd()
3925 msg->data[1] = msg->rsp[1]; /* Addr */ in handle_ipmb_direct_rcv_cmd()
3926 msg->data[2] = msg->rsp[2] & ~0x3; /* rqSeq */ in handle_ipmb_direct_rcv_cmd()
3927 msg->data[2] |= msg->rsp[0] & 0x3; /* rsLUN */ in handle_ipmb_direct_rcv_cmd()
3928 msg->data[3] = cmd; in handle_ipmb_direct_rcv_cmd()
3929 msg->data[4] = IPMI_INVALID_CMD_COMPLETION_CODE; in handle_ipmb_direct_rcv_cmd()
3930 msg->data_size = 5; in handle_ipmb_direct_rcv_cmd()
3934 smi_send(intf, intf->handlers, msg, 0); in handle_ipmb_direct_rcv_cmd()
3958 daddr->slave_addr = msg->rsp[1]; in handle_ipmb_direct_rcv_cmd()
3959 daddr->rs_lun = msg->rsp[0] & 3; in handle_ipmb_direct_rcv_cmd()
3960 daddr->rq_lun = msg->rsp[2] & 3; in handle_ipmb_direct_rcv_cmd()
3968 recv_msg->msgid = (msg->rsp[2] >> 2); in handle_ipmb_direct_rcv_cmd()
3969 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_ipmb_direct_rcv_cmd()
3970 recv_msg->msg.cmd = msg->rsp[3]; in handle_ipmb_direct_rcv_cmd()
3971 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_direct_rcv_cmd()
3973 recv_msg->msg.data_len = msg->rsp_size - 4; in handle_ipmb_direct_rcv_cmd()
3974 memcpy(recv_msg->msg_data, msg->rsp + 4, in handle_ipmb_direct_rcv_cmd()
3975 msg->rsp_size - 4); in handle_ipmb_direct_rcv_cmd()
3987 struct ipmi_smi_msg *msg) in handle_ipmb_direct_rcv_rsp() argument
3992 recv_msg = (struct ipmi_recv_msg *) msg->user_data; in handle_ipmb_direct_rcv_rsp()
4000 recv_msg->msgid = msg->msgid; in handle_ipmb_direct_rcv_rsp()
4004 daddr->slave_addr = msg->rsp[1]; in handle_ipmb_direct_rcv_rsp()
4005 daddr->rq_lun = msg->rsp[0] & 3; in handle_ipmb_direct_rcv_rsp()
4006 daddr->rs_lun = msg->rsp[2] & 3; in handle_ipmb_direct_rcv_rsp()
4007 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_ipmb_direct_rcv_rsp()
4008 recv_msg->msg.cmd = msg->rsp[3]; in handle_ipmb_direct_rcv_rsp()
4009 memcpy(recv_msg->msg_data, &msg->rsp[4], msg->rsp_size - 4); in handle_ipmb_direct_rcv_rsp()
4010 recv_msg->msg.data = recv_msg->msg_data; in handle_ipmb_direct_rcv_rsp()
4011 recv_msg->msg.data_len = msg->rsp_size - 4; in handle_ipmb_direct_rcv_rsp()
4018 struct ipmi_smi_msg *msg) in handle_lan_get_msg_rsp() argument
4028 if (msg->rsp_size < 13) { in handle_lan_get_msg_rsp()
4034 if (msg->rsp[2] != 0) { in handle_lan_get_msg_rsp()
4040 lan_addr.session_handle = msg->rsp[4]; in handle_lan_get_msg_rsp()
4041 lan_addr.remote_SWID = msg->rsp[8]; in handle_lan_get_msg_rsp()
4042 lan_addr.local_SWID = msg->rsp[5]; in handle_lan_get_msg_rsp()
4043 lan_addr.channel = msg->rsp[3] & 0x0f; in handle_lan_get_msg_rsp()
4044 lan_addr.privilege = msg->rsp[3] >> 4; in handle_lan_get_msg_rsp()
4045 lan_addr.lun = msg->rsp[9] & 3; in handle_lan_get_msg_rsp()
4052 msg->rsp[9] >> 2, in handle_lan_get_msg_rsp()
4053 msg->rsp[3] & 0x0f, in handle_lan_get_msg_rsp()
4054 msg->rsp[10], in handle_lan_get_msg_rsp()
4055 (msg->rsp[6] >> 2) & (~1), in handle_lan_get_msg_rsp()
4066 memcpy(recv_msg->msg_data, &msg->rsp[11], msg->rsp_size - 11); in handle_lan_get_msg_rsp()
4072 recv_msg->msg.netfn = msg->rsp[6] >> 2; in handle_lan_get_msg_rsp()
4073 recv_msg->msg.data = recv_msg->msg_data; in handle_lan_get_msg_rsp()
4074 recv_msg->msg.data_len = msg->rsp_size - 12; in handle_lan_get_msg_rsp()
4085 struct ipmi_smi_msg *msg) in handle_lan_get_msg_cmd() argument
4096 if (msg->rsp_size < 12) { in handle_lan_get_msg_cmd()
4102 if (msg->rsp[2] != 0) { in handle_lan_get_msg_cmd()
4107 netfn = msg->rsp[6] >> 2; in handle_lan_get_msg_cmd()
4108 cmd = msg->rsp[10]; in handle_lan_get_msg_cmd()
4109 chan = msg->rsp[3] & 0xf; in handle_lan_get_msg_cmd()
4142 lan_addr->session_handle = msg->rsp[4]; in handle_lan_get_msg_cmd()
4143 lan_addr->remote_SWID = msg->rsp[8]; in handle_lan_get_msg_cmd()
4144 lan_addr->local_SWID = msg->rsp[5]; in handle_lan_get_msg_cmd()
4145 lan_addr->lun = msg->rsp[9] & 3; in handle_lan_get_msg_cmd()
4146 lan_addr->channel = msg->rsp[3] & 0xf; in handle_lan_get_msg_cmd()
4147 lan_addr->privilege = msg->rsp[3] >> 4; in handle_lan_get_msg_cmd()
4155 recv_msg->msgid = msg->rsp[9] >> 2; in handle_lan_get_msg_cmd()
4156 recv_msg->msg.netfn = msg->rsp[6] >> 2; in handle_lan_get_msg_cmd()
4157 recv_msg->msg.cmd = msg->rsp[10]; in handle_lan_get_msg_cmd()
4158 recv_msg->msg.data = recv_msg->msg_data; in handle_lan_get_msg_cmd()
4164 recv_msg->msg.data_len = msg->rsp_size - 12; in handle_lan_get_msg_cmd()
4165 memcpy(recv_msg->msg_data, &msg->rsp[11], in handle_lan_get_msg_cmd()
4166 msg->rsp_size - 12); in handle_lan_get_msg_cmd()
4184 struct ipmi_smi_msg *msg) in handle_oem_get_msg_cmd() argument
4199 if (msg->rsp_size < 4) { in handle_oem_get_msg_cmd()
4205 if (msg->rsp[2] != 0) { in handle_oem_get_msg_cmd()
4214 netfn = msg->rsp[0] >> 2; in handle_oem_get_msg_cmd()
4215 cmd = msg->rsp[1]; in handle_oem_get_msg_cmd()
4216 chan = msg->rsp[3] & 0xf; in handle_oem_get_msg_cmd()
4258 smi_addr->lun = msg->rsp[0] & 3; in handle_oem_get_msg_cmd()
4263 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_oem_get_msg_cmd()
4264 recv_msg->msg.cmd = msg->rsp[1]; in handle_oem_get_msg_cmd()
4265 recv_msg->msg.data = recv_msg->msg_data; in handle_oem_get_msg_cmd()
4271 recv_msg->msg.data_len = msg->rsp_size - 4; in handle_oem_get_msg_cmd()
4272 memcpy(recv_msg->msg_data, &msg->rsp[4], in handle_oem_get_msg_cmd()
4273 msg->rsp_size - 4); in handle_oem_get_msg_cmd()
4285 struct ipmi_smi_msg *msg) in copy_event_into_recv_msg() argument
4293 smi_addr->lun = msg->rsp[0] & 3; in copy_event_into_recv_msg()
4295 recv_msg->msg.netfn = msg->rsp[0] >> 2; in copy_event_into_recv_msg()
4296 recv_msg->msg.cmd = msg->rsp[1]; in copy_event_into_recv_msg()
4297 memcpy(recv_msg->msg_data, &msg->rsp[3], msg->rsp_size - 3); in copy_event_into_recv_msg()
4298 recv_msg->msg.data = recv_msg->msg_data; in copy_event_into_recv_msg()
4299 recv_msg->msg.data_len = msg->rsp_size - 3; in copy_event_into_recv_msg()
4303 struct ipmi_smi_msg *msg) in handle_read_event_rsp() argument
4311 if (msg->rsp_size < 19) { in handle_read_event_rsp()
4317 if (msg->rsp[2] != 0) { in handle_read_event_rsp()
4356 copy_event_into_recv_msg(recv_msg, msg); in handle_read_event_rsp()
4385 copy_event_into_recv_msg(recv_msg, msg); in handle_read_event_rsp()
4405 struct ipmi_smi_msg *msg) in handle_bmc_rsp() argument
4410 recv_msg = (struct ipmi_recv_msg *) msg->user_data; in handle_bmc_rsp()
4418 recv_msg->msgid = msg->msgid; in handle_bmc_rsp()
4423 smi_addr->lun = msg->rsp[0] & 3; in handle_bmc_rsp()
4424 recv_msg->msg.netfn = msg->rsp[0] >> 2; in handle_bmc_rsp()
4425 recv_msg->msg.cmd = msg->rsp[1]; in handle_bmc_rsp()
4426 memcpy(recv_msg->msg_data, &msg->rsp[2], msg->rsp_size - 2); in handle_bmc_rsp()
4427 recv_msg->msg.data = recv_msg->msg_data; in handle_bmc_rsp()
4428 recv_msg->msg.data_len = msg->rsp_size - 2; in handle_bmc_rsp()
4440 struct ipmi_smi_msg *msg) in handle_one_recv_msg() argument
4445 bool is_cmd = !((msg->rsp[0] >> 2) & 1); in handle_one_recv_msg()
4447 pr_debug("Recv: %*ph\n", msg->rsp_size, msg->rsp); in handle_one_recv_msg()
4449 if (msg->rsp_size < 2) { in handle_one_recv_msg()
4453 (msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size); in handle_one_recv_msg()
4457 msg->rsp[0] = msg->data[0] | (1 << 2); in handle_one_recv_msg()
4458 msg->rsp[1] = msg->data[1]; in handle_one_recv_msg()
4459 msg->rsp[2] = IPMI_ERR_UNSPECIFIED; in handle_one_recv_msg()
4460 msg->rsp_size = 3; in handle_one_recv_msg()
4461 } else if (msg->type == IPMI_SMI_MSG_TYPE_IPMB_DIRECT) { in handle_one_recv_msg()
4463 if (is_cmd && (msg->rsp_size < 4)) { in handle_one_recv_msg()
4467 if (!is_cmd && (msg->rsp_size < 5)) { in handle_one_recv_msg()
4470 msg->rsp[0] = msg->data[0] & 0xfc; /* NetFN */ in handle_one_recv_msg()
4471 msg->rsp[0] |= (1 << 2); /* Make it a response */ in handle_one_recv_msg()
4472 msg->rsp[0] |= msg->data[2] & 3; /* rqLUN */ in handle_one_recv_msg()
4473 msg->rsp[1] = msg->data[1]; /* Addr */ in handle_one_recv_msg()
4474 msg->rsp[2] = msg->data[2] & 0xfc; /* rqSeq */ in handle_one_recv_msg()
4475 msg->rsp[2] |= msg->data[0] & 0x3; /* rsLUN */ in handle_one_recv_msg()
4476 msg->rsp[3] = msg->data[3]; /* Cmd */ in handle_one_recv_msg()
4477 msg->rsp[4] = IPMI_ERR_UNSPECIFIED; in handle_one_recv_msg()
4478 msg->rsp_size = 5; in handle_one_recv_msg()
4480 } else if ((msg->data_size >= 2) in handle_one_recv_msg()
4481 && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) in handle_one_recv_msg()
4482 && (msg->data[1] == IPMI_SEND_MSG_CMD) in handle_one_recv_msg()
4483 && (msg->user_data == NULL)) { in handle_one_recv_msg()
4501 if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) in handle_one_recv_msg()
4502 && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) in handle_one_recv_msg()
4503 && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) in handle_one_recv_msg()
4504 && (msg->rsp[2] != IPMI_BUS_ERR) in handle_one_recv_msg()
4505 && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) { in handle_one_recv_msg()
4506 int ch = msg->rsp[3] & 0xf; 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()
4521 } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1)) in handle_one_recv_msg()
4522 || (msg->rsp[1] != msg->data[1])) { in handle_one_recv_msg()
4529 (msg->data[0] >> 2) | 1, msg->data[1], in handle_one_recv_msg()
4530 msg->rsp[0] >> 2, msg->rsp[1]); in handle_one_recv_msg()
4535 if (msg->type == IPMI_SMI_MSG_TYPE_IPMB_DIRECT) { in handle_one_recv_msg()
4536 if ((msg->data[0] >> 2) & 1) { in handle_one_recv_msg()
4539 cc = msg->rsp[4]; 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()
4546 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) in handle_one_recv_msg()
4547 && (msg->rsp[1] == IPMI_SEND_MSG_CMD) in handle_one_recv_msg()
4548 && (msg->user_data != NULL)) { in handle_one_recv_msg()
4555 chan = msg->data[2] & 0x0f; in handle_one_recv_msg()
4559 cc = msg->rsp[2]; in handle_one_recv_msg()
4562 recv_msg = msg->user_data; in handle_one_recv_msg()
4569 recv_msg->msg.data = recv_msg->msg_data; in handle_one_recv_msg()
4571 recv_msg->msg.data_len = 1; in handle_one_recv_msg()
4573 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) in handle_one_recv_msg()
4574 && (msg->rsp[1] == IPMI_GET_MSG_CMD)) { in handle_one_recv_msg()
4578 chan = msg->rsp[3] & 0xf; in handle_one_recv_msg()
4600 if (msg->rsp[4] & 0x04) { 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()
4617 if (msg->rsp[6] & 0x04) { 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()
4648 } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) in handle_one_recv_msg()
4649 && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD)) { 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()
4769 struct ipmi_smi_msg *msg) in ipmi_smi_msg_received() argument
4780 list_add_tail(&msg->link, &intf->waiting_rcv_msgs); in ipmi_smi_msg_received()
4791 if (msg == intf->curr_msg) in ipmi_smi_msg_received()
4825 memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len); in smi_from_recv_msg()
4826 smi_msg->data_size = recv_msg->msg.data_len; in smi_from_recv_msg()
4840 struct ipmi_recv_msg *msg; in check_msg_timeout() local
4858 msg = ent->recv_msg; in check_msg_timeout()
4859 list_add_tail(&msg->link, timeouts); in check_msg_timeout()
4919 struct ipmi_recv_msg *msg, *msg2; in ipmi_timeout_handler() local
4951 list_for_each_entry_safe(msg, msg2, &timeouts, link) in ipmi_timeout_handler()
4952 deliver_err_response(intf, msg, IPMI_TIMEOUT_COMPLETION_CODE); in ipmi_timeout_handler()
5034 static void free_smi_msg(struct ipmi_smi_msg *msg) in free_smi_msg() argument
5039 kfree(msg); in free_smi_msg()
5056 static void free_recv_msg(struct ipmi_recv_msg *msg) in free_recv_msg() argument
5061 kfree(msg); in free_recv_msg()
5077 void ipmi_free_recv_msg(struct ipmi_recv_msg *msg) in ipmi_free_recv_msg() argument
5079 if (msg->user && !oops_in_progress) in ipmi_free_recv_msg()
5080 kref_put(&msg->user->refcount, free_user); in ipmi_free_recv_msg()
5081 msg->done(msg); in ipmi_free_recv_msg()
5087 static void dummy_smi_done_handler(struct ipmi_smi_msg *msg) in dummy_smi_done_handler() argument
5092 static void dummy_recv_done_handler(struct ipmi_recv_msg *msg) in dummy_recv_done_handler() argument
5102 struct kernel_ipmi_msg *msg) in ipmi_panic_request_and_wait() argument
5115 msg, in ipmi_panic_request_and_wait()
5133 struct ipmi_recv_msg *msg) in event_receiver_fetcher() argument
5135 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in event_receiver_fetcher()
5136 && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE) in event_receiver_fetcher()
5137 && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD) in event_receiver_fetcher()
5138 && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) { in event_receiver_fetcher()
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
5147 if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) in device_id_fetcher()
5148 && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) in device_id_fetcher()
5149 && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD) in device_id_fetcher()
5150 && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) { in device_id_fetcher()
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()
5162 struct kernel_ipmi_msg msg; in send_panic_events() local
5179 msg.netfn = 0x04; /* Sensor or Event. */ in send_panic_events()
5180 msg.cmd = 2; /* Platform event command. */ in send_panic_events()
5181 msg.data = data; in send_panic_events()
5182 msg.data_len = 8; in send_panic_events()
5200 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5231 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_panic_events()
5232 msg.cmd = IPMI_GET_DEVICE_ID_CMD; in send_panic_events()
5233 msg.data = NULL; in send_panic_events()
5234 msg.data_len = 0; in send_panic_events()
5236 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5240 msg.netfn = IPMI_NETFN_SENSOR_EVENT_REQUEST; in send_panic_events()
5241 msg.cmd = IPMI_GET_EVENT_RECEIVER_CMD; in send_panic_events()
5242 msg.data = NULL; in send_panic_events()
5243 msg.data_len = 0; in send_panic_events()
5245 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5279 msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */ in send_panic_events()
5280 msg.cmd = IPMI_ADD_SEL_ENTRY_CMD; in send_panic_events()
5281 msg.data = data; in send_panic_events()
5282 msg.data_len = 16; in send_panic_events()
5302 ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()