Lines Matching refs:ssif_info
192 struct ssif_info;
194 typedef void (*ssif_i2c_done)(struct ssif_info *ssif_info, int result,
197 struct ssif_info { struct
294 static void return_hosed_msg(struct ssif_info *ssif_info, argument
296 static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags);
297 static int start_send(struct ssif_info *ssif_info,
301 static unsigned long *ipmi_ssif_lock_cond(struct ssif_info *ssif_info, in ipmi_ssif_lock_cond() argument
304 spin_lock_irqsave(&ssif_info->lock, *flags); in ipmi_ssif_lock_cond()
308 static void ipmi_ssif_unlock_cond(struct ssif_info *ssif_info, in ipmi_ssif_unlock_cond() argument
311 spin_unlock_irqrestore(&ssif_info->lock, *flags); in ipmi_ssif_unlock_cond()
314 static void deliver_recv_msg(struct ssif_info *ssif_info, in deliver_recv_msg() argument
318 return_hosed_msg(ssif_info, msg); in deliver_recv_msg()
323 ipmi_smi_msg_received(ssif_info->intf, msg); in deliver_recv_msg()
327 static void return_hosed_msg(struct ssif_info *ssif_info, in return_hosed_msg() argument
330 ssif_inc_stat(ssif_info, hosed); in return_hosed_msg()
338 deliver_recv_msg(ssif_info, msg); in return_hosed_msg()
347 static void start_clear_flags(struct ssif_info *ssif_info, unsigned long *flags) in start_clear_flags() argument
351 ssif_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; in start_clear_flags()
352 ssif_info->ssif_state = SSIF_CLEARING_FLAGS; in start_clear_flags()
353 ipmi_ssif_unlock_cond(ssif_info, flags); in start_clear_flags()
360 if (start_send(ssif_info, msg, 3) != 0) { in start_clear_flags()
362 ssif_info->ssif_state = SSIF_NORMAL; in start_clear_flags()
366 static void start_flag_fetch(struct ssif_info *ssif_info, unsigned long *flags) in start_flag_fetch() argument
370 ssif_info->req_flags = false; in start_flag_fetch()
371 ssif_info->ssif_state = SSIF_GETTING_FLAGS; in start_flag_fetch()
372 ipmi_ssif_unlock_cond(ssif_info, flags); in start_flag_fetch()
376 if (start_send(ssif_info, mb, 2) != 0) in start_flag_fetch()
377 ssif_info->ssif_state = SSIF_NORMAL; in start_flag_fetch()
380 static void check_start_send(struct ssif_info *ssif_info, unsigned long *flags, in check_start_send() argument
383 if (start_send(ssif_info, msg->data, msg->data_size) != 0) { in check_start_send()
386 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in check_start_send()
387 ssif_info->curr_msg = NULL; in check_start_send()
388 ssif_info->ssif_state = SSIF_NORMAL; in check_start_send()
389 ipmi_ssif_unlock_cond(ssif_info, flags); in check_start_send()
394 static void start_event_fetch(struct ssif_info *ssif_info, unsigned long *flags) in start_event_fetch() argument
398 ssif_info->req_events = false; in start_event_fetch()
402 ssif_info->ssif_state = SSIF_NORMAL; in start_event_fetch()
403 ipmi_ssif_unlock_cond(ssif_info, flags); in start_event_fetch()
407 ssif_info->curr_msg = msg; in start_event_fetch()
408 ssif_info->ssif_state = SSIF_GETTING_EVENTS; in start_event_fetch()
409 ipmi_ssif_unlock_cond(ssif_info, flags); in start_event_fetch()
415 check_start_send(ssif_info, flags, msg); in start_event_fetch()
418 static void start_recv_msg_fetch(struct ssif_info *ssif_info, in start_recv_msg_fetch() argument
425 ssif_info->ssif_state = SSIF_NORMAL; in start_recv_msg_fetch()
426 ipmi_ssif_unlock_cond(ssif_info, flags); in start_recv_msg_fetch()
430 ssif_info->curr_msg = msg; in start_recv_msg_fetch()
431 ssif_info->ssif_state = SSIF_GETTING_MESSAGES; in start_recv_msg_fetch()
432 ipmi_ssif_unlock_cond(ssif_info, flags); in start_recv_msg_fetch()
438 check_start_send(ssif_info, flags, msg); in start_recv_msg_fetch()
447 static void handle_flags(struct ssif_info *ssif_info, unsigned long *flags) in handle_flags() argument
449 if (ssif_info->msg_flags & WDT_PRE_TIMEOUT_INT) { in handle_flags()
451 ssif_inc_stat(ssif_info, watchdog_pretimeouts); in handle_flags()
452 start_clear_flags(ssif_info, flags); in handle_flags()
453 ipmi_smi_watchdog_pretimeout(ssif_info->intf); in handle_flags()
454 } else if (ssif_info->msg_flags & RECEIVE_MSG_AVAIL) in handle_flags()
456 start_recv_msg_fetch(ssif_info, flags); in handle_flags()
457 else if (ssif_info->msg_flags & EVENT_MSG_BUFFER_FULL) in handle_flags()
459 start_event_fetch(ssif_info, flags); in handle_flags()
461 ssif_info->ssif_state = SSIF_NORMAL; in handle_flags()
462 ipmi_ssif_unlock_cond(ssif_info, flags); in handle_flags()
468 struct ssif_info *ssif_info = data; in ipmi_ssif_thread() local
475 &ssif_info->wake_thread); in ipmi_ssif_thread()
476 if (ssif_info->stopping) in ipmi_ssif_thread()
480 init_completion(&ssif_info->wake_thread); in ipmi_ssif_thread()
482 if (ssif_info->i2c_read_write == I2C_SMBUS_WRITE) { in ipmi_ssif_thread()
484 ssif_info->client, ssif_info->i2c_command, in ipmi_ssif_thread()
485 ssif_info->i2c_data[0], in ipmi_ssif_thread()
486 ssif_info->i2c_data + 1); in ipmi_ssif_thread()
487 ssif_info->done_handler(ssif_info, result, NULL, 0); in ipmi_ssif_thread()
490 ssif_info->client, ssif_info->i2c_command, in ipmi_ssif_thread()
491 ssif_info->i2c_data); in ipmi_ssif_thread()
493 ssif_info->done_handler(ssif_info, result, in ipmi_ssif_thread()
496 ssif_info->done_handler(ssif_info, 0, in ipmi_ssif_thread()
497 ssif_info->i2c_data, in ipmi_ssif_thread()
505 static int ssif_i2c_send(struct ssif_info *ssif_info, in ssif_i2c_send() argument
510 ssif_info->done_handler = handler; in ssif_i2c_send()
512 ssif_info->i2c_read_write = read_write; in ssif_i2c_send()
513 ssif_info->i2c_command = command; in ssif_i2c_send()
514 ssif_info->i2c_data = data; in ssif_i2c_send()
515 ssif_info->i2c_size = size; in ssif_i2c_send()
516 complete(&ssif_info->wake_thread); in ssif_i2c_send()
521 static void msg_done_handler(struct ssif_info *ssif_info, int result,
524 static void start_get(struct ssif_info *ssif_info) in start_get() argument
528 ssif_info->rtc_us_timer = 0; in start_get()
529 ssif_info->multi_pos = 0; in start_get()
531 rv = ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ, in start_get()
533 ssif_info->recv, I2C_SMBUS_BLOCK_DATA); in start_get()
536 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in start_get()
539 msg_done_handler(ssif_info, -EIO, NULL, 0); in start_get()
545 struct ssif_info *ssif_info = from_timer(ssif_info, t, retry_timer); in retry_timeout() local
549 if (ssif_info->stopping) in retry_timeout()
552 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in retry_timeout()
553 waiting = ssif_info->waiting_alert; in retry_timeout()
554 ssif_info->waiting_alert = false; in retry_timeout()
555 ipmi_ssif_unlock_cond(ssif_info, flags); in retry_timeout()
558 start_get(ssif_info); in retry_timeout()
565 struct ssif_info *ssif_info = i2c_get_clientdata(client); in ssif_alert() local
572 ssif_inc_stat(ssif_info, alerts); in ssif_alert()
574 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in ssif_alert()
575 if (ssif_info->waiting_alert) { in ssif_alert()
576 ssif_info->waiting_alert = false; in ssif_alert()
577 del_timer(&ssif_info->retry_timer); in ssif_alert()
579 } else if (ssif_info->curr_msg) { in ssif_alert()
580 ssif_info->got_alert = true; in ssif_alert()
582 ipmi_ssif_unlock_cond(ssif_info, flags); in ssif_alert()
584 start_get(ssif_info); in ssif_alert()
587 static int start_resend(struct ssif_info *ssif_info);
589 static void msg_done_handler(struct ssif_info *ssif_info, int result, in msg_done_handler() argument
602 ssif_info->retries_left--; in msg_done_handler()
603 if (ssif_info->retries_left > 0) { in msg_done_handler()
604 ssif_inc_stat(ssif_info, receive_retries); in msg_done_handler()
606 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
607 ssif_info->waiting_alert = true; in msg_done_handler()
608 ssif_info->rtc_us_timer = SSIF_MSG_USEC; in msg_done_handler()
609 mod_timer(&ssif_info->retry_timer, in msg_done_handler()
611 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
615 ssif_inc_stat(ssif_info, receive_errors); in msg_done_handler()
617 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
623 if ((len > 1) && (ssif_info->multi_pos == 0) in msg_done_handler()
628 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
633 ssif_info->data[i] = data[i+2]; in msg_done_handler()
634 ssif_info->multi_len = len; in msg_done_handler()
635 ssif_info->multi_pos = 1; in msg_done_handler()
637 rv = ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ, in msg_done_handler()
639 ssif_info->recv, I2C_SMBUS_BLOCK_DATA); in msg_done_handler()
641 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
647 } else if (ssif_info->multi_pos) { in msg_done_handler()
654 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
662 if (ssif_info->multi_len + len - 1 > IPMI_MAX_MSG_LENGTH) { in msg_done_handler()
665 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
674 ssif_info->data[i + ssif_info->multi_len] = data[i + 1]; in msg_done_handler()
675 ssif_info->multi_len += len; in msg_done_handler()
678 len = ssif_info->multi_len; in msg_done_handler()
679 data = ssif_info->data; in msg_done_handler()
680 } else if (blocknum + 1 != ssif_info->multi_pos) { in msg_done_handler()
688 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
690 ssif_info->multi_pos++; in msg_done_handler()
692 rv = ssif_i2c_send(ssif_info, msg_done_handler, in msg_done_handler()
695 ssif_info->recv, in msg_done_handler()
698 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
709 ssif_inc_stat(ssif_info, receive_errors); in msg_done_handler()
711 ssif_inc_stat(ssif_info, received_messages); in msg_done_handler()
712 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
717 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
719 ssif_info->ssif_state, result); in msg_done_handler()
721 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
722 msg = ssif_info->curr_msg; in msg_done_handler()
728 ssif_info->curr_msg = NULL; in msg_done_handler()
731 switch (ssif_info->ssif_state) { in msg_done_handler()
733 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
738 return_hosed_msg(ssif_info, msg); in msg_done_handler()
740 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
750 ssif_info->ssif_state = SSIF_NORMAL; in msg_done_handler()
751 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
760 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
764 ssif_inc_stat(ssif_info, flag_fetches); in msg_done_handler()
765 ssif_info->msg_flags = data[3]; in msg_done_handler()
766 handle_flags(ssif_info, flags); in msg_done_handler()
781 ssif_info->ssif_state = SSIF_NORMAL; in msg_done_handler()
782 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
791 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
792 handle_flags(ssif_info, flags); in msg_done_handler()
799 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
800 handle_flags(ssif_info, flags); in msg_done_handler()
802 handle_flags(ssif_info, flags); in msg_done_handler()
803 ssif_inc_stat(ssif_info, events); in msg_done_handler()
804 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
814 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
815 handle_flags(ssif_info, flags); in msg_done_handler()
823 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
824 handle_flags(ssif_info, flags); in msg_done_handler()
826 ssif_inc_stat(ssif_info, incoming_messages); in msg_done_handler()
827 handle_flags(ssif_info, flags); in msg_done_handler()
828 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
833 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
834 if (SSIF_IDLE(ssif_info) && !ssif_info->stopping) { in msg_done_handler()
835 if (ssif_info->req_events) in msg_done_handler()
836 start_event_fetch(ssif_info, flags); in msg_done_handler()
837 else if (ssif_info->req_flags) in msg_done_handler()
838 start_flag_fetch(ssif_info, flags); in msg_done_handler()
840 start_next_msg(ssif_info, flags); in msg_done_handler()
842 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
844 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
845 pr_info(PFX "DONE 2: state = %d.\n", ssif_info->ssif_state); in msg_done_handler()
848 static void msg_written_handler(struct ssif_info *ssif_info, int result, in msg_written_handler() argument
855 ssif_info->retries_left--; in msg_written_handler()
856 if (ssif_info->retries_left > 0) { in msg_written_handler()
857 if (!start_resend(ssif_info)) { in msg_written_handler()
858 ssif_inc_stat(ssif_info, send_retries); in msg_written_handler()
862 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
864 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
867 msg_done_handler(ssif_info, -EIO, NULL, 0); in msg_written_handler()
871 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
877 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
880 msg_done_handler(ssif_info, result, NULL, 0); in msg_written_handler()
884 if (ssif_info->multi_data) { in msg_written_handler()
893 ssif_inc_stat(ssif_info, sent_messages_parts); in msg_written_handler()
895 left = ssif_info->multi_len - ssif_info->multi_pos; in msg_written_handler()
899 ssif_info->multi_data[ssif_info->multi_pos] = left; in msg_written_handler()
900 data_to_send = ssif_info->multi_data + ssif_info->multi_pos; in msg_written_handler()
901 ssif_info->multi_pos += left; in msg_written_handler()
909 ssif_info->multi_data = NULL; in msg_written_handler()
911 rv = ssif_i2c_send(ssif_info, msg_written_handler, in msg_written_handler()
918 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
920 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
922 msg_done_handler(ssif_info, -EIO, NULL, 0); in msg_written_handler()
928 ssif_inc_stat(ssif_info, sent_messages); in msg_written_handler()
929 ssif_inc_stat(ssif_info, sent_messages_parts); in msg_written_handler()
931 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_written_handler()
932 if (ssif_info->got_alert) { in msg_written_handler()
934 ssif_info->got_alert = false; in msg_written_handler()
935 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_written_handler()
936 start_get(ssif_info); in msg_written_handler()
939 ssif_info->waiting_alert = true; in msg_written_handler()
940 ssif_info->retries_left = SSIF_RECV_RETRIES; in msg_written_handler()
941 ssif_info->rtc_us_timer = SSIF_MSG_PART_USEC; in msg_written_handler()
942 mod_timer(&ssif_info->retry_timer, in msg_written_handler()
944 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_written_handler()
949 static int start_resend(struct ssif_info *ssif_info) in start_resend() argument
954 ssif_info->got_alert = false; in start_resend()
956 if (ssif_info->data_len > 32) { in start_resend()
958 ssif_info->multi_data = ssif_info->data; in start_resend()
959 ssif_info->multi_len = ssif_info->data_len; in start_resend()
965 ssif_info->multi_pos = 32; in start_resend()
966 ssif_info->data[0] = 32; in start_resend()
968 ssif_info->multi_data = NULL; in start_resend()
970 ssif_info->data[0] = ssif_info->data_len; in start_resend()
973 rv = ssif_i2c_send(ssif_info, msg_written_handler, I2C_SMBUS_WRITE, in start_resend()
974 command, ssif_info->data, I2C_SMBUS_BLOCK_DATA); in start_resend()
975 if (rv && (ssif_info->ssif_debug & SSIF_DEBUG_MSG)) in start_resend()
980 static int start_send(struct ssif_info *ssif_info, in start_send() argument
986 if (len > ssif_info->max_xmit_msg_size) in start_send()
989 ssif_info->retries_left = SSIF_SEND_RETRIES; in start_send()
990 memcpy(ssif_info->data + 1, data, len); in start_send()
991 ssif_info->data_len = len; in start_send()
992 return start_resend(ssif_info); in start_send()
996 static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags) in start_next_msg() argument
1002 if (!SSIF_IDLE(ssif_info)) { in start_next_msg()
1003 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1007 if (!ssif_info->waiting_msg) { in start_next_msg()
1008 ssif_info->curr_msg = NULL; in start_next_msg()
1009 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1013 ssif_info->curr_msg = ssif_info->waiting_msg; in start_next_msg()
1014 ssif_info->waiting_msg = NULL; in start_next_msg()
1015 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1016 rv = start_send(ssif_info, in start_next_msg()
1017 ssif_info->curr_msg->data, in start_next_msg()
1018 ssif_info->curr_msg->data_size); in start_next_msg()
1020 msg = ssif_info->curr_msg; in start_next_msg()
1021 ssif_info->curr_msg = NULL; in start_next_msg()
1022 return_hosed_msg(ssif_info, msg); in start_next_msg()
1023 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in start_next_msg()
1032 struct ssif_info *ssif_info = (struct ssif_info *) send_info; in sender() local
1035 BUG_ON(ssif_info->waiting_msg); in sender()
1036 ssif_info->waiting_msg = msg; in sender()
1038 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in sender()
1039 start_next_msg(ssif_info, flags); in sender()
1041 if (ssif_info->ssif_debug & SSIF_DEBUG_TIMING) { in sender()
1053 struct ssif_info *ssif_info = send_info; in get_smi_info() local
1055 data->addr_src = ssif_info->addr_source; in get_smi_info()
1056 data->dev = &ssif_info->client->dev; in get_smi_info()
1057 data->addr_info = ssif_info->addr_info; in get_smi_info()
1069 struct ssif_info *ssif_info = (struct ssif_info *) send_info; in request_events() local
1072 if (!ssif_info->has_event_buffer) in request_events()
1075 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in request_events()
1081 ssif_info->req_events = true; in request_events()
1082 if (SSIF_IDLE(ssif_info)) in request_events()
1083 start_flag_fetch(ssif_info, flags); in request_events()
1085 ssif_info->req_flags = true; in request_events()
1086 ipmi_ssif_unlock_cond(ssif_info, flags); in request_events()
1093 struct ssif_info *ssif_info = send_info; in ssif_start_processing() local
1095 ssif_info->intf = intf; in ssif_start_processing()
1152 struct ssif_info *ssif_info = dev_get_drvdata(dev); \
1154 return snprintf(buf, 10, "%u\n", ssif_get_stat(ssif_info, name));\
1204 struct ssif_info *ssif_info = send_info; in shutdown_ssif() local
1206 device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group); in shutdown_ssif()
1207 dev_set_drvdata(&ssif_info->client->dev, NULL); in shutdown_ssif()
1210 while (ssif_info->ssif_state != SSIF_NORMAL) in shutdown_ssif()
1213 ssif_info->stopping = true; in shutdown_ssif()
1214 del_timer_sync(&ssif_info->retry_timer); in shutdown_ssif()
1215 if (ssif_info->thread) { in shutdown_ssif()
1216 complete(&ssif_info->wake_thread); in shutdown_ssif()
1217 kthread_stop(ssif_info->thread); in shutdown_ssif()
1223 struct ssif_info *ssif_info = i2c_get_clientdata(client); in ssif_remove() local
1226 if (!ssif_info) in ssif_remove()
1233 ipmi_unregister_smi(ssif_info->intf); in ssif_remove()
1242 kfree(ssif_info); in ssif_remove()
1366 static bool check_acpi(struct ssif_info *ssif_info, struct device *dev) in check_acpi() argument
1373 ssif_info->addr_source = SI_ACPI; in check_acpi()
1374 ssif_info->addr_info.acpi_info.acpi_handle = acpi_handle; in check_acpi()
1404 struct ssif_info *ssif_info; in ssif_probe() local
1415 ssif_info = kzalloc(sizeof(*ssif_info), GFP_KERNEL); in ssif_probe()
1416 if (!ssif_info) { in ssif_probe()
1421 if (!check_acpi(ssif_info, &client->dev)) { in ssif_probe()
1426 ssif_info->addr_source = SI_HOTMOD; in ssif_probe()
1428 ssif_info->addr_source = addr_info->addr_src; in ssif_probe()
1429 ssif_info->ssif_debug = addr_info->debug; in ssif_probe()
1430 ssif_info->addr_info = addr_info->addr_info; in ssif_probe()
1439 ipmi_addr_src_to_str(ssif_info->addr_source), in ssif_probe()
1442 ssif_info->client = client; in ssif_probe()
1443 i2c_set_clientdata(client, ssif_info); in ssif_probe()
1458 ssif_info->max_xmit_msg_size = resp[5]; in ssif_probe()
1459 ssif_info->max_recv_msg_size = resp[6]; in ssif_probe()
1460 ssif_info->multi_support = (resp[4] >> 6) & 0x3; in ssif_probe()
1461 ssif_info->supports_pec = (resp[4] >> 3) & 0x1; in ssif_probe()
1464 switch (ssif_info->multi_support) { in ssif_probe()
1466 if (ssif_info->max_xmit_msg_size > 32) in ssif_probe()
1467 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1468 if (ssif_info->max_recv_msg_size > 32) in ssif_probe()
1469 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1473 if (ssif_info->max_xmit_msg_size > 63) in ssif_probe()
1474 ssif_info->max_xmit_msg_size = 63; in ssif_probe()
1475 if (ssif_info->max_recv_msg_size > 62) in ssif_probe()
1476 ssif_info->max_recv_msg_size = 62; in ssif_probe()
1498 if (ssif_info->max_xmit_msg_size > 63) in ssif_probe()
1499 ssif_info->max_xmit_msg_size = 63; in ssif_probe()
1512 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1513 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1514 ssif_info->multi_support = SSIF_NO_MULTI; in ssif_probe()
1515 ssif_info->supports_pec = 0; in ssif_probe()
1538 ssif_info->global_enables = resp[3]; in ssif_probe()
1541 ssif_info->has_event_buffer = true; in ssif_probe()
1548 msg[2] = ssif_info->global_enables | IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1559 ssif_info->has_event_buffer = true; in ssif_probe()
1560 ssif_info->global_enables |= IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1569 msg[2] = ssif_info->global_enables | IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1580 ssif_info->supports_alert = true; in ssif_probe()
1581 ssif_info->global_enables |= IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1590 spin_lock_init(&ssif_info->lock); in ssif_probe()
1591 ssif_info->ssif_state = SSIF_NORMAL; in ssif_probe()
1592 timer_setup(&ssif_info->retry_timer, retry_timeout, 0); in ssif_probe()
1595 atomic_set(&ssif_info->stats[i], 0); in ssif_probe()
1597 if (ssif_info->supports_pec) in ssif_probe()
1598 ssif_info->client->flags |= I2C_CLIENT_PEC; in ssif_probe()
1600 ssif_info->handlers.owner = THIS_MODULE; in ssif_probe()
1601 ssif_info->handlers.start_processing = ssif_start_processing; in ssif_probe()
1602 ssif_info->handlers.shutdown = shutdown_ssif; in ssif_probe()
1603 ssif_info->handlers.get_smi_info = get_smi_info; in ssif_probe()
1604 ssif_info->handlers.sender = sender; in ssif_probe()
1605 ssif_info->handlers.request_events = request_events; in ssif_probe()
1610 thread_num = ((i2c_adapter_id(ssif_info->client->adapter) in ssif_probe()
1612 ssif_info->client->addr); in ssif_probe()
1613 init_completion(&ssif_info->wake_thread); in ssif_probe()
1614 ssif_info->thread = kthread_run(ipmi_ssif_thread, ssif_info, in ssif_probe()
1616 if (IS_ERR(ssif_info->thread)) { in ssif_probe()
1617 rv = PTR_ERR(ssif_info->thread); in ssif_probe()
1618 dev_notice(&ssif_info->client->dev, in ssif_probe()
1625 dev_set_drvdata(&ssif_info->client->dev, ssif_info); in ssif_probe()
1626 rv = device_add_group(&ssif_info->client->dev, in ssif_probe()
1629 dev_err(&ssif_info->client->dev, in ssif_probe()
1635 rv = ipmi_register_smi(&ssif_info->handlers, in ssif_probe()
1636 ssif_info, in ssif_probe()
1637 &ssif_info->client->dev, in ssif_probe()
1650 kfree(ssif_info); in ssif_probe()
1656 device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group); in ssif_probe()
1657 dev_set_drvdata(&ssif_info->client->dev, NULL); in ssif_probe()