Commit a50e3a99 authored by Stefan Wahren's avatar Stefan Wahren Committed by David S. Miller

net: bcmgenet: Add BCM2711 support

The BCM2711 needs a different maximum DMA burst length. If not set
accordingly a timeout in the transmit queue happens and no package
can be sent. So use the new compatible to derive this value.

Until now the GENET HW version was used as the platform identifier.
This doesn't work with SoC-specific modifications, so introduce a proper
platform data structure.
Signed-off-by: default avatarStefan Wahren <wahrenst@gmx.net>
Acked-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Reviewed-by: default avatarMatthias Brugger <mbrugger@suse.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f7bda51f
...@@ -2576,7 +2576,8 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv) ...@@ -2576,7 +2576,8 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv)
} }
/* Init rDma */ /* Init rDma */
bcmgenet_rdma_writel(priv, DMA_MAX_BURST_LENGTH, DMA_SCB_BURST_SIZE); bcmgenet_rdma_writel(priv, priv->dma_max_burst_length,
DMA_SCB_BURST_SIZE);
/* Initialize Rx queues */ /* Initialize Rx queues */
ret = bcmgenet_init_rx_queues(priv->dev); ret = bcmgenet_init_rx_queues(priv->dev);
...@@ -2589,7 +2590,8 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv) ...@@ -2589,7 +2590,8 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv)
} }
/* Init tDma */ /* Init tDma */
bcmgenet_tdma_writel(priv, DMA_MAX_BURST_LENGTH, DMA_SCB_BURST_SIZE); bcmgenet_tdma_writel(priv, priv->dma_max_burst_length,
DMA_SCB_BURST_SIZE);
/* Initialize Tx queues */ /* Initialize Tx queues */
bcmgenet_init_tx_queues(priv->dev); bcmgenet_init_tx_queues(priv->dev);
...@@ -3420,12 +3422,48 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) ...@@ -3420,12 +3422,48 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv)
params->words_per_bd); params->words_per_bd);
} }
struct bcmgenet_plat_data {
enum bcmgenet_version version;
u32 dma_max_burst_length;
};
static const struct bcmgenet_plat_data v1_plat_data = {
.version = GENET_V1,
.dma_max_burst_length = DMA_MAX_BURST_LENGTH,
};
static const struct bcmgenet_plat_data v2_plat_data = {
.version = GENET_V2,
.dma_max_burst_length = DMA_MAX_BURST_LENGTH,
};
static const struct bcmgenet_plat_data v3_plat_data = {
.version = GENET_V3,
.dma_max_burst_length = DMA_MAX_BURST_LENGTH,
};
static const struct bcmgenet_plat_data v4_plat_data = {
.version = GENET_V4,
.dma_max_burst_length = DMA_MAX_BURST_LENGTH,
};
static const struct bcmgenet_plat_data v5_plat_data = {
.version = GENET_V5,
.dma_max_burst_length = DMA_MAX_BURST_LENGTH,
};
static const struct bcmgenet_plat_data bcm2711_plat_data = {
.version = GENET_V5,
.dma_max_burst_length = 0x08,
};
static const struct of_device_id bcmgenet_match[] = { static const struct of_device_id bcmgenet_match[] = {
{ .compatible = "brcm,genet-v1", .data = (void *)GENET_V1 }, { .compatible = "brcm,genet-v1", .data = &v1_plat_data },
{ .compatible = "brcm,genet-v2", .data = (void *)GENET_V2 }, { .compatible = "brcm,genet-v2", .data = &v2_plat_data },
{ .compatible = "brcm,genet-v3", .data = (void *)GENET_V3 }, { .compatible = "brcm,genet-v3", .data = &v3_plat_data },
{ .compatible = "brcm,genet-v4", .data = (void *)GENET_V4 }, { .compatible = "brcm,genet-v4", .data = &v4_plat_data },
{ .compatible = "brcm,genet-v5", .data = (void *)GENET_V5 }, { .compatible = "brcm,genet-v5", .data = &v5_plat_data },
{ .compatible = "brcm,bcm2711-genet-v5", .data = &bcm2711_plat_data },
{ }, { },
}; };
MODULE_DEVICE_TABLE(of, bcmgenet_match); MODULE_DEVICE_TABLE(of, bcmgenet_match);
...@@ -3435,6 +3473,7 @@ static int bcmgenet_probe(struct platform_device *pdev) ...@@ -3435,6 +3473,7 @@ static int bcmgenet_probe(struct platform_device *pdev)
struct bcmgenet_platform_data *pd = pdev->dev.platform_data; struct bcmgenet_platform_data *pd = pdev->dev.platform_data;
struct device_node *dn = pdev->dev.of_node; struct device_node *dn = pdev->dev.of_node;
const struct of_device_id *of_id = NULL; const struct of_device_id *of_id = NULL;
const struct bcmgenet_plat_data *pdata;
struct bcmgenet_priv *priv; struct bcmgenet_priv *priv;
struct net_device *dev; struct net_device *dev;
const void *macaddr; const void *macaddr;
...@@ -3516,10 +3555,14 @@ static int bcmgenet_probe(struct platform_device *pdev) ...@@ -3516,10 +3555,14 @@ static int bcmgenet_probe(struct platform_device *pdev)
priv->dev = dev; priv->dev = dev;
priv->pdev = pdev; priv->pdev = pdev;
if (of_id) if (of_id) {
priv->version = (enum bcmgenet_version)of_id->data; pdata = of_id->data;
else priv->version = pdata->version;
priv->dma_max_burst_length = pdata->dma_max_burst_length;
} else {
priv->version = pd->genet_version; priv->version = pd->genet_version;
priv->dma_max_burst_length = DMA_MAX_BURST_LENGTH;
}
priv->clk = devm_clk_get(&priv->pdev->dev, "enet"); priv->clk = devm_clk_get(&priv->pdev->dev, "enet");
if (IS_ERR(priv->clk)) { if (IS_ERR(priv->clk)) {
......
...@@ -664,6 +664,7 @@ struct bcmgenet_priv { ...@@ -664,6 +664,7 @@ struct bcmgenet_priv {
bool crc_fwd_en; bool crc_fwd_en;
unsigned int dma_rx_chk_bit; unsigned int dma_rx_chk_bit;
u32 dma_max_burst_length;
u32 msg_enable; u32 msg_enable;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment