Merge branch 'mlxsw-core-extend-qsfp-eeprom-size'
Ido Schimmel says:
====================
Vadim says:
This patch set extends the size of QSFP EEPROM for the cable types
SSF-8436 and SFF-8636 from 256 bytes to 640 bytes. This allows ethtool
to show correct information for these cable types (more details below).
Patch #1 adds a macro that computes the EEPROM page number from the
provided offset specified in the request.
Patch #2 teaches the driver to access the information stored in the
upper pages of the QSFP memory map.
Details and examples:
SFF-8436 specification defines pages 0, 1, 2 and 3. Page 0 contains
lower memory page offsets (from 0x00 to 0x7f) and upper page offsets
(from 0x80 to 0xfe). Upper pages 1, 2 and 3 are optional and can be
empty.
Page 1 is provided if upper page 0 byte 0xc3 bit 6 is set.
Page 2 is provided if upper page 0 byte 0xc3 bit 7 is set.
Page 3 is provided if lower page 0 byte 0x02 bit 2 is cleared.
Offset 0xc3 for the upper page is provided as 0x43 = 0xc3 - 0x80.
As a result of exposing 256 bytes only, ethtool shows wrong information
for pages 1, 2 and 3. In the below hex dump from ethtool for a cable
compliant to SFF-8636 specification, it can be seen that EEPROM of this
device contains optical diagnostic page (lower page 0 byte 0x02 bit 2 is
cleared), but it is not exposed, as the length defined for this type is
256 bytes.
$ ethtool -m sfp42 hex on
Offset Values
------ ------
0x0000: 11 07 00 ff 00 ff 00 00 00 55 55 00 00 00 00 00
0x0010: 00 00 00 00 00 00 2a 90 00 00 82 ae 00 00 00 00
0x0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
0x0060: 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0080: 11 8c 0c 80 00 00 00 00 00 00 00 05 ff 00 00 23
0x0090: 00 00 32 00 4d 65 6c 6c 61 6e 6f 78 20 20 20 20
0x00a0: 20 20 20 20 00 00 02 c9 4d 4d 41 31 42 30 30 2d
0x00b0: 53 53 31 20 20 20 20 20 41 32 42 68 0b b8 46 05
0x00c0: 02 07 f5 9e 4d 54 31 38 33 34 46 54 30 33 38 34
0x00d0: 36 20 20 20 31 38 30 37 30 33 00 00 0c 10 67 c2
0x00e0: 38 32 36 46 4d 41 32 32 36 49 30 31 31 35 20 20
0x00f0: 00 00 00 00 00 00 00 00 00 00 01 00 0e 00 00 00
After changing the length returned by get_module_info() callback from
256 bytes to 640 bytes, the upper pages 1, 2 and 3 are exposed by
ethtool. In the below hex dump from the same cable it can be seen that
the optical diagnostic page (page 3, from offset 0x0200) has non-zero
data.
$ ethtool -m sfp42 hex on
Offset Values
------ ------
0x0000: 11 07 00 ff 00 ff 00 00 00 55 55 00 00 00 00 00
0x0010: 00 00 00 00 00 00 27 79 00 00 82 c5 00 00 00 00
0x0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
0x0060: 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0080: 11 8c 0c 80 00 00 00 00 00 00 00 05 ff 00 00 23
0x0090: 00 00 32 00 4d 65 6c 6c 61 6e 6f 78 20 20 20 20
0x00a0: 20 20 20 20 00 00 02 c9 4d 4d 41 31 42 30 30 2d
0x00b0: 53 53 31 20 20 20 20 20 41 32 42 68 0b b8 46 05
0x00c0: 02 07 f5 9e 4d 54 31 38 33 34 46 54 30 33 38 34
0x00d0: 36 20 20 20 31 38 30 37 30 33 00 00 0c 10 67 c2
0x00e0: 38 32 36 46 4d 41 32 32 36 49 30 31 31 35 20 20
0x00f0: 00 00 00 00 00 00 00 00 00 00 01 00 0e 00 00 00
0x0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0200: 50 00 f6 00 46 00 00 00 00 00 00 00 00 00 00 00
0x0210: 88 b8 79 18 87 5a 7a 76 00 00 00 00 00 00 00 00
0x0220: 00 00 00 00 00 00 00 00 00 00 18 30 0e 61 60 b7
0x0230: 87 71 01 d3 43 e2 03 a5 10 9a 0a ba 0f a0 0b b8
0x0240: 87 71 02 d4 43 e2 05 a5 00 00 00 00 00 00 00 00
0x0250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0260: a7 03 00 00 00 00 00 00 00 00 44 44 22 22 11 11
0x0270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
And 'ethtool -m sfp42' shows the real values for the below fields, while
before it exposed zeros for these fields:
Laser bias current high alarm threshold : 8.500 mA
Laser bias current low alarm threshold : 5.492 mA
Laser bias current high warning threshold : 8.000 mA
Laser bias current low warning threshold : 6.000 mA
Laser output power high alarm threshold : 3.4673 mW / 5.40 dBm
Laser output power low alarm threshold : 0.0724 mW / -11.40 dBm
Laser output power high warning threshold : 1.7378 mW / 2.40 dBm
Laser output power low warning threshold : 0.1445 mW / -8.40 dBm
Module temperature high alarm threshold : 80.00 degrees C / 176.00 F
Module temperature low alarm threshold : -10.00 degrees C / 14.00 F
Module temperature high warning threshold : 70.00 degrees C / 158.00 F
Module temperature low warning threshold : 0.00 degrees C / 32.00 F
Module voltage high alarm threshold : 3.5000 V
Module voltage low alarm threshold : 3.1000 V
====================
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>