diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2022-12-06 14:39:07 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2022-12-06 14:39:07 -0800 |
commit | 2622a733036daff5111ee3b778a2f81bdc2e9b32 (patch) | |
tree | 0f64ccd797d70b3578fd3e3b80bd7e8ec8816757 | |
parent | f1c8e1cb46bafb1fdcc38ba93b2fb46a03f74b3c (diff) | |
parent | 8222c9bc5aece0b610c6ccd443d69fb3102a42f2 (diff) |
Merge "net: stmmac: Add support for qcom serdes" into wip-er12
6 files changed, 733 insertions, 20 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile index b8741ed28ee82..15b93a51ecdc7 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Makefile +++ b/drivers/net/ethernet/stmicro/stmmac/Makefile @@ -21,8 +21,8 @@ obj-$(CONFIG_DWMAC_MEDIATEK) += dwmac-mediatek.o obj-$(CONFIG_DWMAC_MESON) += dwmac-meson.o dwmac-meson8b.o obj-$(CONFIG_DWMAC_OXNAS) += dwmac-oxnas.o obj-$(CONFIG_DWMAC_QCOM_ETHQOS) += dwmac-qcom-eth.o -dwmac-qcom-eth-objs := dwmac-qcom-ethqos.o dwmac-qcom-gpio.o dwmac-qcom-pps.o - +dwmac-qcom-eth-objs := dwmac-qcom-ethqos.o dwmac-qcom-gpio.o dwmac-qcom-pps.o \ + dwmac-qcom-serdes.o obj-$(CONFIG_DWMAC_ROCKCHIP) += dwmac-rk.o obj-$(CONFIG_DWMAC_SOCFPGA) += dwmac-altr-socfpga.o obj-$(CONFIG_DWMAC_STI) += dwmac-sti.o diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c index f1285e63af80f..9b8f885b4adc7 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c @@ -27,6 +27,7 @@ #include "stmmac_platform.h" #include "dwmac-qcom-ethqos.h" #include "stmmac_ptp.h" +#include "dwmac-qcom-serdes.h" #define RGMII_IO_MACRO_DEBUG1 0x20 #define EMAC_SYSTEM_LOW_POWER_DEBUG 0x28 @@ -1016,18 +1017,51 @@ static int ethqos_configure_mac_v3(struct qcom_ethqos *ethqos) return ret; } +int ethqos_configureSGMII(struct qcom_ethqos *ethqos) +{ + u32 value = 0; + + value = readl(ethqos->ioaddr + MAC_CTRL_REG); + switch (ethqos->speed) { + case SPEED_1000: + value &= ~BIT(15); + writel(value, ethqos->ioaddr + MAC_CTRL_REG); + rgmii_updatel(ethqos, BIT(16), BIT(16), RGMII_IO_MACRO_CONFIG2); + break; + + case SPEED_100: + value |= BIT(15) | BIT(14); + writel(value, ethqos->ioaddr + MAC_CTRL_REG); + break; + case SPEED_10: + value |= BIT(15); + value &= ~BIT(14); + writel(value, ethqos->ioaddr + MAC_CTRL_REG); + break; + } + + return value; +} + static void ethqos_fix_mac_speed(void *priv, unsigned int speed) { struct qcom_ethqos *ethqos = priv; - int ret = 0; + struct stmmac_priv *stmpriv = qcom_ethqos_get_priv(ethqos); + int ret = -1; ethqos->speed = speed; - ethqos_update_rgmii_clk(ethqos, speed); - if (ethqos->emac_ver == EMAC_HW_v3_0_0_RG) - ret = ethqos_configure_mac_v3(ethqos); - else - ethqos_configure(ethqos); - if (ret != 0) + + if (stmpriv->plat->interface == PHY_INTERFACE_MODE_SGMII) { + ret = ethqos_configureSGMII(ethqos); + } else { + ethqos_update_rgmii_clk(ethqos, speed); + if (ethqos->emac_ver == EMAC_HW_v3_0_0_RG) + ret = ethqos_configure_mac_v3(ethqos); + else + ethqos_configure(ethqos); + } + + if (ret < 0) ETHQOSERR("HSR configuration has failed\n"); } @@ -1170,6 +1204,7 @@ static int ethqos_phy_intr_enable(void *priv_n) } static const struct of_device_id qcom_ethqos_match[] = { + { .compatible = "qcom,stmmac-ethqos", }, { .compatible = "qcom,stmmac-ethqos-emac0", }, { .compatible = "qcom,stmmac-ethqos-emac1", }, { .compatible = "qcom,emac-smmu-embedded", }, @@ -1630,24 +1665,32 @@ static int qcom_ethqos_probe(struct platform_device *pdev) return PTR_ERR(plat_dat); } + ethqos->ioaddr = (&stmmac_res)->addr; + ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii"); if (IS_ERR(ethqos->rgmii_base)) { ret = PTR_ERR(ethqos->rgmii_base); goto err_mem; } - ethqos->rgmii_clk = devm_clk_get(&pdev->dev, "rgmii"); - if (IS_ERR(ethqos->rgmii_clk)) { - ret = PTR_ERR(ethqos->rgmii_clk); - goto err_mem; + ethqos->speed = SPEED_10; + if (plat_dat->interface == PHY_INTERFACE_MODE_SGMII) { + ret = configure_serdes_dt(ethqos); + if (ret) + goto err_mem; + qcom_ethqos_serdes_init(ethqos, ethqos->speed); + } else { + ethqos->rgmii_clk = devm_clk_get(&pdev->dev, "rgmii"); + if (IS_ERR(ethqos->rgmii_clk)) { + ret = PTR_ERR(ethqos->rgmii_clk); + goto err_mem; + } + ret = clk_prepare_enable(ethqos->rgmii_clk); + if (ret) + goto err_mem; + ethqos_update_rgmii_clk(ethqos, SPEED_10); } - ret = clk_prepare_enable(ethqos->rgmii_clk); - if (ret) - goto err_mem; - - ethqos->speed = SPEED_1000; - ethqos_update_rgmii_clk(ethqos, SPEED_1000); ethqos_set_func_clk_en(ethqos); plat_dat->bsp_priv = ethqos; diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.h b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.h index 82517275897fc..76f06335a2327 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.h @@ -119,9 +119,15 @@ struct ethqos_io_macro { struct qcom_ethqos { struct platform_device *pdev; void __iomem *rgmii_base; + void __iomem *sgmii_base; + void __iomem *ioaddr; + unsigned int rgmii_clk_rate; struct clk *rgmii_clk; + struct clk *phyaux_clk; + struct clk *sgmiref_clk; + unsigned int speed; int gpio_phy_intr_redirect; diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-serdes.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-serdes.c new file mode 100644 index 0000000000000..056013d91f400 --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-serdes.c @@ -0,0 +1,221 @@ +// SPDX-License-Identifier: GPL-2.0 + +// Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + +#include <linux/delay.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/of_gpio.h> + +#include <linux/phy.h> +#include <linux/io.h> + +#include <linux/iopoll.h> +#include <linux/mii.h> +#include <linux/of_mdio.h> +#include <linux/slab.h> +#include <linux/poll.h> +#include <linux/debugfs.h> +#include <linux/dma-iommu.h> +#include <linux/iommu.h> +#include <linux/micrel_phy.h> +#include <linux/tcp.h> +#include <linux/ip.h> + +#include <linux/rtnetlink.h> +#include <asm-generic/io.h> +#include <linux/kthread.h> +#include <linux/io-64-nonatomic-hi-lo.h> + +#include "dwmac-qcom-serdes.h" + +int configure_serdes_dt(struct qcom_ethqos *ethqos) +{ + struct resource *res = NULL; + struct platform_device *pdev = ethqos->pdev; + int ret; + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "serdes"); + ethqos->sgmii_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(ethqos->sgmii_base)) { + dev_err(&pdev->dev, "Can't get sgmii base\n"); + ret = PTR_ERR(ethqos->sgmii_base); + goto err_mem; + } + + ethqos->sgmiref_clk = devm_clk_get(&pdev->dev, "sgmi_ref"); + if (IS_ERR(ethqos->sgmiref_clk)) { + ret = PTR_ERR(ethqos->sgmiref_clk); + ethqos->sgmiref_clk = NULL; + goto err_mem; + } + ethqos->phyaux_clk = devm_clk_get(&pdev->dev, "phyaux"); + if (IS_ERR(ethqos->phyaux_clk)) { + ret = PTR_ERR(ethqos->phyaux_clk); + goto err_get_phyaux_clk; + } + + ret = clk_prepare_enable(ethqos->sgmiref_clk); + if (ret) + goto err_enable_sgmiref_clk; + + ret = clk_prepare_enable(ethqos->phyaux_clk); + if (ret) + goto err_enable_phyaux_clk; + + return 0; + +err_enable_phyaux_clk: + clk_disable_unprepare(ethqos->sgmiref_clk); +err_enable_sgmiref_clk: + ethqos->phyaux_clk = NULL; +err_get_phyaux_clk: + ethqos->sgmiref_clk = NULL; +err_mem: + return ret; +} + +void qcom_ethqos_serdes_init(struct qcom_ethqos *ethqos, int speed) +{ + int retry = 500; + unsigned int val; + + /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/ + writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_PCS_SW_RESET); + writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_PCS_POWER_DOWN_CONTROL); + + /***************** MODULE: QSERDES_COM_SGMII_QMP_PLL*********/ + writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_COM_PLL_IVCO); + writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_COM_CP_CTRL_MODE0); + writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_PLL_RCTRL_MODE0); + writel_relaxed(0x36, ethqos->sgmii_base + QSERDES_COM_PLL_CCTRL_MODE0); + writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_SYSCLK_EN_SEL); + writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP1_MODE0); + writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP2_MODE0); + writel_relaxed(0x82, ethqos->sgmii_base + QSERDES_COM_DEC_START_MODE0); + writel_relaxed(0x55, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START1_MODE0); + writel_relaxed(0x55, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START2_MODE0); + writel_relaxed(0x03, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START3_MODE0); + writel_relaxed(0x24, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE1_MODE0); + + writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE2_MODE0); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE_INITVAL2); + writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_COM_HSCLK_SEL); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_HSCLK_HS_SWITCH_SEL); + writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_COM_CORECLK_DIV_MODE0); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_CORE_CLK_EN); + writel_relaxed(0xB9, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0); + writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0); + writel_relaxed(0x11, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_HSCLK_SEL); + + /******************MODULE: QSERDES_TX0_SGMII_QMP_TX***********************/ + writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX_TX_BAND); + writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_TX_SLEW_CNTL); + writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX_RES_CODE_LANE_OFFSET_TX); + writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX_RES_CODE_LANE_OFFSET_RX); + writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX_LANE_MODE_1); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_TX_LANE_MODE_3); + writel_relaxed(0x12, ethqos->sgmii_base + QSERDES_TX_RCV_DETECT_LVL_2); + writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_TX_TRAN_DRVR_EMP_EN); + + /*****************MODULE: QSERDES_RX0_SGMII_QMP_RX*******************/ + writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX_UCDR_FO_GAIN); + writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_RX_UCDR_SO_GAIN); + writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX_UCDR_FASTLOCK_FO_GAIN); + writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX_UCDR_FASTLOCK_COUNT_LOW); + writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX_UCDR_FASTLOCK_COUNT_HIGH); + writel_relaxed(0x81, ethqos->sgmii_base + QSERDES_RX_UCDR_PI_CONTROLS); + writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX_UCDR_PI_CTRL2); + writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_RX_RX_TERM_BW); + writel_relaxed(0x08, ethqos->sgmii_base + QSERDES_RX_VGA_CAL_CNTRL2); + writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX_GM_CAL); + writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_RX_RX_EQU_ADAPTOR_CNTRL1); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2); + writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3); + writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4); + writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX_RX_IDAC_TSETTLE_LOW); + writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX_RX_IDAC_TSETTLE_HIGH); + writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_RX_RX_IDAC_MEASURE_TIME); + writel_relaxed(0x17, ethqos->sgmii_base + QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2); + writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX_SIGDET_CNTRL); + writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_RX_SIGDET_DEGLITCH_CNTRL); + writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_RX_RX_BAND); + writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX_RX_MODE_00_LOW); + writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX_RX_MODE_00_HIGH); + writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX_RX_MODE_00_HIGH2); + writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX_RX_MODE_00_HIGH3); + writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX_RX_MODE_00_HIGH4); + writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX_RX_MODE_01_LOW); + writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX_RX_MODE_01_HIGH); + writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX_RX_MODE_01_HIGH2); + writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX_RX_MODE_01_HIGH3); + writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX_RX_MODE_01_HIGH4); + writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX_RX_MODE_10_LOW); + writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX_RX_MODE_10_HIGH); + writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX_RX_MODE_10_HIGH2); + writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES_RX_RX_MODE_10_HIGH3); + writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES_RX_RX_MODE_10_HIGH4); + writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX_DCC_CTRL1); + + /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/ + writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_PCS_LINE_RESET_TIME); + writel_relaxed(0x1F, ethqos->sgmii_base + QSERDES_PCS_TX_LARGE_AMP_DRV_LVL); + writel_relaxed(0x03, ethqos->sgmii_base + QSERDES_PCS_TX_SMALL_AMP_DRV_LVL); + writel_relaxed(0x83, ethqos->sgmii_base + QSERDES_PCS_TX_MID_TERM_CTRL1); + writel_relaxed(0x08, ethqos->sgmii_base + QSERDES_PCS_TX_MID_TERM_CTRL2); + writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_PCS_SGMII_MISC_CTRL8); + writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_PCS_SW_RESET); + + writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_PCS_PHY_START); + + do { + val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_C_READY_STATUS); + val &= BIT(0); + if (val) + break; + usleep_range(1000, 1500); + retry--; + } while (retry > 0); + if (!retry) + ETHQOSERR("QSERDES_COM_C_READY_STATUS timedout with retry = %d\n", retry); + + retry = 500; + do { + val = readl_relaxed(ethqos->sgmii_base + QSERDES_PCS_PCS_READY_STATUS); + val &= BIT(0); + if (val) + break; + usleep_range(1000, 1500); + retry--; + } while (retry > 0); + if (!retry) + ETHQOSERR("PCS_READY timedout with retry = %d\n", retry); + + retry = 500; + do { + val = readl_relaxed(ethqos->sgmii_base + QSERDES_PCS_PCS_READY_STATUS); + val &= BIT(7); + if (val) + break; + usleep_range(1000, 1500); + retry--; + } while (retry > 0); + if (!retry) + ETHQOSERR("SGMIIPHY_READY timedout with retry = %d\n", retry); + + retry = 5000; + do { + val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_CMN_STATUS); + val &= BIT(1); + if (val) + break; + usleep_range(1000, 1500); + retry--; + } while (retry > 0); + if (!retry) + ETHQOSERR("PLL Lock Status timedout with retry = %d\n", retry); +} diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-serdes.h b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-serdes.h new file mode 100644 index 0000000000000..f7acda6c7dbda --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-serdes.h @@ -0,0 +1,443 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright (c) 2021, The Linux Foundation. All rights reserved. + */ +/*Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.*/ +#ifndef _DWMAC_QCOM_SERDES_H +#define _DWMAC_QCOM_SERDES_H + +#include <linux/inetdevice.h> +#include <linux/inet.h> +#include <net/addrconf.h> +#include <net/ipv6.h> +#include <net/inet_common.h> +#include <linux/uaccess.h> + +#include "stmmac.h" +#include "dwmac-qcom-ethqos.h" + +#define QSERDES_QMP_PLL 0x0 +#define QSERDES_COM_ATB_SEL1 (QSERDES_QMP_PLL + 0x0) +#define QSERDES_COM_ATB_SEL2 (QSERDES_QMP_PLL + 0x4) +#define QSERDES_COM_BG_TIMER (QSERDES_QMP_PLL + 0xC) +#define QSERDES_COM_BIAS_EN_CLKBUFLR_EN (QSERDES_QMP_PLL + 0x44) +#define QSERDES_COM_BIAS_EN_CTRL_BY_PSM (QSERDES_QMP_PLL + 0x90) +#define QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0 (QSERDES_QMP_PLL + 0x1AC) +#define QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE1 (QSERDES_QMP_PLL + 0x1B4) +#define QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0 (QSERDES_QMP_PLL + 0x1B0) +#define QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE1 (QSERDES_QMP_PLL + 0x1B8) +#define QSERDES_COM_BIN_VCOCAL_HSCLK_SEL (QSERDES_QMP_PLL + 0x1BC) +#define QSERDES_COM_C_READY_STATUS (QSERDES_QMP_PLL + 0x178) +#define QSERDES_COM_CLK_ENABLE1 (QSERDES_QMP_PLL + 0x48) +#define QSERDES_COM_CLK_EP_DIV_MODE0 (QSERDES_QMP_PLL + 0x6C) +#define QSERDES_COM_CLK_EP_DIV_MODE1 (QSERDES_QMP_PLL + 0x70) +#define QSERDES_COM_CLK_SELECT (QSERDES_QMP_PLL + 0x154) +#define QSERDES_COM_CML_SYSCLK_SEL (QSERDES_QMP_PLL + 0x98) +#define QSERDES_COM_CMN_CONFIG (QSERDES_QMP_PLL + 0x17C) +#define QSERDES_COM_CMN_IETRIM (QSERDES_QMP_PLL + 0x5C) +#define QSERDES_COM_CMN_IPTRIM (QSERDES_QMP_PLL + 0x60) +#define QSERDES_COM_CMN_MISC1 (QSERDES_QMP_PLL + 0x19C) +#define QSERDES_COM_CMN_MODE (QSERDES_QMP_PLL + 0x1A0) +#define QSERDES_COM_CMN_MODE_CONTD (QSERDES_QMP_PLL + 0x1A4) +#define QSERDES_COM_CMN_RATE_OVERRIDE (QSERDES_QMP_PLL + 0x180) +#define QSERDES_COM_CMN_STATUS (QSERDES_QMP_PLL + 0x140) +#define QSERDES_COM_CORE_CLK_EN (QSERDES_QMP_PLL + 0x174) +#define QSERDES_COM_CORECLK_DIV_MODE0 (QSERDES_QMP_PLL + 0x168) +#define QSERDES_COM_CORECLK_DIV_MODE1 (QSERDES_QMP_PLL + 0x16C) +#define QSERDES_COM_CP_CTRL_MODE0 (QSERDES_QMP_PLL + 0x74) +#define QSERDES_COM_CP_CTRL_MODE1 (QSERDES_QMP_PLL + 0x78) +#define QSERDES_COM_DEBUG_BUS0 (QSERDES_QMP_PLL + 0x188) +#define QSERDES_COM_DEBUG_BUS1 (QSERDES_QMP_PLL + 0x18C) +#define QSERDES_COM_DEBUG_BUS2 (QSERDES_QMP_PLL + 0x190) +#define QSERDES_COM_DEBUG_BUS3 (QSERDES_QMP_PLL + 0x194) +#define QSERDES_COM_DEBUG_BUS_SEL (QSERDES_QMP_PLL + 0x198) +#define QSERDES_COM_DEC_START_MODE0 (QSERDES_QMP_PLL + 0xBC) +#define QSERDES_COM_DEC_START_MODE1 (QSERDES_QMP_PLL + 0xC4) +#define QSERDES_COM_DEC_START_MSB_MODE0 (QSERDES_QMP_PLL + 0xC0) +#define QSERDES_COM_DEC_START_MSB_MODE1 (QSERDES_QMP_PLL + 0xC8) +#define QSERDES_COM_DIV_FRAC_START1_MODE0 (QSERDES_QMP_PLL + 0xCC) +#define QSERDES_COM_DIV_FRAC_START1_MODE1 (QSERDES_QMP_PLL + 0xD8) +#define QSERDES_COM_DIV_FRAC_START2_MODE0 (QSERDES_QMP_PLL + 0xD0) +#define QSERDES_COM_DIV_FRAC_START2_MODE1 (QSERDES_QMP_PLL + 0xDC) +#define QSERDES_COM_DIV_FRAC_START3_MODE0 (QSERDES_QMP_PLL + 0xD4) +#define QSERDES_COM_DIV_FRAC_START3_MODE1 (QSERDES_QMP_PLL + 0xE0) +#define QSERDES_COM_EP_CLOCK_DETECT_CTRL (QSERDES_QMP_PLL + 0x64) +#define QSERDES_COM_FREQ_UPDATE (QSERDES_QMP_PLL + 0x8) +#define QSERDES_COM_HSCLK_HS_SWITCH_SEL (QSERDES_QMP_PLL + 0x15C) +#define QSERDES_COM_HSCLK_SEL (QSERDES_QMP_PLL + 0x158) +#define QSERDES_COM_INTEGLOOP_BINCODE_STATUS (QSERDES_QMP_PLL + 0x160) +#define QSERDES_COM_INTEGLOOP_EN (QSERDES_QMP_PLL + 0xE8) +#define QSERDES_COM_INTEGLOOP_GAIN0_MODE0 (QSERDES_QMP_PLL + 0xEC) +#define QSERDES_COM_INTEGLOOP_GAIN0_MODE1 (QSERDES_QMP_PLL + 0xF4) +#define QSERDES_COM_INTEGLOOP_GAIN1_MODE0 (QSERDES_QMP_PLL + 0xF0) +#define QSERDES_COM_INTEGLOOP_GAIN1_MODE1 (QSERDES_QMP_PLL + 0xF8) +#define QSERDES_COM_INTEGLOOP_INITVAL (QSERDES_QMP_PLL + 0xE4) +#define QSERDES_COM_INTEGLOOP_P_PATH_GAIN0 (QSERDES_QMP_PLL + 0xFC) +#define QSERDES_COM_INTEGLOOP_P_PATH_GAIN1 (QSERDES_QMP_PLL + 0x100) +#define QSERDES_COM_LOCK_CMP1_MODE0 (QSERDES_QMP_PLL + 0xAC) +#define QSERDES_COM_LOCK_CMP1_MODE1 (QSERDES_QMP_PLL + 0xB4) +#define QSERDES_COM_LOCK_CMP2_MODE0 (QSERDES_QMP_PLL + 0xB0) +#define QSERDES_COM_LOCK_CMP2_MODE1 (QSERDES_QMP_PLL + 0xB8) +#define QSERDES_COM_LOCK_CMP_CFG (QSERDES_QMP_PLL + 0xA8) +#define QSERDES_COM_LOCK_CMP_EN (QSERDES_QMP_PLL + 0xA4) +#define QSERDES_COM_MODE_OPERATION_STATUS (QSERDES_QMP_PLL + 0x1C4) +#define QSERDES_COM_PLL_ANALOG (QSERDES_QMP_PLL + 0x164) +#define QSERDES_COM_PLL_CCTRL_MODE0 (QSERDES_QMP_PLL + 0x84) +#define QSERDES_COM_PLL_CCTRL_MODE1 (QSERDES_QMP_PLL + 0x88) +#define QSERDES_COM_PLL_CNTRL (QSERDES_QMP_PLL + 0x8C) +#define QSERDES_COM_PLL_EN (QSERDES_QMP_PLL + 0x54) +#define QSERDES_COM_PLL_IVCO (QSERDES_QMP_PLL + 0x58) +#define QSERDES_COM_PLL_RCTRL_MODE0 (QSERDES_QMP_PLL + 0x7C) +#define QSERDES_COM_PLL_RCTRL_MODE1 (QSERDES_QMP_PLL + 0x80) +#define QSERDES_COM_PLLCAL_CODE1_STATUS (QSERDES_QMP_PLL + 0x14C) +#define QSERDES_COM_PLLCAL_CODE2_STATUS (QSERDES_QMP_PLL + 0x150) +#define QSERDES_COM_POST_DIV (QSERDES_QMP_PLL + 0x3C) +#define QSERDES_COM_POST_DIV_MUX (QSERDES_QMP_PLL + 0x40) +#define QSERDES_COM_RESERVED_1 (QSERDES_QMP_PLL + 0x1C0) +#define QSERDES_COM_RESET_SM_STATUS (QSERDES_QMP_PLL + 0x144) +#define QSERDES_COM_RESETSM_CNTRL (QSERDES_QMP_PLL + 0x9C) +#define QSERDES_COM_RESETSM_CNTRL2 (QSERDES_QMP_PLL + 0xA0) +#define QSERDES_COM_RESTRIM_CODE_STATUS (QSERDES_QMP_PLL + 0x148) +#define QSERDES_COM_SSC_ADJ_PER1 (QSERDES_QMP_PLL + 0x14) +#define QSERDES_COM_SSC_ADJ_PER2 (QSERDES_QMP_PLL + 0x18) +#define QSERDES_COM_SSC_EN_CENTER (QSERDES_QMP_PLL + 0x10) +#define QSERDES_COM_SSC_PER1 (QSERDES_QMP_PLL + 0x1C) +#define QSERDES_COM_SSC_PER2 (QSERDES_QMP_PLL + 0x20) +#define QSERDES_COM_SSC_STEP_SIZE1_MODE0 (QSERDES_QMP_PLL + 0x24) +#define QSERDES_COM_SSC_STEP_SIZE1_MODE1 (QSERDES_QMP_PLL + 0x30) +#define QSERDES_COM_SSC_STEP_SIZE2_MODE0 (QSERDES_QMP_PLL + 0x28) +#define QSERDES_COM_SSC_STEP_SIZE2_MODE1 (QSERDES_QMP_PLL + 0x34) +#define QSERDES_COM_SSC_STEP_SIZE3_MODE0 (QSERDES_QMP_PLL + 0x2C) +#define QSERDES_COM_SSC_STEP_SIZE3_MODE1 (QSERDES_QMP_PLL + 0x38) +#define QSERDES_COM_SVS_MODE_CLK_SEL (QSERDES_QMP_PLL + 0x184) +#define QSERDES_COM_SW_RESET (QSERDES_QMP_PLL + 0x170) +#define QSERDES_COM_SYS_CLK_CTRL (QSERDES_QMP_PLL + 0x4C) +#define QSERDES_COM_SYSCLK_BUF_ENABLE (QSERDES_QMP_PLL + 0x50) +#define QSERDES_COM_SYSCLK_DET_COMP_STATUS (QSERDES_QMP_PLL + 0x68) +#define QSERDES_COM_SYSCLK_EN_SEL (QSERDES_QMP_PLL + 0x94) +#define QSERDES_COM_VCO_DC_LEVEL_CTRL (QSERDES_QMP_PLL + 0x1A8) +#define QSERDES_COM_VCO_TUNE1_MODE0 (QSERDES_QMP_PLL + 0x110) +#define QSERDES_COM_VCO_TUNE1_MODE1 (QSERDES_QMP_PLL + 0x118) +#define QSERDES_COM_VCO_TUNE2_MODE0 (QSERDES_QMP_PLL + 0x114) +#define QSERDES_COM_VCO_TUNE2_MODE1 (QSERDES_QMP_PLL + 0x11C) +#define QSERDES_COM_VCO_TUNE_CTRL (QSERDES_QMP_PLL + 0x108) +#define QSERDES_COM_VCO_TUNE_INITVAL1 (QSERDES_QMP_PLL + 0x120) +#define QSERDES_COM_VCO_TUNE_INITVAL2 (QSERDES_QMP_PLL + 0x124) +#define QSERDES_COM_VCO_TUNE_MAP (QSERDES_QMP_PLL + 0x10C) +#define QSERDES_COM_VCO_TUNE_MAXVAL1 (QSERDES_QMP_PLL + 0x130) +#define QSERDES_COM_VCO_TUNE_MAXVAL2 (QSERDES_QMP_PLL + 0x134) +#define QSERDES_COM_VCO_TUNE_MINVAL1 (QSERDES_QMP_PLL + 0x128) +#define QSERDES_COM_VCO_TUNE_MINVAL2 (QSERDES_QMP_PLL + 0x12C) +#define QSERDES_COM_VCO_TUNE_TIMER1 (QSERDES_QMP_PLL + 0x138) +#define QSERDES_COM_VCO_TUNE_TIMER2 (QSERDES_QMP_PLL + 0x13C) +#define QSERDES_COM_VCOCAL_DEADMAN_CTRL (QSERDES_QMP_PLL + 0x104) + +#define QSERDES_RX 0x600 +#define QSERDES_RX_UCDR_FO_GAIN_HALF (QSERDES_RX + 0x0) +#define QSERDES_RX_UCDR_FO_GAIN_QUARTER (QSERDES_RX + 0x4) +#define QSERDES_RX_UCDR_FO_GAIN (QSERDES_RX + 0x8) +#define QSERDES_RX_UCDR_SO_GAIN_HALF (QSERDES_RX + 0xC) +#define QSERDES_RX_UCDR_SO_GAIN_QUARTER (QSERDES_RX + 0x10) +#define QSERDES_RX_UCDR_SO_GAIN (QSERDES_RX + 0x14) +#define QSERDES_RX_UCDR_SVS_FO_GAIN_HALF (QSERDES_RX + 0x18) +#define QSERDES_RX_UCDR_SVS_FO_GAIN_QUARTER (QSERDES_RX + 0x1C) +#define QSERDES_RX_UCDR_SVS_FO_GAIN (QSERDES_RX + 0x20) +#define QSERDES_RX_UCDR_SVS_SO_GAIN_HALF (QSERDES_RX + 0x24) +#define QSERDES_RX_UCDR_SVS_SO_GAIN_QUARTER (QSERDES_RX + 0x28) +#define QSERDES_RX_UCDR_SVS_SO_GAIN (QSERDES_RX + 0x2C) +#define QSERDES_RX_UCDR_FASTLOCK_FO_GAIN (QSERDES_RX + 0x30) +#define QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE (QSERDES_RX + 0x34) +#define QSERDES_RX_UCDR_FO_TO_SO_DELAY (QSERDES_RX + 0x38) +#define QSERDES_RX_UCDR_FASTLOCK_COUNT_LOW (QSERDES_RX + 0x3C) +#define QSERDES_RX_UCDR_FASTLOCK_COUNT_HIGH (QSERDES_RX + 0x40) +#define QSERDES_RX_UCDR_PI_CONTROLS (QSERDES_RX + 0x44) +#define QSERDES_RX_UCDR_PI_CTRL2 (QSERDES_RX + 0x48) +#define QSERDES_RX_UCDR_SB2_THRESH1 (QSERDES_RX + 0x4C) +#define QSERDES_RX_UCDR_SB2_THRESH2 (QSERDES_RX + 0x50) +#define QSERDES_RX_UCDR_SB2_GAIN1 (QSERDES_RX + 0x54) +#define QSERDES_RX_UCDR_SB2_GAIN2 (QSERDES_RX + 0x58) +#define QSERDES_RX_AUX_CONTROL (QSERDES_RX + 0x5C) +#define QSERDES_RX_AUX_DATA_TCOARSE_TFINE (QSERDES_RX + 0x60) +#define QSERDES_RX_RCLK_AUXDATA_SEL (QSERDES_RX + 0x64) +#define QSERDES_RX_AC_JTAG_ENABLE (QSERDES_RX + 0x68) +#define QSERDES_RX_AC_JTAG_INITP (QSERDES_RX + 0x6C) +#define QSERDES_RX_AC_JTAG_INITN (QSERDES_RX + 0x70) +#define QSERDES_RX_AC_JTAG_LVL (QSERDES_RX + 0x74) +#define QSERDES_RX_AC_JTAG_MODE (QSERDES_RX + 0x78) +#define QSERDES_RX_AC_JTAG_RESET (QSERDES_RX + 0x7C) +#define QSERDES_RX_RX_TERM_BW (QSERDES_RX + 0x80) +#define QSERDES_RX_RX_RCVR_IQ_EN (QSERDES_RX + 0x84) +#define QSERDES_RX_RX_IDAC_I_DC_OFFSETS (QSERDES_RX + 0x88) +#define QSERDES_RX_RX_IDAC_IBAR_DC_OFFSETS (QSERDES_RX + 0x8C) +#define QSERDES_RX_RX_IDAC_Q_DC_OFFSETS (QSERDES_RX + 0x90) +#define QSERDES_RX_RX_IDAC_QBAR_DC_OFFSETS (QSERDES_RX + 0x94) +#define QSERDES_RX_RX_IDAC_A_DC_OFFSETS (QSERDES_RX + 0x98) +#define QSERDES_RX_RX_IDAC_ABAR_DC_OFFSETS (QSERDES_RX + 0x9C) +#define QSERDES_RX_RX_IDAC_EN (QSERDES_RX + 0xA0) +#define QSERDES_RX_RX_IDAC_ENABLES (QSERDES_RX + 0xA4) +#define QSERDES_RX_RX_IDAC_SIGN (QSERDES_RX + 0xA8) +#define QSERDES_RX_RX_HIGHZ_HIGHRATE (QSERDES_RX + 0xAC) +#define QSERDES_RX_RX_TERM_AC_BYPASS_DC_COUPLE_OFFSET (QSERDES_RX + 0xB0) +#define QSERDES_RX_DFE_1 (QSERDES_RX + 0xB4) +#define QSERDES_RX_DFE_2 (QSERDES_RX + 0xB8) +#define QSERDES_RX_DFE_3 (QSERDES_RX + 0xBC) +#define QSERDES_RX_DFE_4 (QSERDES_RX + 0xC0) +#define QSERDES_RX_TX_ADAPT_PRE_THRESH1 (QSERDES_RX + 0xC4) +#define QSERDES_RX_TX_ADAPT_PRE_THRESH2 (QSERDES_RX + 0xC8) +#define QSERDES_RX_TX_ADAPT_POST_THRESH (QSERDES_RX + 0xCC) +#define QSERDES_RX_TX_ADAPT_MAIN_THRESH (QSERDES_RX + 0xD0) +#define QSERDES_RX_VGA_CAL_CNTRL1 (QSERDES_RX + 0xD4) +#define QSERDES_RX_VGA_CAL_CNTRL2 (QSERDES_RX + 0xD8) +#define QSERDES_RX_GM_CAL (QSERDES_RX + 0xDC) +#define QSERDES_RX_RX_VGA_GAIN2_LSB (QSERDES_RX + 0xE0) +#define QSERDES_RX_RX_VGA_GAIN2_MSB (QSERDES_RX + 0xE4) +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL1 (QSERDES_RX + 0xE8) +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2 (QSERDES_RX + 0xEC) +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3 (QSERDES_RX + 0xF0) +#define QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4 (QSERDES_RX + 0xF4) +#define QSERDES_RX_RX_IDAC_TSETTLE_LOW (QSERDES_RX + 0xF8) +#define QSERDES_RX_RX_IDAC_TSETTLE_HIGH (QSERDES_RX + 0xFC) +#define QSERDES_RX_RX_IDAC_MEASURE_TIME (QSERDES_RX + 0x100) +#define QSERDES_RX_RX_IDAC_ACCUMULATOR (QSERDES_RX + 0x104) +#define QSERDES_RX_RX_EQ_OFFSET_LSB (QSERDES_RX + 0x108) +#define QSERDES_RX_RX_EQ_OFFSET_MSB (QSERDES_RX + 0x10C) +#define QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1 (QSERDES_RX + 0x110) +#define QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2 (QSERDES_RX + 0x114) +#define QSERDES_RX_SIGDET_ENABLES (QSERDES_RX + 0x118) +#define QSERDES_RX_SIGDET_CNTRL (QSERDES_RX + 0x11C) +#define QSERDES_RX_SIGDET_LVL (QSERDES_RX + 0x120) +#define QSERDES_RX_SIGDET_DEGLITCH_CNTRL (QSERDES_RX + 0x124) +#define QSERDES_RX_RX_BAND (QSERDES_RX + 0x128) +#define QSERDES_RX_CDR_FREEZE_UP_DN (QSERDES_RX + 0x12C) +#define QSERDES_RX_CDR_RESET_OVERRIDE (QSERDES_RX + 0x130) +#define QSERDES_RX_RX_INTERFACE_MODE (QSERDES_RX + 0x134) +#define QSERDES_RX_JITTER_GEN_MODE (QSERDES_RX + 0x138) +#define QSERDES_RX_SJ_AMP1 (QSERDES_RX + 0x13C) +#define QSERDES_RX_SJ_AMP2 (QSERDES_RX + 0x140) +#define QSERDES_RX_SJ_PER1 (QSERDES_RX + 0x144) +#define QSERDES_RX_SJ_PER2 (QSERDES_RX + 0x148) +#define QSERDES_RX_PPM_OFFSET1 (QSERDES_RX + 0x14C) +#define QSERDES_RX_PPM_OFFSET2 (QSERDES_RX + 0x150) +#define QSERDES_RX_SIGN_PPM_PERIOD1 (QSERDES_RX + 0x154) +#define QSERDES_RX_SIGN_PPM_PERIOD2 (QSERDES_RX + 0x158) +#define QSERDES_RX_RX_MODE_00_LOW (QSERDES_RX + 0x15C) +#define QSERDES_RX_RX_MODE_00_HIGH (QSERDES_RX + 0x160) +#define QSERDES_RX_RX_MODE_00_HIGH2 (QSERDES_RX + 0x164) +#define QSERDES_RX_RX_MODE_00_HIGH3 (QSERDES_RX + 0x168) +#define QSERDES_RX_RX_MODE_00_HIGH4 (QSERDES_RX + 0x16C) +#define QSERDES_RX_RX_MODE_01_LOW (QSERDES_RX + 0x170) +#define QSERDES_RX_RX_MODE_01_HIGH (QSERDES_RX + 0x174) +#define QSERDES_RX_RX_MODE_01_HIGH2 (QSERDES_RX + 0x178) +#define QSERDES_RX_RX_MODE_01_HIGH3 (QSERDES_RX + 0x17C) +#define QSERDES_RX_RX_MODE_01_HIGH4 (QSERDES_RX + 0x180) +#define QSERDES_RX_RX_MODE_10_LOW (QSERDES_RX + 0x184) +#define QSERDES_RX_RX_MODE_10_HIGH (QSERDES_RX + 0x188) +#define QSERDES_RX_RX_MODE_10_HIGH2 (QSERDES_RX + 0x18C) +#define QSERDES_RX_RX_MODE_10_HIGH3 (QSERDES_RX + 0x190) +#define QSERDES_RX_RX_MODE_10_HIGH4 (QSERDES_RX + 0x194) +#define QSERDES_RX_PHPRE_CTRL (QSERDES_RX + 0x198) +#define QSERDES_RX_PHPRE_INITVAL (QSERDES_RX + 0x19C) +#define QSERDES_RX_DFE_EN_TIMER (QSERDES_RX + 0x1A0) +#define QSERDES_RX_DFE_CTLE_POST_CAL_OFFSET (QSERDES_RX + 0x1A4) +#define QSERDES_RX_DCC_CTRL1 (QSERDES_RX + 0x1A8) +#define QSERDES_RX_DCC_CTRL2 (QSERDES_RX + 0x1AC) +#define QSERDES_RX_VTH_CODE (QSERDES_RX + 0x1B0) +#define QSERDES_RX_VTH_MIN_THRESH (QSERDES_RX + 0x1B4) +#define QSERDES_RX_VTH_MAX_THRESH (QSERDES_RX + 0x1B8) +#define QSERDES_RX_ALOG_OBSV_BUS_CTRL_1 (QSERDES_RX + 0x1BC) +#define QSERDES_RX_PI_CTRL1 (QSERDES_RX + 0x1C0) +#define QSERDES_RX_PI_CTRL2 (QSERDES_RX + 0x1C4) +#define QSERDES_RX_PI_QUAD (QSERDES_RX + 0x1C8) +#define QSERDES_RX_IDATA1 (QSERDES_RX + 0x1CC) +#define QSERDES_RX_IDATA2 (QSERDES_RX + 0x1D0) +#define QSERDES_RX_AUX_DATA1 (QSERDES_RX + 0x1D4) +#define QSERDES_RX_AUX_DATA2 (QSERDES_RX + 0x1D8) +#define QSERDES_RX_AC_JTAG_OUTP (QSERDES_RX + 0x1DC) +#define QSERDES_RX_AC_JTAG_OUTN (QSERDES_RX + 0x1E0) +#define QSERDES_RX_RX_SIGDET (QSERDES_RX + 0x1E4) +#define QSERDES_RX_ALOG_OBSV_BUS_STATUS_1 (QSERDES_RX + 0x1E8) + +#define QSERDES_TX 0x400 +#define QSERDES_TX_BIST_MODE_LANENO (QSERDES_TX + 0x0) +#define QSERDES_TX_BIST_INVERT (QSERDES_TX + 0x4) +#define QSERDES_TX_CLKBUF_ENABLE (QSERDES_TX + 0x8) +#define QSERDES_TX_TX_EMP_POST1_LVL (QSERDES_TX + 0xC) +#define QSERDES_TX_TX_IDLE_LVL_LARGE_AMP (QSERDES_TX + 0x10) +#define QSERDES_TX_TX_DRV_LVL (QSERDES_TX + 0x14) +#define QSERDES_TX_TX_DRV_LVL_OFFSET (QSERDES_TX + 0x18) +#define QSERDES_TX_RESET_TSYNC_EN (QSERDES_TX + 0x1C) +#define QSERDES_TX_PRE_STALL_LDO_BOOST_EN (QSERDES_TX + 0x20) +#define QSERDES_TX_TX_BAND (QSERDES_TX + 0x24) +#define QSERDES_TX_SLEW_CNTL (QSERDES_TX + 0x28) +#define QSERDES_TX_INTERFACE_SELECT (QSERDES_TX + 0x2C) +#define QSERDES_TX_LPB_EN (QSERDES_TX + 0x30) +#define QSERDES_TX_RES_CODE_LANE_TX (QSERDES_TX + 0x34) +#define QSERDES_TX_RES_CODE_LANE_RX (QSERDES_TX + 0x38) +#define QSERDES_TX_RES_CODE_LANE_OFFSET_TX (QSERDES_TX + 0x3C) +#define QSERDES_TX_RES_CODE_LANE_OFFSET_RX (QSERDES_TX + 0x40) +#define QSERDES_TX_PERL_LENGTH1 (QSERDES_TX + 0x44) +#define QSERDES_TX_PERL_LENGTH2 (QSERDES_TX + 0x48) +#define QSERDES_TX_SERDES_BYP_EN_OUT (QSERDES_TX + 0x4C) +#define QSERDES_TX_DEBUG_BUS_SEL (QSERDES_TX + 0x50) +#define QSERDES_TX_TRANSCEIVER_BIAS_EN (QSERDES_TX + 0x54) +#define QSERDES_TX_HIGHZ_DRVR_EN (QSERDES_TX + 0x58) +#define QSERDES_TX_TX_POL_INV (QSERDES_TX + 0x5C) +#define QSERDES_TX_PARRATE_REC_DETECT_IDLE_EN (QSERDES_TX + 0x60) +#define QSERDES_TX_BIST_PATTERN1 (QSERDES_TX + 0x64) +#define QSERDES_TX_BIST_PATTERN2 (QSERDES_TX + 0x68) +#define QSERDES_TX_BIST_PATTERN3 (QSERDES_TX + 0x6C) +#define QSERDES_TX_BIST_PATTERN4 (QSERDES_TX + 0x70) +#define QSERDES_TX_BIST_PATTERN5 (QSERDES_TX + 0x74) +#define QSERDES_TX_BIST_PATTERN6 (QSERDES_TX + 0x78) +#define QSERDES_TX_BIST_PATTERN7 (QSERDES_TX + 0x7C) +#define QSERDES_TX_BIST_PATTERN8 (QSERDES_TX + 0x80) +#define QSERDES_TX_LANE_MODE_1 (QSERDES_TX + 0x84) +#define QSERDES_TX_LANE_MODE_2 (QSERDES_TX + 0x88) +#define QSERDES_TX_LANE_MODE_3 (QSERDES_TX + 0x8C) +#define QSERDES_TX_LANE_MODE_4 (QSERDES_TX + 0x90) +#define QSERDES_TX_LANE_MODE_5 (QSERDES_TX + 0x94) +#define QSERDES_TX_ATB_SEL1 (QSERDES_TX + 0x98) +#define QSERDES_TX_ATB_SEL2 (QSERDES_TX + 0x9C) +#define QSERDES_TX_RCV_DETECT_LVL (QSERDES_TX + 0xA0) +#define QSERDES_TX_RCV_DETECT_LVL_2 (QSERDES_TX + 0xA4) +#define QSERDES_TX_PRBS_SEED1 (QSERDES_TX + 0xA8) +#define QSERDES_TX_PRBS_SEED2 (QSERDES_TX + 0xAC) +#define QSERDES_TX_PRBS_SEED3 (QSERDES_TX + 0xB0) +#define QSERDES_TX_PRBS_SEED4 (QSERDES_TX + 0xB4) +#define QSERDES_TX_RESET_GEN (QSERDES_TX + 0xB8) +#define QSERDES_TX_RESET_GEN_MUXES (QSERDES_TX + 0xBC) +#define QSERDES_TX_TRAN_DRVR_EMP_EN (QSERDES_TX + 0xC0) +#define QSERDES_TX_TX_INTERFACE_MODE (QSERDES_TX + 0xC4) +#define QSERDES_TX_VMODE_CTRL1 (QSERDES_TX + 0xC8) +#define QSERDES_TX_ALOG_OBSV_BUS_CTRL_1 (QSERDES_TX + 0xCC) +#define QSERDES_TX_BIST_STATUS (QSERDES_TX + 0xD0) +#define QSERDES_TX_BIST_ERROR_COUNT1 (QSERDES_TX + 0xD4) +#define QSERDES_TX_BIST_ERROR_COUNT2 (QSERDES_TX + 0xD8) +#define QSERDES_TX_ALOG_OBSV_BUS_STATUS_1 (QSERDES_TX + 0xDC) +#define QSERDES_TX_LANE_DIG_CONFIG (QSERDES_TX + 0xE0) +#define QSERDES_TX_PI_QEC_CTRL (QSERDES_TX + 0xE4) +#define QSERDES_TX_PRE_EMPH (QSERDES_TX + 0xE8) +#define QSERDES_TX_SW_RESET (QSERDES_TX + 0xEC) +#define QSERDES_TX_DCC_OFFSET (QSERDES_TX + 0xF0) +#define QSERDES_TX_DCC_CMUX_POSTCAL_OFFSET (QSERDES_TX + 0xF4) +#define QSERDES_TX_DCC_CMUX_CAL_CTRL1 (QSERDES_TX + 0xF8) +#define QSERDES_TX_DCC_CMUX_CAL_CTRL2 (QSERDES_TX + 0xFC) +#define QSERDES_TX_DIG_BKUP_CTRL (QSERDES_TX + 0x100) +#define QSERDES_TX_DEBUG_BUS0 (QSERDES_TX + 0x104) +#define QSERDES_TX_DEBUG_BUS1 (QSERDES_TX + 0x108) +#define QSERDES_TX_DEBUG_BUS2 (QSERDES_TX + 0x10C) +#define QSERDES_TX_DEBUG_BUS3 (QSERDES_TX + 0x110) +#define QSERDES_TX_READ_EQCODE (QSERDES_TX + 0x114) +#define QSERDES_TX_READ_OFFSETCODE (QSERDES_TX + 0x118) +#define QSERDES_TX_IA_ERROR_COUNTER_LOW (QSERDES_TX + 0x11C) +#define QSERDES_TX_IA_ERROR_COUNTER_HIGH (QSERDES_TX + 0x120) +#define QSERDES_TX_VGA_READ_CODE (QSERDES_TX + 0x124) +#define QSERDES_TX_VTH_READ_CODE (QSERDES_TX + 0x128) +#define QSERDES_TX_DFE_TAP1_READ_CODE (QSERDES_TX + 0x12C) +#define QSERDES_TX_DFE_TAP2_READ_CODE (QSERDES_TX + 0x130) +#define QSERDES_TX_IDAC_STATUS_I (QSERDES_TX + 0x134) +#define QSERDES_TX_IDAC_STATUS_IBAR (QSERDES_TX + 0x138) +#define QSERDES_TX_IDAC_STATUS_Q (QSERDES_TX + 0x13C) +#define QSERDES_TX_IDAC_STATUS_QBAR (QSERDES_TX + 0x140) +#define QSERDES_TX_IDAC_STATUS_A (QSERDES_TX + 0x144) +#define QSERDES_TX_IDAC_STATUS_ABAR (QSERDES_TX + 0x148) +#define QSERDES_TX_IDAC_STATUS_SM_ON (QSERDES_TX + 0x14C) +#define QSERDES_TX_IDAC_STATUS_CAL_DONE (QSERDES_TX + 0x150) +#define QSERDES_TX_IDAC_STATUS_SIGNERROR (QSERDES_TX + 0x154) +#define QSERDES_TX_DCC_CAL_STATUS (QSERDES_TX + 0x158) +#define QSERDES_TX_DCC_READ_CODE_STATUS (QSERDES_TX + 0x15C) + +#define QSERDES_PCS 0xC00 +#define QSERDES_PCS_PHY_START (QSERDES_PCS + 0x0) +#define QSERDES_PCS_POWER_DOWN_CONTROL (QSERDES_PCS + 0x4) +#define QSERDES_PCS_SW_RESET (QSERDES_PCS + 0x8) +#define QSERDES_PCS_LINE_RESET_TIME (QSERDES_PCS + 0xC) +#define QSERDES_PCS_PCS_CTRL1 (QSERDES_PCS + 0x10) +#define QSERDES_PCS_TSYNC_RSYNC_CNTL (QSERDES_PCS + 0x14) +#define QSERDES_PCS_RETIME_BUFFER_EN (QSERDES_PCS + 0x18) +#define QSERDES_PCS_PLL_CNTL (QSERDES_PCS + 0x1C) +#define QSERDES_PCS_TX_LARGE_AMP_DRV_LVL (QSERDES_PCS + 0x20) +#define QSERDES_PCS_TX_LARGE_AMP_POST_EMP_LVL (QSERDES_PCS + 0x24) +#define QSERDES_PCS_TX_SMALL_AMP_DRV_LVL (QSERDES_PCS + 0x28) +#define QSERDES_PCS_TX_SMALL_AMP_POST_EMP_LVL (QSERDES_PCS + 0x2C) +#define QSERDES_PCS_RX_SYNC_WAIT_TIME (QSERDES_PCS + 0x30) +#define QSERDES_PCS_L0_BIST_CTRL (QSERDES_PCS + 0x34) +#define QSERDES_PCS_MISC_BIST_CTRL (QSERDES_PCS + 0x38) +#define QSERDES_PCS_BIST_PRBS_POLY0 (QSERDES_PCS + 0x3C) +#define QSERDES_PCS_BIST_PRBS_POLY1 (QSERDES_PCS + 0x40) +#define QSERDES_PCS_BIST_PRBS_SEED0 (QSERDES_PCS + 0x44) +#define QSERDES_PCS_BIST_PRBS_SEED1 (QSERDES_PCS + 0x48) +#define QSERDES_PCS_BIST_PRBS_SEED2 (QSERDES_PCS + 0x4C) +#define QSERDES_PCS_BIST_NUM_IPG (QSERDES_PCS + 0x50) +#define QSERDES_PCS_RX_HS_EQUALIZER_SETTING_CAPABILITY (QSERDES_PCS + 0x54) +#define QSERDES_PCS_RX_HS_ADAPT_LENGTH_REFRESH_CAPABILITY (QSERDES_PCS + 0x58) +#define QSERDES_PCS_RX_HS_ADAPT_LENGTH_INITIAL_CAPABILITY (QSERDES_PCS + 0x5C) +#define QSERDES_PCS_DEBUG_BUS_CLKSEL (QSERDES_PCS + 0x60) +#define QSERDES_PCS_DEBUG_BUS_0_CTRL (QSERDES_PCS + 0x64) +#define QSERDES_PCS_DEBUG_BUS_1_CTRL (QSERDES_PCS + 0x68) +#define QSERDES_PCS_DEBUG_BUS_2_CTRL (QSERDES_PCS + 0x6C) +#define QSERDES_PCS_DEBUG_BUS_3_CTRL (QSERDES_PCS + 0x70) +#define QSERDES_PCS_DEBUG_BUS_0_STATUS_CHK (QSERDES_PCS + 0x74) +#define QSERDES_PCS_DEBUG_BUS_1_STATUS_CHK (QSERDES_PCS + 0x78) +#define QSERDES_PCS_DEBUG_BUS_2_STATUS_CHK (QSERDES_PCS + 0x7C) +#define QSERDES_PCS_DEBUG_BUS_3_STATUS_CHK (QSERDES_PCS + 0x80) +#define QSERDES_PCS_RX_MIN_HIBERN8_TIME (QSERDES_PCS + 0x84) +#define QSERDES_PCS_RX_SIGDET_CTRL1 (QSERDES_PCS + 0x88) +#define QSERDES_PCS_RX_SIGDET_CTRL2 (QSERDES_PCS + 0x8C) +#define QSERDES_PCS_TCLK_SYM_CNTR_INITVAL (QSERDES_PCS + 0x90) +#define QSERDES_PCS_PCS_READY_STATUS (QSERDES_PCS + 0x94) +#define QSERDES_PCS_PCS_MISC_STATUS (QSERDES_PCS + 0x98) +#define QSERDES_PCS_L0_BIST_CHK_ERR_CNT_L_STATUS (QSERDES_PCS + 0x9C) +#define QSERDES_PCS_L0_BIST_CHK_ERR_CNT_H_STATUS (QSERDES_PCS + 0xA0) +#define QSERDES_PCS_L0_BIST_CHK_STATUS (QSERDES_PCS + 0xA4) +#define QSERDES_PCS_DEBUG_BUS_0_STATUS (QSERDES_PCS + 0xA8) +#define QSERDES_PCS_DEBUG_BUS_1_STATUS (QSERDES_PCS + 0xAC) +#define QSERDES_PCS_DEBUG_BUS_2_STATUS (QSERDES_PCS + 0xB0) +#define QSERDES_PCS_DEBUG_BUS_3_STATUS (QSERDES_PCS + 0xB4) +#define QSERDES_PCS_REVISION_ID0 (QSERDES_PCS + 0xB8) +#define QSERDES_PCS_REVISION_ID1 (QSERDES_PCS + 0xBC) +#define QSERDES_PCS_REVISION_ID2 (QSERDES_PCS + 0xC0) +#define QSERDES_PCS_REVISION_ID3 (QSERDES_PCS + 0xC4) +#define QSERDES_PCS_SYSCLK_EN_COUNT_CTRL (QSERDES_PCS + 0xC8) +#define QSERDES_PCS_PLL_SHUTDOWN_CTRL (QSERDES_PCS + 0xCC) +#define QSERDES_PCS_TIMER_20US_CORECLK_STEPS_MSB (QSERDES_PCS + 0xD0) +#define QSERDES_PCS_TIMER_20US_CORECLK_STEPS_LSB (QSERDES_PCS + 0xD4) +#define QSERDES_PCS_TX_MID_TERM_CTRL1 (QSERDES_PCS + 0xD8) +#define QSERDES_PCS_TX_MID_TERM_CTRL2 (QSERDES_PCS + 0xDC) +#define QSERDES_PCS_MULTI_LANE_CTRL1 (QSERDES_PCS + 0xE0) +#define QSERDES_PCS_L1_BIST_CTRL (QSERDES_PCS + 0xE4) +#define QSERDES_PCS_L1_BIST_CHK_ERR_CNT_L_STATUS (QSERDES_PCS + 0xE8) +#define QSERDES_PCS_L1_BIST_CHK_ERR_CNT_H_STATUS (QSERDES_PCS + 0xEC) +#define QSERDES_PCS_L1_BIST_CHK_STATUS (QSERDES_PCS + 0xF0) +#define QSERDES_PCS_STATUS_CLEAR (QSERDES_PCS + 0xF4) +#define QSERDES_PCS_RX_HSG4_SYNC_WAIT_TIME (QSERDES_PCS + 0xF8) +#define QSERDES_PCS_SGMII_MISC_CTRL1 (QSERDES_PCS + 0xFC) +#define QSERDES_PCS_SGMII_MISC_CTRL2 (QSERDES_PCS + 0x100) +#define QSERDES_PCS_SGMII_MISC_CTRL3 (QSERDES_PCS + 0x104) +#define QSERDES_PCS_SGMII_MISC_CTRL4 (QSERDES_PCS + 0x108) +#define QSERDES_PCS_SGMII_MISC_CTRL5 (QSERDES_PCS + 0x10C) +#define QSERDES_PCS_SGMII_MISC_CTRL6 (QSERDES_PCS + 0x110) +#define QSERDES_PCS_SGMII_MISC_CTRL7 (QSERDES_PCS + 0x114) +#define QSERDES_PCS_SGMII_MISC_CTRL8 (QSERDES_PCS + 0x118) +#define QSERDES_PCS_SGMII_INTERRUPT_STATUS (QSERDES_PCS + 0x11C) +#define QSERDES_PCS_SGMII_IRQ_CLEAR (QSERDES_PCS + 0x120) +#define QSERDES_PCS_SGMII_IRQ_MASK (QSERDES_PCS + 0x124) + +#define QSERDES_PCS_2 0x200 +#define QSERDES_PCS2_PCS_CMN_STATUS (QSERDES_PCS_2 + 0x0) +#define QSERDES_PCS2_TCLK_CTRL_STATUS (QSERDES_PCS_2 + 0x4) +#define QSERDES_PCS2_TX_LANE0_0_STATUS (QSERDES_PCS_2 + 0x8) +#define QSERDES_PCS2_TX_LANE0_1_STATUS (QSERDES_PCS_2 + 0xC) +#define QSERDES_PCS2_TX_LANE0_2_STATUS (QSERDES_PCS_2 + 0x10) +#define QSERDES_PCS2_RX_LANE0_0_STATUS (QSERDES_PCS_2 + 0x14) +#define QSERDES_PCS2_RX_LANE0_1_STATUS (QSERDES_PCS_2 + 0x18) +#define QSERDES_PCS2_RX_LANE0_3_STATUS (QSERDES_PCS_2 + 0x1C) +#define QSERDES_PCS2_TX_LANE1_0_STATUS (QSERDES_PCS_2 + 0x20) +#define QSERDES_PCS2_TX_LANE1_1_STATUS (QSERDES_PCS_2 + 0x24) +#define QSERDES_PCS2_TX_LANE1_2_STATUS (QSERDES_PCS_2 + 0x28) +#define QSERDES_PCS2_RX_LANE1_0_STATUS (QSERDES_PCS_2 + 0x2C) +#define QSERDES_PCS2_RX_LANE1_1_STATUS (QSERDES_PCS_2 + 0x30) +#define QSERDES_PCS2_RX_LANE1_3_STATUS (QSERDES_PCS_2 + 0x34) + +int configure_serdes_dt(struct qcom_ethqos *ethqos); +void qcom_ethqos_serdes_init(struct qcom_ethqos *ethqos, int speed); +#endif diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 2dbc4a41d1e87..fcdcf633a39aa 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -5736,7 +5736,7 @@ static void stmmac_common_interrupt(struct stmmac_priv *priv) } /* PCS link status */ - if (priv->hw->pcs) { + if (priv->hw->pcs && priv->hw->pcs != STMMAC_PCS_SGMII) { if (priv->xstats.pcs_link) netif_carrier_on(priv->dev); else |