Thread (63 messages) 63 messages, 5 authors, 2024-04-05

Re: [PATCH net-next v8 04/11] net: stmmac: dwmac-loongson: Move irq config to loongson_gmac_config

From: Yanteng Si <hidden>
Date: 2024-03-20 10:12:56

在 2024/3/19 21:43, Serge Semin 写道:
On Wed, Mar 13, 2024 at 04:14:28PM +0800, Yanteng Si wrote:
quoted
在 2024/2/6 01:01, Serge Semin 写道:
quoted
On Tue, Jan 30, 2024 at 04:43:24PM +0800, Yanteng Si wrote:
quoted
Add loongson_dwmac_config and moving irq config related
code to loongson_dwmac_config.

Removing MSI to prepare for adding loongson multi-channel
support later.
Please detach this change into a separate patch and thoroughly explain
why it was necessary.
OK.
quoted
quoted
Signed-off-by: Yanteng Si <redacted>
Signed-off-by: Feiyang Chen <redacted>
Signed-off-by: Yinggang Gu <redacted>
---
   .../ethernet/stmicro/stmmac/dwmac-loongson.c  | 85 ++++++++++++-------
   1 file changed, 55 insertions(+), 30 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c
index 979c9b6dab3f..e7ce027cc14e 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c
@@ -11,8 +11,46 @@
   struct stmmac_pci_info {
   	int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat);
+	int (*config)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat,
+		      struct stmmac_resources *res, struct device_node *np);
   };
+static int loongson_dwmac_config_legacy(struct pci_dev *pdev,
+					struct plat_stmmacenet_data *plat,
+					struct stmmac_resources *res,
+					struct device_node *np)
+{
+	if (np) {
+		res->irq = of_irq_get_byname(np, "macirq");
+		if (res->irq < 0) {
+			dev_err(&pdev->dev, "IRQ macirq not found\n");
+			return -ENODEV;
+		}
+
+		res->wol_irq = of_irq_get_byname(np, "eth_wake_irq");
+		if (res->wol_irq < 0) {
+			dev_info(&pdev->dev,
+				 "IRQ eth_wake_irq not found, using macirq\n");
+			res->wol_irq = res->irq;
+		}
+
+		res->lpi_irq = of_irq_get_byname(np, "eth_lpi");
+		if (res->lpi_irq < 0) {
+			dev_err(&pdev->dev, "IRQ eth_lpi not found\n");
+			return -ENODEV;
+		}
+	} else {
+		res->irq = pdev->irq;
+		res->wol_irq = res->irq;
+	}
+
+	plat->flags &= ~STMMAC_FLAG_MULTI_MSI_EN;
+	dev_info(&pdev->dev, "%s: Single IRQ enablement successful\n",
+		 __func__);
Why is this here all of the sudden? I don't see this in the original
code. Please move it to the patch which requires the flag
setup/cleanup or drop if it isn't necessary.
+	plat->flags &= ~STMMAC_FLAG_MULTI_MSI_EN;
This cannot be removed because it appeared in a rebase(v4 -> v5). See
<https://lore.kernel.org/all/20230710090001.303225-9-brgl@bgdev.pl/ (local)>
AFAICS it _can_ be removed. The patch you referred to is a formal
conversion of
-	plat->multi_msi_en = 0;
to
+	plat->flags &= ~STMMAC_FLAG_MULTI_MSI_EN;
First of all the "multi_msi_en" field clearance had been
redundant there since the code setting the flag was executed after the
code which may cause the field clearance performed. Second AFAICS the
"multi_msi_en" field clearance was originally added to emphasize the
functions semantics:
intel_eth_config_multi_msi() - config multi IRQ device,
intel_eth_config_single_msi() - config single IRQ device.

So in your case there is no any reason of clearing the
STMMAC_FLAG_MULTI_MSI_EN flag. Please, either drop it or move the
change into a separate patch.
OK, you are right. drop it.


Thanks,

Yanteng
-Serge(y)
quoted
+	dev_info(&pdev->dev, "%s: Single IRQ enablement successful\n",
+		 __func__);

OK, drop it.
quoted
quoted
+
+	return 0;
+}
+
   static void loongson_default_data(struct pci_dev *pdev,
   				  struct plat_stmmacenet_data *plat)
   {
@@ -66,8 +104,21 @@ static int loongson_gmac_data(struct pci_dev *pdev,
   	return 0;
   }
+static int loongson_gmac_config(struct pci_dev *pdev,
+				struct plat_stmmacenet_data *plat,
+				struct stmmac_resources *res,
+				struct device_node *np)
+{
+	int ret;
+
+	ret = loongson_dwmac_config_legacy(pdev, plat, res, np);
+
+	return ret;
+}
+
You introduce the config callback here and convert to a dummy method
in
[PATCH 07/11] net: stmmac: dwmac-loongson: Add multi-channel supports for loongson
It's just pointless. What about introducing the
loongson_dwmac_config_legacy() method and call it directly?
OK, I will try.
quoted
quoted
   static struct stmmac_pci_info loongson_gmac_pci_info = {
   	.setup = loongson_gmac_data,
+	.config = loongson_gmac_config,
   };
   static int loongson_dwmac_probe(struct pci_dev *pdev,
@@ -139,44 +190,19 @@ static int loongson_dwmac_probe(struct pci_dev *pdev,
   		plat->phy_interface = phy_mode;
   	}
-	pci_enable_msi(pdev);
See my first note in this message.
OK.


Thanks,

Yanteng
quoted
-Serge(y)
quoted
   	memset(&res, 0, sizeof(res));
   	res.addr = pcim_iomap_table(pdev)[0];
-	if (np) {
-		res.irq = of_irq_get_byname(np, "macirq");
-		if (res.irq < 0) {
-			dev_err(&pdev->dev, "IRQ macirq not found\n");
-			ret = -ENODEV;
-			goto err_disable_msi;
-		}
-
-		res.wol_irq = of_irq_get_byname(np, "eth_wake_irq");
-		if (res.wol_irq < 0) {
-			dev_info(&pdev->dev,
-				 "IRQ eth_wake_irq not found, using macirq\n");
-			res.wol_irq = res.irq;
-		}
-
-		res.lpi_irq = of_irq_get_byname(np, "eth_lpi");
-		if (res.lpi_irq < 0) {
-			dev_err(&pdev->dev, "IRQ eth_lpi not found\n");
-			ret = -ENODEV;
-			goto err_disable_msi;
-		}
-	} else {
-		res.irq = pdev->irq;
-		res.wol_irq = pdev->irq;
-	}
+	ret = info->config(pdev, plat, &res, np);
+	if (ret)
+		goto err_disable_device;
   	ret = stmmac_dvr_probe(&pdev->dev, plat, &res);
   	if (ret)
-		goto err_disable_msi;
+		goto err_disable_device;
   	return ret;
-err_disable_msi:
-	pci_disable_msi(pdev);
   err_disable_device:
   	pci_disable_device(pdev);
   err_put_node:
@@ -200,7 +226,6 @@ static void loongson_dwmac_remove(struct pci_dev *pdev)
   		break;
   	}
-	pci_disable_msi(pdev);
   	pci_disable_device(pdev);
   }
-- 
2.31.4
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help