diff options
Diffstat (limited to 'target/linux/layerscape/patches-4.4/7029-fmd-SGMII-PCS-needs-to-be-reprogrammed-after-sleep.patch')
-rw-r--r-- | target/linux/layerscape/patches-4.4/7029-fmd-SGMII-PCS-needs-to-be-reprogrammed-after-sleep.patch | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-4.4/7029-fmd-SGMII-PCS-needs-to-be-reprogrammed-after-sleep.patch b/target/linux/layerscape/patches-4.4/7029-fmd-SGMII-PCS-needs-to-be-reprogrammed-after-sleep.patch new file mode 100644 index 0000000000..8c10e3d9f5 --- /dev/null +++ b/target/linux/layerscape/patches-4.4/7029-fmd-SGMII-PCS-needs-to-be-reprogrammed-after-sleep.patch @@ -0,0 +1,228 @@ +From afcfdda960da9d9ad4c4d21c7dd0cc7791cf36c7 Mon Sep 17 00:00:00 2001 +From: Madalin Bucur <madalin.bucur@freescale.com> +Date: Wed, 4 May 2016 19:24:53 +0300 +Subject: [PATCH 29/70] fmd: SGMII PCS needs to be reprogrammed after sleep + +Signed-off-by: Madalin Bucur <madalin.bucur@freescale.com> +--- + drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c | 6 ++ + .../freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c | 1 + + .../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c | 12 ++++ + .../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h | 1 + + .../freescale/sdk_fman/Peripherals/FM/MAC/memac.c | 58 +++++++++++--------- + .../freescale/sdk_fman/Peripherals/FM/MAC/tgec.c | 1 + + .../sdk_fman/inc/Peripherals/fm_mac_ext.h | 13 +++++ + .../sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h | 2 + + .../freescale/sdk_fman/src/wrapper/lnxwrp_fm.c | 14 +++++ + 9 files changed, 83 insertions(+), 25 deletions(-) + +--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c ++++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c +@@ -175,6 +175,12 @@ static int dpaa_resume(struct device *de + priv = netdev_priv(net_dev); + mac_dev = priv->mac_dev; + ++ err = fm_mac_resume(mac_dev->get_mac_handle(mac_dev)); ++ if (err) { ++ netdev_err(net_dev, "fm_mac_resume = %d\n", err); ++ goto resume_failed; ++ } ++ + err = fm_port_resume(mac_dev->port_dev[TX]); + if (err) { + netdev_err(net_dev, "fm_port_resume(TX) = %d\n", err); +--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c ++++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c +@@ -1371,6 +1371,7 @@ static void InitFmMacControllerDriver(t_ + + p_FmMacControllerDriver->f_FM_MAC_Enable = DtsecEnable; + p_FmMacControllerDriver->f_FM_MAC_Disable = DtsecDisable; ++ p_FmMacControllerDriver->f_FM_MAC_Resume = NULL; + + p_FmMacControllerDriver->f_FM_MAC_SetException = DtsecSetException; + +--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c ++++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c +@@ -299,6 +299,18 @@ t_Error FM_MAC_Disable (t_Handle h_FmMac + RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG); + } + ++t_Error FM_MAC_Resume (t_Handle h_FmMac) ++{ ++ t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac; ++ ++ SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE); ++ ++ if (p_FmMacControllerDriver->f_FM_MAC_Resume) ++ return p_FmMacControllerDriver->f_FM_MAC_Resume(h_FmMac); ++ ++ return E_OK; ++} ++ + /* ......................................................................... */ + + t_Error FM_MAC_Enable1588TimeStamp (t_Handle h_FmMac) +--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h ++++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h +@@ -91,6 +91,7 @@ typedef struct { + + t_Error (*f_FM_MAC_Enable) (t_Handle h_FmMac, e_CommMode mode); + t_Error (*f_FM_MAC_Disable) (t_Handle h_FmMac, e_CommMode mode); ++ t_Error (*f_FM_MAC_Resume) (t_Handle h_FmMac); + t_Error (*f_FM_MAC_Enable1588TimeStamp) (t_Handle h_FmMac); + t_Error (*f_FM_MAC_Disable1588TimeStamp) (t_Handle h_FmMac); + t_Error (*f_FM_MAC_Reset) (t_Handle h_FmMac, bool wait); +--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/memac.c ++++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/memac.c +@@ -812,6 +812,37 @@ static uint16_t MemacGetMaxFrameLength(t + return fman_memac_get_max_frame_len(p_Memac->p_MemMap); + } + ++static t_Error MemacInitInternalPhy(t_Handle h_Memac) ++{ ++ t_Memac *p_Memac = (t_Memac *)h_Memac; ++ uint8_t i, phyAddr; ++ ++ if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_SGMII) ++ { ++ /* Configure internal SGMII PHY */ ++ if (p_Memac->enetMode & ENET_IF_SGMII_BASEX) ++ SetupSgmiiInternalPhyBaseX(p_Memac, PHY_MDIO_ADDR); ++ else ++ SetupSgmiiInternalPhy(p_Memac, PHY_MDIO_ADDR); ++ } ++ else if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_QSGMII) ++ { ++ /* Configure 4 internal SGMII PHYs */ ++ for (i = 0; i < 4; i++) ++ { ++ /* QSGMII PHY address occupies 3 upper bits of 5-bit ++ phyAddress; the lower 2 bits are used to extend ++ register address space and access each one of 4 ++ ports inside QSGMII. */ ++ phyAddr = (uint8_t)((PHY_MDIO_ADDR << 2) | i); ++ if (p_Memac->enetMode & ENET_IF_SGMII_BASEX) ++ SetupSgmiiInternalPhyBaseX(p_Memac, phyAddr); ++ else ++ SetupSgmiiInternalPhy(p_Memac, phyAddr); ++ } ++ } ++ return E_OK; ++} + + /*****************************************************************************/ + /* mEMAC Init & Free API */ +@@ -825,7 +856,6 @@ static t_Error MemacInit(t_Handle h_Mema + struct memac_cfg *p_MemacDriverParam; + enum enet_interface enet_interface; + enum enet_speed enet_speed; +- uint8_t i, phyAddr; + t_EnetAddr ethAddr; + e_FmMacType portType; + t_Error err; +@@ -887,30 +917,7 @@ static t_Error MemacInit(t_Handle h_Mema + } + #endif /* FM_RX_FIFO_CORRUPT_ERRATA_10GMAC_A006320 */ + +- if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_SGMII) +- { +- /* Configure internal SGMII PHY */ +- if (p_Memac->enetMode & ENET_IF_SGMII_BASEX) +- SetupSgmiiInternalPhyBaseX(p_Memac, PHY_MDIO_ADDR); +- else +- SetupSgmiiInternalPhy(p_Memac, PHY_MDIO_ADDR); +- } +- else if (ENET_INTERFACE_FROM_MODE(p_Memac->enetMode) == e_ENET_IF_QSGMII) +- { +- /* Configure 4 internal SGMII PHYs */ +- for (i = 0; i < 4; i++) +- { +- /* QSGMII PHY address occupies 3 upper bits of 5-bit +- phyAddress; the lower 2 bits are used to extend +- register address space and access each one of 4 +- ports inside QSGMII. */ +- phyAddr = (uint8_t)((PHY_MDIO_ADDR << 2) | i); +- if (p_Memac->enetMode & ENET_IF_SGMII_BASEX) +- SetupSgmiiInternalPhyBaseX(p_Memac, phyAddr); +- else +- SetupSgmiiInternalPhy(p_Memac, phyAddr); +- } +- } ++ MemacInitInternalPhy(h_Memac); + + /* Max Frame Length */ + err = FmSetMacMaxFrame(p_Memac->fmMacControllerDriver.h_Fm, +@@ -1008,6 +1015,7 @@ static void InitFmMacControllerDriver(t_ + + p_FmMacControllerDriver->f_FM_MAC_Enable = MemacEnable; + p_FmMacControllerDriver->f_FM_MAC_Disable = MemacDisable; ++ p_FmMacControllerDriver->f_FM_MAC_Resume = MemacInitInternalPhy; + + p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = MemacSetTxAutoPauseFrames; + p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = MemacSetTxPauseFrames; +--- a/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/tgec.c ++++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/tgec.c +@@ -897,6 +897,7 @@ static void InitFmMacControllerDriver(t_ + + p_FmMacControllerDriver->f_FM_MAC_Enable = TgecEnable; + p_FmMacControllerDriver->f_FM_MAC_Disable = TgecDisable; ++ p_FmMacControllerDriver->f_FM_MAC_Resume = NULL; + + p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames = TgecTxMacPause; + p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames = TgecSetTxPauseFrames; +--- a/drivers/net/ethernet/freescale/sdk_fman/inc/Peripherals/fm_mac_ext.h ++++ b/drivers/net/ethernet/freescale/sdk_fman/inc/Peripherals/fm_mac_ext.h +@@ -467,6 +467,19 @@ t_Error FM_MAC_Enable(t_Handle h_FmMac, + t_Error FM_MAC_Disable(t_Handle h_FmMac, e_CommMode mode); + + /**************************************************************************//** ++ @Function FM_MAC_Resume ++ ++ @Description Re-init the MAC after suspend ++ ++ @Param[in] h_FmMac A handle to a FM MAC Module. ++ ++ @Return E_OK on success; Error code otherwise. ++ ++ @Cautions Allowed only following FM_MAC_Init(). ++*//***************************************************************************/ ++t_Error FM_MAC_Resume(t_Handle h_FmMac); ++ ++/**************************************************************************//** + @Function FM_MAC_Enable1588TimeStamp + + @Description Enables the TSU operation. +--- a/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h ++++ b/drivers/net/ethernet/freescale/sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h +@@ -765,6 +765,8 @@ int fm_mac_enable(struct fm_mac_dev *fm_ + + int fm_mac_disable(struct fm_mac_dev *fm_mac_dev); + ++int fm_mac_resume(struct fm_mac_dev *fm_mac_dev); ++ + int fm_mac_set_promiscuous(struct fm_mac_dev *fm_mac_dev, + bool enable); + +--- a/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c ++++ b/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c +@@ -1733,6 +1733,20 @@ int fm_mac_disable(struct fm_mac_dev *fm + } + EXPORT_SYMBOL(fm_mac_disable); + ++int fm_mac_resume(struct fm_mac_dev *fm_mac_dev) ++{ ++ int _errno; ++ t_Error err; ++ ++ err = FM_MAC_Resume(fm_mac_dev); ++ _errno = -GET_ERROR_TYPE(err); ++ if (unlikely(_errno < 0)) ++ pr_err("FM_MAC_Resume() = 0x%08x\n", err); ++ ++ return _errno; ++} ++EXPORT_SYMBOL(fm_mac_resume); ++ + int fm_mac_set_promiscuous(struct fm_mac_dev *fm_mac_dev, + bool enable) + { |