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 {
|
||||
const struct ethqos_emac_por *por;
|
||||
unsigned int num_por;
|
||||
bool rgmii_config_looback_en;
|
||||
};
|
||||
|
||||
struct qcom_ethqos {
|
||||
|
@ -90,6 +91,7 @@ struct qcom_ethqos {
|
|||
|
||||
const struct ethqos_emac_por *por;
|
||||
unsigned int num_por;
|
||||
bool rgmii_config_looback_en;
|
||||
};
|
||||
|
||||
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 = {
|
||||
.por = 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[] = {
|
||||
|
@ -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 = {
|
||||
.por = 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)
|
||||
|
@ -311,8 +315,12 @@ static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos)
|
|||
rgmii_updatel(ethqos, SDCC_DDR_CONFIG_PRG_DLY_EN,
|
||||
SDCC_DDR_CONFIG_PRG_DLY_EN,
|
||||
SDCC_HC_REG_DDR_CONFIG);
|
||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
||||
if (ethqos->rgmii_config_looback_en)
|
||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
||||
else
|
||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||
0, RGMII_IO_MACRO_CONFIG);
|
||||
break;
|
||||
|
||||
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,
|
||||
SDCC_DDR_CONFIG_EXT_PRG_RCLK_DLY_EN,
|
||||
SDCC_HC_REG_DDR_CONFIG);
|
||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
||||
if (ethqos->rgmii_config_looback_en)
|
||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||
RGMII_CONFIG_LOOPBACK_EN, RGMII_IO_MACRO_CONFIG);
|
||||
else
|
||||
rgmii_updatel(ethqos, RGMII_CONFIG_LOOPBACK_EN,
|
||||
0, RGMII_IO_MACRO_CONFIG);
|
||||
|
||||
break;
|
||||
|
||||
case SPEED_10:
|
||||
|
@ -518,6 +531,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
|
|||
data = of_device_get_match_data(&pdev->dev);
|
||||
ethqos->por = data->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");
|
||||
if (IS_ERR(ethqos->rgmii_clk)) {
|
||||
|
|
Loading…
Add table
Reference in a new issue