Skip to content

Commit feb42b0

Browse files
nazariiglguohan
authored andcommitted
[mellanox] Extend size of QSFP EEPROM for the cable type SSF8436 and SFF8636. (#110)
Extend size of QSFP EEPROM for the cable type SSF8436, SFF8636 from 256 to 612 bytes in order to make available all the pages Signed-off-by: Nazarii Hnydyn <[email protected]>
1 parent 5dbf6d5 commit feb42b0

3 files changed

+170
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
From 701662a1dc781e18341974ec6cece31bead06fbd Mon Sep 17 00:00:00 2001
2+
From: Vadim Pasternak <[email protected]>
3+
Date: Mon, 12 Aug 2019 07:31:57 +0300
4+
Subject: [PATCH v1 1/1] mlxsw: core: Extend QSFP EEPROM supported size for
5+
ethtool
6+
7+
Extend size of QSFP EEPROM for the cable type SSF8436, SFF8636 from 256
8+
to 612 bytes in order to make available all the pages.
9+
10+
Signed-off-by: Vadim Pasternak <[email protected]>
11+
---
12+
drivers/net/ethernet/mellanox/mlxsw/core_env.c | 40 ++++++++++++++++++--------
13+
drivers/net/ethernet/mellanox/mlxsw/reg.h | 5 ++++
14+
include/uapi/linux/ethtool.h | 3 ++
15+
3 files changed, 36 insertions(+), 12 deletions(-)
16+
17+
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_env.c b/drivers/net/ethernet/mellanox/mlxsw/core_env.c
18+
index d2c7ce67c300..0a5495f9f4c7 100644
19+
--- a/drivers/net/ethernet/mellanox/mlxsw/core_env.c
20+
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_env.c
21+
@@ -44,12 +44,13 @@ static int mlxsw_env_validate_cable_ident(struct mlxsw_core *core, int id,
22+
23+
static int
24+
mlxsw_env_query_module_eeprom(struct mlxsw_core *mlxsw_core, int module,
25+
- u16 offset, u16 size, void *data,
26+
+ u16 offset, u16 size, bool qsfp, void *data,
27+
unsigned int *p_read_size)
28+
{
29+
char eeprom_tmp[MLXSW_REG_MCIA_EEPROM_SIZE];
30+
char mcia_pl[MLXSW_REG_MCIA_LEN];
31+
u16 i2c_addr;
32+
+ u8 page = 0;
33+
int status;
34+
int err;
35+
36+
@@ -62,11 +63,19 @@ mlxsw_env_query_module_eeprom(struct mlxsw_core *mlxsw_core, int module,
37+
38+
i2c_addr = MLXSW_REG_MCIA_I2C_ADDR_LOW;
39+
if (offset >= MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH) {
40+
- i2c_addr = MLXSW_REG_MCIA_I2C_ADDR_HIGH;
41+
- offset -= MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH;
42+
+ if (qsfp) {
43+
+ page = MLXSW_REG_MCIA_PAGE_GET(offset);
44+
+ offset -= MLXSW_REG_MCIA_EEPROM_UP_PAGE_LENGTH * page;
45+
+ if (offset + size > MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH)
46+
+ size = MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH -
47+
+ offset;
48+
+ } else {
49+
+ i2c_addr = MLXSW_REG_MCIA_I2C_ADDR_HIGH;
50+
+ offset -= MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH;
51+
+ }
52+
}
53+
54+
- mlxsw_reg_mcia_pack(mcia_pl, module, 0, 0, offset, size, i2c_addr);
55+
+ mlxsw_reg_mcia_pack(mcia_pl, module, 0, page, offset, size, i2c_addr);
56+
57+
err = mlxsw_reg_query(mlxsw_core, MLXSW_REG(mcia), mcia_pl);
58+
if (err)
59+
@@ -152,10 +161,11 @@ int mlxsw_env_get_module_info(struct mlxsw_core *mlxsw_core, int module,
60+
u16 offset = MLXSW_REG_MCIA_EEPROM_MODULE_INFO_SIZE;
61+
u8 module_rev_id, module_id, diag_mon;
62+
unsigned int read_size;
63+
+ bool unused = false;
64+
int err;
65+
66+
err = mlxsw_env_query_module_eeprom(mlxsw_core, module, 0, offset,
67+
- module_info, &read_size);
68+
+ unused, module_info, &read_size);
69+
if (err)
70+
return err;
71+
72+
@@ -168,7 +178,7 @@ int mlxsw_env_get_module_info(struct mlxsw_core *mlxsw_core, int module,
73+
switch (module_id) {
74+
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP:
75+
modinfo->type = ETH_MODULE_SFF_8436;
76+
- modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN;
77+
+ modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN;
78+
break;
79+
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP_PLUS: /* fall-through */
80+
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP28:
81+
@@ -176,17 +186,17 @@ int mlxsw_env_get_module_info(struct mlxsw_core *mlxsw_core, int module,
82+
module_rev_id >=
83+
MLXSW_REG_MCIA_EEPROM_MODULE_INFO_REV_ID_8636) {
84+
modinfo->type = ETH_MODULE_SFF_8636;
85+
- modinfo->eeprom_len = ETH_MODULE_SFF_8636_LEN;
86+
+ modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN;
87+
} else {
88+
modinfo->type = ETH_MODULE_SFF_8436;
89+
- modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN;
90+
+ modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN;
91+
}
92+
break;
93+
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_SFP:
94+
/* Verify if transceiver provides diagnostic monitoring page */
95+
err = mlxsw_env_query_module_eeprom(mlxsw_core, module,
96+
- SFP_DIAGMON, 1, &diag_mon,
97+
- &read_size);
98+
+ SFP_DIAGMON, 1, unused,
99+
+ &diag_mon, &read_size);
100+
if (err)
101+
return err;
102+
103+
@@ -213,6 +223,7 @@ int mlxsw_env_get_module_eeprom(struct net_device *netdev,
104+
{
105+
int offset = ee->offset;
106+
unsigned int read_size;
107+
+ bool qsfp;
108+
int i = 0;
109+
int err;
110+
111+
@@ -221,10 +232,15 @@ int mlxsw_env_get_module_eeprom(struct net_device *netdev,
112+
113+
memset(data, 0, ee->len);
114+
115+
+ /* Validate module identifier type. */
116+
+ err = mlxsw_env_validate_cable_ident(mlxsw_core, module, &qsfp);
117+
+ if (err)
118+
+ return err;
119+
+
120+
while (i < ee->len) {
121+
err = mlxsw_env_query_module_eeprom(mlxsw_core, module, offset,
122+
- ee->len - i, data + i,
123+
- &read_size);
124+
+ ee->len - i, qsfp,
125+
+ data + i, &read_size);
126+
if (err) {
127+
netdev_err(netdev, "Eeprom query failed\n");
128+
return err;
129+
diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h
130+
index a8cd53f068ce..8d7a58472799 100644
131+
--- a/drivers/net/ethernet/mellanox/mlxsw/reg.h
132+
+++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h
133+
@@ -7823,6 +7823,7 @@ MLXSW_ITEM32(reg, mcia, device_address, 0x04, 0, 16);
134+
MLXSW_ITEM32(reg, mcia, size, 0x08, 0, 16);
135+
136+
#define MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH 256
137+
+#define MLXSW_REG_MCIA_EEPROM_UP_PAGE_LENGTH 128
138+
#define MLXSW_REG_MCIA_EEPROM_SIZE 48
139+
#define MLXSW_REG_MCIA_I2C_ADDR_LOW 0x50
140+
#define MLXSW_REG_MCIA_I2C_ADDR_HIGH 0x51
141+
@@ -7858,6 +7859,10 @@ enum mlxsw_reg_mcia_eeprom_module_info {
142+
*/
143+
MLXSW_ITEM_BUF(reg, mcia, eeprom, 0x10, MLXSW_REG_MCIA_EEPROM_SIZE);
144+
145+
+#define MLXSW_REG_MCIA_PAGE_GET(off) (((off) - \
146+
+ MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH) / \
147+
+ MLXSW_REG_MCIA_EEPROM_UP_PAGE_LENGTH + 1)
148+
+
149+
static inline void mlxsw_reg_mcia_pack(char *payload, u8 module, u8 lock,
150+
u8 page_number, u16 device_addr,
151+
u8 size, u8 i2c_device_addr)
152+
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
153+
index 8e547231c1b7..b868569344d1 100644
154+
--- a/include/uapi/linux/ethtool.h
155+
+++ b/include/uapi/linux/ethtool.h
156+
@@ -1595,6 +1595,9 @@ static inline int ethtool_validate_duplex(__u8 duplex)
157+
#define ETH_MODULE_SFF_8436 0x4
158+
#define ETH_MODULE_SFF_8436_LEN 256
159+
160+
+#define ETH_MODULE_SFF_8636_MAX_LEN 640
161+
+#define ETH_MODULE_SFF_8436_MAX_LEN 640
162+
+
163+
/* Reset flags */
164+
/* The reset() operation must clear the flags for the components which
165+
* were actually reset. On successful return, the flags indicate the
166+
--
167+
2.11.0
168+

patch/series

+2-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ linux-4.13-thermal-intel_pch_thermal-Fix-enable-check-on.patch
8181
0043-mellanox-platform-Backporting-Melanox-drivers-from-v.patch
8282
0044-mlxsw-minimal-Provide-optimization-for-module-number.patch
8383
0045-mlxsw-minimal-Add-validation-for-FW-version.patch
84-
0046-mfd-lpc-ich-extend-with-additional-chipsets-support.patch
84+
0046-mlxsw-core-Extend-QSFP-EEPROM-supported-size-for-eth.patch
85+
0047-mfd-lpc-ich-extend-with-additional-chipsets-support.patch
8586
linux-4.16-firmware-dmi-handle-missing-DMI-data-gracefully.patch
8687
mellanox-backport-introduce-psample-a-new-genetlink-channel.patch
8788
mellanox-backport-introduce-tc-sample-action.patch

0 commit comments

Comments
 (0)