Lines Matching refs:msg

47 			       struct ipmi_smi_msg *msg);
562 struct ipmi_recv_msg *msg);
681 struct ipmi_recv_msg *msg, *msg2; in free_recv_msg_list() local
683 list_for_each_entry_safe(msg, msg2, q, link) { in free_recv_msg_list()
684 list_del(&msg->link); in free_recv_msg_list()
685 ipmi_free_recv_msg(msg); in free_recv_msg_list()
691 struct ipmi_smi_msg *msg, *msg2; in free_smi_msg_list() local
693 list_for_each_entry_safe(msg, msg2, q, link) { in free_smi_msg_list()
694 list_del(&msg->link); in free_smi_msg_list()
695 ipmi_free_smi_msg(msg); in free_smi_msg_list()
938 static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in deliver_response() argument
942 if (!msg->user) { in deliver_response()
945 intf->null_user_handler(intf, msg); in deliver_response()
950 ipmi_free_recv_msg(msg); in deliver_response()
957 ipmi_free_recv_msg(msg); in deliver_response()
958 atomic_dec(&msg->user->nr_msgs); in deliver_response()
965 list_add_tail(&msg->link, &intf->user_msgs); in deliver_response()
974 struct ipmi_recv_msg *msg) in deliver_local_response() argument
976 if (deliver_response(intf, msg)) in deliver_local_response()
983 struct ipmi_recv_msg *msg, int err) in deliver_err_response() argument
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()
990 deliver_local_response(intf, msg); in deliver_err_response()
1126 struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; in intf_find_seq() local
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()
1131 *recv_msg = msg; in intf_find_seq()
1180 struct ipmi_recv_msg *msg = NULL; in intf_err_seq() local
1196 msg = ent->recv_msg; in intf_err_seq()
1201 if (msg) in intf_err_seq()
1202 deliver_err_response(intf, msg, err); in intf_err_seq()
1331 struct ipmi_recv_msg *msg, *msg2; in _ipmi_destroy_user() local
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()
1387 ipmi_free_recv_msg(msg); in _ipmi_destroy_user()
1586 struct ipmi_recv_msg *msg, *msg2; in ipmi_set_gets_events() local
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()
1618 list_for_each_entry_safe(msg, msg2, &msgs, link) { in ipmi_set_gets_events()
1619 msg->user = user; in ipmi_set_gets_events()
1621 deliver_local_response(intf, msg); in ipmi_set_gets_events()
1768 struct kernel_ipmi_msg *msg, in format_ipmb_msg() argument
1785 smi_msg->data[i+4] = (msg->netfn << 2) | (ipmb_addr->lun & 0x3); 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()
1810 struct kernel_ipmi_msg *msg, in format_lan_msg() argument
1822 smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3); 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()
1880 static bool is_maintenance_mode_cmd(struct kernel_ipmi_msg *msg) in is_maintenance_mode_cmd() argument
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()
1891 struct kernel_ipmi_msg *msg, in i_ipmi_req_sysintf() argument
1899 if (msg->netfn & 1) 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()
1923 if (is_maintenance_mode_cmd(msg)) { in i_ipmi_req_sysintf()
1938 if (msg->data_len + 2 > IPMI_MAX_MSG_LENGTH) { 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()
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()
1958 struct kernel_ipmi_msg *msg, in i_ipmi_req_ipmb() argument
2000 if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_ipmb()
2013 if (recv_msg->msg.netfn & 0x1) { in i_ipmi_req_ipmb()
2019 format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid, in i_ipmi_req_ipmb()
2034 if (is_maintenance_mode_cmd(msg)) in i_ipmi_req_ipmb()
2067 format_ipmb_msg(smi_msg, msg, ipmb_addr, 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()
2099 struct kernel_ipmi_msg *msg, in i_ipmi_req_ipmb_direct() argument
2105 bool is_cmd = !(recv_msg->msg.netfn & 0x1); in i_ipmi_req_ipmb_direct()
2111 if (!is_cmd && msg->data_len < 1) { in i_ipmi_req_ipmb_direct()
2116 if ((msg->data_len + 4) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_ipmb_direct()
2131 smi_msg->data[0] = msg->netfn << 2 | daddr->rs_lun; in i_ipmi_req_ipmb_direct()
2134 smi_msg->data[0] = msg->netfn << 2 | daddr->rq_lun; 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()
2151 struct kernel_ipmi_msg *msg, in i_ipmi_req_lan() argument
2180 if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) { in i_ipmi_req_lan()
2193 if (recv_msg->msg.netfn & 0x1) { in i_ipmi_req_lan()
2199 format_lan_msg(smi_msg, msg, lan_addr, msgid, in i_ipmi_req_lan()
2238 format_lan_msg(smi_msg, msg, lan_addr, 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()
2276 struct kernel_ipmi_msg *msg, in i_ipmi_request() argument
2338 recv_msg->msg = *msg; in i_ipmi_request()
2341 rv = i_ipmi_req_sysintf(intf, addr, msgid, msg, smi_msg, in i_ipmi_request()
2344 rv = i_ipmi_req_ipmb(intf, addr, msgid, msg, smi_msg, recv_msg, in i_ipmi_request()
2348 rv = i_ipmi_req_ipmb_direct(intf, addr, msgid, msg, smi_msg, in i_ipmi_request()
2351 rv = i_ipmi_req_lan(intf, addr, msgid, msg, smi_msg, recv_msg, in i_ipmi_request()
2394 struct kernel_ipmi_msg *msg, in ipmi_request_settime() argument
2416 msg, in ipmi_request_settime()
2433 struct kernel_ipmi_msg *msg, in ipmi_request_supply_msgs() argument
2455 msg, in ipmi_request_supply_msgs()
2470 struct ipmi_recv_msg *msg) in bmc_device_id_handler() argument
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()
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()
2485 msg->msg.data[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()
2495 intf->bmc->cc = msg->msg.data[0]; in bmc_device_id_handler()
2513 struct kernel_ipmi_msg msg; in send_get_device_id_cmd() local
2519 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_get_device_id_cmd()
2520 msg.cmd = IPMI_GET_DEVICE_ID_CMD; in send_get_device_id_cmd()
2521 msg.data = NULL; in send_get_device_id_cmd()
2522 msg.data_len = 0; in send_get_device_id_cmd()
2528 &msg, in send_get_device_id_cmd()
3250 struct kernel_ipmi_msg msg; in send_guid_cmd() local
3257 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_guid_cmd()
3258 msg.cmd = IPMI_GET_DEVICE_GUID_CMD; in send_guid_cmd()
3259 msg.data = NULL; in send_guid_cmd()
3260 msg.data_len = 0; in send_guid_cmd()
3265 &msg, in send_guid_cmd()
3275 static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in guid_handler() argument
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()
3291 if (msg->msg.data_len < UUID_SIZE + 1) { 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()
3333 struct kernel_ipmi_msg msg; in send_channel_info_cmd() local
3341 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_channel_info_cmd()
3342 msg.cmd = IPMI_GET_CHANNEL_INFO_CMD; in send_channel_info_cmd()
3343 msg.data = data; in send_channel_info_cmd()
3344 msg.data_len = 1; in send_channel_info_cmd()
3350 &msg, in send_channel_info_cmd()
3361 channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in channel_handler() argument
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()
3393 if (msg->msg.data_len < 4) { 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()
3682 struct ipmi_smi_msg *msg, in deliver_smi_err_response() argument
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()
3692 rv = handle_one_recv_msg(intf, msg); in deliver_smi_err_response()
3694 ipmi_free_smi_msg(msg); in deliver_smi_err_response()
3701 struct ipmi_smi_msg *msg; in cleanup_smi_msgs() local
3725 msg = list_entry(entry, struct ipmi_smi_msg, link); in cleanup_smi_msgs()
3726 deliver_smi_err_response(intf, msg, IPMI_ERR_UNSPECIFIED); in cleanup_smi_msgs()
3793 struct ipmi_smi_msg *msg) in handle_ipmb_get_msg_rsp() argument
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()
3856 struct ipmi_smi_msg *msg) in handle_ipmb_get_msg_cmd() argument
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()
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()
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()
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()
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()
3965 struct ipmi_smi_msg *msg) in handle_ipmb_direct_rcv_cmd() argument
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()
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()
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()
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()
4048 struct ipmi_smi_msg *msg) in handle_ipmb_direct_rcv_rsp() argument
4053 recv_msg = msg->user_data; in handle_ipmb_direct_rcv_rsp()
4061 recv_msg->msgid = msg->msgid; 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()
4079 struct ipmi_smi_msg *msg) in handle_lan_get_msg_rsp() argument
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()
4146 struct ipmi_smi_msg *msg) in handle_lan_get_msg_cmd() argument
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()
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()
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()
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()
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()
4264 struct ipmi_smi_msg *msg) in handle_oem_get_msg_cmd() argument
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()
4338 smi_addr->lun = msg->rsp[0] & 3; 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()
4365 struct ipmi_smi_msg *msg) in copy_event_into_recv_msg() argument
4373 smi_addr->lun = msg->rsp[0] & 3; 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()
4383 struct ipmi_smi_msg *msg) in handle_read_event_rsp() argument
4390 if (msg->rsp_size < 19) { in handle_read_event_rsp()
4396 if (msg->rsp[2] != 0) { in handle_read_event_rsp()
4437 copy_event_into_recv_msg(recv_msg, msg); in handle_read_event_rsp()
4466 copy_event_into_recv_msg(recv_msg, msg); in handle_read_event_rsp()
4486 struct ipmi_smi_msg *msg) in handle_bmc_rsp() argument
4491 recv_msg = msg->user_data; in handle_bmc_rsp()
4499 recv_msg->msgid = msg->msgid; 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()
4521 struct ipmi_smi_msg *msg) in handle_one_recv_msg() argument
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()
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()
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()
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()
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()
4626 requeue = handle_ipmb_direct_rcv_cmd(intf, msg); in handle_one_recv_msg()
4628 requeue = handle_ipmb_direct_rcv_rsp(intf, msg); 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()
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()
4655 recv_msg->msg.data = recv_msg->msg_data; 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()
4667 chan = msg->rsp[3] & 0xf; in handle_one_recv_msg()
4689 if (msg->rsp[4] & 0x04) { in handle_one_recv_msg()
4694 requeue = handle_ipmb_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4700 requeue = handle_ipmb_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4706 if (msg->rsp[6] & 0x04) { in handle_one_recv_msg()
4711 requeue = handle_lan_get_msg_rsp(intf, msg); in handle_one_recv_msg()
4717 requeue = handle_lan_get_msg_cmd(intf, msg); in handle_one_recv_msg()
4727 requeue = handle_oem_get_msg_cmd(intf, msg); 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()
4743 requeue = handle_read_event_rsp(intf, msg); in handle_one_recv_msg()
4746 requeue = handle_bmc_rsp(intf, msg); in handle_one_recv_msg()
4803 struct ipmi_recv_msg *msg, *msg2; in smi_work() local
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()
4872 ipmi_free_recv_msg(msg); in smi_work()
4875 user->handler->ipmi_recv_hndl(msg, user->handler_data); in smi_work()
4885 struct ipmi_smi_msg *msg) in ipmi_smi_msg_received() argument
4896 list_add_tail(&msg->link, &intf->waiting_rcv_msgs); in ipmi_smi_msg_received()
4907 if (msg == intf->curr_msg) in ipmi_smi_msg_received()
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()
4957 struct ipmi_recv_msg *msg; in check_msg_timeout() local
4975 msg = ent->recv_msg; in check_msg_timeout()
4976 list_add_tail(&msg->link, timeouts); in check_msg_timeout()
5036 struct ipmi_recv_msg *msg, *msg2; in ipmi_timeout_handler() local
5068 list_for_each_entry_safe(msg, msg2, &timeouts, link) in ipmi_timeout_handler()
5069 deliver_err_response(intf, msg, IPMI_TIMEOUT_COMPLETION_CODE); in ipmi_timeout_handler()
5163 static void free_smi_msg(struct ipmi_smi_msg *msg) in free_smi_msg() argument
5168 kfree(msg); in free_smi_msg()
5185 static void free_recv_msg(struct ipmi_recv_msg *msg) in free_recv_msg() argument
5190 kfree(msg); in free_recv_msg()
5206 void ipmi_free_recv_msg(struct ipmi_recv_msg *msg) in ipmi_free_recv_msg() argument
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()
5216 static void dummy_smi_done_handler(struct ipmi_smi_msg *msg) in dummy_smi_done_handler() argument
5221 static void dummy_recv_done_handler(struct ipmi_recv_msg *msg) in dummy_recv_done_handler() argument
5231 struct kernel_ipmi_msg *msg) in _ipmi_panic_request_and_wait() argument
5244 msg, in _ipmi_panic_request_and_wait()
5263 struct kernel_ipmi_msg *msg) in ipmi_panic_request_and_wait() argument
5266 _ipmi_panic_request_and_wait(user->intf, addr, msg); in ipmi_panic_request_and_wait()
5271 struct ipmi_recv_msg *msg) in event_receiver_fetcher() argument
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()
5283 static void device_id_fetcher(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) in device_id_fetcher() argument
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()
5300 struct kernel_ipmi_msg msg; in send_panic_events() local
5317 msg.netfn = 0x04; /* Sensor or Event. */ in send_panic_events()
5318 msg.cmd = 2; /* Platform event command. */ in send_panic_events()
5319 msg.data = data; in send_panic_events()
5320 msg.data_len = 8; in send_panic_events()
5338 _ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5369 msg.netfn = IPMI_NETFN_APP_REQUEST; in send_panic_events()
5370 msg.cmd = IPMI_GET_DEVICE_ID_CMD; in send_panic_events()
5371 msg.data = NULL; in send_panic_events()
5372 msg.data_len = 0; in send_panic_events()
5374 _ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5378 msg.netfn = IPMI_NETFN_SENSOR_EVENT_REQUEST; in send_panic_events()
5379 msg.cmd = IPMI_GET_EVENT_RECEIVER_CMD; in send_panic_events()
5380 msg.data = NULL; in send_panic_events()
5381 msg.data_len = 0; in send_panic_events()
5383 _ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()
5417 msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */ in send_panic_events()
5418 msg.cmd = IPMI_ADD_SEL_ENTRY_CMD; in send_panic_events()
5419 msg.data = data; in send_panic_events()
5420 msg.data_len = 16; in send_panic_events()
5435 _ipmi_panic_request_and_wait(intf, &addr, &msg); in send_panic_events()