Multiple irqs, internal delay and tx drop counter is present only in R-Car Gen3. Add feature bits to support the same. Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx> --- drivers/net/ethernet/renesas/ravb_main.c | 36 ++++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c index e966b76df32c..b3c99f974632 100644 --- a/drivers/net/ethernet/renesas/ravb_main.c +++ b/drivers/net/ethernet/renesas/ravb_main.c @@ -42,10 +42,18 @@ #define RAVB_PTP_CONFIG_ACTIVE BIT(0) #define RAVB_PTP_CONFIG_INACTIVE BIT(1) +#define RAVB_MULTI_IRQS BIT(2) +#define RAVB_INTERNAL_DELAY BIT(3) +#define RAVB_TX_DROP_COUNTER BIT(4) #define RAVB_PTP (RAVB_PTP_CONFIG_ACTIVE | RAVB_PTP_CONFIG_INACTIVE) -#define RAVB_RCAR_GEN3_FEATURES RAVB_PTP_CONFIG_ACTIVE +#define RAVB_RCAR_GEN3_FEATURES \ + (RAVB_PTP_CONFIG_ACTIVE | \ + RAVB_MULTI_IRQS | \ + RAVB_INTERNAL_DELAY | \ + RAVB_TX_DROP_COUNTER) + #define RAVB_RCAR_GEN2_FEATURES RAVB_PTP_CONFIG_INACTIVE static const char *ravb_rx_irqs[NUM_RX_QUEUE] = { @@ -435,6 +443,7 @@ static void ravb_emac_init(struct net_device *ndev) static int ravb_dmac_init(struct net_device *ndev) { struct ravb_private *priv = netdev_priv(ndev); + const struct ravb_drv_data *info = priv->info; int error; /* Set CONFIG mode */ @@ -466,7 +475,7 @@ static int ravb_dmac_init(struct net_device *ndev) ravb_write(ndev, TCCR_TFEN, TCCR); /* Interrupt init: */ - if (priv->chip_id == RCAR_GEN3) { + if (info->features & RAVB_MULTI_IRQS) { /* Clear DIL.DPLx */ ravb_write(ndev, 0, DIL); /* Set queue specific interrupt */ @@ -767,6 +776,7 @@ static void ravb_error_interrupt(struct net_device *ndev) static bool ravb_queue_interrupt(struct net_device *ndev, int q) { struct ravb_private *priv = netdev_priv(ndev); + const struct ravb_drv_data *info = priv->info; u32 ris0 = ravb_read(ndev, RIS0); u32 ric0 = ravb_read(ndev, RIC0); u32 tis = ravb_read(ndev, TIS); @@ -775,7 +785,7 @@ static bool ravb_queue_interrupt(struct net_device *ndev, int q) if (((ris0 & ric0) & BIT(q)) || ((tis & tic) & BIT(q))) { if (napi_schedule_prep(&priv->napi[q])) { /* Mask RX and TX interrupts */ - if (priv->chip_id == RCAR_GEN2) { + if (!(info->features & RAVB_MULTI_IRQS)) { ravb_write(ndev, ric0 & ~BIT(q), RIC0); ravb_write(ndev, tic & ~BIT(q), TIC); } else { @@ -919,6 +929,7 @@ static int ravb_poll(struct napi_struct *napi, int budget) { struct net_device *ndev = napi->dev; struct ravb_private *priv = netdev_priv(ndev); + const struct ravb_drv_data *info = priv->info; unsigned long flags; int q = napi - priv->napi; int mask = BIT(q); @@ -942,7 +953,7 @@ static int ravb_poll(struct napi_struct *napi, int budget) /* Re-enable RX/TX interrupts */ spin_lock_irqsave(&priv->lock, flags); - if (priv->chip_id == RCAR_GEN2) { + if (!(info->features & RAVB_MULTI_IRQS)) { ravb_modify(ndev, RIC0, mask, mask); ravb_modify(ndev, TIC, mask, mask); } else { @@ -1360,7 +1371,7 @@ static int ravb_open(struct net_device *ndev) napi_enable(&priv->napi[RAVB_BE]); napi_enable(&priv->napi[RAVB_NC]); - if (priv->chip_id == RCAR_GEN2) { + if (!(info->features & RAVB_MULTI_IRQS)) { error = request_irq(ndev->irq, ravb_interrupt, IRQF_SHARED, ndev->name, ndev); if (error) { @@ -1418,7 +1429,7 @@ static int ravb_open(struct net_device *ndev) if (info->features & RAVB_PTP_CONFIG_INACTIVE) ravb_ptp_stop(ndev); out_free_irq_nc_tx: - if (priv->chip_id == RCAR_GEN2) + if (!(info->features & RAVB_MULTI_IRQS)) goto out_free_irq; free_irq(priv->tx_irqs[RAVB_NC], ndev); out_free_irq_nc_rx: @@ -1648,13 +1659,14 @@ static u16 ravb_select_queue(struct net_device *ndev, struct sk_buff *skb, static struct net_device_stats *ravb_get_stats(struct net_device *ndev) { struct ravb_private *priv = netdev_priv(ndev); + const struct ravb_drv_data *info = priv->info; struct net_device_stats *nstats, *stats0, *stats1; nstats = &ndev->stats; stats0 = &priv->stats[RAVB_BE]; stats1 = &priv->stats[RAVB_NC]; - if (priv->chip_id == RCAR_GEN3) { + if (info->features & RAVB_TX_DROP_COUNTER) { nstats->tx_dropped += ravb_read(ndev, TROCR); ravb_write(ndev, 0, TROCR); /* (write clear) */ } @@ -1729,7 +1741,7 @@ static int ravb_close(struct net_device *ndev) of_phy_deregister_fixed_link(np); } - if (priv->chip_id != RCAR_GEN2) { + if (info->features & RAVB_MULTI_IRQS) { free_irq(priv->tx_irqs[RAVB_NC], ndev); free_irq(priv->rx_irqs[RAVB_NC], ndev); free_irq(priv->tx_irqs[RAVB_BE], ndev); @@ -2113,7 +2125,7 @@ static int ravb_probe(struct platform_device *pdev) pm_runtime_enable(&pdev->dev); pm_runtime_get_sync(&pdev->dev); - if (info->chip_id == RCAR_GEN3) + if (info->features & RAVB_MULTI_IRQS) irq = platform_get_irq_byname(pdev, "ch22"); else irq = platform_get_irq(pdev, 0); @@ -2153,7 +2165,7 @@ static int ravb_probe(struct platform_device *pdev) priv->avb_link_active_low = of_property_read_bool(np, "renesas,ether-link-active-low"); - if (info->chip_id == RCAR_GEN3) { + if (info->features & RAVB_MULTI_IRQS) { irq = platform_get_irq_byname(pdev, "ch24"); if (irq < 0) { error = irq; @@ -2215,7 +2227,7 @@ static int ravb_probe(struct platform_device *pdev) ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI); } - if (priv->chip_id != RCAR_GEN2) { + if (info->features & RAVB_INTERNAL_DELAY) { ravb_parse_delay_mode(np, ndev); ravb_set_delay_mode(ndev); } @@ -2414,7 +2426,7 @@ static int __maybe_unused ravb_resume(struct device *dev) ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI); } - if (priv->chip_id != RCAR_GEN2) + if (info->features & RAVB_INTERNAL_DELAY) ravb_set_delay_mode(ndev); /* Restore descriptor base address table */ -- 2.17.1