sfc: Implement module EEPROM access for SFE4002 and SFN4112F
authorBen Hutchings <bhutchings@solarflare.com>
Sat, 5 May 2012 00:36:50 +0000 (01:36 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Thu, 10 May 2012 02:10:54 +0000 (03:10 +0100)
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/qt202x_phy.c

index 8a7caf88ffb6c3bb1d880f58e3e1d832bdad0499..326a28637f3c6ef73434eb347a8699c28f068188 100644 (file)
@@ -449,6 +449,37 @@ static void qt202x_phy_remove(struct efx_nic *efx)
        efx->phy_data = NULL;
 }
 
+static int qt202x_phy_get_module_info(struct efx_nic *efx,
+                                     struct ethtool_modinfo *modinfo)
+{
+       modinfo->type = ETH_MODULE_SFF_8079;
+       modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
+       return 0;
+}
+
+static int qt202x_phy_get_module_eeprom(struct efx_nic *efx,
+                                       struct ethtool_eeprom *ee, u8 *data)
+{
+       int mmd, reg_base, rc, i;               
+
+       if (efx->phy_type == PHY_TYPE_QT2025C) {
+               mmd = MDIO_MMD_PCS;
+               reg_base = 0xd000;
+       } else {
+               mmd = MDIO_MMD_PMAPMD;
+               reg_base = 0x8007;
+       }
+
+       for (i = 0; i < ee->len; i++) {
+               rc = efx_mdio_read(efx, mmd, reg_base + ee->offset + i);
+               if (rc < 0)
+                       return rc;
+               data[i] = rc;
+       }
+
+       return 0;
+}
+
 const struct efx_phy_operations falcon_qt202x_phy_ops = {
        .probe           = qt202x_phy_probe,
        .init            = qt202x_phy_init,
@@ -459,4 +490,6 @@ const struct efx_phy_operations falcon_qt202x_phy_ops = {
        .get_settings    = qt202x_phy_get_settings,
        .set_settings    = efx_mdio_set_settings,
        .test_alive      = efx_mdio_test_alive,
+       .get_module_eeprom = qt202x_phy_get_module_eeprom,
+       .get_module_info = qt202x_phy_get_module_info,
 };