Files
s390-tools/opticsmon/optics_info.h
Niklas Schnelle c34adb9cab opticsmon: Introduce opticsmon tool
The optics monitoring tool opticsmon implements the user-space portion
of reporting optics data to the SE. Its basic functionality is to
collect optical module information equivalent to "ethtool --module-info"
for PCI Physical Functions and forwards this data to the SE using the
new SCLP Write Event Data Action Qualifier 3.

For the part of finding all PFs we need to look at all PCI
functions and determine which ones are PFs and what netdevs they
correspond to. This is a generally useful functionality so this part as
well as the SCLP issuing code go into a new libzpci library which also
includes a standalone example for listing PCI functions and their s390x
specific attributes. Medium term we plan to add this functionality to
lszdev.

For the opticsmon tool itself there are 2 basic operating modes:

* One-shot Mode: Without parameters opticsmon collects optical module
  data and prints a summary of the netdevice in JSON format. With
  --module-data it also includes a base64 encoded raw dump equivalent to
  ethtool --module-info <netdev> raw on.
* Monitor Mode: With the --monitor flag opticsmon runs continuously
  usually started via a systemd unit and collects new optical module
  data on a time interval (default 24h) or when the operational state
  ("/sys/class/net/<netdev/operstate") changes. The tool listens for
  changes via netlink so no polling on sysfs is necessary

Note: Both modes will *NOT* issues SCLPs without adding the
--send-report flag but will output a JSON summary for each data
collection so can be tested without firmware impact.

Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
2024-12-06 10:57:34 +01:00

50 lines
1.2 KiB
C

#pragma once
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>
#define SFF8079_I2C_ADDRESS_LOW 0x50
#define SFF8079_I2C_ADDRESS_HIGH 0x51
#define SFF8472_DIAGNOSTICS_TYPE_OFFSET 0x5C
#define SFF8472_DIAGNOSTICS_TYPE_MASK (1 << 6)
#define SFF8636_PAGE_SIZE 0x80
#define SFF8636_QSFP28_LENGTH 0x100
#define SFF8636_STATUS_2_OFFSET 0x02
#define SFF8636_STATUS_FLAT_MEM (1 << 2)
#define SFF8636_PAGE_OFFSET 0xC3
#define SFF8636_P01H (1 << 6)
#define SFF8636_P02H (1 << 7)
enum optics_type {
OPTICS_TYPE_UNKNOWN = 0x0, /* Unknown or unsupported */
OPTICS_TYPE_SFP = 0x3, /* SFP/SFP+/SFP28 and later with SFF-8472 management interface */
OPTICS_TYPE_QSFP28 = 0x11 /* QSFP28 (SFF-8665 et al.)*/
};
enum optics_los {
OPTICS_NO_LOS = 0x0,
OPTICS_LOS = 0x1,
OPTICS_UNKNOWN_LOS = 0x2,
OPTICS_UNAVAILABLE_LOS = 0x3,
};
struct optics {
size_t size;
uint8_t *raw;
};
enum optics_type optics_type(struct optics *oi);
const char *optics_type_str(enum optics_type type);
const char *optics_los_str(enum optics_los los);
enum optics_los optics_rx_los(struct optics *oi);
enum optics_los optics_tx_los(struct optics *oi);
enum optics_los optics_tx_fault(struct optics *oi);
void optics_free(struct optics *oi);