@@ -1659,8 +1659,8 @@ static int mlx5e_get_module_info(struct net_device *netdev,
int size_read = 0;
u8 data[4] = {0};
- size_read = mlx5_query_module_eeprom(dev, 0, 2, data);
- if (size_read < 2)
+ size_read = mlx5_query_module_eeprom(dev, 0, 3, data);
+ if (size_read < 3)
return -EIO;
/* data[0] = identifier byte */
@@ -1680,6 +1680,14 @@ static int mlx5e_get_module_info(struct net_device *netdev,
modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN;
}
break;
+ case MLX5_MODULE_ID_DSFP:
+ modinfo->type = ETH_MODULE_CMIS_4;
+ /* check flat_mem bit, zero indicates paged memory */
+ if (data[2] & 0x80)
+ modinfo->eeprom_len = ETH_MODULE_CMIS_4_LEN;
+ else
+ modinfo->eeprom_len = ETH_MODULE_CMIS_4_MAX_LEN;
+ break;
case MLX5_MODULE_ID_SFP:
modinfo->type = ETH_MODULE_SFF_8472;
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
@@ -311,13 +311,9 @@ static int mlx5_query_module_id(struct mlx5_core_dev *dev, int module_num,
return 0;
}
-static int mlx5_qsfp_eeprom_page(u16 offset)
+static int mlx5_eeprom_high_page_num(u16 offset)
{
- if (offset < MLX5_EEPROM_PAGE_LENGTH)
- /* Addresses between 0-255 - page 00 */
- return 0;
-
- /* Addresses between 256 - 639 belongs to pages 01, 02 and 03
+ /* Addresses 256 and higher belong to pages 01, 02, etc.
* For example, offset = 400 belongs to page 02:
* 1 + ((400 - 256)/128) = 2
*/
@@ -325,6 +321,16 @@ static int mlx5_qsfp_eeprom_page(u16 offset)
MLX5_EEPROM_HIGH_PAGE_LENGTH);
}
+static int mlx5_qsfp_eeprom_page(u16 offset)
+{
+ if (offset < MLX5_EEPROM_PAGE_LENGTH)
+ /* Addresses between 0-255 - page 00 */
+ return 0;
+
+ /* Addresses between 256 - 639 belong to pages 01, 02 and 03 */
+ return mlx5_eeprom_high_page_num(offset);
+}
+
static int mlx5_qsfp_eeprom_high_page_offset(int page_num)
{
if (!page_num) /* Page 0 always start from low page */
@@ -341,6 +347,37 @@ static void mlx5_qsfp_eeprom_params_set(u16 *i2c_addr, int *page_num, u16 *offse
*offset -= mlx5_qsfp_eeprom_high_page_offset(*page_num);
}
+static int mlx5_dsfp_eeprom_high_page_offset(int page_num)
+{
+ if (!page_num)
+ return 0;
+
+ return (page_num < 0x10 ? page_num : page_num - 13) * MLX5_EEPROM_HIGH_PAGE_LENGTH;
+}
+
+static int mlx5_dsfp_eeprom_page(u16 offset)
+{
+ if (offset < MLX5_EEPROM_PAGE_LENGTH)
+ return 0;
+
+ if (offset < MLX5_EEPROM_PAGE_LENGTH + (MLX5_EEPROM_HIGH_PAGE_LENGTH * 2))
+ /* Addresses 0 - 511 - pages 00, 01 and 02 */
+ return mlx5_eeprom_high_page_num(offset);
+
+ /* Offsets 512 - 767 belong to pages 10h and 11h.
+ * For example, offset = 700 belongs to page 11:
+ * 13 + 1 + ((700 - 256) / 128) = 17 = 0x11
+ */
+ return 13 + mlx5_eeprom_high_page_num(offset);
+}
+
+static void mlx5_dsfp_eeprom_params_set(u16 *i2c_addr, int *page_num, u16 *offset)
+{
+ *i2c_addr = MLX5_I2C_ADDR_LOW;
+ *page_num = mlx5_dsfp_eeprom_page(*offset);
+ *offset -= mlx5_dsfp_eeprom_high_page_offset(*page_num);
+}
+
static void mlx5_sfp_eeprom_params_set(u16 *i2c_addr, int *page_num, u16 *offset)
{
*i2c_addr = MLX5_I2C_ADDR_LOW;
@@ -380,6 +417,9 @@ int mlx5_query_module_eeprom(struct mlx5_core_dev *dev,
case MLX5_MODULE_ID_QSFP28:
mlx5_qsfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
break;
+ case MLX5_MODULE_ID_DSFP:
+ mlx5_dsfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
+ break;
default:
mlx5_core_err(dev, "Module ID not recognized: 0x%x\n", module_id);
return -EINVAL;
@@ -45,6 +45,7 @@ enum mlx5_module_id {
MLX5_MODULE_ID_QSFP = 0xC,
MLX5_MODULE_ID_QSFP_PLUS = 0xD,
MLX5_MODULE_ID_QSFP28 = 0x11,
+ MLX5_MODULE_ID_DSFP = 0x1B,
};
enum mlx5_an_status {