net: stmmac: dwmac-qcom-ethqos: Adjust rgmii loopback_en per platform
Not all platforms should have RGMII_CONFIG_LOOPBACK_EN and the result it about 50% packet loss on incoming messages. So make it possile to configure this per compatible and enable it for QCS404. Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d90b312047
commit
a7bf6d7c92
1 changed files with 18 additions and 4 deletions
|
@ -78,6 +78,7 @@ struct ethqos_emac_por {
|
||||||
struct ethqos_emac_driver_data {
|
struct ethqos_emac_driver_data {
|
||||||
const struct ethqos_emac_por *por;
|
const struct ethqos_emac_por *por;
|
||||||
unsigned int num_por;
|
unsigned int num_por;
|
||||||
|
bool rgmii_config_looback_en;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct qcom_ethqos {
|
struct qcom_ethqos {
|
||||||
|
@ -90,6 +91,7 @@ struct qcom_ethqos {
|
||||||
|
|
||||||
const struct ethqos_emac_por *por;
|
const struct ethqos_emac_por *por;
|
||||||
unsigned int num_por;
|
unsigned int num_por;
|
||||||
|
bool rgmii_config_looback_en;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rgmii_readl(struct qcom_ethqos *ethqos, unsigned int offset)
|
static int rgmii_readl(struct qcom_ethqos *ethqos, unsigned int offset)
|
||||||
|
@ -181,6 +183,7 @@ static const struct ethqos_emac_por emac_v2_3_0_por[] = {
|
||||||
static const struct ethqos_emac_driver_data emac_v2_3_0_data = {
|
static const struct ethqos_emac_driver_data emac_v2_3_0_data = {
|
||||||
.por = emac_v2_3_0_por,
|
.por = emac_v2_3_0_por,
|
||||||
.num_por = ARRAY_SIZE(emac_v2_3_0_por),
|
.num_por = ARRAY_SIZE(emac_v2_3_0_por),
|
||||||
|
.rgmii_config_looback_en = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ethqos_emac_por emac_v2_1_0_por[] = {
|
static const struct ethqos_emac_por emac_v2_1_0_por[] = {
|
||||||
|
@ -195,6 +198,7 @@ static const struct ethqos_emac_por emac_v2_1_0_por[] = {
|
||||||
static const struct ethqos_emac_driver_data emac_v2_1_0_data = {
|
static const struct ethqos_emac_driver_data emac_v2_1_0_data = {
|
||||||
.por = emac_v2_1_0_por,
|
.por = emac_v2_1_0_por,
|
||||||
.num_por = ARRAY_SIZE(emac_v2_1_0_por),
|
.num_por = ARRAY_SIZE(emac_v2_1_0_por),
|
||||||
|
.rgmii_config_looback_en = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ethqos_dll_configure(struct qcom_ethqos *ethqos)
|
static int ethqos_dll_configure(struct qcom_ethqos *ethqos)
|
||||||
|
@ -311,8 +315,12 @@ static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos)
|
||||||
rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_DLY_EN,
|
rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_DLY_EN,
|
||||||
SDCC_DDR_CONFIG_PRG_DLY_EN,
|
SDCC_DDR_CONFIG_PRG_DLY_EN,
|
||||||
SDCC_HC_REG_DDR_CONFIG);
|
SDCC_HC_REG_DDR_CONFIG);
|
||||||
|
if (ethqos->rgmii_config_looback_en)
|
||||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||||
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
||||||
|
else
|
||||||
|
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||||
|
0, RGMII_IO_MACRO_CONFIG);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPEED_100:
|
case SPEED_100:
|
||||||
|
@ -345,8 +353,13 @@ static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos)
|
||||||
rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
|
rgmii_updatel(ethqos, SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
|
||||||
SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
|
SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
|
||||||
SDCC_HC_REG_DDR_CONFIG);
|
SDCC_HC_REG_DDR_CONFIG);
|
||||||
|
if (ethqos->rgmii_config_looback_en)
|
||||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||||
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
||||||
|
else
|
||||||
|
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||||
|
0, RGMII_IO_MACRO_CONFIG);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPEED_10:
|
case SPEED_10:
|
||||||
|
@ -518,6 +531,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
|
||||||
data = of_device_get_match_data(&pdev->dev);
|
data = of_device_get_match_data(&pdev->dev);
|
||||||
ethqos->por = data->por;
|
ethqos->por = data->por;
|
||||||
ethqos->num_por = data->num_por;
|
ethqos->num_por = data->num_por;
|
||||||
|
ethqos->rgmii_config_looback_en = data->rgmii_config_looback_en;
|
||||||
|
|
||||||
ethqos->rgmii_clk = devm_clk_get(&pdev->dev, "rgmii");
|
ethqos->rgmii_clk = devm_clk_get(&pdev->dev, "rgmii");
|
||||||
if (IS_ERR(ethqos->rgmii_clk)) {
|
if (IS_ERR(ethqos->rgmii_clk)) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue