Inter-revision diff: patch 5

Comparing v1 (message) to rfc (message)

--- v1
+++ vrfc
@@ -1,245 +1,123 @@
-The DMAC and EMAC blocks of Gigabit Ethernet IP is almost similar to
-Ethernet AVB. With few changes in driver we can support both the IP.
-
-This patch is in preparation for supporting the same by replacing chip
-type by a structure with values, feature bits and function pointers.
-
-Currently only values is added to structure and later patches will add
-features and function pointers.
+R-Car supports gPTP feature whereas RZ/G2L does not support it.
+This patch excludes gtp feature support for RZ/G2L by enabling
+no_gptp feature bit.
 
 Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
-Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
 ---
- drivers/net/ethernet/renesas/ravb.h      | 14 +++++
- drivers/net/ethernet/renesas/ravb_main.c | 76 +++++++++++++++++-------
- 2 files changed, 67 insertions(+), 23 deletions(-)
+ drivers/net/ethernet/renesas/ravb_main.c | 46 ++++++++++++++----------
+ 1 file changed, 28 insertions(+), 18 deletions(-)
 
-diff --git a/drivers/net/ethernet/renesas/ravb.h b/drivers/net/ethernet/renesas/ravb.h
-index 80e62ca2e3d3..0ed21262f26b 100644
---- a/drivers/net/ethernet/renesas/ravb.h
-+++ b/drivers/net/ethernet/renesas/ravb.h
-@@ -988,6 +988,18 @@ enum ravb_chip_id {
- 	RCAR_GEN3,
+diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
+index d38fc33a8e93..8663d83507a0 100644
+--- a/drivers/net/ethernet/renesas/ravb_main.c
++++ b/drivers/net/ethernet/renesas/ravb_main.c
+@@ -918,6 +918,7 @@ static irqreturn_t ravb_interrupt(int irq, void *dev_id)
+ {
+ 	struct net_device *ndev = dev_id;
+ 	struct ravb_private *priv = netdev_priv(ndev);
++	const struct ravb_hw_info *info = priv->info;
+ 	irqreturn_t result = IRQ_NONE;
+ 	u32 iss;
+ 
+@@ -953,7 +954,7 @@ static irqreturn_t ravb_interrupt(int irq, void *dev_id)
+ 	}
+ 
+ 	/* gPTP interrupt status summary */
+-	if (iss & ISS_CGIS) {
++	if (!info->no_gptp && (iss & ISS_CGIS)) {
+ 		ravb_ptp_interrupt(ndev);
+ 		result = IRQ_HANDLED;
+ 	}
+@@ -1378,6 +1379,7 @@ static int ravb_get_ts_info(struct net_device *ndev,
+ 			    struct ethtool_ts_info *info)
+ {
+ 	struct ravb_private *priv = netdev_priv(ndev);
++	const struct ravb_hw_info *hw_info = priv->info;
+ 
+ 	info->so_timestamping =
+ 		SOF_TIMESTAMPING_TX_SOFTWARE |
+@@ -1391,7 +1393,8 @@ static int ravb_get_ts_info(struct net_device *ndev,
+ 		(1 << HWTSTAMP_FILTER_NONE) |
+ 		(1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
+ 		(1 << HWTSTAMP_FILTER_ALL);
+-	info->phc_index = ptp_clock_index(priv->ptp.clock);
++	if (!hw_info->no_gptp)
++		info->phc_index = ptp_clock_index(priv->ptp.clock);
+ 
+ 	return 0;
+ }
+@@ -2116,6 +2119,7 @@ static const struct ravb_hw_info rgeth_hw_info = {
+ 	.emac_init = ravb_rgeth_emac_init,
+ 	.aligned_tx = 1,
+ 	.tx_counters = 1,
++	.no_gptp = 1,
  };
  
-+struct ravb_drv_data {
-+	netdev_features_t net_features;
-+	netdev_features_t net_hw_features;
-+	const char (*gstrings_stats)[ETH_GSTRING_LEN];
-+	size_t gstrings_size;
-+	size_t stats_len;
-+	u32 num_gstat_queue;
-+	size_t skb_sz;
-+	u8 num_tx_desc;
-+	enum ravb_chip_id chip_id;
-+};
-+
- struct ravb_private {
- 	struct net_device *ndev;
- 	struct platform_device *pdev;
-@@ -1040,6 +1052,8 @@ struct ravb_private {
- 	unsigned txcidm:1;		/* TX Clock Internal Delay Mode */
- 	unsigned rgmii_override:1;	/* Deprecated rgmii-*id behavior */
- 	int num_tx_desc;		/* TX descriptors per packet */
-+
-+	const struct ravb_drv_data *info;
- };
+ static const struct of_device_id ravb_match_table[] = {
+@@ -2159,13 +2163,15 @@ 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;
  
- static inline u32 ravb_read(struct net_device *ndev, enum ravb_reg reg)
-diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
-index 805397088850..84ebd6fef711 100644
---- a/drivers/net/ethernet/renesas/ravb_main.c
-+++ b/drivers/net/ethernet/renesas/ravb_main.c
-@@ -339,6 +339,7 @@ static void ravb_ring_format(struct net_device *ndev, int q)
- static int ravb_ring_init(struct net_device *ndev, int q)
- {
- 	struct ravb_private *priv = netdev_priv(ndev);
-+	const struct ravb_drv_data *info = priv->info;
- 	int num_tx_desc = priv->num_tx_desc;
- 	struct sk_buff *skb;
- 	int ring_size;
-@@ -353,7 +354,7 @@ static int ravb_ring_init(struct net_device *ndev, int q)
- 		goto error;
- 
- 	for (i = 0; i < priv->num_rx_ring[q]; i++) {
--		skb = netdev_alloc_skb(ndev, RX_BUF_SZ + RAVB_ALIGN - 1);
-+		skb = netdev_alloc_skb(ndev, info->skb_sz);
- 		if (!skb)
- 			goto error;
- 		ravb_set_buffer_align(skb);
-@@ -1133,13 +1134,14 @@ static const char ravb_gstrings_stats[][ETH_GSTRING_LEN] = {
- 	"rx_queue_1_over_errors",
- };
- 
--#define RAVB_STATS_LEN	ARRAY_SIZE(ravb_gstrings_stats)
--
- static int ravb_get_sset_count(struct net_device *netdev, int sset)
- {
-+	struct ravb_private *priv = netdev_priv(netdev);
-+	const struct ravb_drv_data *info = priv->info;
-+
- 	switch (sset) {
- 	case ETH_SS_STATS:
--		return RAVB_STATS_LEN;
-+		return info->stats_len;
- 	default:
- 		return -EOPNOTSUPP;
- 	}
-@@ -1149,11 +1151,12 @@ static void ravb_get_ethtool_stats(struct net_device *ndev,
- 				   struct ethtool_stats *estats, u64 *data)
- {
- 	struct ravb_private *priv = netdev_priv(ndev);
-+	const struct ravb_drv_data *info = priv->info;
- 	int i = 0;
- 	int q;
- 
- 	/* Device-specific stats */
--	for (q = RAVB_BE; q < NUM_RX_QUEUE; q++) {
-+	for (q = RAVB_BE; q < info->num_gstat_queue; q++) {
- 		struct net_device_stats *stats = &priv->stats[q];
- 
- 		data[i++] = priv->cur_rx[q];
-@@ -1176,9 +1179,12 @@ static void ravb_get_ethtool_stats(struct net_device *ndev,
- 
- static void ravb_get_strings(struct net_device *ndev, u32 stringset, u8 *data)
- {
-+	struct ravb_private *priv = netdev_priv(ndev);
-+	const struct ravb_drv_data *info = priv->info;
-+
- 	switch (stringset) {
- 	case ETH_SS_STATS:
--		memcpy(data, ravb_gstrings_stats, sizeof(ravb_gstrings_stats));
-+		memcpy(data, info->gstrings_stats, info->gstrings_size);
- 		break;
+-	if (!info->no_gptp && !info->ccc_gac) {
++	if (info->no_gptp) {
+ 		ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG);
+-		/* Set CSEL value */
+-		ravb_modify(ndev, CCC, CCC_CSEL, CCC_CSEL_HPB);
+-	} else {
++	} else if (info->ccc_gac) {
+ 		ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG |
+ 			    CCC_GAC | CCC_CSEL_HPB);
++	} else {
++		ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG);
++		/* Set CSEL value */
++		ravb_modify(ndev, CCC, CCC_CSEL, CCC_CSEL_HPB);
  	}
  }
-@@ -1924,12 +1930,36 @@ static int ravb_mdio_release(struct ravb_private *priv)
- 	return 0;
- }
  
-+static const struct ravb_drv_data ravb_gen3_data = {
-+	.net_features = NETIF_F_RXCSUM,
-+	.net_hw_features = NETIF_F_RXCSUM,
-+	.gstrings_stats = ravb_gstrings_stats,
-+	.gstrings_size = sizeof(ravb_gstrings_stats),
-+	.stats_len = ARRAY_SIZE(ravb_gstrings_stats),
-+	.num_gstat_queue = NUM_RX_QUEUE,
-+	.skb_sz = RX_BUF_SZ + RAVB_ALIGN - 1,
-+	.num_tx_desc = NUM_TX_DESC_GEN3,
-+	.chip_id = RCAR_GEN3,
-+};
-+
-+static const struct ravb_drv_data ravb_gen2_data = {
-+	.net_features = NETIF_F_RXCSUM,
-+	.net_hw_features = NETIF_F_RXCSUM,
-+	.gstrings_stats = ravb_gstrings_stats,
-+	.gstrings_size = sizeof(ravb_gstrings_stats),
-+	.stats_len = ARRAY_SIZE(ravb_gstrings_stats),
-+	.num_gstat_queue = NUM_RX_QUEUE,
-+	.skb_sz = RX_BUF_SZ + RAVB_ALIGN - 1,
-+	.num_tx_desc = NUM_TX_DESC_GEN2,
-+	.chip_id = RCAR_GEN2,
-+};
-+
- static const struct of_device_id ravb_match_table[] = {
--	{ .compatible = "renesas,etheravb-r8a7790", .data = (void *)RCAR_GEN2 },
--	{ .compatible = "renesas,etheravb-r8a7794", .data = (void *)RCAR_GEN2 },
--	{ .compatible = "renesas,etheravb-rcar-gen2", .data = (void *)RCAR_GEN2 },
--	{ .compatible = "renesas,etheravb-r8a7795", .data = (void *)RCAR_GEN3 },
--	{ .compatible = "renesas,etheravb-rcar-gen3", .data = (void *)RCAR_GEN3 },
-+	{ .compatible = "renesas,etheravb-r8a7790", .data = &ravb_gen2_data },
-+	{ .compatible = "renesas,etheravb-r8a7794", .data = &ravb_gen2_data },
-+	{ .compatible = "renesas,etheravb-rcar-gen2", .data = &ravb_gen2_data },
-+	{ .compatible = "renesas,etheravb-r8a7795", .data = &ravb_gen3_data },
-+	{ .compatible = "renesas,etheravb-rcar-gen3", .data = &ravb_gen3_data },
- 	{ }
- };
- MODULE_DEVICE_TABLE(of, ravb_match_table);
-@@ -2034,8 +2064,8 @@ static void ravb_set_delay_mode(struct net_device *ndev)
- static int ravb_probe(struct platform_device *pdev)
- {
- 	struct device_node *np = pdev->dev.of_node;
-+	const struct ravb_drv_data *info;
- 	struct ravb_private *priv;
--	enum ravb_chip_id chip_id;
- 	struct net_device *ndev;
- 	int error, irq, q;
- 	struct resource *res;
-@@ -2052,15 +2082,15 @@ static int ravb_probe(struct platform_device *pdev)
- 	if (!ndev)
- 		return -ENOMEM;
+@@ -2348,13 +2354,15 @@ static int ravb_probe(struct platform_device *pdev)
+ 	/* Set AVB config mode */
+ 	ravb_set_config_mode(ndev);
  
--	ndev->features = NETIF_F_RXCSUM;
--	ndev->hw_features = NETIF_F_RXCSUM;
-+	info = of_device_get_match_data(&pdev->dev);
-+
-+	ndev->features = info->net_features;
-+	ndev->hw_features = info->net_hw_features;
+-	/* Set GTI value */
+-	error = ravb_set_gti(ndev);
+-	if (error)
+-		goto out_disable_refclk;
++	if (!info->no_gptp) {
++		/* Set GTI value */
++		error = ravb_set_gti(ndev);
++		if (error)
++			goto out_disable_refclk;
  
- 	pm_runtime_enable(&pdev->dev);
- 	pm_runtime_get_sync(&pdev->dev);
+-	/* Request GTI loading */
+-	ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
++		/* Request GTI loading */
++		ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
++	}
  
--	chip_id = (enum ravb_chip_id)of_device_get_match_data(&pdev->dev);
--
--	if (chip_id == RCAR_GEN3)
-+	if (info->chip_id == RCAR_GEN3)
- 		irq = platform_get_irq_byname(pdev, "ch22");
- 	else
- 		irq = platform_get_irq(pdev, 0);
-@@ -2073,6 +2103,7 @@ static int ravb_probe(struct platform_device *pdev)
- 	SET_NETDEV_DEV(ndev, &pdev->dev);
+ 	if (info->internal_delay) {
+ 		ravb_parse_delay_mode(np, ndev);
+@@ -2547,13 +2555,15 @@ static int __maybe_unused ravb_resume(struct device *dev)
+ 	/* Set AVB config mode */
+ 	ravb_set_config_mode(ndev);
  
- 	priv = netdev_priv(ndev);
-+	priv->info = info;
- 	priv->ndev = ndev;
- 	priv->pdev = pdev;
- 	priv->num_tx_ring[RAVB_BE] = BE_TX_RING_SIZE;
-@@ -2099,7 +2130,7 @@ static int ravb_probe(struct platform_device *pdev)
- 	priv->avb_link_active_low =
- 		of_property_read_bool(np, "renesas,ether-link-active-low");
+-	/* Set GTI value */
+-	ret = ravb_set_gti(ndev);
+-	if (ret)
+-		return ret;
++	if (!info->no_gptp) {
++		/* Set GTI value */
++		ret = ravb_set_gti(ndev);
++		if (ret)
++			return ret;
  
--	if (chip_id == RCAR_GEN3) {
-+	if (info->chip_id == RCAR_GEN3) {
- 		irq = platform_get_irq_byname(pdev, "ch24");
- 		if (irq < 0) {
- 			error = irq;
-@@ -2124,7 +2155,7 @@ static int ravb_probe(struct platform_device *pdev)
- 		}
- 	}
+-	/* Request GTI loading */
+-	ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
++		/* Request GTI loading */
++		ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
++	}
  
--	priv->chip_id = chip_id;
-+	priv->chip_id = info->chip_id;
- 
- 	priv->clk = devm_clk_get(&pdev->dev, NULL);
- 	if (IS_ERR(priv->clk)) {
-@@ -2142,8 +2173,7 @@ static int ravb_probe(struct platform_device *pdev)
- 	ndev->max_mtu = 2048 - (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN);
- 	ndev->min_mtu = ETH_MIN_MTU;
- 
--	priv->num_tx_desc = chip_id == RCAR_GEN2 ?
--		NUM_TX_DESC_GEN2 : NUM_TX_DESC_GEN3;
-+	priv->num_tx_desc = info->num_tx_desc;
- 
- 	/* Set function */
- 	ndev->netdev_ops = &ravb_netdev_ops;
-@@ -2184,7 +2214,7 @@ static int ravb_probe(struct platform_device *pdev)
- 	INIT_LIST_HEAD(&priv->ts_skb_list);
- 
- 	/* Initialise PTP Clock driver */
--	if (chip_id != RCAR_GEN2)
-+	if (info->chip_id != RCAR_GEN2)
- 		ravb_ptp_init(ndev, pdev);
- 
- 	/* Debug message level */
-@@ -2232,7 +2262,7 @@ static int ravb_probe(struct platform_device *pdev)
- 			  priv->desc_bat_dma);
- 
- 	/* Stop PTP Clock driver */
--	if (chip_id != RCAR_GEN2)
-+	if (info->chip_id != RCAR_GEN2)
- 		ravb_ptp_stop(ndev);
- out_disable_refclk:
- 	clk_disable_unprepare(priv->refclk);
+ 	if (info->internal_delay)
+ 		ravb_set_delay_mode(ndev);
 -- 
 2.17.1
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help