mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 13:26:48 +07:00
1a59d1b8e0
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not write to the free software foundation inc 59 temple place suite 330 boston ma 02111 1307 usa extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 1334 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Richard Fontana <rfontana@redhat.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070033.113240726@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
87 lines
1.9 KiB
C
87 lines
1.9 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
/*
|
|
*
|
|
* Copyright (C) IBM Corporation, 2004
|
|
*
|
|
* Author: Max Asböck <amax@us.ibm.com>
|
|
*/
|
|
|
|
#include <linux/sched/signal.h>
|
|
#include "ibmasm.h"
|
|
#include "dot_command.h"
|
|
|
|
/*
|
|
* Reverse Heartbeat, i.e. heartbeats sent from the driver to the
|
|
* service processor.
|
|
* These heartbeats are initiated by user level programs.
|
|
*/
|
|
|
|
/* the reverse heartbeat dot command */
|
|
#pragma pack(1)
|
|
static struct {
|
|
struct dot_command_header header;
|
|
unsigned char command[3];
|
|
} rhb_dot_cmd = {
|
|
.header = {
|
|
.type = sp_read,
|
|
.command_size = 3,
|
|
.data_size = 0,
|
|
.status = 0
|
|
},
|
|
.command = { 4, 3, 6 }
|
|
};
|
|
#pragma pack()
|
|
|
|
void ibmasm_init_reverse_heartbeat(struct service_processor *sp, struct reverse_heartbeat *rhb)
|
|
{
|
|
init_waitqueue_head(&rhb->wait);
|
|
rhb->stopped = 0;
|
|
}
|
|
|
|
/**
|
|
* start_reverse_heartbeat
|
|
* Loop forever, sending a reverse heartbeat dot command to the service
|
|
* processor, then sleeping. The loop comes to an end if the service
|
|
* processor fails to respond 3 times or we were interrupted.
|
|
*/
|
|
int ibmasm_start_reverse_heartbeat(struct service_processor *sp, struct reverse_heartbeat *rhb)
|
|
{
|
|
struct command *cmd;
|
|
int times_failed = 0;
|
|
int result = 1;
|
|
|
|
cmd = ibmasm_new_command(sp, sizeof rhb_dot_cmd);
|
|
if (!cmd)
|
|
return -ENOMEM;
|
|
|
|
while (times_failed < 3) {
|
|
memcpy(cmd->buffer, (void *)&rhb_dot_cmd, sizeof rhb_dot_cmd);
|
|
cmd->status = IBMASM_CMD_PENDING;
|
|
ibmasm_exec_command(sp, cmd);
|
|
ibmasm_wait_for_response(cmd, IBMASM_CMD_TIMEOUT_NORMAL);
|
|
|
|
if (cmd->status != IBMASM_CMD_COMPLETE)
|
|
times_failed++;
|
|
|
|
wait_event_interruptible_timeout(rhb->wait,
|
|
rhb->stopped,
|
|
REVERSE_HEARTBEAT_TIMEOUT * HZ);
|
|
|
|
if (signal_pending(current) || rhb->stopped) {
|
|
result = -EINTR;
|
|
break;
|
|
}
|
|
}
|
|
command_put(cmd);
|
|
rhb->stopped = 0;
|
|
|
|
return result;
|
|
}
|
|
|
|
void ibmasm_stop_reverse_heartbeat(struct reverse_heartbeat *rhb)
|
|
{
|
|
rhb->stopped = 1;
|
|
wake_up_interruptible(&rhb->wait);
|
|
}
|