Blame SOURCES/0019-sff-8636-Use-memory-map-during-parsing.patch

89ea86
From 85023fa5dd7e79ce46a92ab567b4b675c3145775 Mon Sep 17 00:00:00 2001
89ea86
From: Ido Schimmel <idosch@nvidia.com>
89ea86
Date: Tue, 12 Oct 2021 16:25:18 +0300
89ea86
Subject: [PATCH 19/35] sff-8636: Use memory map during parsing
89ea86
89ea86
Instead of passing one large buffer to the individual parsing functions,
89ea86
use the memory map structure from the previous patch.
89ea86
89ea86
This has the added benefit of checking which optional pages are actually
89ea86
available and it will also allow us to consolidate the IOCTL and netlink
89ea86
parsing code paths.
89ea86
89ea86
Tested by making sure that there are no differences in output in both
89ea86
the IOCTL and netlink paths before and after the patch.
89ea86
89ea86
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
89ea86
---
89ea86
 qsfp.c | 368 +++++++++++++++++++++++++++++++--------------------------
89ea86
 1 file changed, 201 insertions(+), 167 deletions(-)
89ea86
89ea86
diff --git a/qsfp.c b/qsfp.c
89ea86
index 80000d40f6e8..354b3b1ce9ff 100644
89ea86
--- a/qsfp.c
89ea86
+++ b/qsfp.c
89ea86
@@ -205,20 +205,21 @@ static struct sff8636_aw_flags {
89ea86
 	{ NULL, 0, 0 },
89ea86
 };
89ea86
 
89ea86
-static void sff8636_show_identifier(const __u8 *id)
89ea86
+static void sff8636_show_identifier(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
-	sff8024_show_identifier(id, SFF8636_ID_OFFSET);
89ea86
+	sff8024_show_identifier(map->lower_memory, SFF8636_ID_OFFSET);
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_ext_identifier(const __u8 *id)
89ea86
+static void sff8636_show_ext_identifier(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
 	printf("\t%-41s : 0x%02x\n", "Extended identifier",
89ea86
-			id[SFF8636_EXT_ID_OFFSET]);
89ea86
+	       map->page_00h[SFF8636_EXT_ID_OFFSET]);
89ea86
 
89ea86
 	static const char *pfx =
89ea86
 		"\tExtended identifier description           :";
89ea86
 
89ea86
-	switch (id[SFF8636_EXT_ID_OFFSET] & SFF8636_EXT_ID_PWR_CLASS_MASK) {
89ea86
+	switch (map->page_00h[SFF8636_EXT_ID_OFFSET] &
89ea86
+		SFF8636_EXT_ID_PWR_CLASS_MASK) {
89ea86
 	case SFF8636_EXT_ID_PWR_CLASS_1:
89ea86
 		printf("%s 1.5W max. Power consumption\n", pfx);
89ea86
 		break;
89ea86
@@ -233,17 +234,18 @@ static void sff8636_show_ext_identifier(const __u8 *id)
89ea86
 		break;
89ea86
 	}
89ea86
 
89ea86
-	if (id[SFF8636_EXT_ID_OFFSET] & SFF8636_EXT_ID_CDR_TX_MASK)
89ea86
+	if (map->page_00h[SFF8636_EXT_ID_OFFSET] & SFF8636_EXT_ID_CDR_TX_MASK)
89ea86
 		printf("%s CDR present in TX,", pfx);
89ea86
 	else
89ea86
 		printf("%s No CDR in TX,", pfx);
89ea86
 
89ea86
-	if (id[SFF8636_EXT_ID_OFFSET] & SFF8636_EXT_ID_CDR_RX_MASK)
89ea86
+	if (map->page_00h[SFF8636_EXT_ID_OFFSET] & SFF8636_EXT_ID_CDR_RX_MASK)
89ea86
 		printf(" CDR present in RX\n");
89ea86
 	else
89ea86
 		printf(" No CDR in RX\n");
89ea86
 
89ea86
-	switch (id[SFF8636_EXT_ID_OFFSET] & SFF8636_EXT_ID_EPWR_CLASS_MASK) {
89ea86
+	switch (map->page_00h[SFF8636_EXT_ID_OFFSET] &
89ea86
+		SFF8636_EXT_ID_EPWR_CLASS_MASK) {
89ea86
 	case SFF8636_EXT_ID_PWR_CLASS_LEGACY:
89ea86
 		printf("%s", pfx);
89ea86
 		break;
89ea86
@@ -257,18 +259,19 @@ static void sff8636_show_ext_identifier(const __u8 *id)
89ea86
 		printf("%s 5.0W max. Power consumption, ", pfx);
89ea86
 		break;
89ea86
 	}
89ea86
-	if (id[SFF8636_PWR_MODE_OFFSET] & SFF8636_HIGH_PWR_ENABLE)
89ea86
+	if (map->lower_memory[SFF8636_PWR_MODE_OFFSET] &
89ea86
+	    SFF8636_HIGH_PWR_ENABLE)
89ea86
 		printf(" High Power Class (> 3.5 W) enabled\n");
89ea86
 	else
89ea86
 		printf(" High Power Class (> 3.5 W) not enabled\n");
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_connector(const __u8 *id)
89ea86
+static void sff8636_show_connector(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
-	sff8024_show_connector(id, SFF8636_CTOR_OFFSET);
89ea86
+	sff8024_show_connector(map->page_00h, SFF8636_CTOR_OFFSET);
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_transceiver(const __u8 *id)
89ea86
+static void sff8636_show_transceiver(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
 	static const char *pfx =
89ea86
 		"\tTransceiver type                          :";
89ea86
@@ -276,33 +279,41 @@ static void sff8636_show_transceiver(const __u8 *id)
89ea86
 	printf("\t%-41s : 0x%02x 0x%02x 0x%02x " \
89ea86
 			"0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
89ea86
 			"Transceiver codes",
89ea86
-			id[SFF8636_ETHERNET_COMP_OFFSET],
89ea86
-			id[SFF8636_SONET_COMP_OFFSET],
89ea86
-			id[SFF8636_SAS_COMP_OFFSET],
89ea86
-			id[SFF8636_GIGE_COMP_OFFSET],
89ea86
-			id[SFF8636_FC_LEN_OFFSET],
89ea86
-			id[SFF8636_FC_TECH_OFFSET],
89ea86
-			id[SFF8636_FC_TRANS_MEDIA_OFFSET],
89ea86
-			id[SFF8636_FC_SPEED_OFFSET]);
89ea86
+			map->page_00h[SFF8636_ETHERNET_COMP_OFFSET],
89ea86
+			map->page_00h[SFF8636_SONET_COMP_OFFSET],
89ea86
+			map->page_00h[SFF8636_SAS_COMP_OFFSET],
89ea86
+			map->page_00h[SFF8636_GIGE_COMP_OFFSET],
89ea86
+			map->page_00h[SFF8636_FC_LEN_OFFSET],
89ea86
+			map->page_00h[SFF8636_FC_TECH_OFFSET],
89ea86
+			map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET],
89ea86
+			map->page_00h[SFF8636_FC_SPEED_OFFSET]);
89ea86
 
89ea86
 	/* 10G/40G Ethernet Compliance Codes */
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_10G_LRM)
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_10G_LRM)
89ea86
 		printf("%s 10G Ethernet: 10G Base-LRM\n", pfx);
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_10G_LR)
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_10G_LR)
89ea86
 		printf("%s 10G Ethernet: 10G Base-LR\n", pfx);
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_10G_SR)
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_10G_SR)
89ea86
 		printf("%s 10G Ethernet: 10G Base-SR\n", pfx);
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_40G_CR4)
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_40G_CR4)
89ea86
 		printf("%s 40G Ethernet: 40G Base-CR4\n", pfx);
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_40G_SR4)
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_40G_SR4)
89ea86
 		printf("%s 40G Ethernet: 40G Base-SR4\n", pfx);
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_40G_LR4)
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_40G_LR4)
89ea86
 		printf("%s 40G Ethernet: 40G Base-LR4\n", pfx);
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_40G_ACTIVE)
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_40G_ACTIVE)
89ea86
 		printf("%s 40G Ethernet: 40G Active Cable (XLPPI)\n", pfx);
89ea86
 	/* Extended Specification Compliance Codes from SFF-8024 */
89ea86
-	if (id[SFF8636_ETHERNET_COMP_OFFSET] & SFF8636_ETHERNET_RSRVD) {
89ea86
-		switch (id[SFF8636_OPTION_1_OFFSET]) {
89ea86
+	if (map->page_00h[SFF8636_ETHERNET_COMP_OFFSET] &
89ea86
+	    SFF8636_ETHERNET_RSRVD) {
89ea86
+		switch (map->page_00h[SFF8636_OPTION_1_OFFSET]) {
89ea86
 		case SFF8636_ETHERNET_UNSPECIFIED:
89ea86
 			printf("%s (reserved or unknown)\n", pfx);
89ea86
 			break;
89ea86
@@ -493,113 +504,122 @@ static void sff8636_show_transceiver(const __u8 *id)
89ea86
 	}
89ea86
 
89ea86
 	/* SONET Compliance Codes */
89ea86
-	if (id[SFF8636_SONET_COMP_OFFSET] & (SFF8636_SONET_40G_OTN))
89ea86
+	if (map->page_00h[SFF8636_SONET_COMP_OFFSET] &
89ea86
+	    (SFF8636_SONET_40G_OTN))
89ea86
 		printf("%s 40G OTN (OTU3B/OTU3C)\n", pfx);
89ea86
-	if (id[SFF8636_SONET_COMP_OFFSET] & (SFF8636_SONET_OC48_LR))
89ea86
+	if (map->page_00h[SFF8636_SONET_COMP_OFFSET] & (SFF8636_SONET_OC48_LR))
89ea86
 		printf("%s SONET: OC-48, long reach\n", pfx);
89ea86
-	if (id[SFF8636_SONET_COMP_OFFSET] & (SFF8636_SONET_OC48_IR))
89ea86
+	if (map->page_00h[SFF8636_SONET_COMP_OFFSET] & (SFF8636_SONET_OC48_IR))
89ea86
 		printf("%s SONET: OC-48, intermediate reach\n", pfx);
89ea86
-	if (id[SFF8636_SONET_COMP_OFFSET] & (SFF8636_SONET_OC48_SR))
89ea86
+	if (map->page_00h[SFF8636_SONET_COMP_OFFSET] & (SFF8636_SONET_OC48_SR))
89ea86
 		printf("%s SONET: OC-48, short reach\n", pfx);
89ea86
 
89ea86
 	/* SAS/SATA Compliance Codes */
89ea86
-	if (id[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_6G))
89ea86
+	if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_6G))
89ea86
 		printf("%s SAS 6.0G\n", pfx);
89ea86
-	if (id[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_3G))
89ea86
+	if (map->page_00h[SFF8636_SAS_COMP_OFFSET] & (SFF8636_SAS_3G))
89ea86
 		printf("%s SAS 3.0G\n", pfx);
89ea86
 
89ea86
 	/* Ethernet Compliance Codes */
89ea86
-	if (id[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_T)
89ea86
+	if (map->page_00h[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_T)
89ea86
 		printf("%s Ethernet: 1000BASE-T\n", pfx);
89ea86
-	if (id[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_CX)
89ea86
+	if (map->page_00h[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_CX)
89ea86
 		printf("%s Ethernet: 1000BASE-CX\n", pfx);
89ea86
-	if (id[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_LX)
89ea86
+	if (map->page_00h[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_LX)
89ea86
 		printf("%s Ethernet: 1000BASE-LX\n", pfx);
89ea86
-	if (id[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_SX)
89ea86
+	if (map->page_00h[SFF8636_GIGE_COMP_OFFSET] & SFF8636_GIGE_1000_BASE_SX)
89ea86
 		printf("%s Ethernet: 1000BASE-SX\n", pfx);
89ea86
 
89ea86
 	/* Fibre Channel link length */
89ea86
-	if (id[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_VERY_LONG)
89ea86
+	if (map->page_00h[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_VERY_LONG)
89ea86
 		printf("%s FC: very long distance (V)\n", pfx);
89ea86
-	if (id[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_SHORT)
89ea86
+	if (map->page_00h[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_SHORT)
89ea86
 		printf("%s FC: short distance (S)\n", pfx);
89ea86
-	if (id[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_INT)
89ea86
+	if (map->page_00h[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_INT)
89ea86
 		printf("%s FC: intermediate distance (I)\n", pfx);
89ea86
-	if (id[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_LONG)
89ea86
+	if (map->page_00h[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_LONG)
89ea86
 		printf("%s FC: long distance (L)\n", pfx);
89ea86
-	if (id[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_MED)
89ea86
+	if (map->page_00h[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_LEN_MED)
89ea86
 		printf("%s FC: medium distance (M)\n", pfx);
89ea86
 
89ea86
 	/* Fibre Channel transmitter technology */
89ea86
-	if (id[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_TECH_LONG_LC)
89ea86
+	if (map->page_00h[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_TECH_LONG_LC)
89ea86
 		printf("%s FC: Longwave laser (LC)\n", pfx);
89ea86
-	if (id[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_TECH_ELEC_INTER)
89ea86
+	if (map->page_00h[SFF8636_FC_LEN_OFFSET] & SFF8636_FC_TECH_ELEC_INTER)
89ea86
 		printf("%s FC: Electrical inter-enclosure (EL)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TECH_OFFSET] & SFF8636_FC_TECH_ELEC_INTRA)
89ea86
+	if (map->page_00h[SFF8636_FC_TECH_OFFSET] & SFF8636_FC_TECH_ELEC_INTRA)
89ea86
 		printf("%s FC: Electrical intra-enclosure (EL)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TECH_OFFSET] & SFF8636_FC_TECH_SHORT_WO_OFC)
89ea86
+	if (map->page_00h[SFF8636_FC_TECH_OFFSET] &
89ea86
+	    SFF8636_FC_TECH_SHORT_WO_OFC)
89ea86
 		printf("%s FC: Shortwave laser w/o OFC (SN)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TECH_OFFSET] & SFF8636_FC_TECH_SHORT_W_OFC)
89ea86
+	if (map->page_00h[SFF8636_FC_TECH_OFFSET] & SFF8636_FC_TECH_SHORT_W_OFC)
89ea86
 		printf("%s FC: Shortwave laser with OFC (SL)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TECH_OFFSET] & SFF8636_FC_TECH_LONG_LL)
89ea86
+	if (map->page_00h[SFF8636_FC_TECH_OFFSET] & SFF8636_FC_TECH_LONG_LL)
89ea86
 		printf("%s FC: Longwave laser (LL)\n", pfx);
89ea86
 
89ea86
 	/* Fibre Channel transmission media */
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_TW)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_TW)
89ea86
 		printf("%s FC: Twin Axial Pair (TW)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_TP)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_TP)
89ea86
 		printf("%s FC: Twisted Pair (TP)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_MI)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_MI)
89ea86
 		printf("%s FC: Miniature Coax (MI)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_TV)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_TV)
89ea86
 		printf("%s FC: Video Coax (TV)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_M6)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_M6)
89ea86
 		printf("%s FC: Multimode, 62.5m (M6)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_M5)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_M5)
89ea86
 		printf("%s FC: Multimode, 50m (M5)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_OM3)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_OM3)
89ea86
 		printf("%s FC: Multimode, 50um (OM3)\n", pfx);
89ea86
-	if (id[SFF8636_FC_TRANS_MEDIA_OFFSET] & SFF8636_FC_TRANS_MEDIA_SM)
89ea86
+	if (map->page_00h[SFF8636_FC_TRANS_MEDIA_OFFSET] &
89ea86
+	    SFF8636_FC_TRANS_MEDIA_SM)
89ea86
 		printf("%s FC: Single Mode (SM)\n", pfx);
89ea86
 
89ea86
 	/* Fibre Channel speed */
89ea86
-	if (id[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_1200_MBPS)
89ea86
+	if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_1200_MBPS)
89ea86
 		printf("%s FC: 1200 MBytes/sec\n", pfx);
89ea86
-	if (id[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_800_MBPS)
89ea86
+	if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_800_MBPS)
89ea86
 		printf("%s FC: 800 MBytes/sec\n", pfx);
89ea86
-	if (id[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_1600_MBPS)
89ea86
+	if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_1600_MBPS)
89ea86
 		printf("%s FC: 1600 MBytes/sec\n", pfx);
89ea86
-	if (id[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_400_MBPS)
89ea86
+	if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_400_MBPS)
89ea86
 		printf("%s FC: 400 MBytes/sec\n", pfx);
89ea86
-	if (id[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_200_MBPS)
89ea86
+	if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_200_MBPS)
89ea86
 		printf("%s FC: 200 MBytes/sec\n", pfx);
89ea86
-	if (id[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_100_MBPS)
89ea86
+	if (map->page_00h[SFF8636_FC_SPEED_OFFSET] & SFF8636_FC_SPEED_100_MBPS)
89ea86
 		printf("%s FC: 100 MBytes/sec\n", pfx);
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_encoding(const __u8 *id)
89ea86
+static void sff8636_show_encoding(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
-	sff8024_show_encoding(id, SFF8636_ENCODING_OFFSET, ETH_MODULE_SFF_8636);
89ea86
+	sff8024_show_encoding(map->page_00h, SFF8636_ENCODING_OFFSET,
89ea86
+			      ETH_MODULE_SFF_8636);
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_rate_identifier(const __u8 *id)
89ea86
+static void sff8636_show_rate_identifier(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
 	/* TODO: Need to fix rate select logic */
89ea86
 	printf("\t%-41s : 0x%02x\n", "Rate identifier",
89ea86
-			id[SFF8636_EXT_RS_OFFSET]);
89ea86
+	       map->page_00h[SFF8636_EXT_RS_OFFSET]);
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_oui(const __u8 *id, int id_offset)
89ea86
-{
89ea86
-	sff8024_show_oui(id, id_offset);
89ea86
-}
89ea86
-
89ea86
-static void sff8636_show_wavelength_or_copper_compliance(const __u8 *id)
89ea86
+static void
89ea86
+sff8636_show_wavelength_or_copper_compliance(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
 	printf("\t%-41s : 0x%02x", "Transmitter technology",
89ea86
-		(id[SFF8636_DEVICE_TECH_OFFSET] & SFF8636_TRANS_TECH_MASK));
89ea86
+	       map->page_00h[SFF8636_DEVICE_TECH_OFFSET] &
89ea86
+	       SFF8636_TRANS_TECH_MASK);
89ea86
 
89ea86
-	switch (id[SFF8636_DEVICE_TECH_OFFSET] & SFF8636_TRANS_TECH_MASK) {
89ea86
+	switch (map->page_00h[SFF8636_DEVICE_TECH_OFFSET] &
89ea86
+		SFF8636_TRANS_TECH_MASK) {
89ea86
 	case SFF8636_TRANS_850_VCSEL:
89ea86
 		printf(" (850 nm VCSEL)\n");
89ea86
 		break;
89ea86
@@ -650,31 +670,26 @@ static void sff8636_show_wavelength_or_copper_compliance(const __u8 *id)
89ea86
 		break;
89ea86
 	}
89ea86
 
89ea86
-	if ((id[SFF8636_DEVICE_TECH_OFFSET] & SFF8636_TRANS_TECH_MASK)
89ea86
-			>= SFF8636_TRANS_COPPER_PAS_UNEQUAL) {
89ea86
+	if ((map->page_00h[SFF8636_DEVICE_TECH_OFFSET] &
89ea86
+	     SFF8636_TRANS_TECH_MASK) >= SFF8636_TRANS_COPPER_PAS_UNEQUAL) {
89ea86
 		printf("\t%-41s : %udb\n", "Attenuation at 2.5GHz",
89ea86
-			id[SFF8636_WAVELEN_HIGH_BYTE_OFFSET]);
89ea86
+			map->page_00h[SFF8636_WAVELEN_HIGH_BYTE_OFFSET]);
89ea86
 		printf("\t%-41s : %udb\n", "Attenuation at 5.0GHz",
89ea86
-			id[SFF8636_WAVELEN_LOW_BYTE_OFFSET]);
89ea86
+			map->page_00h[SFF8636_WAVELEN_LOW_BYTE_OFFSET]);
89ea86
 		printf("\t%-41s : %udb\n", "Attenuation at 7.0GHz",
89ea86
-			id[SFF8636_WAVE_TOL_HIGH_BYTE_OFFSET]);
89ea86
+			map->page_00h[SFF8636_WAVE_TOL_HIGH_BYTE_OFFSET]);
89ea86
 		printf("\t%-41s : %udb\n", "Attenuation at 12.9GHz",
89ea86
-			id[SFF8636_WAVE_TOL_LOW_BYTE_OFFSET]);
89ea86
+		       map->page_00h[SFF8636_WAVE_TOL_LOW_BYTE_OFFSET]);
89ea86
 	} else {
89ea86
 		printf("\t%-41s : %.3lfnm\n", "Laser wavelength",
89ea86
-			(((id[SFF8636_WAVELEN_HIGH_BYTE_OFFSET] << 8) |
89ea86
-				id[SFF8636_WAVELEN_LOW_BYTE_OFFSET])*0.05));
89ea86
+		       (((map->page_00h[SFF8636_WAVELEN_HIGH_BYTE_OFFSET] << 8) |
89ea86
+			 map->page_00h[SFF8636_WAVELEN_LOW_BYTE_OFFSET]) * 0.05));
89ea86
 		printf("\t%-41s : %.3lfnm\n", "Laser wavelength tolerance",
89ea86
-			(((id[SFF8636_WAVE_TOL_HIGH_BYTE_OFFSET] << 8) |
89ea86
-			id[SFF8636_WAVE_TOL_LOW_BYTE_OFFSET])*0.005));
89ea86
+		       (((map->page_00h[SFF8636_WAVE_TOL_HIGH_BYTE_OFFSET] << 8) |
89ea86
+			 map->page_00h[SFF8636_WAVE_TOL_LOW_BYTE_OFFSET]) * 0.005));
89ea86
 	}
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_revision_compliance(const __u8 *id)
89ea86
-{
89ea86
-	sff_show_revision_compliance(id, SFF8636_REV_COMPLIANCE_OFFSET);
89ea86
-}
89ea86
-
89ea86
 /*
89ea86
  * 2-byte internal temperature conversions:
89ea86
  * First byte is a signed 8-bit integer, which is the temp decimal part
89ea86
@@ -683,39 +698,65 @@ static void sff8636_show_revision_compliance(const __u8 *id)
89ea86
 #define SFF8636_OFFSET_TO_TEMP(offset) ((__s16)OFFSET_TO_U16(offset))
89ea86
 #define OFFSET_TO_U16_PTR(ptr, offset) (ptr[offset] << 8 | ptr[(offset) + 1])
89ea86
 
89ea86
-static void sff8636_dom_parse(const __u8 *id, const __u8 *page_three, struct sff_diags *sd)
89ea86
+static void sff8636_dom_parse(const struct sff8636_memory_map *map,
89ea86
+			      struct sff_diags *sd)
89ea86
 {
89ea86
+	const __u8 *id = map->lower_memory;
89ea86
 	int i = 0;
89ea86
 
89ea86
 	/* Monitoring Thresholds for Alarms and Warnings */
89ea86
 	sd->sfp_voltage[MCURR] = OFFSET_TO_U16_PTR(id, SFF8636_VCC_CURR);
89ea86
-	sd->sfp_voltage[HALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_VCC_HALRM);
89ea86
-	sd->sfp_voltage[LALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_VCC_LALRM);
89ea86
-	sd->sfp_voltage[HWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_VCC_HWARN);
89ea86
-	sd->sfp_voltage[LWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_VCC_LWARN);
89ea86
-
89ea86
 	sd->sfp_temp[MCURR] = SFF8636_OFFSET_TO_TEMP(SFF8636_TEMP_CURR);
89ea86
-	sd->sfp_temp[HALRM] = (__s16)OFFSET_TO_U16_PTR(page_three, SFF8636_TEMP_HALRM);
89ea86
-	sd->sfp_temp[LALRM] = (__s16)OFFSET_TO_U16_PTR(page_three, SFF8636_TEMP_LALRM);
89ea86
-	sd->sfp_temp[HWARN] = (__s16)OFFSET_TO_U16_PTR(page_three, SFF8636_TEMP_HWARN);
89ea86
-	sd->sfp_temp[LWARN] = (__s16)OFFSET_TO_U16_PTR(page_three, SFF8636_TEMP_LWARN);
89ea86
-
89ea86
-	sd->bias_cur[HALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_BIAS_HALRM);
89ea86
-	sd->bias_cur[LALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_BIAS_LALRM);
89ea86
-	sd->bias_cur[HWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_BIAS_HWARN);
89ea86
-	sd->bias_cur[LWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_BIAS_LWARN);
89ea86
-
89ea86
-	sd->tx_power[HALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_PWR_HALRM);
89ea86
-	sd->tx_power[LALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_PWR_LALRM);
89ea86
-	sd->tx_power[HWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_PWR_HWARN);
89ea86
-	sd->tx_power[LWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_TX_PWR_LWARN);
89ea86
-
89ea86
-	sd->rx_power[HALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_RX_PWR_HALRM);
89ea86
-	sd->rx_power[LALRM] = OFFSET_TO_U16_PTR(page_three, SFF8636_RX_PWR_LALRM);
89ea86
-	sd->rx_power[HWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_RX_PWR_HWARN);
89ea86
-	sd->rx_power[LWARN] = OFFSET_TO_U16_PTR(page_three, SFF8636_RX_PWR_LWARN);
89ea86
-
89ea86
 
89ea86
+	if (!map->page_03h)
89ea86
+		goto out;
89ea86
+
89ea86
+	sd->sfp_voltage[HALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						   SFF8636_VCC_HALRM);
89ea86
+	sd->sfp_voltage[LALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						   SFF8636_VCC_LALRM);
89ea86
+	sd->sfp_voltage[HWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						   SFF8636_VCC_HWARN);
89ea86
+	sd->sfp_voltage[LWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						   SFF8636_VCC_LWARN);
89ea86
+
89ea86
+	sd->sfp_temp[HALRM] = (__s16)OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						       SFF8636_TEMP_HALRM);
89ea86
+	sd->sfp_temp[LALRM] = (__s16)OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						       SFF8636_TEMP_LALRM);
89ea86
+	sd->sfp_temp[HWARN] = (__s16)OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						       SFF8636_TEMP_HWARN);
89ea86
+	sd->sfp_temp[LWARN] = (__s16)OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						       SFF8636_TEMP_LWARN);
89ea86
+
89ea86
+	sd->bias_cur[HALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_BIAS_HALRM);
89ea86
+	sd->bias_cur[LALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_BIAS_LALRM);
89ea86
+	sd->bias_cur[HWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_BIAS_HWARN);
89ea86
+	sd->bias_cur[LWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_BIAS_LWARN);
89ea86
+
89ea86
+	sd->tx_power[HALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_PWR_HALRM);
89ea86
+	sd->tx_power[LALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_PWR_LALRM);
89ea86
+	sd->tx_power[HWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_PWR_HWARN);
89ea86
+	sd->tx_power[LWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_TX_PWR_LWARN);
89ea86
+
89ea86
+	sd->rx_power[HALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_RX_PWR_HALRM);
89ea86
+	sd->rx_power[LALRM] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_RX_PWR_LALRM);
89ea86
+	sd->rx_power[HWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_RX_PWR_HWARN);
89ea86
+	sd->rx_power[LWARN] = OFFSET_TO_U16_PTR(map->page_03h,
89ea86
+						SFF8636_RX_PWR_LWARN);
89ea86
+
89ea86
+out:
89ea86
 	/* Channel Specific Data */
89ea86
 	for (i = 0; i < MAX_CHANNEL_NUM; i++) {
89ea86
 		u8 rx_power_offset, tx_bias_offset;
89ea86
@@ -749,7 +790,7 @@ static void sff8636_dom_parse(const __u8 *id, const __u8 *page_three, struct sff
89ea86
 	}
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_dom(const __u8 *id, const __u8 *page_three, __u32 eeprom_len)
89ea86
+static void sff8636_show_dom(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
 	struct sff_diags sd = {0};
89ea86
 	char *rx_power_string = NULL;
89ea86
@@ -763,20 +804,15 @@ static void sff8636_show_dom(const __u8 *id, const __u8 *page_three, __u32 eepro
89ea86
 	 * and thresholds
89ea86
 	 * If pagging support exists, then supports_alarms is marked as 1
89ea86
 	 */
89ea86
+	if (map->page_03h)
89ea86
+		sd.supports_alarms = 1;
89ea86
 
89ea86
-	if (eeprom_len == ETH_MODULE_SFF_8636_MAX_LEN) {
89ea86
-		if (!(id[SFF8636_STATUS_2_OFFSET] &
89ea86
-					SFF8636_STATUS_PAGE_3_PRESENT)) {
89ea86
-			sd.supports_alarms = 1;
89ea86
-		}
89ea86
-	}
89ea86
+	sd.rx_power_type = map->page_00h[SFF8636_DIAG_TYPE_OFFSET] &
89ea86
+			   SFF8636_RX_PWR_TYPE_MASK;
89ea86
+	sd.tx_power_type = map->page_00h[SFF8636_DIAG_TYPE_OFFSET] &
89ea86
+			   SFF8636_RX_PWR_TYPE_MASK;
89ea86
 
89ea86
-	sd.rx_power_type = id[SFF8636_DIAG_TYPE_OFFSET] &
89ea86
-						SFF8636_RX_PWR_TYPE_MASK;
89ea86
-	sd.tx_power_type = id[SFF8636_DIAG_TYPE_OFFSET] &
89ea86
-						SFF8636_RX_PWR_TYPE_MASK;
89ea86
-
89ea86
-	sff8636_dom_parse(id, page_three, &sd);
89ea86
+	sff8636_dom_parse(map, &sd);
89ea86
 
89ea86
 	PRINT_TEMP("Module temperature", sd.sfp_temp[MCURR]);
89ea86
 	PRINT_VCC("Module voltage", sd.sfp_voltage[MCURR]);
89ea86
@@ -819,7 +855,7 @@ static void sff8636_show_dom(const __u8 *id, const __u8 *page_three, __u32 eepro
89ea86
 	if (sd.supports_alarms) {
89ea86
 		for (i = 0; sff8636_aw_flags[i].str; ++i) {
89ea86
 			printf("\t%-41s : %s\n", sff8636_aw_flags[i].str,
89ea86
-			       id[sff8636_aw_flags[i].offset]
89ea86
+			       map->lower_memory[sff8636_aw_flags[i].offset]
89ea86
 			       & sff8636_aw_flags[i].value ? "On" : "Off");
89ea86
 		}
89ea86
 
89ea86
@@ -827,39 +863,39 @@ static void sff8636_show_dom(const __u8 *id, const __u8 *page_three, __u32 eepro
89ea86
 	}
89ea86
 }
89ea86
 
89ea86
-static void sff8636_show_page_zero(const __u8 *id)
89ea86
+static void sff8636_show_page_zero(const struct sff8636_memory_map *map)
89ea86
 {
89ea86
-	sff8636_show_ext_identifier(id);
89ea86
-	sff8636_show_connector(id);
89ea86
-	sff8636_show_transceiver(id);
89ea86
-	sff8636_show_encoding(id);
89ea86
-	sff_show_value_with_unit(id, SFF8636_BR_NOMINAL_OFFSET,
89ea86
-			"BR, Nominal", 100, "Mbps");
89ea86
-	sff8636_show_rate_identifier(id);
89ea86
-	sff_show_value_with_unit(id, SFF8636_SM_LEN_OFFSET,
89ea86
-		     "Length (SMF,km)", 1, "km");
89ea86
-	sff_show_value_with_unit(id, SFF8636_OM3_LEN_OFFSET,
89ea86
-			"Length (OM3 50um)", 2, "m");
89ea86
-	sff_show_value_with_unit(id, SFF8636_OM2_LEN_OFFSET,
89ea86
-			"Length (OM2 50um)", 1, "m");
89ea86
-	sff_show_value_with_unit(id, SFF8636_OM1_LEN_OFFSET,
89ea86
-		     "Length (OM1 62.5um)", 1, "m");
89ea86
-	sff_show_value_with_unit(id, SFF8636_CBL_LEN_OFFSET,
89ea86
-		     "Length (Copper or Active cable)", 1, "m");
89ea86
-	sff8636_show_wavelength_or_copper_compliance(id);
89ea86
-	sff_show_ascii(id, SFF8636_VENDOR_NAME_START_OFFSET,
89ea86
+	sff8636_show_ext_identifier(map);
89ea86
+	sff8636_show_connector(map);
89ea86
+	sff8636_show_transceiver(map);
89ea86
+	sff8636_show_encoding(map);
89ea86
+	sff_show_value_with_unit(map->page_00h, SFF8636_BR_NOMINAL_OFFSET,
89ea86
+				 "BR, Nominal", 100, "Mbps");
89ea86
+	sff8636_show_rate_identifier(map);
89ea86
+	sff_show_value_with_unit(map->page_00h, SFF8636_SM_LEN_OFFSET,
89ea86
+				 "Length (SMF,km)", 1, "km");
89ea86
+	sff_show_value_with_unit(map->page_00h, SFF8636_OM3_LEN_OFFSET,
89ea86
+				 "Length (OM3 50um)", 2, "m");
89ea86
+	sff_show_value_with_unit(map->page_00h, SFF8636_OM2_LEN_OFFSET,
89ea86
+				 "Length (OM2 50um)", 1, "m");
89ea86
+	sff_show_value_with_unit(map->page_00h, SFF8636_OM1_LEN_OFFSET,
89ea86
+				 "Length (OM1 62.5um)", 1, "m");
89ea86
+	sff_show_value_with_unit(map->page_00h, SFF8636_CBL_LEN_OFFSET,
89ea86
+				 "Length (Copper or Active cable)", 1, "m");
89ea86
+	sff8636_show_wavelength_or_copper_compliance(map);
89ea86
+	sff_show_ascii(map->page_00h, SFF8636_VENDOR_NAME_START_OFFSET,
89ea86
 		       SFF8636_VENDOR_NAME_END_OFFSET, "Vendor name");
89ea86
-	sff8636_show_oui(id, SFF8636_VENDOR_OUI_OFFSET);
89ea86
-	sff_show_ascii(id, SFF8636_VENDOR_PN_START_OFFSET,
89ea86
+	sff8024_show_oui(map->page_00h, SFF8636_VENDOR_OUI_OFFSET);
89ea86
+	sff_show_ascii(map->page_00h, SFF8636_VENDOR_PN_START_OFFSET,
89ea86
 		       SFF8636_VENDOR_PN_END_OFFSET, "Vendor PN");
89ea86
-	sff_show_ascii(id, SFF8636_VENDOR_REV_START_OFFSET,
89ea86
+	sff_show_ascii(map->page_00h, SFF8636_VENDOR_REV_START_OFFSET,
89ea86
 		       SFF8636_VENDOR_REV_END_OFFSET, "Vendor rev");
89ea86
-	sff_show_ascii(id, SFF8636_VENDOR_SN_START_OFFSET,
89ea86
+	sff_show_ascii(map->page_00h, SFF8636_VENDOR_SN_START_OFFSET,
89ea86
 		       SFF8636_VENDOR_SN_END_OFFSET, "Vendor SN");
89ea86
-	sff_show_ascii(id, SFF8636_DATE_YEAR_OFFSET,
89ea86
+	sff_show_ascii(map->page_00h, SFF8636_DATE_YEAR_OFFSET,
89ea86
 		       SFF8636_DATE_VENDOR_LOT_OFFSET + 1, "Date code");
89ea86
-	sff8636_show_revision_compliance(id);
89ea86
-
89ea86
+	sff_show_revision_compliance(map->lower_memory,
89ea86
+				     SFF8636_REV_COMPLIANCE_OFFSET);
89ea86
 }
89ea86
 
89ea86
 static void sff8636_memory_map_init_buf(struct sff8636_memory_map *map,
89ea86
@@ -896,13 +932,13 @@ void sff8636_show_all_ioctl(const __u8 *id, __u32 eeprom_len)
89ea86
 
89ea86
 	sff8636_memory_map_init_buf(&map, id, eeprom_len);
89ea86
 
89ea86
-	sff8636_show_identifier(id);
89ea86
-	switch (id[SFF8636_ID_OFFSET]) {
89ea86
+	sff8636_show_identifier(&map);
89ea86
+	switch (map.lower_memory[SFF8636_ID_OFFSET]) {
89ea86
 	case SFF8024_ID_QSFP:
89ea86
 	case SFF8024_ID_QSFP_PLUS:
89ea86
 	case SFF8024_ID_QSFP28:
89ea86
-		sff8636_show_page_zero(id);
89ea86
-		sff8636_show_dom(id, id + 3 * 0x80, eeprom_len);
89ea86
+		sff8636_show_page_zero(&map);
89ea86
+		sff8636_show_dom(&map);
89ea86
 		break;
89ea86
 	}
89ea86
 }
89ea86
@@ -939,9 +975,7 @@ void sff8636_show_all_nl(const struct ethtool_module_eeprom *page_zero,
89ea86
 
89ea86
 	sff8636_memory_map_init_pages(&map, page_zero, page_three);
89ea86
 
89ea86
-	sff8636_show_identifier(page_zero->data);
89ea86
-	sff8636_show_page_zero(page_zero->data);
89ea86
-	if (page_three)
89ea86
-		sff8636_show_dom(page_zero->data, page_three->data - 0x80,
89ea86
-				 ETH_MODULE_SFF_8636_MAX_LEN);
89ea86
+	sff8636_show_identifier(&map);
89ea86
+	sff8636_show_page_zero(&map);
89ea86
+	sff8636_show_dom(&map);
89ea86
 }
89ea86
-- 
89ea86
2.35.1
89ea86