Lines Matching refs:ssif_info
193 struct ssif_info;
195 typedef void (*ssif_i2c_done)(struct ssif_info *ssif_info, int result,
198 struct ssif_info { struct
300 static void return_hosed_msg(struct ssif_info *ssif_info, argument
302 static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags);
303 static int start_send(struct ssif_info *ssif_info,
307 static unsigned long *ipmi_ssif_lock_cond(struct ssif_info *ssif_info, in ipmi_ssif_lock_cond() argument
309 __acquires(&ssif_info->lock) in ipmi_ssif_lock_cond()
311 spin_lock_irqsave(&ssif_info->lock, *flags); in ipmi_ssif_lock_cond()
315 static void ipmi_ssif_unlock_cond(struct ssif_info *ssif_info, in ipmi_ssif_unlock_cond() argument
317 __releases(&ssif_info->lock) in ipmi_ssif_unlock_cond()
319 spin_unlock_irqrestore(&ssif_info->lock, *flags); in ipmi_ssif_unlock_cond()
322 static void deliver_recv_msg(struct ssif_info *ssif_info, in deliver_recv_msg() argument
326 return_hosed_msg(ssif_info, msg); in deliver_recv_msg()
327 dev_err(&ssif_info->client->dev, in deliver_recv_msg()
331 ipmi_smi_msg_received(ssif_info->intf, 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()
411 ipmi_ssif_unlock_cond(ssif_info, flags); in start_event_fetch()
415 ssif_info->curr_msg = msg; in start_event_fetch()
416 ssif_info->ssif_state = SSIF_GETTING_EVENTS; in start_event_fetch()
417 ipmi_ssif_unlock_cond(ssif_info, flags); in start_event_fetch()
423 check_start_send(ssif_info, flags, msg); in start_event_fetch()
426 static void start_recv_msg_fetch(struct ssif_info *ssif_info, in start_recv_msg_fetch() argument
433 ssif_info->ssif_state = SSIF_NORMAL; in start_recv_msg_fetch()
434 ipmi_ssif_unlock_cond(ssif_info, flags); in start_recv_msg_fetch()
438 ssif_info->curr_msg = msg; in start_recv_msg_fetch()
439 ssif_info->ssif_state = SSIF_GETTING_MESSAGES; in start_recv_msg_fetch()
440 ipmi_ssif_unlock_cond(ssif_info, flags); in start_recv_msg_fetch()
446 check_start_send(ssif_info, flags, msg); in start_recv_msg_fetch()
455 static void handle_flags(struct ssif_info *ssif_info, unsigned long *flags) in handle_flags() argument
457 if (ssif_info->msg_flags & WDT_PRE_TIMEOUT_INT) { in handle_flags()
459 ssif_inc_stat(ssif_info, watchdog_pretimeouts); in handle_flags()
460 start_clear_flags(ssif_info, flags); in handle_flags()
461 ipmi_smi_watchdog_pretimeout(ssif_info->intf); 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()
545 dev_dbg(&ssif_info->client->dev, in start_get()
548 msg_done_handler(ssif_info, -EIO, NULL, 0); in start_get()
554 struct ssif_info *ssif_info = from_timer(ssif_info, t, retry_timer); in retry_timeout() local
558 if (ssif_info->stopping) in retry_timeout()
561 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in retry_timeout()
562 waiting = ssif_info->waiting_alert; in retry_timeout()
563 ssif_info->waiting_alert = false; in retry_timeout()
564 ipmi_ssif_unlock_cond(ssif_info, flags); in retry_timeout()
567 start_get(ssif_info); in retry_timeout()
572 struct ssif_info *ssif_info = from_timer(ssif_info, t, watch_timer); in watch_timeout() local
575 if (ssif_info->stopping) in watch_timeout()
578 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in watch_timeout()
579 if (ssif_info->watch_timeout) { in watch_timeout()
580 mod_timer(&ssif_info->watch_timer, in watch_timeout()
581 jiffies + ssif_info->watch_timeout); in watch_timeout()
582 if (SSIF_IDLE(ssif_info)) { in watch_timeout()
583 start_flag_fetch(ssif_info, flags); /* Releases lock */ in watch_timeout()
586 ssif_info->req_flags = true; in watch_timeout()
588 ipmi_ssif_unlock_cond(ssif_info, flags); in watch_timeout()
594 struct ssif_info *ssif_info = i2c_get_clientdata(client); in ssif_alert() local
601 ssif_inc_stat(ssif_info, alerts); in ssif_alert()
603 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in ssif_alert()
604 if (ssif_info->waiting_alert) { in ssif_alert()
605 ssif_info->waiting_alert = false; in ssif_alert()
606 del_timer(&ssif_info->retry_timer); in ssif_alert()
608 } else if (ssif_info->curr_msg) { in ssif_alert()
609 ssif_info->got_alert = true; in ssif_alert()
611 ipmi_ssif_unlock_cond(ssif_info, flags); in ssif_alert()
613 start_get(ssif_info); in ssif_alert()
616 static int start_resend(struct ssif_info *ssif_info);
618 static void msg_done_handler(struct ssif_info *ssif_info, int result, in msg_done_handler() argument
631 ssif_info->retries_left--; in msg_done_handler()
632 if (ssif_info->retries_left > 0) { in msg_done_handler()
633 ssif_inc_stat(ssif_info, receive_retries); in msg_done_handler()
635 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); 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()
641 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
645 ssif_inc_stat(ssif_info, receive_errors); 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()
659 ssif_inc_stat(ssif_info, received_message_parts); 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()
669 rv = ssif_i2c_send(ssif_info, msg_done_handler, I2C_SMBUS_READ, in msg_done_handler()
671 ssif_info->recv, I2C_SMBUS_BLOCK_DATA); in msg_done_handler()
673 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
674 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
680 } else if (ssif_info->multi_pos) { in msg_done_handler()
687 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
688 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
701 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
702 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
708 if (ssif_info->multi_len + len > IPMI_MAX_MSG_LENGTH) { in msg_done_handler()
711 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
712 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
719 ssif_info->data[i + ssif_info->multi_len] = data[i]; in msg_done_handler()
720 ssif_info->multi_len += len; in msg_done_handler()
723 len = ssif_info->multi_len; in msg_done_handler()
724 data = ssif_info->data; in msg_done_handler()
725 } else if (blocknum + 1 != ssif_info->multi_pos) { in msg_done_handler()
731 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
732 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
734 ssif_info->multi_pos - 1, blocknum); in msg_done_handler()
737 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
739 ssif_info->multi_pos++; in msg_done_handler()
741 rv = ssif_i2c_send(ssif_info, msg_done_handler, in msg_done_handler()
744 ssif_info->recv, in msg_done_handler()
747 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_done_handler()
748 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
759 ssif_inc_stat(ssif_info, receive_errors); in msg_done_handler()
761 ssif_inc_stat(ssif_info, received_messages); in msg_done_handler()
762 ssif_inc_stat(ssif_info, received_message_parts); in msg_done_handler()
765 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
766 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
768 ssif_info->ssif_state, result); in msg_done_handler()
770 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
771 msg = ssif_info->curr_msg; in msg_done_handler()
781 ssif_info->curr_msg = NULL; in msg_done_handler()
784 switch (ssif_info->ssif_state) { in msg_done_handler()
786 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
791 return_hosed_msg(ssif_info, msg); in msg_done_handler()
793 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
803 ssif_info->ssif_state = SSIF_NORMAL; in msg_done_handler()
804 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
805 dev_warn(&ssif_info->client->dev, in msg_done_handler()
814 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
815 dev_warn(&ssif_info->client->dev, in msg_done_handler()
819 ssif_inc_stat(ssif_info, flag_fetches); in msg_done_handler()
820 ssif_info->msg_flags = data[3]; in msg_done_handler()
821 handle_flags(ssif_info, flags); in msg_done_handler()
829 dev_warn(&ssif_info->client->dev, in msg_done_handler()
834 dev_warn(&ssif_info->client->dev, in msg_done_handler()
838 ssif_info->ssif_state = SSIF_NORMAL; in msg_done_handler()
839 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
845 dev_warn(&ssif_info->client->dev, in msg_done_handler()
847 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
856 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
857 handle_flags(ssif_info, flags); in msg_done_handler()
860 dev_warn(&ssif_info->client->dev, in msg_done_handler()
865 ssif_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; in msg_done_handler()
866 handle_flags(ssif_info, flags); in msg_done_handler()
868 handle_flags(ssif_info, flags); in msg_done_handler()
869 ssif_inc_stat(ssif_info, events); in msg_done_handler()
870 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
877 dev_warn(&ssif_info->client->dev, in msg_done_handler()
879 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
888 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
889 handle_flags(ssif_info, flags); in msg_done_handler()
892 dev_warn(&ssif_info->client->dev, in msg_done_handler()
898 ssif_info->msg_flags &= ~RECEIVE_MSG_AVAIL; in msg_done_handler()
899 handle_flags(ssif_info, flags); in msg_done_handler()
901 ssif_inc_stat(ssif_info, incoming_messages); in msg_done_handler()
902 handle_flags(ssif_info, flags); in msg_done_handler()
903 deliver_recv_msg(ssif_info, msg); in msg_done_handler()
909 dev_warn(&ssif_info->client->dev, in msg_done_handler()
911 ssif_info->ssif_state); in msg_done_handler()
912 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
915 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_done_handler()
916 if (SSIF_IDLE(ssif_info) && !ssif_info->stopping) { in msg_done_handler()
917 if (ssif_info->req_events) in msg_done_handler()
918 start_event_fetch(ssif_info, flags); in msg_done_handler()
919 else if (ssif_info->req_flags) in msg_done_handler()
920 start_flag_fetch(ssif_info, flags); in msg_done_handler()
922 start_next_msg(ssif_info, flags); in msg_done_handler()
924 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_done_handler()
926 if (ssif_info->ssif_debug & SSIF_DEBUG_STATE) in msg_done_handler()
927 dev_dbg(&ssif_info->client->dev, in msg_done_handler()
928 "DONE 2: state = %d.\n", ssif_info->ssif_state); in msg_done_handler()
931 static void msg_written_handler(struct ssif_info *ssif_info, int result, in msg_written_handler() argument
938 ssif_info->retries_left--; in msg_written_handler()
939 if (ssif_info->retries_left > 0) { in msg_written_handler()
940 if (!start_resend(ssif_info)) { in msg_written_handler()
941 ssif_inc_stat(ssif_info, send_retries); in msg_written_handler()
945 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
947 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
948 dev_dbg(&ssif_info->client->dev, in msg_written_handler()
950 msg_done_handler(ssif_info, -EIO, NULL, 0); in msg_written_handler()
954 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
960 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
961 dev_dbg(&ssif_info->client->dev, in msg_written_handler()
964 msg_done_handler(ssif_info, result, NULL, 0); in msg_written_handler()
968 if (ssif_info->multi_data) { in msg_written_handler()
978 ssif_inc_stat(ssif_info, sent_messages_parts); in msg_written_handler()
980 left = ssif_info->multi_len - ssif_info->multi_pos; in msg_written_handler()
985 ssif_info->multi_data[ssif_info->multi_pos] = to_write; in msg_written_handler()
986 data_to_send = ssif_info->multi_data + ssif_info->multi_pos; in msg_written_handler()
987 ssif_info->multi_pos += to_write; in msg_written_handler()
989 if (ssif_info->cmd8_works) { in msg_written_handler()
992 ssif_info->multi_data = NULL; in msg_written_handler()
995 ssif_info->multi_data = NULL; in msg_written_handler()
998 rv = ssif_i2c_send(ssif_info, msg_written_handler, in msg_written_handler()
1003 ssif_inc_stat(ssif_info, send_errors); in msg_written_handler()
1005 if (ssif_info->ssif_debug & SSIF_DEBUG_MSG) in msg_written_handler()
1006 dev_dbg(&ssif_info->client->dev, in msg_written_handler()
1008 msg_done_handler(ssif_info, -EIO, NULL, 0); in msg_written_handler()
1014 ssif_inc_stat(ssif_info, sent_messages); in msg_written_handler()
1015 ssif_inc_stat(ssif_info, sent_messages_parts); in msg_written_handler()
1017 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in msg_written_handler()
1018 if (ssif_info->got_alert) { in msg_written_handler()
1020 ssif_info->got_alert = false; in msg_written_handler()
1021 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_written_handler()
1022 start_get(ssif_info); in msg_written_handler()
1025 ssif_info->waiting_alert = true; in msg_written_handler()
1026 ssif_info->retries_left = SSIF_RECV_RETRIES; in msg_written_handler()
1027 ssif_info->rtc_us_timer = SSIF_MSG_PART_USEC; in msg_written_handler()
1028 if (!ssif_info->stopping) in msg_written_handler()
1029 mod_timer(&ssif_info->retry_timer, in msg_written_handler()
1031 ipmi_ssif_unlock_cond(ssif_info, flags); in msg_written_handler()
1036 static int start_resend(struct ssif_info *ssif_info) in start_resend() argument
1041 ssif_info->got_alert = false; in start_resend()
1043 if (ssif_info->data_len > 32) { in start_resend()
1045 ssif_info->multi_data = ssif_info->data; in start_resend()
1046 ssif_info->multi_len = ssif_info->data_len; in start_resend()
1052 ssif_info->multi_pos = 32; in start_resend()
1053 ssif_info->data[0] = 32; in start_resend()
1055 ssif_info->multi_data = NULL; in start_resend()
1057 ssif_info->data[0] = ssif_info->data_len; in start_resend()
1060 rv = ssif_i2c_send(ssif_info, msg_written_handler, I2C_SMBUS_WRITE, in start_resend()
1061 command, ssif_info->data, I2C_SMBUS_BLOCK_DATA); in start_resend()
1062 if (rv && (ssif_info->ssif_debug & SSIF_DEBUG_MSG)) in start_resend()
1063 dev_dbg(&ssif_info->client->dev, in start_resend()
1068 static int start_send(struct ssif_info *ssif_info, in start_send() argument
1074 if (len > ssif_info->max_xmit_msg_size) in start_send()
1077 ssif_info->retries_left = SSIF_SEND_RETRIES; in start_send()
1078 memcpy(ssif_info->data + 1, data, len); in start_send()
1079 ssif_info->data_len = len; in start_send()
1080 return start_resend(ssif_info); in start_send()
1084 static void start_next_msg(struct ssif_info *ssif_info, unsigned long *flags) in start_next_msg() argument
1090 if (!SSIF_IDLE(ssif_info)) { in start_next_msg()
1091 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1095 if (!ssif_info->waiting_msg) { in start_next_msg()
1096 ssif_info->curr_msg = NULL; in start_next_msg()
1097 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1101 ssif_info->curr_msg = ssif_info->waiting_msg; in start_next_msg()
1102 ssif_info->waiting_msg = NULL; in start_next_msg()
1103 ipmi_ssif_unlock_cond(ssif_info, flags); in start_next_msg()
1104 rv = start_send(ssif_info, in start_next_msg()
1105 ssif_info->curr_msg->data, in start_next_msg()
1106 ssif_info->curr_msg->data_size); in start_next_msg()
1108 msg = ssif_info->curr_msg; in start_next_msg()
1109 ssif_info->curr_msg = NULL; in start_next_msg()
1110 return_hosed_msg(ssif_info, msg); in start_next_msg()
1111 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in start_next_msg()
1120 struct ssif_info *ssif_info = (struct ssif_info *) send_info; in sender() local
1123 BUG_ON(ssif_info->waiting_msg); in sender()
1124 ssif_info->waiting_msg = msg; in sender()
1126 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in sender()
1127 start_next_msg(ssif_info, flags); in sender()
1129 if (ssif_info->ssif_debug & SSIF_DEBUG_TIMING) { in sender()
1133 dev_dbg(&ssif_info->client->dev, in sender()
1142 struct ssif_info *ssif_info = send_info; in get_smi_info() local
1144 data->addr_src = ssif_info->addr_source; in get_smi_info()
1145 data->dev = &ssif_info->client->dev; in get_smi_info()
1146 data->addr_info = ssif_info->addr_info; in get_smi_info()
1157 struct ssif_info *ssif_info = (struct ssif_info *) send_info; in request_events() local
1160 if (!ssif_info->has_event_buffer) in request_events()
1163 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in request_events()
1164 ssif_info->req_events = true; in request_events()
1165 ipmi_ssif_unlock_cond(ssif_info, flags); in request_events()
1174 struct ssif_info *ssif_info = (struct ssif_info *) send_info; in ssif_set_need_watch() local
1183 flags = ipmi_ssif_lock_cond(ssif_info, &oflags); in ssif_set_need_watch()
1184 if (timeout != ssif_info->watch_timeout) { in ssif_set_need_watch()
1185 ssif_info->watch_timeout = timeout; in ssif_set_need_watch()
1186 if (ssif_info->watch_timeout) in ssif_set_need_watch()
1187 mod_timer(&ssif_info->watch_timer, in ssif_set_need_watch()
1188 jiffies + ssif_info->watch_timeout); in ssif_set_need_watch()
1190 ipmi_ssif_unlock_cond(ssif_info, flags); in ssif_set_need_watch()
1196 struct ssif_info *ssif_info = send_info; in ssif_start_processing() local
1198 ssif_info->intf = intf; in ssif_start_processing()
1255 struct ssif_info *ssif_info = dev_get_drvdata(dev); \
1257 return snprintf(buf, 10, "%u\n", ssif_get_stat(ssif_info, name));\
1307 struct ssif_info *ssif_info = send_info; in shutdown_ssif() local
1309 device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group); in shutdown_ssif()
1310 dev_set_drvdata(&ssif_info->client->dev, NULL); in shutdown_ssif()
1313 while (ssif_info->ssif_state != SSIF_NORMAL) in shutdown_ssif()
1316 ssif_info->stopping = true; in shutdown_ssif()
1317 del_timer_sync(&ssif_info->watch_timer); in shutdown_ssif()
1318 del_timer_sync(&ssif_info->retry_timer); in shutdown_ssif()
1319 if (ssif_info->thread) { in shutdown_ssif()
1320 complete(&ssif_info->wake_thread); in shutdown_ssif()
1321 kthread_stop(ssif_info->thread); in shutdown_ssif()
1327 struct ssif_info *ssif_info = i2c_get_clientdata(client); in ssif_remove() local
1330 if (!ssif_info) in ssif_remove()
1337 ipmi_unregister_smi(ssif_info->intf); in ssif_remove()
1346 kfree(ssif_info); in ssif_remove()
1482 static bool check_acpi(struct ssif_info *ssif_info, struct device *dev) in check_acpi() argument
1489 ssif_info->addr_source = SI_ACPI; in check_acpi()
1490 ssif_info->addr_info.acpi_info.acpi_handle = acpi_handle; in check_acpi()
1543 struct ssif_info *ssif_info, in test_multipart_messages() argument
1550 if (ssif_info->max_xmit_msg_size <= 32) in test_multipart_messages()
1553 do_middle = ssif_info->max_xmit_msg_size > 63; in test_multipart_messages()
1597 ssif_info->cmd8_works = true; in test_multipart_messages()
1617 if (ssif_info->max_xmit_msg_size > 63) in test_multipart_messages()
1618 ssif_info->max_xmit_msg_size = 63; in test_multipart_messages()
1622 ssif_info->max_xmit_msg_size = 32; in test_multipart_messages()
1634 struct ssif_info *ssif_info = i2c_get_clientdata(client); in ssif_remove_dup() local
1636 ipmi_unregister_smi(ssif_info->intf); in ssif_remove_dup()
1637 kfree(ssif_info); in ssif_remove_dup()
1661 struct ssif_info *ssif_info) in ssif_check_and_remove() argument
1673 if (ssif_info->addr_source == SI_ACPI && in ssif_check_and_remove()
1690 struct ssif_info *ssif_info; in ssif_probe() local
1704 ssif_info = kzalloc(sizeof(*ssif_info), GFP_KERNEL); in ssif_probe()
1705 if (!ssif_info) { in ssif_probe()
1711 if (!check_acpi(ssif_info, &client->dev)) { in ssif_probe()
1716 ssif_info->addr_source = SI_HOTMOD; in ssif_probe()
1718 ssif_info->addr_source = addr_info->addr_src; in ssif_probe()
1719 ssif_info->ssif_debug = addr_info->debug; in ssif_probe()
1720 ssif_info->addr_info = addr_info->addr_info; in ssif_probe()
1726 ssif_info->client = client; in ssif_probe()
1727 i2c_set_clientdata(client, ssif_info); in ssif_probe()
1729 rv = ssif_check_and_remove(client, ssif_info); in ssif_probe()
1731 if (!rv && ssif_info->addr_source == SI_ACPI) { in ssif_probe()
1746 ipmi_addr_src_to_str(ssif_info->addr_source), in ssif_probe()
1757 dev_dbg(&ssif_info->client->dev, in ssif_probe()
1763 ssif_info->max_xmit_msg_size = resp[5]; in ssif_probe()
1764 ssif_info->max_recv_msg_size = resp[6]; in ssif_probe()
1765 ssif_info->multi_support = (resp[4] >> 6) & 0x3; in ssif_probe()
1766 ssif_info->supports_pec = (resp[4] >> 3) & 0x1; in ssif_probe()
1769 switch (ssif_info->multi_support) { in ssif_probe()
1771 if (ssif_info->max_xmit_msg_size > 32) in ssif_probe()
1772 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1773 if (ssif_info->max_recv_msg_size > 32) in ssif_probe()
1774 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1778 if (ssif_info->max_xmit_msg_size > 63) in ssif_probe()
1779 ssif_info->max_xmit_msg_size = 63; in ssif_probe()
1780 if (ssif_info->max_recv_msg_size > 62) in ssif_probe()
1781 ssif_info->max_recv_msg_size = 62; in ssif_probe()
1795 dev_info(&ssif_info->client->dev, in ssif_probe()
1799 ssif_info->max_xmit_msg_size = 32; in ssif_probe()
1800 ssif_info->max_recv_msg_size = 32; in ssif_probe()
1801 ssif_info->multi_support = SSIF_NO_MULTI; in ssif_probe()
1802 ssif_info->supports_pec = 0; in ssif_probe()
1805 test_multipart_messages(client, ssif_info, resp); in ssif_probe()
1813 dev_warn(&ssif_info->client->dev, in ssif_probe()
1822 dev_warn(&ssif_info->client->dev, in ssif_probe()
1829 ssif_info->global_enables = resp[3]; in ssif_probe()
1832 ssif_info->has_event_buffer = true; in ssif_probe()
1839 msg[2] = ssif_info->global_enables | IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1842 dev_warn(&ssif_info->client->dev, in ssif_probe()
1851 ssif_info->has_event_buffer = true; in ssif_probe()
1852 ssif_info->global_enables |= IPMI_BMC_EVT_MSG_BUFF; in ssif_probe()
1861 msg[2] = ssif_info->global_enables | IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1864 dev_warn(&ssif_info->client->dev, in ssif_probe()
1873 ssif_info->supports_alert = true; in ssif_probe()
1874 ssif_info->global_enables |= IPMI_BMC_RCV_MSG_INTR; in ssif_probe()
1879 dev_dbg(&ssif_info->client->dev, in ssif_probe()
1884 spin_lock_init(&ssif_info->lock); in ssif_probe()
1885 ssif_info->ssif_state = SSIF_NORMAL; in ssif_probe()
1886 timer_setup(&ssif_info->retry_timer, retry_timeout, 0); in ssif_probe()
1887 timer_setup(&ssif_info->watch_timer, watch_timeout, 0); in ssif_probe()
1890 atomic_set(&ssif_info->stats[i], 0); in ssif_probe()
1892 if (ssif_info->supports_pec) in ssif_probe()
1893 ssif_info->client->flags |= I2C_CLIENT_PEC; in ssif_probe()
1895 ssif_info->handlers.owner = THIS_MODULE; in ssif_probe()
1896 ssif_info->handlers.start_processing = ssif_start_processing; in ssif_probe()
1897 ssif_info->handlers.shutdown = shutdown_ssif; in ssif_probe()
1898 ssif_info->handlers.get_smi_info = get_smi_info; in ssif_probe()
1899 ssif_info->handlers.sender = sender; in ssif_probe()
1900 ssif_info->handlers.request_events = request_events; in ssif_probe()
1901 ssif_info->handlers.set_need_watch = ssif_set_need_watch; in ssif_probe()
1906 thread_num = ((i2c_adapter_id(ssif_info->client->adapter) in ssif_probe()
1908 ssif_info->client->addr); in ssif_probe()
1909 init_completion(&ssif_info->wake_thread); in ssif_probe()
1910 ssif_info->thread = kthread_run(ipmi_ssif_thread, ssif_info, in ssif_probe()
1912 if (IS_ERR(ssif_info->thread)) { in ssif_probe()
1913 rv = PTR_ERR(ssif_info->thread); in ssif_probe()
1914 dev_notice(&ssif_info->client->dev, in ssif_probe()
1921 dev_set_drvdata(&ssif_info->client->dev, ssif_info); in ssif_probe()
1922 rv = device_add_group(&ssif_info->client->dev, in ssif_probe()
1925 dev_err(&ssif_info->client->dev, in ssif_probe()
1931 rv = ipmi_register_smi(&ssif_info->handlers, in ssif_probe()
1932 ssif_info, in ssif_probe()
1933 &ssif_info->client->dev, in ssif_probe()
1936 dev_err(&ssif_info->client->dev, in ssif_probe()
1946 dev_err(&ssif_info->client->dev, in ssif_probe()
1949 kfree(ssif_info); in ssif_probe()
1956 device_remove_group(&ssif_info->client->dev, &ipmi_ssif_dev_attr_group); in ssif_probe()
1957 dev_set_drvdata(&ssif_info->client->dev, NULL); in ssif_probe()