ravb: Add no_ptp_cfg_active to struct ravb_hw_info
authorBiju Das <biju.das.jz@bp.renesas.com>
Wed, 25 Aug 2021 07:01:44 +0000 (08:01 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Aug 2021 10:18:16 +0000 (11:18 +0100)
There are some H/W differences for the gPTP feature between
R-Car Gen3, R-Car Gen2, and RZ/G2L as below.

1) On R-Car Gen2, gPTP support is not active in config mode.
2) On R-Car Gen3, gPTP support is active in config mode.
3) RZ/G2L does not support the gPTP feature.

Add a no_ptp_cfg_active hw feature bit to struct ravb_hw_info for
handling gPTP for R-Car Gen2.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/renesas/ravb.h
drivers/net/ethernet/renesas/ravb_main.c

index da486e06b3224c79e89dc5b8ba62716503659b6d..9ecf1a8c3ca87f5f4ec4dd92abcd8194bd0bf3d1 100644 (file)
@@ -998,6 +998,7 @@ struct ravb_hw_info {
        unsigned internal_delay:1;      /* AVB-DMAC has internal delays */
        unsigned tx_counters:1;         /* E-MAC has TX counters */
        unsigned multi_irqs:1;          /* AVB-DMAC and E-MAC has multiple irqs */
+       unsigned no_ptp_cfg_active:1;   /* AVB-DMAC does not support gPTP active in config mode */
 };
 
 struct ravb_private {
index 28b8dcae57a821519d7c8b146361c40c51a33d1a..e33b836218f049e26c7e71f499df195166be99ec 100644 (file)
@@ -1205,6 +1205,7 @@ static int ravb_set_ringparam(struct net_device *ndev,
                              struct ethtool_ringparam *ring)
 {
        struct ravb_private *priv = netdev_priv(ndev);
+       const struct ravb_hw_info *info = priv->info;
        int error;
 
        if (ring->tx_pending > BE_TX_RING_MAX ||
@@ -1218,7 +1219,7 @@ static int ravb_set_ringparam(struct net_device *ndev,
        if (netif_running(ndev)) {
                netif_device_detach(ndev);
                /* Stop PTP Clock driver */
-               if (priv->chip_id == RCAR_GEN2)
+               if (info->no_ptp_cfg_active)
                        ravb_ptp_stop(ndev);
                /* Wait for DMA stopping */
                error = ravb_stop_dma(ndev);
@@ -1250,7 +1251,7 @@ static int ravb_set_ringparam(struct net_device *ndev,
                ravb_emac_init(ndev);
 
                /* Initialise PTP Clock driver */
-               if (priv->chip_id == RCAR_GEN2)
+               if (info->no_ptp_cfg_active)
                        ravb_ptp_init(ndev, priv->pdev);
 
                netif_device_attach(ndev);
@@ -1390,7 +1391,7 @@ static int ravb_open(struct net_device *ndev)
        ravb_emac_init(ndev);
 
        /* Initialise PTP Clock driver */
-       if (priv->chip_id == RCAR_GEN2)
+       if (info->no_ptp_cfg_active)
                ravb_ptp_init(ndev, priv->pdev);
 
        netif_tx_start_all_queues(ndev);
@@ -1404,7 +1405,7 @@ static int ravb_open(struct net_device *ndev)
 
 out_ptp_stop:
        /* Stop PTP Clock driver */
-       if (priv->chip_id == RCAR_GEN2)
+       if (info->no_ptp_cfg_active)
                ravb_ptp_stop(ndev);
 out_free_irq_nc_tx:
        if (!info->multi_irqs)
@@ -1445,13 +1446,14 @@ static void ravb_tx_timeout_work(struct work_struct *work)
 {
        struct ravb_private *priv = container_of(work, struct ravb_private,
                                                 work);
+       const struct ravb_hw_info *info = priv->info;
        struct net_device *ndev = priv->ndev;
        int error;
 
        netif_tx_stop_all_queues(ndev);
 
        /* Stop PTP Clock driver */
-       if (priv->chip_id == RCAR_GEN2)
+       if (info->no_ptp_cfg_active)
                ravb_ptp_stop(ndev);
 
        /* Wait for DMA stopping */
@@ -1486,7 +1488,7 @@ static void ravb_tx_timeout_work(struct work_struct *work)
 
 out:
        /* Initialise PTP Clock driver */
-       if (priv->chip_id == RCAR_GEN2)
+       if (info->no_ptp_cfg_active)
                ravb_ptp_init(ndev, priv->pdev);
 
        netif_tx_start_all_queues(ndev);
@@ -1695,7 +1697,7 @@ static int ravb_close(struct net_device *ndev)
        ravb_write(ndev, 0, TIC);
 
        /* Stop PTP Clock driver */
-       if (priv->chip_id == RCAR_GEN2)
+       if (info->no_ptp_cfg_active)
                ravb_ptp_stop(ndev);
 
        /* Set the config mode to stop the AVB-DMAC's processes */
@@ -1956,6 +1958,7 @@ static const struct ravb_hw_info ravb_gen2_hw_info = {
        .stats_len = ARRAY_SIZE(ravb_gstrings_stats),
        .max_rx_len = RX_BUF_SZ + RAVB_ALIGN - 1,
        .aligned_tx = 1,
+       .no_ptp_cfg_active = 1,
 };
 
 static const struct of_device_id ravb_match_table[] = {
@@ -1996,8 +1999,9 @@ static int ravb_set_gti(struct net_device *ndev)
 static void ravb_set_config_mode(struct net_device *ndev)
 {
        struct ravb_private *priv = netdev_priv(ndev);
+       const struct ravb_hw_info *info = priv->info;
 
-       if (priv->chip_id == RCAR_GEN2) {
+       if (info->no_ptp_cfg_active) {
                ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG);
                /* Set CSEL value */
                ravb_modify(ndev, CCC, CCC_CSEL, CCC_CSEL_HPB);