aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/701-net-0229-enetc-Initialize-SerDes-for-SGMII-and-SXGMII-protoco.patch
diff options
context:
space:
mode:
authorYangbo Lu <yangbo.lu@nxp.com>2020-04-10 10:47:05 +0800
committerPetr Štetiar <ynezz@true.cz>2020-05-07 12:53:06 +0200
commitcddd4591404fb4c53dc0b3c0b15b942cdbed4356 (patch)
tree392c1179de46b0f804e3789edca19069b64e6b44 /target/linux/layerscape/patches-5.4/701-net-0229-enetc-Initialize-SerDes-for-SGMII-and-SXGMII-protoco.patch
parentd1d2c0b5579ea4f69a42246c9318539d61ba1999 (diff)
downloadupstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.gz
upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.bz2
upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.zip
layerscape: add patches-5.4
Add patches for linux-5.4. The patches are from NXP LSDK-20.04 release which was tagged LSDK-20.04-V5.4. https://source.codeaurora.org/external/qoriq/qoriq-components/linux/ For boards LS1021A-IOT, and Traverse-LS1043 which are not involved in LSDK, port the dts patches from 4.14. The patches are sorted into the following categories: 301-arch-xxxx 302-dts-xxxx 303-core-xxxx 701-net-xxxx 801-audio-xxxx 802-can-xxxx 803-clock-xxxx 804-crypto-xxxx 805-display-xxxx 806-dma-xxxx 807-gpio-xxxx 808-i2c-xxxx 809-jailhouse-xxxx 810-keys-xxxx 811-kvm-xxxx 812-pcie-xxxx 813-pm-xxxx 814-qe-xxxx 815-sata-xxxx 816-sdhc-xxxx 817-spi-xxxx 818-thermal-xxxx 819-uart-xxxx 820-usb-xxxx 821-vfio-xxxx Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0229-enetc-Initialize-SerDes-for-SGMII-and-SXGMII-protoco.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/701-net-0229-enetc-Initialize-SerDes-for-SGMII-and-SXGMII-protoco.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0229-enetc-Initialize-SerDes-for-SGMII-and-SXGMII-protoco.patch b/target/linux/layerscape/patches-5.4/701-net-0229-enetc-Initialize-SerDes-for-SGMII-and-SXGMII-protoco.patch
new file mode 100644
index 0000000000..ef78b50148
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/701-net-0229-enetc-Initialize-SerDes-for-SGMII-and-SXGMII-protoco.patch
@@ -0,0 +1,169 @@
+From 6943ed031ee75f13a950e293f92db68ea2ec2786 Mon Sep 17 00:00:00 2001
+From: Claudiu Manoil <claudiu.manoil@nxp.com>
+Date: Wed, 14 Aug 2019 14:34:47 +0300
+Subject: [PATCH] enetc: Initialize SerDes for SGMII and SXGMII protocols
+
+ENETC has ethernet MACs capable of SGMII and SXGMII but
+in order to use these protocols some serdes configurations
+need to be performed.
+The serdes is configurable via an internal MDIO bus
+connected to an internal PCS device, all reads/writes are
+performed at address 0.
+This patch basically removes the dependecy on a bootloader
+regarding serdes initialization.
+
+Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com>
+Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
+---
+ drivers/net/ethernet/freescale/enetc/enetc_hw.h | 17 +++++++
+ drivers/net/ethernet/freescale/enetc/enetc_mdio.c | 24 +++++++++
+ drivers/net/ethernet/freescale/enetc/enetc_pf.c | 59 +++++++++++++++++++++++
+ drivers/net/ethernet/freescale/enetc/enetc_pf.h | 2 +
+ 4 files changed, 102 insertions(+)
+
+--- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h
++++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
+@@ -221,6 +221,23 @@ enum enetc_bdr_type {TX, RX};
+ #define ENETC_PM0_MAXFRM 0x8014
+ #define ENETC_SET_TX_MTU(val) ((val) << 16)
+ #define ENETC_SET_MAXFRM(val) ((val) & 0xffff)
++
++#define ENETC_PM_IMDIO_BASE 0x8030
++/* PCS registers */
++#define ENETC_PCS_CR 0x0
++#define ENETC_PCS_CR_RESET_AN 0x1200
++#define ENETC_PCS_CR_DEF_VAL 0x0140
++#define ENETC_PCS_CR_LANE_RESET 0x8000
++#define ENETC_PCS_DEV_ABILITY 0x04
++#define ENETC_PCS_DEV_ABILITY_SGMII 0x4001
++#define ENETC_PCS_DEV_ABILITY_SXGMII 0x5001
++#define ENETC_PCS_LINK_TIMER1 0x12
++#define ENETC_PCS_LINK_TIMER1_VAL 0x06a0
++#define ENETC_PCS_LINK_TIMER2 0x13
++#define ENETC_PCS_LINK_TIMER2_VAL 0x0003
++#define ENETC_PCS_IF_MODE 0x14
++#define ENETC_PCS_IF_MODE_SGMII_AN 0x0003
++
+ #define ENETC_PM0_IF_MODE 0x8300
+ #define ENETC_PMO_IFM_RG BIT(2)
+ #define ENETC_PM0_IFM_RLP (BIT(5) | BIT(11))
+--- a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c
++++ b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c
+@@ -200,3 +200,27 @@ void enetc_mdio_remove(struct enetc_pf *
+ if (pf->mdio)
+ mdiobus_unregister(pf->mdio);
+ }
++
++int enetc_imdio_init(struct enetc_pf *pf)
++{
++ struct device *dev = &pf->si->pdev->dev;
++ struct enetc_mdio_priv *mdio_priv;
++ struct mii_bus *bus;
++
++ bus = devm_mdiobus_alloc_size(dev, sizeof(*mdio_priv));
++ if (!bus)
++ return -ENOMEM;
++
++ bus->name = "FSL ENETC internal MDIO Bus";
++ bus->read = enetc_mdio_read;
++ bus->write = enetc_mdio_write;
++ bus->parent = dev;
++ mdio_priv = bus->priv;
++ mdio_priv->hw = &pf->si->hw;
++ mdio_priv->mdio_base = ENETC_PM_IMDIO_BASE;
++ snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev));
++
++ pf->imdio = bus;
++
++ return 0;
++}
+--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
++++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+@@ -807,6 +807,61 @@ static void enetc_of_put_phy(struct enet
+ of_node_put(priv->phy_node);
+ }
+
++static void enetc_configure_sgmii(struct mii_bus *imdio)
++{
++ /* Set to SGMII mode, use AN */
++ imdio->write(imdio, 0, ENETC_PCS_IF_MODE,
++ ENETC_PCS_IF_MODE_SGMII_AN);
++
++ /* Dev ability - SGMII */
++ imdio->write(imdio, 0, ENETC_PCS_DEV_ABILITY,
++ ENETC_PCS_DEV_ABILITY_SGMII);
++
++ /* Adjust link timer for SGMII */
++ imdio->write(imdio, 0, ENETC_PCS_LINK_TIMER1,
++ ENETC_PCS_LINK_TIMER1_VAL);
++ imdio->write(imdio, 0, ENETC_PCS_LINK_TIMER2,
++ ENETC_PCS_LINK_TIMER2_VAL);
++
++ /* restart PCS AN */
++ imdio->write(imdio, 0, ENETC_PCS_CR,
++ ENETC_PCS_CR_RESET_AN | ENETC_PCS_CR_DEF_VAL);
++}
++
++static void enetc_configure_sxgmii(struct mii_bus *imdio)
++{
++ /* Dev ability - SXGMII */
++ imdio->write(imdio, 0, MII_ADDR_C45 | (MDIO_MMD_VEND2 << 16) |
++ ENETC_PCS_DEV_ABILITY, ENETC_PCS_DEV_ABILITY_SXGMII);
++
++ /* Restart PCS AN */
++ imdio->write(imdio, 0, MII_ADDR_C45 | (MDIO_MMD_VEND2 << 16) |
++ ENETC_PCS_CR,
++ ENETC_PCS_CR_LANE_RESET | ENETC_PCS_CR_RESET_AN);
++}
++
++static int enetc_configure_serdes(struct enetc_ndev_priv *priv)
++{
++ struct enetc_pf *pf = enetc_si_priv(priv->si);
++ int err;
++
++ if (priv->if_mode != PHY_INTERFACE_MODE_SGMII &&
++ priv->if_mode != PHY_INTERFACE_MODE_XGMII)
++ return 0;
++
++ err = enetc_imdio_init(pf);
++ if (err)
++ return err;
++
++ if (priv->if_mode == PHY_INTERFACE_MODE_SGMII)
++ enetc_configure_sgmii(pf->imdio);
++
++ if (priv->if_mode == PHY_INTERFACE_MODE_XGMII)
++ enetc_configure_sxgmii(pf->imdio);
++
++ return 0;
++}
++
+ static int enetc_pf_probe(struct pci_dev *pdev,
+ const struct pci_device_id *ent)
+ {
+@@ -871,6 +926,10 @@ static int enetc_pf_probe(struct pci_dev
+ if (err)
+ dev_warn(&pdev->dev, "Fallback to PHY-less operation\n");
+
++ err = enetc_configure_serdes(priv);
++ if (err)
++ dev_warn(&pdev->dev, "Attempted serdes config but failed\n");
++
+ err = register_netdev(ndev);
+ if (err)
+ goto err_reg_netdev;
+--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.h
++++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
+@@ -44,6 +44,7 @@ struct enetc_pf {
+ DECLARE_BITMAP(active_vlans, VLAN_N_VID);
+
+ struct mii_bus *mdio; /* saved for cleanup */
++ struct mii_bus *imdio;
+ };
+
+ int enetc_msg_psi_init(struct enetc_pf *pf);
+@@ -53,3 +54,4 @@ void enetc_msg_handle_rxmsg(struct enetc
+ /* MDIO */
+ int enetc_mdio_probe(struct enetc_pf *pf);
+ void enetc_mdio_remove(struct enetc_pf *pf);
++int enetc_imdio_init(struct enetc_pf *pf);