xref: /OK3568_Linux_fs/kernel/drivers/s390/scsi/zfcp_diag.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * zfcp device driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Definitions for handling diagnostics in the the zfcp device driver.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright IBM Corp. 2018, 2020
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef ZFCP_DIAG_H
11*4882a593Smuzhiyun #define ZFCP_DIAG_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/spinlock.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include "zfcp_fsf.h"
16*4882a593Smuzhiyun #include "zfcp_def.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /**
19*4882a593Smuzhiyun  * struct zfcp_diag_header - general part of a diagnostic buffer.
20*4882a593Smuzhiyun  * @access_lock: lock protecting all the data in this buffer.
21*4882a593Smuzhiyun  * @updating: flag showing that an update for this buffer is currently running.
22*4882a593Smuzhiyun  * @incomplete: flag showing that the data in @buffer is incomplete.
23*4882a593Smuzhiyun  * @timestamp: time in jiffies when the data of this buffer was last captured.
24*4882a593Smuzhiyun  * @buffer: implementation-depending data of this buffer
25*4882a593Smuzhiyun  * @buffer_size: size of @buffer
26*4882a593Smuzhiyun  */
27*4882a593Smuzhiyun struct zfcp_diag_header {
28*4882a593Smuzhiyun 	spinlock_t	access_lock;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	/* Flags */
31*4882a593Smuzhiyun 	u64		updating	:1;
32*4882a593Smuzhiyun 	u64		incomplete	:1;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	unsigned long	timestamp;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	void		*buffer;
37*4882a593Smuzhiyun 	size_t		buffer_size;
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /**
41*4882a593Smuzhiyun  * struct zfcp_diag_adapter - central storage for all diagnostics concerning an
42*4882a593Smuzhiyun  *			      adapter.
43*4882a593Smuzhiyun  * @sysfs_established: flag showing that the associated sysfs-group was created
44*4882a593Smuzhiyun  *		       during run of zfcp_adapter_enqueue().
45*4882a593Smuzhiyun  * @max_age: maximum age of data in diagnostic buffers before they need to be
46*4882a593Smuzhiyun  *	     refreshed (in ms).
47*4882a593Smuzhiyun  * @port_data: data retrieved using exchange port data.
48*4882a593Smuzhiyun  * @port_data.header: header with metadata for the cache in @port_data.data.
49*4882a593Smuzhiyun  * @port_data.data: cached QTCB Bottom of command exchange port data.
50*4882a593Smuzhiyun  * @config_data: data retrieved using exchange config data.
51*4882a593Smuzhiyun  * @config_data.header: header with metadata for the cache in @config_data.data.
52*4882a593Smuzhiyun  * @config_data.data: cached QTCB Bottom of command exchange config data.
53*4882a593Smuzhiyun  */
54*4882a593Smuzhiyun struct zfcp_diag_adapter {
55*4882a593Smuzhiyun 	u64	sysfs_established	:1;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	unsigned long	max_age;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	struct zfcp_diag_adapter_port_data {
60*4882a593Smuzhiyun 		struct zfcp_diag_header		header;
61*4882a593Smuzhiyun 		struct fsf_qtcb_bottom_port	data;
62*4882a593Smuzhiyun 	} port_data;
63*4882a593Smuzhiyun 	struct zfcp_diag_adapter_config_data {
64*4882a593Smuzhiyun 		struct zfcp_diag_header		header;
65*4882a593Smuzhiyun 		struct fsf_qtcb_bottom_config	data;
66*4882a593Smuzhiyun 	} config_data;
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun int zfcp_diag_adapter_setup(struct zfcp_adapter *const adapter);
70*4882a593Smuzhiyun void zfcp_diag_adapter_free(struct zfcp_adapter *const adapter);
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun int zfcp_diag_sysfs_setup(struct zfcp_adapter *const adapter);
73*4882a593Smuzhiyun void zfcp_diag_sysfs_destroy(struct zfcp_adapter *const adapter);
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun void zfcp_diag_update_xdata(struct zfcp_diag_header *const hdr,
76*4882a593Smuzhiyun 			    const void *const data, const bool incomplete);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /*
79*4882a593Smuzhiyun  * Function-Type used in zfcp_diag_update_buffer_limited() for the function
80*4882a593Smuzhiyun  * that does the buffer-implementation dependent work.
81*4882a593Smuzhiyun  */
82*4882a593Smuzhiyun typedef int (*zfcp_diag_update_buffer_func)(struct zfcp_adapter *const adapter);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun int zfcp_diag_update_config_data_buffer(struct zfcp_adapter *const adapter);
85*4882a593Smuzhiyun int zfcp_diag_update_port_data_buffer(struct zfcp_adapter *const adapter);
86*4882a593Smuzhiyun int zfcp_diag_update_buffer_limited(struct zfcp_adapter *const adapter,
87*4882a593Smuzhiyun 				    struct zfcp_diag_header *const hdr,
88*4882a593Smuzhiyun 				    zfcp_diag_update_buffer_func buffer_update);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /**
91*4882a593Smuzhiyun  * zfcp_diag_support_sfp() - Return %true if the @adapter supports reporting
92*4882a593Smuzhiyun  *			     SFP Data.
93*4882a593Smuzhiyun  * @adapter: adapter to test the availability of SFP Data reporting for.
94*4882a593Smuzhiyun  */
95*4882a593Smuzhiyun static inline bool
zfcp_diag_support_sfp(const struct zfcp_adapter * const adapter)96*4882a593Smuzhiyun zfcp_diag_support_sfp(const struct zfcp_adapter *const adapter)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun 	return !!(adapter->adapter_features & FSF_FEATURE_REPORT_SFP_DATA);
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #endif /* ZFCP_DIAG_H */
102