[RFC PATCH ethtool-next 3/6] ethtool: Print CMIS Module State
From: Ido Schimmel <hidden>
Date: 2021-08-09 10:23:43
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Ido Schimmel <idosch@nvidia.com> Print the CMIS Module State when dumping EEPROM contents via the '-m' option. It can be used, for example, to test module low power mode settings. Example output: # ethtool -m swp11 Identifier : 0x18 (QSFP-DD Double Density 8X Pluggable Transceiver (INF-8628)) ... Module State : 0x03 (ModuleReady) # ethtool --set-module swp11 low-power on # ethtool -m swp11 Identifier : 0x18 (QSFP-DD Double Density 8X Pluggable Transceiver (INF-8628)) ... Module State : 0x01 (ModuleLowPwr) Signed-off-by: Ido Schimmel <idosch@nvidia.com> --- cmis.c | 35 +++++++++++++++++++++++++++++++++++ cmis.h | 8 ++++++++ 2 files changed, 43 insertions(+)
diff --git a/cmis.c b/cmis.c
index 361b721f332f..f09219fd889d 100644
--- a/cmis.c
+++ b/cmis.c@@ -42,6 +42,39 @@ static void cmis_show_rev_compliance(const __u8 *id) printf("\t%-41s : Rev. %d.%d\n", "Revision compliance", major, minor); } +/** + * Print the current Module State. Relevant documents: + * [1] CMIS Rev. 5, pag. 57, section 6.3.2.2, Figure 6-3 + * [2] CMIS Rev. 5, pag. 60, section 6.3.2.3, Figure 6-4 + * [3] CMIS Rev. 5, pag. 107, section 8.2.2, Table 8-6 + */ +static void cmis_show_mod_state(const __u8 *id) +{ + __u8 mod_state = (id[CMIS_MODULE_STATE_OFFSET] >> 1) & 0x07; + + printf("\t%-41s : 0x%02x", "Module State", mod_state); + switch (mod_state) { + case CMIS_MODULE_STATE_MODULE_LOW_PWR: + printf(" (ModuleLowPwr)\n"); + break; + case CMIS_MODULE_STATE_MODULE_PWR_UP: + printf(" (ModulePwrUp)\n"); + break; + case CMIS_MODULE_STATE_MODULE_READY: + printf(" (ModuleReady)\n"); + break; + case CMIS_MODULE_STATE_MODULE_PWR_DN: + printf(" (ModulePwrDn)\n"); + break; + case CMIS_MODULE_STATE_MODULE_FAULT: + printf(" (ModuleFault)\n"); + break; + default: + printf(" (reserved or unknown)\n"); + break; + } +} + /** * Print information about the device's power consumption. * Relevant documents:
@@ -336,6 +369,7 @@ void qsfp_dd_show_all(const __u8 *id) cmis_show_link_len(id); cmis_show_vendor_info(id); cmis_show_rev_compliance(id); + cmis_show_mod_state(id); } void cmis_show_all(const struct ethtool_module_eeprom *page_zero,
@@ -356,4 +390,5 @@ void cmis_show_all(const struct ethtool_module_eeprom *page_zero, cmis_show_vendor_info(page_zero_data); cmis_show_rev_compliance(page_zero_data); + cmis_show_mod_state(page_zero_data); }
diff --git a/cmis.h b/cmis.h
index 78ee1495bc33..197b70a2034d 100644
--- a/cmis.h
+++ b/cmis.h@@ -5,6 +5,14 @@ #define CMIS_ID_OFFSET 0x00 #define CMIS_REV_COMPLIANCE_OFFSET 0x01 +/* Module State (Page 0) */ +#define CMIS_MODULE_STATE_OFFSET 0x03 +#define CMIS_MODULE_STATE_MODULE_LOW_PWR 0x01 +#define CMIS_MODULE_STATE_MODULE_PWR_UP 0x02 +#define CMIS_MODULE_STATE_MODULE_READY 0x03 +#define CMIS_MODULE_STATE_MODULE_PWR_DN 0x04 +#define CMIS_MODULE_STATE_MODULE_FAULT 0x05 + #define CMIS_MODULE_TYPE_OFFSET 0x55 #define CMIS_MT_MMF 0x01 #define CMIS_MT_SMF 0x02
--
2.31.1