diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0005-amd-xgbe-Add-ethtool-support-to-retrieve-SFP-module-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0005-amd-xgbe-Add-ethtool-support-to-retrieve-SFP-module-.patch | 299 |
1 files changed, 0 insertions, 299 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0005-amd-xgbe-Add-ethtool-support-to-retrieve-SFP-module-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0005-amd-xgbe-Add-ethtool-support-to-retrieve-SFP-module-.patch deleted file mode 100644 index b1337b11..00000000 --- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0005-amd-xgbe-Add-ethtool-support-to-retrieve-SFP-module-.patch +++ /dev/null @@ -1,299 +0,0 @@ -From d8470b1e4163404f94fcec04b82c4485b8a40a68 Mon Sep 17 00:00:00 2001 -From: Tom Lendacky <thomas.lendacky@amd.com> -Date: Wed, 23 May 2018 11:38:46 -0500 -Subject: [PATCH 05/95] amd-xgbe: Add ethtool support to retrieve SFP module - info - -Add support to get SFP module information using ethtool. - -Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> -Signed-off-by: David S. Miller <davem@davemloft.net> -Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com> ---- - drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c | 18 ++++ - drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 21 ++++ - drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 137 +++++++++++++++++++++++++++ - drivers/net/ethernet/amd/xgbe/xgbe.h | 13 +++ - 4 files changed, 189 insertions(+) - -diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c -index ff397bb..57394b77 100644 ---- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c -+++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c -@@ -626,6 +626,22 @@ static int xgbe_get_ts_info(struct net_device *netdev, - return 0; - } - -+static int xgbe_get_module_info(struct net_device *netdev, -+ struct ethtool_modinfo *modinfo) -+{ -+ struct xgbe_prv_data *pdata = netdev_priv(netdev); -+ -+ return pdata->phy_if.module_info(pdata, modinfo); -+} -+ -+static int xgbe_get_module_eeprom(struct net_device *netdev, -+ struct ethtool_eeprom *eeprom, u8 *data) -+{ -+ struct xgbe_prv_data *pdata = netdev_priv(netdev); -+ -+ return pdata->phy_if.module_eeprom(pdata, eeprom, data); -+} -+ - static const struct ethtool_ops xgbe_ethtool_ops = { - .get_drvinfo = xgbe_get_drvinfo, - .get_msglevel = xgbe_get_msglevel, -@@ -646,6 +662,8 @@ static const struct ethtool_ops xgbe_ethtool_ops = { - .get_ts_info = xgbe_get_ts_info, - .get_link_ksettings = xgbe_get_link_ksettings, - .set_link_ksettings = xgbe_set_link_ksettings, -+ .get_module_info = xgbe_get_module_info, -+ .get_module_eeprom = xgbe_get_module_eeprom, - }; - - const struct ethtool_ops *xgbe_get_ethtool_ops(void) -diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c -index 1197779..36fddc2 100644 ---- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c -+++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c -@@ -126,6 +126,24 @@ - #include "xgbe.h" - #include "xgbe-common.h" - -+static int xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata, -+ struct ethtool_eeprom *eeprom, u8 *data) -+{ -+ if (!pdata->phy_if.phy_impl.module_eeprom) -+ return -ENXIO; -+ -+ return pdata->phy_if.phy_impl.module_eeprom(pdata, eeprom, data); -+} -+ -+static int xgbe_phy_module_info(struct xgbe_prv_data *pdata, -+ struct ethtool_modinfo *modinfo) -+{ -+ if (!pdata->phy_if.phy_impl.module_info) -+ return -ENXIO; -+ -+ return pdata->phy_if.phy_impl.module_info(pdata, modinfo); -+} -+ - static void xgbe_an37_clear_interrupts(struct xgbe_prv_data *pdata) - { - int reg; -@@ -1639,4 +1657,7 @@ void xgbe_init_function_ptrs_phy(struct xgbe_phy_if *phy_if) - phy_if->phy_valid_speed = xgbe_phy_valid_speed; - - phy_if->an_isr = xgbe_an_combined_isr; -+ -+ phy_if->module_info = xgbe_phy_module_info; -+ phy_if->module_eeprom = xgbe_phy_module_eeprom; - } -diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c -index cb15caf..141bb13 100644 ---- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c -+++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c -@@ -119,6 +119,7 @@ - #include <linux/kmod.h> - #include <linux/mdio.h> - #include <linux/phy.h> -+#include <linux/ethtool.h> - - #include "xgbe.h" - #include "xgbe-common.h" -@@ -270,6 +271,15 @@ struct xgbe_sfp_eeprom { - u8 vendor[32]; - }; - -+#define XGBE_SFP_DIAGS_SUPPORTED(_x) \ -+ ((_x)->extd[XGBE_SFP_EXTD_SFF_8472] && \ -+ !((_x)->extd[XGBE_SFP_EXTD_DIAG] & XGBE_SFP_EXTD_DIAG_ADDR_CHANGE)) -+ -+#define XGBE_SFP_EEPROM_BASE_LEN 256 -+#define XGBE_SFP_EEPROM_DIAG_LEN 256 -+#define XGBE_SFP_EEPROM_MAX (XGBE_SFP_EEPROM_BASE_LEN + \ -+ XGBE_SFP_EEPROM_DIAG_LEN) -+ - #define XGBE_BEL_FUSE_VENDOR "BEL-FUSE " - #define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 " - -@@ -1301,6 +1311,130 @@ static void xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata) - xgbe_phy_put_comm_ownership(pdata); - } - -+static int xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata, -+ struct ethtool_eeprom *eeprom, u8 *data) -+{ -+ struct xgbe_phy_data *phy_data = pdata->phy_data; -+ u8 eeprom_addr, eeprom_data[XGBE_SFP_EEPROM_MAX]; -+ struct xgbe_sfp_eeprom *sfp_eeprom; -+ unsigned int i, j, rem; -+ int ret; -+ -+ rem = eeprom->len; -+ -+ if (!eeprom->len) { -+ ret = -EINVAL; -+ goto done; -+ } -+ -+ if ((eeprom->offset + eeprom->len) > XGBE_SFP_EEPROM_MAX) { -+ ret = -EINVAL; -+ goto done; -+ } -+ -+ if (phy_data->port_mode != XGBE_PORT_MODE_SFP) { -+ ret = -ENXIO; -+ goto done; -+ } -+ -+ if (!netif_running(pdata->netdev)) { -+ ret = -EIO; -+ goto done; -+ } -+ -+ if (phy_data->sfp_mod_absent) { -+ ret = -EIO; -+ goto done; -+ } -+ -+ ret = xgbe_phy_get_comm_ownership(pdata); -+ if (ret) { -+ ret = -EIO; -+ goto done; -+ } -+ -+ ret = xgbe_phy_sfp_get_mux(pdata); -+ if (ret) { -+ netdev_err(pdata->netdev, "I2C error setting SFP MUX\n"); -+ ret = -EIO; -+ goto put_own; -+ } -+ -+ /* Read the SFP serial ID eeprom */ -+ eeprom_addr = 0; -+ ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS, -+ &eeprom_addr, sizeof(eeprom_addr), -+ eeprom_data, XGBE_SFP_EEPROM_BASE_LEN); -+ if (ret) { -+ netdev_err(pdata->netdev, -+ "I2C error reading SFP EEPROM\n"); -+ ret = -EIO; -+ goto put_mux; -+ } -+ -+ sfp_eeprom = (struct xgbe_sfp_eeprom *)eeprom_data; -+ -+ if (XGBE_SFP_DIAGS_SUPPORTED(sfp_eeprom)) { -+ /* Read the SFP diagnostic eeprom */ -+ eeprom_addr = 0; -+ ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_DIAG_INFO_ADDRESS, -+ &eeprom_addr, sizeof(eeprom_addr), -+ eeprom_data + XGBE_SFP_EEPROM_BASE_LEN, -+ XGBE_SFP_EEPROM_DIAG_LEN); -+ if (ret) { -+ netdev_err(pdata->netdev, -+ "I2C error reading SFP DIAGS\n"); -+ ret = -EIO; -+ goto put_mux; -+ } -+ } -+ -+ for (i = 0, j = eeprom->offset; i < eeprom->len; i++, j++) { -+ if ((j >= XGBE_SFP_EEPROM_BASE_LEN) && -+ !XGBE_SFP_DIAGS_SUPPORTED(sfp_eeprom)) -+ break; -+ -+ data[i] = eeprom_data[j]; -+ rem--; -+ } -+ -+put_mux: -+ xgbe_phy_sfp_put_mux(pdata); -+ -+put_own: -+ xgbe_phy_put_comm_ownership(pdata); -+ -+done: -+ eeprom->len -= rem; -+ -+ return ret; -+} -+ -+static int xgbe_phy_module_info(struct xgbe_prv_data *pdata, -+ struct ethtool_modinfo *modinfo) -+{ -+ struct xgbe_phy_data *phy_data = pdata->phy_data; -+ -+ if (phy_data->port_mode != XGBE_PORT_MODE_SFP) -+ return -ENXIO; -+ -+ if (!netif_running(pdata->netdev)) -+ return -EIO; -+ -+ if (phy_data->sfp_mod_absent) -+ return -EIO; -+ -+ if (XGBE_SFP_DIAGS_SUPPORTED(&phy_data->sfp_eeprom)) { -+ modinfo->type = ETH_MODULE_SFF_8472; -+ modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; -+ } else { -+ modinfo->type = ETH_MODULE_SFF_8079; -+ modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; -+ } -+ -+ return 0; -+} -+ - static void xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata) - { - struct ethtool_link_ksettings *lks = &pdata->phy.lks; -@@ -3196,4 +3330,7 @@ void xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if) - - phy_impl->kr_training_pre = xgbe_phy_kr_training_pre; - phy_impl->kr_training_post = xgbe_phy_kr_training_post; -+ -+ phy_impl->module_info = xgbe_phy_module_info; -+ phy_impl->module_eeprom = xgbe_phy_module_eeprom; - } -diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h -index 54e43ad3..f0f455b 100644 ---- a/drivers/net/ethernet/amd/xgbe/xgbe.h -+++ b/drivers/net/ethernet/amd/xgbe/xgbe.h -@@ -835,6 +835,7 @@ struct xgbe_hw_if { - * Optional routines: - * an_pre, an_post - * kr_training_pre, kr_training_post -+ * module_info, module_eeprom - */ - struct xgbe_phy_impl_if { - /* Perform Setup/teardown actions */ -@@ -883,6 +884,12 @@ struct xgbe_phy_impl_if { - /* Pre/Post KR training enablement support */ - void (*kr_training_pre)(struct xgbe_prv_data *); - void (*kr_training_post)(struct xgbe_prv_data *); -+ -+ /* SFP module related info */ -+ int (*module_info)(struct xgbe_prv_data *pdata, -+ struct ethtool_modinfo *modinfo); -+ int (*module_eeprom)(struct xgbe_prv_data *pdata, -+ struct ethtool_eeprom *eeprom, u8 *data); - }; - - struct xgbe_phy_if { -@@ -905,6 +912,12 @@ struct xgbe_phy_if { - /* For single interrupt support */ - irqreturn_t (*an_isr)(struct xgbe_prv_data *); - -+ /* For ethtool PHY support */ -+ int (*module_info)(struct xgbe_prv_data *pdata, -+ struct ethtool_modinfo *modinfo); -+ int (*module_eeprom)(struct xgbe_prv_data *pdata, -+ struct ethtool_eeprom *eeprom, u8 *data); -+ - /* PHY implementation specific services */ - struct xgbe_phy_impl_if phy_impl; - }; --- -2.7.4 - |