• Home
  • Raw
  • Download

Lines Matching +full:ssif +full:- +full:bmc

1 // SPDX-License-Identifier: GPL-2.0+
6 * compliant device. Called SSIF by the IPMI spec.
12 * non-blocking I2C interface, add support for multi-part
20 * This file holds the "policy" for the interface to the SSIF state
22 * and drives the real SSIF state machine.
63 /* ssif_debug is a bit-field
64 * SSIF_DEBUG_MSG - commands and their responses
65 * SSIF_DEBUG_STATES - message states
66 * SSIF_DEBUG_TIMING - Measure times between events in the driver
103 /* FIXME - add watchdog stuff. */
106 #define IS_SSIF_IDLE(ssif) ((ssif)->ssif_state == SSIF_IDLE \ argument
107 && (ssif)->curr_msg == NULL)
251 * Used to perform timer operations when run-to-completion
281 /* Info from SSIF cmd */
298 #define ssif_inc_stat(ssif, stat) \ argument
299 atomic_inc(&(ssif)->stats[SSIF_STAT_ ## stat])
300 #define ssif_get_stat(ssif, stat) \ argument
301 ((unsigned int) atomic_read(&(ssif)->stats[SSIF_STAT_ ## stat]))
315 __acquires(&ssif_info->lock) in ipmi_ssif_lock_cond()
317 spin_lock_irqsave(&ssif_info->lock, *flags); in ipmi_ssif_lock_cond()
323 __releases(&ssif_info->lock) in ipmi_ssif_unlock_cond()
325 spin_unlock_irqrestore(&ssif_info->lock, *flags); in ipmi_ssif_unlock_cond()
331 if (msg->rsp_size < 0) { in deliver_recv_msg()
333 dev_err(&ssif_info->client->dev, in deliver_recv_msg()
335 __func__, msg->rsp_size); in deliver_recv_msg()
337 ipmi_smi_msg_received(ssif_info->intf, msg); in deliver_recv_msg()
347 msg->rsp[0] = msg->data[0] | 4; in return_hosed_msg()
348 msg->rsp[1] = msg->data[1]; in return_hosed_msg()
349 msg->rsp[2] = 0xFF; /* Unknown error. */ in return_hosed_msg()
350 msg->rsp_size = 3; in return_hosed_msg()
365 ssif_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; in start_clear_flags()
366 ssif_info->ssif_state = SSIF_CLEARING_FLAGS; in start_clear_flags()
369 /* Make sure the watchdog pre-timeout flag is not set at startup. */ in start_clear_flags()
376 ssif_info->ssif_state = SSIF_IDLE; in start_clear_flags()
384 ssif_info->req_flags = false; in start_flag_fetch()
385 ssif_info->ssif_state = SSIF_GETTING_FLAGS; in start_flag_fetch()
391 ssif_info->ssif_state = SSIF_IDLE; in start_flag_fetch()
397 if (start_send(ssif_info, msg->data, msg->data_size) != 0) { in check_start_send()
401 ssif_info->curr_msg = NULL; in check_start_send()
402 ssif_info->ssif_state = SSIF_IDLE; in check_start_send()
412 ssif_info->req_events = false; in start_event_fetch()
416 ssif_info->ssif_state = SSIF_IDLE; in start_event_fetch()
421 ssif_info->curr_msg = msg; in start_event_fetch()
422 ssif_info->ssif_state = SSIF_GETTING_EVENTS; in start_event_fetch()
425 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in start_event_fetch()
426 msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD; in start_event_fetch()
427 msg->data_size = 2; in start_event_fetch()
439 ssif_info->ssif_state = SSIF_IDLE; in start_recv_msg_fetch()
444 ssif_info->curr_msg = msg; in start_recv_msg_fetch()
445 ssif_info->ssif_state = SSIF_GETTING_MESSAGES; in start_recv_msg_fetch()
448 msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); in start_recv_msg_fetch()
449 msg->data[1] = IPMI_GET_MSG_CMD; in start_recv_msg_fetch()
450 msg->data_size = 2; in start_recv_msg_fetch()
463 if (ssif_info->msg_flags & WDT_PRE_TIMEOUT_INT) { in handle_flags()
464 /* Watchdog pre-timeout */ in handle_flags()
467 ipmi_smi_watchdog_pretimeout(ssif_info->intf); in handle_flags()
468 } else if (ssif_info->msg_flags & RECEIVE_MSG_AVAIL) in handle_flags()
471 else if (ssif_info->msg_flags & EVENT_MSG_BUFFER_FULL) in handle_flags()
475 ssif_info->ssif_state = SSIF_IDLE; in handle_flags()
489 &ssif_info->wake_thread); in ipmi_ssif_thread()
490 if (ssif_info->stopping) in ipmi_ssif_thread()
492 if (result == -ERESTARTSYS) in ipmi_ssif_thread()
494 init_completion(&ssif_info->wake_thread); in ipmi_ssif_thread()
496 if (ssif_info->i2c_read_write == I2C_SMBUS_WRITE) { in ipmi_ssif_thread()
498 ssif_info->client, ssif_info->i2c_command, in ipmi_ssif_thread()
499 ssif_info->i2c_data[0], in ipmi_ssif_thread()
500 ssif_info->i2c_data + 1); in ipmi_ssif_thread()
501 ssif_info->done_handler(ssif_info, result, NULL, 0); in ipmi_ssif_thread()
504 ssif_info->client, ssif_info->i2c_command, in ipmi_ssif_thread()
505 ssif_info->i2c_data); in ipmi_ssif_thread()
507 ssif_info->done_handler(ssif_info, result, in ipmi_ssif_thread()
510 ssif_info->done_handler(ssif_info, 0, in ipmi_ssif_thread()
511 ssif_info->i2c_data, in ipmi_ssif_thread()
524 ssif_info->done_handler = handler; in ssif_i2c_send()
526 ssif_info->i2c_read_write = read_write; in ssif_i2c_send()
527 ssif_info->i2c_command = command; in ssif_i2c_send()
528 ssif_info->i2c_data = data; in ssif_i2c_send()
529 ssif_info->i2c_size = size; in ssif_i2c_send()
530 complete(&ssif_info->wake_thread); in ssif_i2c_send()
539 ssif_info->rtc_us_timer = 0; in start_get()
540 ssif_info->multi_pos = 0; in start_get()
544 ssif_info->recv, I2C_SMBUS_BLOCK_DATA); in start_get()
555 if (ssif_info->stopping) in retry_timeout()
559 resend = ssif_info->do_resend; in retry_timeout()
560 ssif_info->do_resend = false; in retry_timeout()
561 waiting = ssif_info->waiting_alert; in retry_timeout()
562 ssif_info->waiting_alert = false; in retry_timeout()
578 if (ssif_info->stopping) in watch_timeout()
582 if (ssif_info->watch_timeout) { in watch_timeout()
583 mod_timer(&ssif_info->watch_timer, in watch_timeout()
584 jiffies + ssif_info->watch_timeout); in watch_timeout()
589 ssif_info->req_flags = true; in watch_timeout()
607 if (ssif_info->waiting_alert) { in ssif_alert()
608 ssif_info->waiting_alert = false; in ssif_alert()
609 del_timer(&ssif_info->retry_timer); in ssif_alert()
611 } else if (ssif_info->curr_msg) { in ssif_alert()
612 ssif_info->got_alert = true; in ssif_alert()
626 * We are single-threaded here, so no need for a lock until we in msg_done_handler()
631 ssif_info->retries_left--; in msg_done_handler()
632 if (ssif_info->retries_left > 0) { in msg_done_handler()
636 ssif_info->waiting_alert = true; in msg_done_handler()
637 ssif_info->rtc_us_timer = SSIF_MSG_USEC; in msg_done_handler()
638 if (!ssif_info->stopping) in msg_done_handler()
639 mod_timer(&ssif_info->retry_timer, in msg_done_handler()
647 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
648 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
654 if ((len > 1) && (ssif_info->multi_pos == 0) in msg_done_handler()
656 /* Start of multi-part read. Start the next transaction. */ in msg_done_handler()
661 /* Remove the multi-part read marker. */ in msg_done_handler()
662 len -= 2; in msg_done_handler()
665 ssif_info->data[i] = data[i]; in msg_done_handler()
666 ssif_info->multi_len = len; in msg_done_handler()
667 ssif_info->multi_pos = 1; in msg_done_handler()
671 ssif_info->recv, I2C_SMBUS_BLOCK_DATA); in msg_done_handler()
673 } else if (ssif_info->multi_pos) { in msg_done_handler()
674 /* Middle of multi-part read. Start the next transaction. */ in msg_done_handler()
679 result = -EIO; in msg_done_handler()
680 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
681 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
688 len--; in msg_done_handler()
693 result = -EIO; in msg_done_handler()
694 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
695 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
701 if (ssif_info->multi_len + len > IPMI_MAX_MSG_LENGTH) { in msg_done_handler()
703 result = -E2BIG; in msg_done_handler()
704 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
705 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
712 ssif_info->data[i + ssif_info->multi_len] = data[i]; in msg_done_handler()
713 ssif_info->multi_len += len; in msg_done_handler()
716 len = ssif_info->multi_len; in msg_done_handler()
717 data = ssif_info->data; in msg_done_handler()
718 } else if (blocknum + 1 != ssif_info->multi_pos) { in msg_done_handler()
724 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
725 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
727 ssif_info->multi_pos - 1, blocknum); in msg_done_handler()
728 result = -EIO; in msg_done_handler()
732 ssif_info->multi_pos++; in msg_done_handler()
737 ssif_info->recv, in msg_done_handler()
751 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
752 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
754 ssif_info->ssif_state, result); in msg_done_handler()
757 msg = ssif_info->curr_msg; in msg_done_handler()
762 memcpy(msg->rsp, data, len); in msg_done_handler()
766 msg->rsp_size = len; in msg_done_handler()
767 ssif_info->curr_msg = NULL; in msg_done_handler()
770 switch (ssif_info->ssif_state) { in msg_done_handler()
783 /* We got the flags from the SSIF, now handle them. */ in msg_done_handler()
789 ssif_info->ssif_state = SSIF_IDLE; in msg_done_handler()
791 dev_warn(&ssif_info->client->dev, in msg_done_handler()
799 ssif_info->ssif_state = SSIF_IDLE; in msg_done_handler()
801 dev_warn(&ssif_info->client->dev, in msg_done_handler()
806 ssif_info->msg_flags = data[3]; in msg_done_handler()
815 dev_warn(&ssif_info->client->dev, in msg_done_handler()
820 dev_warn(&ssif_info->client->dev, in msg_done_handler()
824 ssif_info->ssif_state = SSIF_IDLE; in msg_done_handler()
831 dev_warn(&ssif_info->client->dev, in msg_done_handler()
837 if ((result < 0) || (len < 3) || (msg->rsp[2] != 0)) { in msg_done_handler()
839 msg->done(msg); in msg_done_handler()
842 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
844 } else if (msg->rsp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 in msg_done_handler()
845 || msg->rsp[1] != IPMI_READ_EVENT_MSG_BUFFER_CMD) { in msg_done_handler()
846 dev_warn(&ssif_info->client->dev, in msg_done_handler()
848 msg->rsp[0], msg->rsp[1]); in msg_done_handler()
849 msg->done(msg); in msg_done_handler()
851 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
863 dev_warn(&ssif_info->client->dev, in msg_done_handler()
869 if ((result < 0) || (len < 3) || (msg->rsp[2] != 0)) { in msg_done_handler()
871 msg->done(msg); in msg_done_handler()
874 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
876 } else if (msg->rsp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 in msg_done_handler()
877 || msg->rsp[1] != IPMI_GET_MSG_CMD) { in msg_done_handler()
878 dev_warn(&ssif_info->client->dev, in msg_done_handler()
880 msg->rsp[0], msg->rsp[1]); in msg_done_handler()
881 msg->done(msg); in msg_done_handler()
884 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
895 dev_warn(&ssif_info->client->dev, in msg_done_handler()
897 ssif_info->ssif_state); in msg_done_handler()
902 if (IS_SSIF_IDLE(ssif_info) && !ssif_info->stopping) { in msg_done_handler()
903 if (ssif_info->req_events) in msg_done_handler()
905 else if (ssif_info->req_flags) in msg_done_handler()
912 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
913 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
914 "DONE 2: state = %d.\n", ssif_info->ssif_state); in msg_done_handler()
920 /* We are single-threaded here, so no need for a lock. */ in msg_written_handler()
922 ssif_info->retries_left--; in msg_written_handler()
923 if (ssif_info->retries_left > 0) { in msg_written_handler()
928 ssif_info->do_resend = true; in msg_written_handler()
929 mod_timer(&ssif_info->retry_timer, in msg_written_handler()
936 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
937 dev_dbg(&ssif_info->client->dev, in msg_written_handler()
940 msg_done_handler(ssif_info, -EIO, NULL, 0); in msg_written_handler()
944 if (ssif_info->multi_data) { in msg_written_handler()
946 * In the middle of a multi-data write. See the comment in msg_written_handler()
956 left = ssif_info->multi_len - ssif_info->multi_pos; in msg_written_handler()
961 ssif_info->multi_data[ssif_info->multi_pos] = to_write; in msg_written_handler()
962 data_to_send = ssif_info->multi_data + ssif_info->multi_pos; in msg_written_handler()
963 ssif_info->multi_pos += to_write; in msg_written_handler()
965 if (ssif_info->cmd8_works) { in msg_written_handler()
968 ssif_info->multi_data = NULL; in msg_written_handler()
971 ssif_info->multi_data = NULL; in msg_written_handler()
985 if (ssif_info->got_alert) { in msg_written_handler()
987 ssif_info->got_alert = false; in msg_written_handler()
992 ssif_info->waiting_alert = true; in msg_written_handler()
993 ssif_info->retries_left = SSIF_RECV_RETRIES; in msg_written_handler()
994 ssif_info->rtc_us_timer = SSIF_MSG_PART_USEC; in msg_written_handler()
995 if (!ssif_info->stopping) in msg_written_handler()
996 mod_timer(&ssif_info->retry_timer, in msg_written_handler()
1007 ssif_info->got_alert = false; in start_resend()
1009 if (ssif_info->data_len > 32) { in start_resend()
1011 ssif_info->multi_data = ssif_info->data; in start_resend()
1012 ssif_info->multi_len = ssif_info->data_len; in start_resend()
1018 ssif_info->multi_pos = 32; in start_resend()
1019 ssif_info->data[0] = 32; in start_resend()
1021 ssif_info->multi_data = NULL; in start_resend()
1023 ssif_info->data[0] = ssif_info->data_len; in start_resend()
1027 command, ssif_info->data, I2C_SMBUS_BLOCK_DATA); in start_resend()
1035 return -E2BIG; in start_send()
1036 if (len > ssif_info->max_xmit_msg_size) in start_send()
1037 return -E2BIG; in start_send()
1039 ssif_info->retries_left = SSIF_SEND_RETRIES; in start_send()
1040 memcpy(ssif_info->data + 1, data, len); in start_send()
1041 ssif_info->data_len = len; in start_send()
1058 if (!ssif_info->waiting_msg) { in start_next_msg()
1059 ssif_info->curr_msg = NULL; in start_next_msg()
1064 ssif_info->curr_msg = ssif_info->waiting_msg; in start_next_msg()
1065 ssif_info->waiting_msg = NULL; in start_next_msg()
1068 ssif_info->curr_msg->data, in start_next_msg()
1069 ssif_info->curr_msg->data_size); in start_next_msg()
1071 msg = ssif_info->curr_msg; in start_next_msg()
1072 ssif_info->curr_msg = NULL; in start_next_msg()
1086 BUG_ON(ssif_info->waiting_msg); in sender()
1087 ssif_info->waiting_msg = msg; in sender()
1092 if (ssif_info->ssif_debug & SSIF_DEBUG_TIMING) { in sender()
1096 dev_dbg(&ssif_info->client->dev, in sender()
1098 msg->data[0], msg->data[1], in sender()
1107 data->addr_src = ssif_info->addr_source; in get_smi_info()
1108 data->dev = &ssif_info->client->dev; in get_smi_info()
1109 data->addr_info = ssif_info->addr_info; in get_smi_info()
1110 get_device(data->dev); in get_smi_info()
1123 if (!ssif_info->has_event_buffer) in request_events()
1127 ssif_info->req_events = true; in request_events()
1147 if (timeout != ssif_info->watch_timeout) { in ssif_set_need_watch()
1148 ssif_info->watch_timeout = timeout; in ssif_set_need_watch()
1149 if (ssif_info->watch_timeout) in ssif_set_need_watch()
1150 mod_timer(&ssif_info->watch_timer, in ssif_set_need_watch()
1151 jiffies + ssif_info->watch_timeout); in ssif_set_need_watch()
1161 ssif_info->intf = intf; in ssif_start_processing()
1176 MODULE_PARM_DESC(adapter_name, "The string name of the I2C device that has the BMC. By default all…
1228 return snprintf(buf, 10, "ssif\n"); in ipmi_type_show()
1272 device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group); in shutdown_ssif()
1273 dev_set_drvdata(&ssif_info->client->dev, NULL); in shutdown_ssif()
1276 while (ssif_info->ssif_state != SSIF_IDLE) in shutdown_ssif()
1279 ssif_info->stopping = true; in shutdown_ssif()
1280 del_timer_sync(&ssif_info->watch_timer); in shutdown_ssif()
1281 del_timer_sync(&ssif_info->retry_timer); in shutdown_ssif()
1282 if (ssif_info->thread) { in shutdown_ssif()
1283 complete(&ssif_info->wake_thread); in shutdown_ssif()
1284 kthread_stop(ssif_info->thread); in shutdown_ssif()
1300 ipmi_unregister_smi(ssif_info->intf); in ssif_remove()
1303 if (addr_info->client == client) { in ssif_remove()
1304 addr_info->client = NULL; in ssif_remove()
1316 int ret = -ENODEV, retry_cnt = SSIF_RECV_RETRIES; in read_response()
1324 retry_cnt--; in read_response()
1342 retry_cnt--; in do_cmd()
1347 return -ENODEV; in do_cmd()
1356 ret = -EINVAL; in do_cmd()
1358 ret = -E2BIG; in do_cmd()
1377 return -ENOMEM; in ssif_detect()
1384 rv = -ENODEV; in ssif_detect()
1386 strlcpy(info->type, DEVICE_NAME, I2C_NAME_SIZE); in ssif_detect()
1401 return -1; in strcmp_nospace()
1416 if (info->binfo.addr == addr) { in ssif_info_find()
1417 if (info->addr_src == SI_SMBIOS && !info->adapter_name) in ssif_info_find()
1418 info->adapter_name = kstrdup(adapter_name, in ssif_info_find()
1421 if (info->adapter_name || adapter_name) { in ssif_info_find()
1422 if (!info->adapter_name != !adapter_name) { in ssif_info_find()
1427 strcmp_nospace(info->adapter_name, in ssif_info_find()
1454 ssif_info->addr_source = SI_ACPI; in check_acpi()
1455 ssif_info->addr_info.acpi_info.acpi_handle = acpi_handle; in check_acpi()
1469 i2c_adapter_id(client->adapter), in find_slave_address()
1470 client->addr); in find_slave_address()
1486 retry_cnt--; in start_multipart_test()
1491 …dev_err(&client->dev, "Could not write multi-part start, though the BMC said it could handle it. … in start_multipart_test()
1502 …dev_err(&client->dev, "Could not write multi-part middle, though the BMC said it could handle it. … in start_multipart_test()
1517 if (ssif_info->max_xmit_msg_size <= 32) in test_multipart_messages()
1520 do_middle = ssif_info->max_xmit_msg_size > 63; in test_multipart_messages()
1528 * multi-part messages. Per what the specification says, it in test_multipart_messages()
1542 * implement cmd=8, they use a zero-length end transaction, in test_multipart_messages()
1546 * If it does, then we use that. If not, it tests zero- in test_multipart_messages()
1548 * we only allow 63-byte transactions max. in test_multipart_messages()
1564 ssif_info->cmd8_works = true; in test_multipart_messages()
1570 dev_err(&client->dev, "Second multipart test failed.\n"); in test_multipart_messages()
1580 /* Zero-size end parts work, use those. */ in test_multipart_messages()
1584 if (ssif_info->max_xmit_msg_size > 63) in test_multipart_messages()
1585 ssif_info->max_xmit_msg_size = 63; in test_multipart_messages()
1589 ssif_info->max_xmit_msg_size = 32; in test_multipart_messages()
1603 ipmi_unregister_smi(ssif_info->intf); in ssif_remove_dup()
1613 return -ENOMEM; in ssif_add_infos()
1614 info->addr_src = SI_ACPI; in ssif_add_infos()
1615 info->client = client; in ssif_add_infos()
1616 info->adapter_name = kstrdup(client->adapter->name, GFP_KERNEL); in ssif_add_infos()
1617 if (!info->adapter_name) { in ssif_add_infos()
1619 return -ENOMEM; in ssif_add_infos()
1622 info->binfo.addr = client->addr; in ssif_add_infos()
1623 list_add_tail(&info->link, &ssif_infos); in ssif_add_infos()
1638 if (!info->client) in ssif_check_and_remove()
1640 if (!strcmp(info->adapter_name, client->adapter->name) && in ssif_check_and_remove()
1641 info->binfo.addr == client->addr) { in ssif_check_and_remove()
1642 if (info->addr_src == SI_ACPI) in ssif_check_and_remove()
1643 return -EEXIST; in ssif_check_and_remove()
1645 if (ssif_info->addr_source == SI_ACPI && in ssif_check_and_remove()
1646 info->addr_src == SI_SMBIOS) { in ssif_check_and_remove()
1647 dev_info(&client->dev, in ssif_check_and_remove()
1648 "Removing %s-specified SSIF interface in favor of ACPI\n", in ssif_check_and_remove()
1649 ipmi_addr_src_to_str(info->addr_src)); in ssif_check_and_remove()
1650 ssif_remove_dup(info->client); in ssif_check_and_remove()
1673 return -ENOMEM; in ssif_probe()
1680 return -ENOMEM; in ssif_probe()
1683 if (!check_acpi(ssif_info, &client->dev)) { in ssif_probe()
1684 addr_info = ssif_info_find(client->addr, client->adapter->name, in ssif_probe()
1688 ssif_info->addr_source = SI_HOTMOD; in ssif_probe()
1690 ssif_info->addr_source = addr_info->addr_src; in ssif_probe()
1691 ssif_info->ssif_debug = addr_info->debug; in ssif_probe()
1692 ssif_info->addr_info = addr_info->addr_info; in ssif_probe()
1693 addr_info->client = client; in ssif_probe()
1694 slave_addr = addr_info->slave_addr; in ssif_probe()
1698 ssif_info->client = client; in ssif_probe()
1703 if (!rv && ssif_info->addr_source == SI_ACPI) { in ssif_probe()
1706 dev_err(&client->dev, "Out of memory!, exiting ..\n"); in ssif_probe()
1710 dev_err(&client->dev, "Not probing, Interface already present\n"); in ssif_probe()
1716 dev_info(&client->dev, in ssif_probe()
1717 "Trying %s-specified SSIF interface at i2c address 0x%x, adapter %s, slave address 0x%x\n", in ssif_probe()
1718 ipmi_addr_src_to_str(ssif_info->addr_source), in ssif_probe()
1719 client->addr, client->adapter->name, slave_addr); in ssif_probe()
1724 msg[2] = 0; /* SSIF */ in ssif_probe()
1729 dev_dbg(&ssif_info->client->dev, in ssif_probe()
1730 "SSIF info too short: %d\n", len); in ssif_probe()
1734 /* Got a good SSIF response, handle it. */ in ssif_probe()
1735 ssif_info->max_xmit_msg_size = resp[5]; in ssif_probe()
1736 ssif_info->max_recv_msg_size = resp[6]; in ssif_probe()
1737 ssif_info->multi_support = (resp[4] >> 6) & 0x3; in ssif_probe()
1738 ssif_info->supports_pec = (resp[4] >> 3) & 0x1; in ssif_probe()
1741 switch (ssif_info->multi_support) { in ssif_probe()
1743 if (ssif_info->max_xmit_msg_size > 32) in ssif_probe()
1744 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1745 if (ssif_info->max_recv_msg_size > 32) in ssif_probe()
1746 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1750 if (ssif_info->max_xmit_msg_size > 63) in ssif_probe()
1751 ssif_info->max_xmit_msg_size = 63; in ssif_probe()
1752 if (ssif_info->max_recv_msg_size > 62) in ssif_probe()
1753 ssif_info->max_recv_msg_size = 62; in ssif_probe()
1766 /* Assume no multi-part or PEC support */ in ssif_probe()
1767 dev_info(&ssif_info->client->dev, in ssif_probe()
1768 …"Error fetching SSIF: %d %d %2.2x, your system probably doesn't support this command so using defa… in ssif_probe()
1771 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1772 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1773 ssif_info->multi_support = SSIF_NO_MULTI; in ssif_probe()
1774 ssif_info->supports_pec = 0; in ssif_probe()
1785 dev_warn(&ssif_info->client->dev, in ssif_probe()
1794 dev_warn(&ssif_info->client->dev, in ssif_probe()
1801 ssif_info->global_enables = resp[3]; in ssif_probe()
1804 ssif_info->has_event_buffer = true; in ssif_probe()
1811 msg[2] = ssif_info->global_enables | IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1814 dev_warn(&ssif_info->client->dev, in ssif_probe()
1823 ssif_info->has_event_buffer = true; in ssif_probe()
1824 ssif_info->global_enables |= IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1833 msg[2] = ssif_info->global_enables | IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1836 dev_warn(&ssif_info->client->dev, in ssif_probe()
1845 ssif_info->supports_alert = true; in ssif_probe()
1846 ssif_info->global_enables |= IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1851 dev_dbg(&ssif_info->client->dev, in ssif_probe()
1853 __func__, client->addr); in ssif_probe()
1856 spin_lock_init(&ssif_info->lock); in ssif_probe()
1857 ssif_info->ssif_state = SSIF_IDLE; in ssif_probe()
1858 timer_setup(&ssif_info->retry_timer, retry_timeout, 0); in ssif_probe()
1859 timer_setup(&ssif_info->watch_timer, watch_timeout, 0); in ssif_probe()
1862 atomic_set(&ssif_info->stats[i], 0); in ssif_probe()
1864 if (ssif_info->supports_pec) in ssif_probe()
1865 ssif_info->client->flags |= I2C_CLIENT_PEC; in ssif_probe()
1867 ssif_info->handlers.owner = THIS_MODULE; in ssif_probe()
1868 ssif_info->handlers.start_processing = ssif_start_processing; in ssif_probe()
1869 ssif_info->handlers.shutdown = shutdown_ssif; in ssif_probe()
1870 ssif_info->handlers.get_smi_info = get_smi_info; in ssif_probe()
1871 ssif_info->handlers.sender = sender; in ssif_probe()
1872 ssif_info->handlers.request_events = request_events; in ssif_probe()
1873 ssif_info->handlers.set_need_watch = ssif_set_need_watch; in ssif_probe()
1878 thread_num = ((i2c_adapter_id(ssif_info->client->adapter) in ssif_probe()
1880 ssif_info->client->addr); in ssif_probe()
1881 init_completion(&ssif_info->wake_thread); in ssif_probe()
1882 ssif_info->thread = kthread_run(ipmi_ssif_thread, ssif_info, in ssif_probe()
1884 if (IS_ERR(ssif_info->thread)) { in ssif_probe()
1885 rv = PTR_ERR(ssif_info->thread); in ssif_probe()
1886 dev_notice(&ssif_info->client->dev, in ssif_probe()
1893 dev_set_drvdata(&ssif_info->client->dev, ssif_info); in ssif_probe()
1894 rv = device_add_group(&ssif_info->client->dev, in ssif_probe()
1897 dev_err(&ssif_info->client->dev, in ssif_probe()
1903 rv = ipmi_register_smi(&ssif_info->handlers, in ssif_probe()
1905 &ssif_info->client->dev, in ssif_probe()
1908 dev_err(&ssif_info->client->dev, in ssif_probe()
1916 addr_info->client = NULL; in ssif_probe()
1918 dev_err(&ssif_info->client->dev, in ssif_probe()
1919 "Unable to start IPMI SSIF: %d\n", rv); in ssif_probe()
1928 device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group); in ssif_probe()
1929 dev_set_drvdata(&ssif_info->client->dev, NULL); in ssif_probe()
1943 rv = -EEXIST; in new_ssif_client()
1949 rv = -ENOMEM; in new_ssif_client()
1954 addr_info->adapter_name = kstrdup(adapter_name, GFP_KERNEL); in new_ssif_client()
1955 if (!addr_info->adapter_name) { in new_ssif_client()
1957 rv = -ENOMEM; in new_ssif_client()
1962 strncpy(addr_info->binfo.type, DEVICE_NAME, in new_ssif_client()
1963 sizeof(addr_info->binfo.type)); in new_ssif_client()
1964 addr_info->binfo.addr = addr; in new_ssif_client()
1965 addr_info->binfo.platform_data = addr_info; in new_ssif_client()
1966 addr_info->debug = debug; in new_ssif_client()
1967 addr_info->slave_addr = slave_addr; in new_ssif_client()
1968 addr_info->addr_src = addr_src; in new_ssif_client()
1969 addr_info->dev = dev; in new_ssif_client()
1974 list_add_tail(&addr_info->link, &ssif_infos); in new_ssif_client()
1989 list_del(&info->link); in free_ssif_clients()
1990 kfree(info->adapter_name); in free_ssif_clients()
2011 unsigned short addr = info->binfo.addr; in ssif_address_list()
2043 return -ENODEV; in dmi_ipmi_probe()
2045 rv = device_property_read_u16(&pdev->dev, "i2c-addr", &i2c_addr); in dmi_ipmi_probe()
2047 dev_warn(&pdev->dev, "No i2c-addr property\n"); in dmi_ipmi_probe()
2048 return -ENODEV; in dmi_ipmi_probe()
2051 rv = device_property_read_u8(&pdev->dev, "slave-addr", &slave_addr); in dmi_ipmi_probe()
2056 slave_addr, SI_SMBIOS, &pdev->dev); in dmi_ipmi_probe()
2061 return -ENODEV; in dmi_ipmi_probe()
2090 struct ssif_addr_info *addr_info = dev_get_drvdata(&dev->dev); in ssif_platform_remove()
2096 list_del(&addr_info->link); in ssif_platform_remove()
2103 { "dmi-ipmi-ssif", 0 },
2124 pr_info("IPMI SSIF Interface driver\n"); in init_ipmi_ssif()
2176 MODULE_ALIAS("platform:dmi-ipmi-ssif");