Lines Matching refs:ssif_info

190 struct ssif_info;
192 typedef void (*ssif_i2c_done)(struct ssif_info *ssif_info, int result,
195 struct ssif_info { struct
298 static void return_hosed_msg(struct ssif_info *ssif_info, argument
300 static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags);
301 static int start_send(struct ssif_info *ssif_info,
305 static unsigned long *ipmi_ssif_lock_cond(struct ssif_info *ssif_info, in ipmi_ssif_lock_cond() argument
308 spin_lock_irqsave(&ssif_info->lock, *flags); in ipmi_ssif_lock_cond()
312 static void ipmi_ssif_unlock_cond(struct ssif_info *ssif_info, in ipmi_ssif_unlock_cond() argument
315 spin_unlock_irqrestore(&ssif_info->lock, *flags); in ipmi_ssif_unlock_cond()
318 static void deliver_recv_msg(struct ssif_info *ssif_info, in deliver_recv_msg() argument
321 ipmi_smi_t intf = ssif_info->intf; in deliver_recv_msg()
326 return_hosed_msg(ssif_info, msg); in deliver_recv_msg()
335 static void return_hosed_msg(struct ssif_info *ssif_info, in return_hosed_msg() argument
338 ssif_inc_stat(ssif_info, hosed); in return_hosed_msg()
346 deliver_recv_msg(ssif_info, msg); in return_hosed_msg()
355 static void start_clear_flags(struct ssif_info *ssif_info, unsigned long *flags) in start_clear_flags() argument
359 ssif_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; in start_clear_flags()
360 ssif_info->ssif_state = SSIF_CLEARING_FLAGS; in start_clear_flags()
361 ipmi_ssif_unlock_cond(ssif_info, flags); in start_clear_flags()
368 if (start_send(ssif_info, msg, 3) != 0) { in start_clear_flags()
370 ssif_info->ssif_state = SSIF_NORMAL; in start_clear_flags()
374 static void start_flag_fetch(struct ssif_info *ssif_info, unsigned long *flags) in start_flag_fetch() argument
378 ssif_info->req_flags = false; in start_flag_fetch()
379 ssif_info->ssif_state = SSIF_GETTING_FLAGS; in start_flag_fetch()
380 ipmi_ssif_unlock_cond(ssif_info, flags); in start_flag_fetch()
384 if (start_send(ssif_info, mb, 2) != 0) in start_flag_fetch()
385 ssif_info->ssif_state = SSIF_NORMAL; in start_flag_fetch()
388 static void check_start_send(struct ssif_info *ssif_info, unsigned long *flags, in check_start_send() argument
391 if (start_send(ssif_info, msg->data, msg->data_size) != 0) { in check_start_send()
394 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in check_start_send()
395 ssif_info->curr_msg = NULL; in check_start_send()
396 ssif_info->ssif_state = SSIF_NORMAL; in check_start_send()
397 ipmi_ssif_unlock_cond(ssif_info, flags); in check_start_send()
402 static void start_event_fetch(struct ssif_info *ssif_info, unsigned long *flags) in start_event_fetch() argument
406 ssif_info->req_events = false; in start_event_fetch()
410 ssif_info->ssif_state = SSIF_NORMAL; in start_event_fetch()
414 ssif_info->curr_msg = msg; in start_event_fetch()
415 ssif_info->ssif_state = SSIF_GETTING_EVENTS; in start_event_fetch()
416 ipmi_ssif_unlock_cond(ssif_info, flags); in start_event_fetch()
422 check_start_send(ssif_info, flags, msg); in start_event_fetch()
425 static void start_recv_msg_fetch(struct ssif_info *ssif_info, in start_recv_msg_fetch() argument
432 ssif_info->ssif_state = SSIF_NORMAL; in start_recv_msg_fetch()
436 ssif_info->curr_msg = msg; in start_recv_msg_fetch()
437 ssif_info->ssif_state = SSIF_GETTING_MESSAGES; in start_recv_msg_fetch()
438 ipmi_ssif_unlock_cond(ssif_info, flags); in start_recv_msg_fetch()
444 check_start_send(ssif_info, flags, msg); in start_recv_msg_fetch()
453 static void handle_flags(struct ssif_info *ssif_info, unsigned long *flags) in handle_flags() argument
455 if (ssif_info->msg_flags & WDT_PRE_TIMEOUT_INT) { in handle_flags()
456 ipmi_smi_t intf = ssif_info->intf; in handle_flags()
458 ssif_inc_stat(ssif_info, watchdog_pretimeouts); in handle_flags()
459 start_clear_flags(ssif_info, flags); in handle_flags()
462 } else if (ssif_info->msg_flags & RECEIVE_MSG_AVAIL) in handle_flags()
464 start_recv_msg_fetch(ssif_info, flags); in handle_flags()
465 else if (ssif_info->msg_flags & EVENT_MSG_BUFFER_FULL) in handle_flags()
467 start_event_fetch(ssif_info, flags); in handle_flags()
469 ssif_info->ssif_state = SSIF_NORMAL; in handle_flags()
470 ipmi_ssif_unlock_cond(ssif_info, flags); in handle_flags()
476 struct ssif_info *ssif_info = data; in ipmi_ssif_thread() local
483 &ssif_info->wake_thread); in ipmi_ssif_thread()
484 if (ssif_info->stopping) in ipmi_ssif_thread()
488 init_completion(&ssif_info->wake_thread); in ipmi_ssif_thread()
490 if (ssif_info->i2c_read_write == I2C_SMBUS_WRITE) { in ipmi_ssif_thread()
492 ssif_info->client, ssif_info->i2c_command, in ipmi_ssif_thread()
493 ssif_info->i2c_data[0], in ipmi_ssif_thread()
494 ssif_info->i2c_data + 1); in ipmi_ssif_thread()
495 ssif_info->done_handler(ssif_info, result, NULL, 0); in ipmi_ssif_thread()
498 ssif_info->client, ssif_info->i2c_command, in ipmi_ssif_thread()
499 ssif_info->i2c_data); in ipmi_ssif_thread()
501 ssif_info->done_handler(ssif_info, result, in ipmi_ssif_thread()
504 ssif_info->done_handler(ssif_info, 0, in ipmi_ssif_thread()
505 ssif_info->i2c_data, in ipmi_ssif_thread()
513 static int ssif_i2c_send(struct ssif_info *ssif_info, in ssif_i2c_send() argument
518 ssif_info->done_handler = handler; in ssif_i2c_send()
520 ssif_info->i2c_read_write = read_write; in ssif_i2c_send()
521 ssif_info->i2c_command = command; in ssif_i2c_send()
522 ssif_info->i2c_data = data; in ssif_i2c_send()
523 ssif_info->i2c_size = size; in ssif_i2c_send()
524 complete(&ssif_info->wake_thread); in ssif_i2c_send()
529 static void msg_done_handler(struct ssif_info *ssif_info, int result,
532 static void start_get(struct ssif_info *ssif_info) in start_get() argument
536 ssif_info->rtc_us_timer = 0; in start_get()
537 ssif_info->multi_pos = 0; in start_get()
539 rv = ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ, in start_get()
541 ssif_info->recv, I2C_SMBUS_BLOCK_DATA); in start_get()
544 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in start_get()
547 msg_done_handler(ssif_info, -EIO, NULL, 0); in start_get()
553 struct ssif_info *ssif_info = (void *) data; in retry_timeout() local
557 if (ssif_info->stopping) in retry_timeout()
560 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in retry_timeout()
561 waiting = ssif_info->waiting_alert; in retry_timeout()
562 ssif_info->waiting_alert = false; in retry_timeout()
563 ipmi_ssif_unlock_cond(ssif_info, flags); in retry_timeout()
566 start_get(ssif_info); in retry_timeout()
572 struct ssif_info *ssif_info = i2c_get_clientdata(client); in ssif_alert() local
576 ssif_inc_stat(ssif_info, alerts); in ssif_alert()
578 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in ssif_alert()
579 if (ssif_info->waiting_alert) { in ssif_alert()
580 ssif_info->waiting_alert = false; in ssif_alert()
581 del_timer(&ssif_info->retry_timer); in ssif_alert()
583 } else if (ssif_info->curr_msg) { in ssif_alert()
584 ssif_info->got_alert = true; in ssif_alert()
586 ipmi_ssif_unlock_cond(ssif_info, flags); in ssif_alert()
588 start_get(ssif_info); in ssif_alert()
591 static int start_resend(struct ssif_info *ssif_info);
593 static void msg_done_handler(struct ssif_info *ssif_info, int result, in msg_done_handler() argument
606 ssif_info->retries_left--; in msg_done_handler()
607 if (ssif_info->retries_left > 0) { in msg_done_handler()
608 ssif_inc_stat(ssif_info, receive_retries); in msg_done_handler()
610 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
611 ssif_info->waiting_alert = true; in msg_done_handler()
612 ssif_info->rtc_us_timer = SSIF_MSG_USEC; in msg_done_handler()
613 mod_timer(&ssif_info->retry_timer, in msg_done_handler()
615 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
619 ssif_inc_stat(ssif_info, receive_errors); in msg_done_handler()
621 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
627 if ((len > 1) && (ssif_info->multi_pos == 0) in msg_done_handler()
632 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
637 ssif_info->data[i] = data[i+2]; in msg_done_handler()
638 ssif_info->multi_len = len; in msg_done_handler()
639 ssif_info->multi_pos = 1; in msg_done_handler()
641 rv = ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ, in msg_done_handler()
643 ssif_info->recv, I2C_SMBUS_BLOCK_DATA); in msg_done_handler()
645 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
651 } else if (ssif_info->multi_pos) { in msg_done_handler()
658 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
666 if (ssif_info->multi_len + len - 1 > IPMI_MAX_MSG_LENGTH) { in msg_done_handler()
669 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
678 ssif_info->data[i + ssif_info->multi_len] = data[i + 1]; in msg_done_handler()
679 ssif_info->multi_len += len; in msg_done_handler()
682 len = ssif_info->multi_len; in msg_done_handler()
683 data = ssif_info->data; in msg_done_handler()
684 } else if (blocknum + 1 != ssif_info->multi_pos) { in msg_done_handler()
692 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
694 ssif_info->multi_pos++; in msg_done_handler()
696 rv = ssif_i2c_send(ssif_info, msg_done_handler, in msg_done_handler()
699 ssif_info->recv, in msg_done_handler()
702 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
713 ssif_inc_stat(ssif_info, receive_errors); in msg_done_handler()
715 ssif_inc_stat(ssif_info, received_messages); in msg_done_handler()
716 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
721 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
723 ssif_info->ssif_state, result); in msg_done_handler()
725 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
726 msg = ssif_info->curr_msg; in msg_done_handler()
732 ssif_info->curr_msg = NULL; in msg_done_handler()
735 switch (ssif_info->ssif_state) { in msg_done_handler()
737 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
742 return_hosed_msg(ssif_info, msg); in msg_done_handler()
744 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
754 ssif_info->ssif_state = SSIF_NORMAL; in msg_done_handler()
755 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
763 ssif_inc_stat(ssif_info, flag_fetches); in msg_done_handler()
764 ssif_info->msg_flags = data[3]; in msg_done_handler()
765 handle_flags(ssif_info, flags); in msg_done_handler()
780 ssif_info->ssif_state = SSIF_NORMAL; in msg_done_handler()
781 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
790 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
791 handle_flags(ssif_info, flags); in msg_done_handler()
798 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
799 handle_flags(ssif_info, flags); in msg_done_handler()
801 handle_flags(ssif_info, flags); in msg_done_handler()
802 ssif_inc_stat(ssif_info, events); in msg_done_handler()
803 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
813 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
814 handle_flags(ssif_info, flags); in msg_done_handler()
822 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
823 handle_flags(ssif_info, flags); in msg_done_handler()
825 ssif_inc_stat(ssif_info, incoming_messages); in msg_done_handler()
826 handle_flags(ssif_info, flags); in msg_done_handler()
827 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
832 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
833 if (SSIF_IDLE(ssif_info) && !ssif_info->stopping) { in msg_done_handler()
834 if (ssif_info->req_events) in msg_done_handler()
835 start_event_fetch(ssif_info, flags); in msg_done_handler()
836 else if (ssif_info->req_flags) in msg_done_handler()
837 start_flag_fetch(ssif_info, flags); in msg_done_handler()
839 start_next_msg(ssif_info, flags); in msg_done_handler()
841 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
843 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
844 pr_info(PFX "DONE 2: state = %d.\n", ssif_info->ssif_state); in msg_done_handler()
847 static void msg_written_handler(struct ssif_info *ssif_info, int result, in msg_written_handler() argument
854 ssif_info->retries_left--; in msg_written_handler()
855 if (ssif_info->retries_left > 0) { in msg_written_handler()
856 if (!start_resend(ssif_info)) { in msg_written_handler()
857 ssif_inc_stat(ssif_info, send_retries); in msg_written_handler()
861 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
863 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
866 msg_done_handler(ssif_info, -EIO, NULL, 0); in msg_written_handler()
870 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
876 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
879 msg_done_handler(ssif_info, result, NULL, 0); in msg_written_handler()
883 if (ssif_info->multi_data) { in msg_written_handler()
891 ssif_inc_stat(ssif_info, sent_messages_parts); in msg_written_handler()
893 left = ssif_info->multi_len - ssif_info->multi_pos; in msg_written_handler()
897 ssif_info->multi_data[ssif_info->multi_pos] = left; in msg_written_handler()
898 ssif_info->multi_pos += left; in msg_written_handler()
906 ssif_info->multi_data = NULL; in msg_written_handler()
908 rv = ssif_i2c_send(ssif_info, msg_written_handler, in msg_written_handler()
911 ssif_info->multi_data + ssif_info->multi_pos, in msg_written_handler()
915 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
917 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
919 msg_done_handler(ssif_info, -EIO, NULL, 0); in msg_written_handler()
925 ssif_inc_stat(ssif_info, sent_messages); in msg_written_handler()
926 ssif_inc_stat(ssif_info, sent_messages_parts); in msg_written_handler()
928 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_written_handler()
929 got_alert = ssif_info->got_alert; in msg_written_handler()
931 ssif_info->got_alert = false; in msg_written_handler()
932 ssif_info->waiting_alert = false; in msg_written_handler()
936 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_written_handler()
938 retry_timeout((unsigned long) ssif_info); in msg_written_handler()
941 ssif_info->waiting_alert = true; in msg_written_handler()
942 ssif_info->retries_left = SSIF_RECV_RETRIES; in msg_written_handler()
943 ssif_info->rtc_us_timer = SSIF_MSG_PART_USEC; in msg_written_handler()
944 mod_timer(&ssif_info->retry_timer, in msg_written_handler()
946 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_written_handler()
951 static int start_resend(struct ssif_info *ssif_info) in start_resend() argument
956 ssif_info->got_alert = false; in start_resend()
958 if (ssif_info->data_len > 32) { in start_resend()
960 ssif_info->multi_data = ssif_info->data; in start_resend()
961 ssif_info->multi_len = ssif_info->data_len; in start_resend()
967 ssif_info->multi_pos = 32; in start_resend()
968 ssif_info->data[0] = 32; in start_resend()
970 ssif_info->multi_data = NULL; in start_resend()
972 ssif_info->data[0] = ssif_info->data_len; in start_resend()
975 rv = ssif_i2c_send(ssif_info, msg_written_handler, I2C_SMBUS_WRITE, in start_resend()
976 command, ssif_info->data, I2C_SMBUS_BLOCK_DATA); in start_resend()
977 if (rv && (ssif_info->ssif_debug & SSIF_DEBUG_MSG)) in start_resend()
982 static int start_send(struct ssif_info *ssif_info, in start_send() argument
988 if (len > ssif_info->max_xmit_msg_size) in start_send()
991 ssif_info->retries_left = SSIF_SEND_RETRIES; in start_send()
992 memcpy(ssif_info->data + 1, data, len); in start_send()
993 ssif_info->data_len = len; in start_send()
994 return start_resend(ssif_info); in start_send()
998 static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags) in start_next_msg() argument
1004 if (!SSIF_IDLE(ssif_info)) { in start_next_msg()
1005 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1009 if (!ssif_info->waiting_msg) { in start_next_msg()
1010 ssif_info->curr_msg = NULL; in start_next_msg()
1011 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1015 ssif_info->curr_msg = ssif_info->waiting_msg; in start_next_msg()
1016 ssif_info->waiting_msg = NULL; in start_next_msg()
1017 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1018 rv = start_send(ssif_info, in start_next_msg()
1019 ssif_info->curr_msg->data, in start_next_msg()
1020 ssif_info->curr_msg->data_size); in start_next_msg()
1022 msg = ssif_info->curr_msg; in start_next_msg()
1023 ssif_info->curr_msg = NULL; in start_next_msg()
1024 return_hosed_msg(ssif_info, msg); in start_next_msg()
1025 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in start_next_msg()
1034 struct ssif_info *ssif_info = (struct ssif_info *) send_info; in sender() local
1037 BUG_ON(ssif_info->waiting_msg); in sender()
1038 ssif_info->waiting_msg = msg; in sender()
1040 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in sender()
1041 start_next_msg(ssif_info, flags); in sender()
1043 if (ssif_info->ssif_debug & SSIF_DEBUG_TIMING) { in sender()
1055 struct ssif_info *ssif_info = send_info; in get_smi_info() local
1057 data->addr_src = ssif_info->addr_source; in get_smi_info()
1058 data->dev = &ssif_info->client->dev; in get_smi_info()
1059 data->addr_info = ssif_info->addr_info; in get_smi_info()
1071 struct ssif_info *ssif_info = (struct ssif_info *) send_info; in request_events() local
1074 if (!ssif_info->has_event_buffer) in request_events()
1077 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in request_events()
1083 ssif_info->req_events = true; in request_events()
1084 if (SSIF_IDLE(ssif_info)) in request_events()
1085 start_flag_fetch(ssif_info, flags); in request_events()
1087 ssif_info->req_flags = true; in request_events()
1088 ipmi_ssif_unlock_cond(ssif_info, flags); in request_events()
1094 struct ssif_info *ssif_info = send_info; in inc_usecount() local
1096 if (!i2c_get_adapter(ssif_info->client->adapter->nr)) in inc_usecount()
1099 i2c_use_client(ssif_info->client); in inc_usecount()
1105 struct ssif_info *ssif_info = send_info; in dec_usecount() local
1107 i2c_release_client(ssif_info->client); in dec_usecount()
1108 i2c_put_adapter(ssif_info->client->adapter); in dec_usecount()
1114 struct ssif_info *ssif_info = send_info; in ssif_start_processing() local
1116 ssif_info->intf = intf; in ssif_start_processing()
1170 struct ssif_info *ssif_info = i2c_get_clientdata(client); in ssif_remove() local
1173 if (!ssif_info) in ssif_remove()
1180 rv = ipmi_unregister_smi(ssif_info->intf); in ssif_remove()
1185 ssif_info->intf = NULL; in ssif_remove()
1188 while (ssif_info->ssif_state != SSIF_NORMAL) in ssif_remove()
1191 ssif_info->stopping = true; in ssif_remove()
1192 del_timer_sync(&ssif_info->retry_timer); in ssif_remove()
1193 if (ssif_info->thread) { in ssif_remove()
1194 complete(&ssif_info->wake_thread); in ssif_remove()
1195 kthread_stop(ssif_info->thread); in ssif_remove()
1202 kfree(ssif_info); in ssif_remove()
1294 struct ssif_info *ssif_info = m->private; in smi_stats_proc_show() local
1297 ssif_get_stat(ssif_info, sent_messages)); in smi_stats_proc_show()
1299 ssif_get_stat(ssif_info, sent_messages_parts)); in smi_stats_proc_show()
1301 ssif_get_stat(ssif_info, send_retries)); in smi_stats_proc_show()
1303 ssif_get_stat(ssif_info, send_errors)); in smi_stats_proc_show()
1305 ssif_get_stat(ssif_info, received_messages)); in smi_stats_proc_show()
1307 ssif_get_stat(ssif_info, received_message_parts)); in smi_stats_proc_show()
1309 ssif_get_stat(ssif_info, receive_retries)); in smi_stats_proc_show()
1311 ssif_get_stat(ssif_info, receive_errors)); in smi_stats_proc_show()
1313 ssif_get_stat(ssif_info, flag_fetches)); in smi_stats_proc_show()
1315 ssif_get_stat(ssif_info, hosed)); in smi_stats_proc_show()
1317 ssif_get_stat(ssif_info, events)); in smi_stats_proc_show()
1319 ssif_get_stat(ssif_info, watchdog_pretimeouts)); in smi_stats_proc_show()
1321 ssif_get_stat(ssif_info, alerts)); in smi_stats_proc_show()
1389 static bool check_acpi(struct ssif_info *ssif_info, struct device *dev) in check_acpi() argument
1396 ssif_info->addr_source = SI_ACPI; in check_acpi()
1397 ssif_info->addr_info.acpi_info.acpi_handle = acpi_handle; in check_acpi()
1414 struct ssif_info *ssif_info; in ssif_probe() local
1426 ssif_info = kzalloc(sizeof(*ssif_info), GFP_KERNEL); in ssif_probe()
1427 if (!ssif_info) { in ssif_probe()
1432 if (!check_acpi(ssif_info, &client->dev)) { in ssif_probe()
1437 ssif_info->addr_source = SI_HOTMOD; in ssif_probe()
1439 ssif_info->addr_source = addr_info->addr_src; in ssif_probe()
1440 ssif_info->ssif_debug = addr_info->debug; in ssif_probe()
1441 ssif_info->addr_info = addr_info->addr_info; in ssif_probe()
1447 ipmi_addr_src_to_str(ssif_info->addr_source), in ssif_probe()
1460 rv = ipmi_demangle_device_id(resp, len, &ssif_info->device_id); in ssif_probe()
1464 ssif_info->client = client; in ssif_probe()
1465 i2c_set_clientdata(client, ssif_info); in ssif_probe()
1480 ssif_info->max_xmit_msg_size = resp[5]; in ssif_probe()
1481 ssif_info->max_recv_msg_size = resp[6]; in ssif_probe()
1482 ssif_info->multi_support = (resp[4] >> 6) & 0x3; in ssif_probe()
1483 ssif_info->supports_pec = (resp[4] >> 3) & 0x1; in ssif_probe()
1486 switch (ssif_info->multi_support) { in ssif_probe()
1488 if (ssif_info->max_xmit_msg_size > 32) in ssif_probe()
1489 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1490 if (ssif_info->max_recv_msg_size > 32) in ssif_probe()
1491 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1495 if (ssif_info->max_xmit_msg_size > 63) in ssif_probe()
1496 ssif_info->max_xmit_msg_size = 63; in ssif_probe()
1497 if (ssif_info->max_recv_msg_size > 62) in ssif_probe()
1498 ssif_info->max_recv_msg_size = 62; in ssif_probe()
1520 if (ssif_info->max_xmit_msg_size > 63) in ssif_probe()
1521 ssif_info->max_xmit_msg_size = 63; in ssif_probe()
1534 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1535 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1536 ssif_info->multi_support = SSIF_NO_MULTI; in ssif_probe()
1537 ssif_info->supports_pec = 0; in ssif_probe()
1560 ssif_info->global_enables = resp[3]; in ssif_probe()
1563 ssif_info->has_event_buffer = true; in ssif_probe()
1570 msg[2] = ssif_info->global_enables | IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1581 ssif_info->has_event_buffer = true; in ssif_probe()
1582 ssif_info->global_enables |= IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1587 msg[2] = ssif_info->global_enables | IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1598 ssif_info->supports_alert = true; in ssif_probe()
1599 ssif_info->global_enables |= IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1603 ssif_info->intf_num = atomic_inc_return(&next_intf); in ssif_probe()
1610 spin_lock_init(&ssif_info->lock); in ssif_probe()
1611 ssif_info->ssif_state = SSIF_NORMAL; in ssif_probe()
1612 init_timer(&ssif_info->retry_timer); in ssif_probe()
1613 ssif_info->retry_timer.data = (unsigned long) ssif_info; in ssif_probe()
1614 ssif_info->retry_timer.function = retry_timeout; in ssif_probe()
1617 atomic_set(&ssif_info->stats[i], 0); in ssif_probe()
1619 if (ssif_info->supports_pec) in ssif_probe()
1620 ssif_info->client->flags |= I2C_CLIENT_PEC; in ssif_probe()
1622 ssif_info->handlers.owner = THIS_MODULE; in ssif_probe()
1623 ssif_info->handlers.start_processing = ssif_start_processing; in ssif_probe()
1624 ssif_info->handlers.get_smi_info = get_smi_info; in ssif_probe()
1625 ssif_info->handlers.sender = sender; in ssif_probe()
1626 ssif_info->handlers.request_events = request_events; in ssif_probe()
1627 ssif_info->handlers.inc_usecount = inc_usecount; in ssif_probe()
1628 ssif_info->handlers.dec_usecount = dec_usecount; in ssif_probe()
1633 thread_num = ((ssif_info->client->adapter->nr << 8) | in ssif_probe()
1634 ssif_info->client->addr); in ssif_probe()
1635 init_completion(&ssif_info->wake_thread); in ssif_probe()
1636 ssif_info->thread = kthread_run(ipmi_ssif_thread, ssif_info, in ssif_probe()
1638 if (IS_ERR(ssif_info->thread)) { in ssif_probe()
1639 rv = PTR_ERR(ssif_info->thread); in ssif_probe()
1640 dev_notice(&ssif_info->client->dev, in ssif_probe()
1647 rv = ipmi_register_smi(&ssif_info->handlers, in ssif_probe()
1648 ssif_info, in ssif_probe()
1649 &ssif_info->device_id, in ssif_probe()
1650 &ssif_info->client->dev, in ssif_probe()
1657 rv = ipmi_smi_add_proc_entry(ssif_info->intf, "type", in ssif_probe()
1659 ssif_info); in ssif_probe()
1665 rv = ipmi_smi_add_proc_entry(ssif_info->intf, "ssif_stats", in ssif_probe()
1667 ssif_info); in ssif_probe()
1675 kfree(ssif_info); in ssif_probe()
1680 ipmi_unregister_smi(ssif_info->intf); in ssif_probe()