2019-10-25 23:12:44 +07:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
/*
|
|
|
|
* zfcp device driver
|
|
|
|
*
|
|
|
|
* Definitions for handling diagnostics in the the zfcp device driver.
|
|
|
|
*
|
|
|
|
* Copyright IBM Corp. 2018
|
|
|
|
*/
|
|
|
|
|
|
|
|
#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.
|
scsi: zfcp: introduce sysfs interface for diagnostics of local SFP transceiver
This adds an interface to read the diagnostics of the local SFP transceiver
of an FCP-Channel from userspace. This comes in the form of new sysfs
entries that are attached to the CCW device representing the FCP
device. Each type of data gets its own sysfs entry; the whole collection of
entries is pooled into a new child-directory of the CCW device node:
"diagnostics".
Adds sysfs entries for:
* sfp_invalid: boolean value evaluating to whether the following 5
fields are invalid; {0, 1}; 1 - invalid
* temperature: transceiver temp.; unit 1/256°C;
range [-128°C, +128°C]
* vcc: supply voltage; unit 100μV; range [0, 6.55V]
* tx_bias: transmitter laser bias current; unit 2μA;
range [0, 131mA]
* tx_power: coupled TX output power; unit 0.1μW; range [0, 6.5mW]
* rx_power: received optical power; unit 0.1μW; range [0, 6.5mW]
* optical_port: boolean value evaluating to whether the FCP-Channel has
an optical port; {0, 1}; 1 - optical
* fec_active: boolean value evaluating to whether 16G FEC is active;
{0, 1}; 1 - active
* port_tx_type: nibble describing the port type; {0, 1, 2, 3};
0 - unknown, 1 - short wave,
2 - long wave LC 1310nm, 3 - long wave LL 1550nm
* connector_type: two bits describing the connector type; {0, 1};
0 - unknown, 1 - SFP+
This is only supported if the FCP-Channel in turn supports reporting the
SFP Diagnostic Data, otherwise read() on these new entries will return
EOPNOTSUPP (this affects only adapters older than FICON Express8S, on
Mainframe generations older than z14). Other possible errors for read()
include ENOLINK, ENODEV and ENOMEM.
With this patch the userspace-interface will only read data stored in
the corresponding "diagnostic buffer" (that was stored during completion
of an previous Exchange Port Data command). Implicit updating will
follow later in this series.
Link: https://lore.kernel.org/r/1f9cce7c829c881e7d71a3f10c5b57f3dd84ab32.1572018132.git.bblock@linux.ibm.com
Reviewed-by: Steffen Maier <maier@linux.ibm.com>
Signed-off-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2019-10-25 23:12:47 +07:00
|
|
|
* @sysfs_established: flag showing that the associated sysfs-group was created
|
|
|
|
* during run of zfcp_adapter_enqueue().
|
2019-10-25 23:12:44 +07:00
|
|
|
* @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.
|
2019-10-25 23:12:45 +07:00
|
|
|
* @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.
|
2019-10-25 23:12:44 +07:00
|
|
|
*/
|
|
|
|
struct zfcp_diag_adapter {
|
scsi: zfcp: introduce sysfs interface for diagnostics of local SFP transceiver
This adds an interface to read the diagnostics of the local SFP transceiver
of an FCP-Channel from userspace. This comes in the form of new sysfs
entries that are attached to the CCW device representing the FCP
device. Each type of data gets its own sysfs entry; the whole collection of
entries is pooled into a new child-directory of the CCW device node:
"diagnostics".
Adds sysfs entries for:
* sfp_invalid: boolean value evaluating to whether the following 5
fields are invalid; {0, 1}; 1 - invalid
* temperature: transceiver temp.; unit 1/256°C;
range [-128°C, +128°C]
* vcc: supply voltage; unit 100μV; range [0, 6.55V]
* tx_bias: transmitter laser bias current; unit 2μA;
range [0, 131mA]
* tx_power: coupled TX output power; unit 0.1μW; range [0, 6.5mW]
* rx_power: received optical power; unit 0.1μW; range [0, 6.5mW]
* optical_port: boolean value evaluating to whether the FCP-Channel has
an optical port; {0, 1}; 1 - optical
* fec_active: boolean value evaluating to whether 16G FEC is active;
{0, 1}; 1 - active
* port_tx_type: nibble describing the port type; {0, 1, 2, 3};
0 - unknown, 1 - short wave,
2 - long wave LC 1310nm, 3 - long wave LL 1550nm
* connector_type: two bits describing the connector type; {0, 1};
0 - unknown, 1 - SFP+
This is only supported if the FCP-Channel in turn supports reporting the
SFP Diagnostic Data, otherwise read() on these new entries will return
EOPNOTSUPP (this affects only adapters older than FICON Express8S, on
Mainframe generations older than z14). Other possible errors for read()
include ENOLINK, ENODEV and ENOMEM.
With this patch the userspace-interface will only read data stored in
the corresponding "diagnostic buffer" (that was stored during completion
of an previous Exchange Port Data command). Implicit updating will
follow later in this series.
Link: https://lore.kernel.org/r/1f9cce7c829c881e7d71a3f10c5b57f3dd84ab32.1572018132.git.bblock@linux.ibm.com
Reviewed-by: Steffen Maier <maier@linux.ibm.com>
Signed-off-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2019-10-25 23:12:47 +07:00
|
|
|
u64 sysfs_established :1;
|
|
|
|
|
2019-10-25 23:12:44 +07:00
|
|
|
struct {
|
|
|
|
struct zfcp_diag_header header;
|
|
|
|
struct fsf_qtcb_bottom_port data;
|
|
|
|
} port_data;
|
2019-10-25 23:12:45 +07:00
|
|
|
struct {
|
|
|
|
struct zfcp_diag_header header;
|
|
|
|
struct fsf_qtcb_bottom_config data;
|
|
|
|
} config_data;
|
2019-10-25 23:12:44 +07:00
|
|
|
};
|
|
|
|
|
|
|
|
int zfcp_diag_adapter_setup(struct zfcp_adapter *const adapter);
|
|
|
|
void zfcp_diag_adapter_free(struct zfcp_adapter *const adapter);
|
|
|
|
|
scsi: zfcp: introduce sysfs interface for diagnostics of local SFP transceiver
This adds an interface to read the diagnostics of the local SFP transceiver
of an FCP-Channel from userspace. This comes in the form of new sysfs
entries that are attached to the CCW device representing the FCP
device. Each type of data gets its own sysfs entry; the whole collection of
entries is pooled into a new child-directory of the CCW device node:
"diagnostics".
Adds sysfs entries for:
* sfp_invalid: boolean value evaluating to whether the following 5
fields are invalid; {0, 1}; 1 - invalid
* temperature: transceiver temp.; unit 1/256°C;
range [-128°C, +128°C]
* vcc: supply voltage; unit 100μV; range [0, 6.55V]
* tx_bias: transmitter laser bias current; unit 2μA;
range [0, 131mA]
* tx_power: coupled TX output power; unit 0.1μW; range [0, 6.5mW]
* rx_power: received optical power; unit 0.1μW; range [0, 6.5mW]
* optical_port: boolean value evaluating to whether the FCP-Channel has
an optical port; {0, 1}; 1 - optical
* fec_active: boolean value evaluating to whether 16G FEC is active;
{0, 1}; 1 - active
* port_tx_type: nibble describing the port type; {0, 1, 2, 3};
0 - unknown, 1 - short wave,
2 - long wave LC 1310nm, 3 - long wave LL 1550nm
* connector_type: two bits describing the connector type; {0, 1};
0 - unknown, 1 - SFP+
This is only supported if the FCP-Channel in turn supports reporting the
SFP Diagnostic Data, otherwise read() on these new entries will return
EOPNOTSUPP (this affects only adapters older than FICON Express8S, on
Mainframe generations older than z14). Other possible errors for read()
include ENOLINK, ENODEV and ENOMEM.
With this patch the userspace-interface will only read data stored in
the corresponding "diagnostic buffer" (that was stored during completion
of an previous Exchange Port Data command). Implicit updating will
follow later in this series.
Link: https://lore.kernel.org/r/1f9cce7c829c881e7d71a3f10c5b57f3dd84ab32.1572018132.git.bblock@linux.ibm.com
Reviewed-by: Steffen Maier <maier@linux.ibm.com>
Signed-off-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2019-10-25 23:12:47 +07:00
|
|
|
int zfcp_diag_sysfs_setup(struct zfcp_adapter *const adapter);
|
|
|
|
void zfcp_diag_sysfs_destroy(struct zfcp_adapter *const adapter);
|
|
|
|
|
2019-10-25 23:12:44 +07:00
|
|
|
void zfcp_diag_update_xdata(struct zfcp_diag_header *const hdr,
|
|
|
|
const void *const data, const bool incomplete);
|
|
|
|
|
scsi: zfcp: introduce sysfs interface for diagnostics of local SFP transceiver
This adds an interface to read the diagnostics of the local SFP transceiver
of an FCP-Channel from userspace. This comes in the form of new sysfs
entries that are attached to the CCW device representing the FCP
device. Each type of data gets its own sysfs entry; the whole collection of
entries is pooled into a new child-directory of the CCW device node:
"diagnostics".
Adds sysfs entries for:
* sfp_invalid: boolean value evaluating to whether the following 5
fields are invalid; {0, 1}; 1 - invalid
* temperature: transceiver temp.; unit 1/256°C;
range [-128°C, +128°C]
* vcc: supply voltage; unit 100μV; range [0, 6.55V]
* tx_bias: transmitter laser bias current; unit 2μA;
range [0, 131mA]
* tx_power: coupled TX output power; unit 0.1μW; range [0, 6.5mW]
* rx_power: received optical power; unit 0.1μW; range [0, 6.5mW]
* optical_port: boolean value evaluating to whether the FCP-Channel has
an optical port; {0, 1}; 1 - optical
* fec_active: boolean value evaluating to whether 16G FEC is active;
{0, 1}; 1 - active
* port_tx_type: nibble describing the port type; {0, 1, 2, 3};
0 - unknown, 1 - short wave,
2 - long wave LC 1310nm, 3 - long wave LL 1550nm
* connector_type: two bits describing the connector type; {0, 1};
0 - unknown, 1 - SFP+
This is only supported if the FCP-Channel in turn supports reporting the
SFP Diagnostic Data, otherwise read() on these new entries will return
EOPNOTSUPP (this affects only adapters older than FICON Express8S, on
Mainframe generations older than z14). Other possible errors for read()
include ENOLINK, ENODEV and ENOMEM.
With this patch the userspace-interface will only read data stored in
the corresponding "diagnostic buffer" (that was stored during completion
of an previous Exchange Port Data command). Implicit updating will
follow later in this series.
Link: https://lore.kernel.org/r/1f9cce7c829c881e7d71a3f10c5b57f3dd84ab32.1572018132.git.bblock@linux.ibm.com
Reviewed-by: Steffen Maier <maier@linux.ibm.com>
Signed-off-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2019-10-25 23:12:47 +07:00
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
}
|
|
|
|
|
2019-10-25 23:12:44 +07:00
|
|
|
#endif /* ZFCP_DIAG_H */
|