/* SPDX-License-Identifier: GPL-2.0 */
/*
 * zfcp device driver
 *
 * Definitions for handling diagnostics in the the zfcp device driver.
 *
 * Copyright IBM Corp. 2018, 2020
 */

#ifndef ZFCP_DIAG_H
#define ZFCP_DIAG_H

#include <linux/spinlock.h>

#include "zfcp_fsf.h"
#include "zfcp_def.h"

/**
 * struct zfcp_diag_header - general part of a diagnostic buffer.
 * @access_lock: lock protecting all the data in this buffer.
 * @updating: flag showing that an update for this buffer is currently running.
 * @incomplete: flag showing that the data in @buffer is incomplete.
 * @timestamp: time in jiffies when the data of this buffer was last captured.
 * @buffer: implementation-depending data of this buffer
 * @buffer_size: size of @buffer
 */
struct zfcp_diag_header {
	spinlock_t	access_lock;

	/* Flags */
	u64		updating	:1;
	u64		incomplete	:1;

	unsigned long	timestamp;

	void		*buffer;
	size_t		buffer_size;
};

/**
 * struct zfcp_diag_adapter - central storage for all diagnostics concerning an
 *			      adapter.
 * @sysfs_established: flag showing that the associated sysfs-group was created
 *		       during run of zfcp_adapter_enqueue().
 * @max_age: maximum age of data in diagnostic buffers before they need to be
 *	     refreshed (in ms).
 * @port_data: data retrieved using exchange port data.
 * @port_data.header: header with metadata for the cache in @port_data.data.
 * @port_data.data: cached QTCB Bottom of command exchange port data.
 * @config_data: data retrieved using exchange config data.
 * @config_data.header: header with metadata for the cache in @config_data.data.
 * @config_data.data: cached QTCB Bottom of command exchange config data.
 */
struct zfcp_diag_adapter {
	u64	sysfs_established	:1;

	unsigned long	max_age;

	struct zfcp_diag_adapter_port_data {
		struct zfcp_diag_header		header;
		struct fsf_qtcb_bottom_port	data;
	} port_data;
	struct zfcp_diag_adapter_config_data {
		struct zfcp_diag_header		header;
		struct fsf_qtcb_bottom_config	data;
	} config_data;
};

int zfcp_diag_adapter_setup(struct zfcp_adapter *const adapter);
void zfcp_diag_adapter_free(struct zfcp_adapter *const adapter);

int zfcp_diag_sysfs_setup(struct zfcp_adapter *const adapter);
void zfcp_diag_sysfs_destroy(struct zfcp_adapter *const adapter);

void zfcp_diag_update_xdata(struct zfcp_diag_header *const hdr,
			    const void *const data, const bool incomplete);

/*
 * Function-Type used in zfcp_diag_update_buffer_limited() for the function
 * that does the buffer-implementation dependent work.
 */
typedef int (*zfcp_diag_update_buffer_func)(struct zfcp_adapter *const adapter);

int zfcp_diag_update_config_data_buffer(struct zfcp_adapter *const adapter);
int zfcp_diag_update_port_data_buffer(struct zfcp_adapter *const adapter);
int zfcp_diag_update_buffer_limited(struct zfcp_adapter *const adapter,
				    struct zfcp_diag_header *const hdr,
				    zfcp_diag_update_buffer_func buffer_update);

/**
 * zfcp_diag_support_sfp() - Return %true if the @adapter supports reporting
 *			     SFP Data.
 * @adapter: adapter to test the availability of SFP Data reporting for.
 */
static inline bool
zfcp_diag_support_sfp(const struct zfcp_adapter *const adapter)
{
	return !!(adapter->adapter_features & FSF_FEATURE_REPORT_SFP_DATA);
}

#endif /* ZFCP_DIAG_H */
