From afcfdda960da9d9ad4c4d21c7dd0cc7791cf36c7 Mon Sep 17 00:00:00 2001 From: Madalin Bucur 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 --- 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) {