11
11
#include "reg.h"
12
12
13
13
static int mlxsw_env_validate_cable_ident (struct mlxsw_core * core , int id ,
14
- bool * qsfp )
14
+ bool * qsfp , bool * cmis )
15
15
{
16
16
char eeprom_tmp [MLXSW_REG_MCIA_EEPROM_SIZE ];
17
17
char mcia_pl [MLXSW_REG_MCIA_LEN ];
@@ -25,15 +25,19 @@ static int mlxsw_env_validate_cable_ident(struct mlxsw_core *core, int id,
25
25
return err ;
26
26
mlxsw_reg_mcia_eeprom_memcpy_from (mcia_pl , eeprom_tmp );
27
27
ident = eeprom_tmp [0 ];
28
+ * cmis = false;
28
29
switch (ident ) {
29
30
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_SFP :
30
31
* qsfp = false;
31
32
break ;
32
33
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP : /* fall-through */
33
34
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP_PLUS : /* fall-through */
34
- case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP28 : /* fall-through */
35
+ case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP28 :
36
+ * qsfp = true;
37
+ break ;
35
38
case MLXSW_REG_MCIA_EEPROM_MODULE_INFO_ID_QSFP_DD :
36
39
* qsfp = true;
40
+ * cmis = true;
37
41
break ;
38
42
default :
39
43
return - EINVAL ;
@@ -117,7 +121,8 @@ int mlxsw_env_module_temp_thresholds_get(struct mlxsw_core *core, int module,
117
121
char mcia_pl [MLXSW_REG_MCIA_LEN ] = {0 };
118
122
char mtmp_pl [MLXSW_REG_MTMP_LEN ];
119
123
unsigned int module_temp ;
120
- bool qsfp ;
124
+ bool qsfp , cmis ;
125
+ int page ;
121
126
int err ;
122
127
123
128
mlxsw_reg_mtmp_pack (mtmp_pl , MLXSW_REG_MTMP_MODULE_INDEX_MIN + module ,
@@ -141,21 +146,28 @@ int mlxsw_env_module_temp_thresholds_get(struct mlxsw_core *core, int module,
141
146
*/
142
147
143
148
/* Validate module identifier value. */
144
- err = mlxsw_env_validate_cable_ident (core , module , & qsfp );
149
+ err = mlxsw_env_validate_cable_ident (core , module , & qsfp , & cmis );
145
150
if (err )
146
151
return err ;
147
152
148
- if (qsfp )
149
- mlxsw_reg_mcia_pack (mcia_pl , module , 0 ,
150
- MLXSW_REG_MCIA_TH_PAGE_NUM ,
153
+ if (qsfp ) {
154
+ /* For QSFP/CMIS module-defined thresholds are located in page
155
+ * 02h, otherwise in page 03h.
156
+ */
157
+ if (cmis )
158
+ page = MLXSW_REG_MCIA_TH_PAGE_CMIS_NUM ;
159
+ else
160
+ page = MLXSW_REG_MCIA_TH_PAGE_NUM ;
161
+ mlxsw_reg_mcia_pack (mcia_pl , module , 0 , page ,
151
162
MLXSW_REG_MCIA_TH_PAGE_OFF + off ,
152
163
MLXSW_REG_MCIA_TH_ITEM_SIZE ,
153
164
MLXSW_REG_MCIA_I2C_ADDR_LOW );
154
- else
165
+ } else {
155
166
mlxsw_reg_mcia_pack (mcia_pl , module , 0 ,
156
167
MLXSW_REG_MCIA_PAGE0_LO ,
157
168
off , MLXSW_REG_MCIA_TH_ITEM_SIZE ,
158
169
MLXSW_REG_MCIA_I2C_ADDR_HIGH );
170
+ }
159
171
160
172
err = mlxsw_reg_query (core , MLXSW_REG (mcia ), mcia_pl );
161
173
if (err )
@@ -252,16 +264,16 @@ int mlxsw_env_get_module_eeprom(struct net_device *netdev,
252
264
{
253
265
int offset = ee -> offset ;
254
266
unsigned int read_size ;
267
+ bool qsfp , cmis ;
255
268
int i = 0 ;
256
- bool qsfp ;
257
269
int err ;
258
270
259
271
if (!ee -> len )
260
272
return - EINVAL ;
261
273
262
274
memset (data , 0 , ee -> len );
263
275
/* Validate module identifier value. */
264
- err = mlxsw_env_validate_cable_ident (mlxsw_core , module , & qsfp );
276
+ err = mlxsw_env_validate_cable_ident (mlxsw_core , module , & qsfp , & cmis );
265
277
if (err )
266
278
return err ;
267
279
0 commit comments