Blob Blame History Raw
From d200d6ae25c4cca557900de665cdc489f94d38df Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
Date: Wed, 22 Dec 2021 23:00:47 +0100
Subject: [PATCH] mt76: mt7915: move pci specific code back to pci.c
Git-commit: d200d6ae25c4cca557900de665cdc489f94d38df
Patch-mainline: v5.18-rc1
References: bsc#1209980

This avoids the need to check for the device type in mmio.c and makes the code
cleaner

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Acked-by: Takashi Iwai <tiwai@suse.de>

---
 .../net/wireless/mediatek/mt76/mt7915/mmio.c  | 52 +++-------------
 .../wireless/mediatek/mt76/mt7915/mt7915.h    |  7 +--
 .../net/wireless/mediatek/mt76/mt7915/pci.c   | 60 +++++++++++++++++--
 3 files changed, 64 insertions(+), 55 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
index a6dd33f7576f..f1568f9059d8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
@@ -505,7 +505,7 @@ static void mt7915_irq_tasklet(struct tasklet_struct *t)
 	}
 }
 
-static irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)
+irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)
 {
 	struct mt7915_dev *dev = dev_instance;
 
@@ -521,10 +521,8 @@ static irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)
 	return IRQ_HANDLED;
 }
 
-int mt7915_mmio_probe(struct device *pdev,
-		      void __iomem *mem_base,
-		      u32 device_id,
-		      int irq, struct mt7915_hif *hif2)
+struct mt7915_dev *mt7915_mmio_probe(struct device *pdev,
+				     void __iomem *mem_base, u32 device_id)
 {
 	static const struct mt76_driver_ops drv_ops = {
 		/* txwi_size = txd size + txp size */
@@ -551,11 +549,11 @@ int mt7915_mmio_probe(struct device *pdev,
 
 	ops = devm_kmemdup(pdev, &mt7915_ops, sizeof(mt7915_ops), GFP_KERNEL);
 	if (!ops)
-		return -ENOMEM;
+		return ERR_PTR(-ENOMEM);
 
 	mdev = mt76_alloc_device(pdev, sizeof(*dev), ops, &drv_ops);
 	if (!mdev)
-		return -ENOMEM;
+		return ERR_PTR(-ENOMEM);
 
 	dev = container_of(mdev, struct mt7915_dev, mt76);
 
@@ -566,49 +564,13 @@ int mt7915_mmio_probe(struct device *pdev,
 	tasklet_setup(&dev->irq_tasklet, mt7915_irq_tasklet);
 
 	mt76_wr(dev, MT_INT_MASK_CSR, 0);
-	/* master switch of PCIe tnterrupt enable */
-	if (dev_is_pci(pdev))
-		mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff);
-
-	ret = devm_request_irq(mdev->dev, irq, mt7915_irq_handler,
-			       IRQF_SHARED, KBUILD_MODNAME, dev);
-	if (ret)
-		goto error;
 
-	if (hif2 && dev_is_pci(pdev)) {
-		dev->hif2 = hif2;
+	return dev;
 
-		mt76_wr(dev, MT_INT1_MASK_CSR, 0);
-		/* master switch of PCIe tnterrupt enable */
-		if (is_mt7915(mdev))
-			mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE, 0xff);
-		else
-			mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE_MT7916, 0xff);
-
-		ret = devm_request_irq(mdev->dev, dev->hif2->irq,
-				       mt7915_irq_handler, IRQF_SHARED,
-				       KBUILD_MODNAME "-hif", dev);
-		if (ret) {
-			put_device(dev->hif2->dev);
-			goto free_irq;
-		}
-	}
-
-	ret = mt7915_register_device(dev);
-	if (ret)
-		goto free_hif2_irq;
-
-	return 0;
-
-free_hif2_irq:
-	if (dev->hif2)
-		devm_free_irq(mdev->dev, dev->hif2->irq, dev);
-free_irq:
-	devm_free_irq(mdev->dev, irq, dev);
 error:
 	mt76_free_device(&dev->mt76);
 
-	return ret;
+	return ERR_PTR(ret);
 }
 
 static int __init mt7915_init(void)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
index 11615d9324b2..fe1c7a41ca79 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
@@ -380,10 +380,9 @@ extern const struct mt76_testmode_ops mt7915_testmode_ops;
 extern struct pci_driver mt7915_pci_driver;
 extern struct pci_driver mt7915_hif_driver;
 
-int mt7915_mmio_probe(struct device *pdev,
-		      void __iomem *mem_base,
-		      u32 device_id,
-		      int irq, struct mt7915_hif *hif2);
+struct mt7915_dev *mt7915_mmio_probe(struct device *pdev,
+				     void __iomem *mem_base, u32 device_id);
+irqreturn_t mt7915_irq_handler(int irq, void *dev_instance);
 u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif);
 int mt7915_register_device(struct mt7915_dev *dev);
 void mt7915_unregister_device(struct mt7915_dev *dev);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/pci.c b/drivers/net/wireless/mediatek/mt76/mt7915/pci.c
index 92f4b5849cd8..6f819c41a4c4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/pci.c
@@ -95,7 +95,10 @@ static int mt7915_pci_hif2_probe(struct pci_dev *pdev)
 static int mt7915_pci_probe(struct pci_dev *pdev,
 			    const struct pci_device_id *id)
 {
+	struct mt7915_dev *dev;
+	struct mt76_dev *mdev;
 	struct mt7915_hif *hif2;
+	int irq;
 	int ret;
 
 	ret = pcim_enable_device(pdev);
@@ -117,18 +120,63 @@ static int mt7915_pci_probe(struct pci_dev *pdev,
 	if (id->device == 0x7916 || id->device == 0x790a)
 		return mt7915_pci_hif2_probe(pdev);
 
+	dev = mt7915_mmio_probe(&pdev->dev, pcim_iomap_table(pdev)[0],
+				id->device);
+	if (IS_ERR(dev))
+		return PTR_ERR(dev);
+
+	mdev = &dev->mt76;
+	hif2 = mt7915_pci_init_hif2(pdev);
+
 	ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
 	if (ret < 0)
-		return ret;
+		goto free_device;
 
-	hif2 = mt7915_pci_init_hif2(pdev);
+	irq = pdev->irq;
+	ret = devm_request_irq(mdev->dev, irq, mt7915_irq_handler,
+			       IRQF_SHARED, KBUILD_MODNAME, dev);
+	if (ret)
+		goto free_irq_vector;
+
+	mt76_wr(dev, MT_INT_MASK_CSR, 0);
 
-	ret = mt7915_mmio_probe(&pdev->dev, pcim_iomap_table(pdev)[0],
-				id->device, pdev->irq, hif2);
-	if (!ret)
-		return 0;
+	/* master switch of PCIe tnterrupt enable */
+	mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff);
+
+	if (hif2) {
+		dev->hif2 = hif2;
+
+		mt76_wr(dev, MT_INT1_MASK_CSR, 0);
+		/* master switch of PCIe tnterrupt enable */
+		if (is_mt7915(mdev))
+			mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE, 0xff);
+		else
+			mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE_MT7916, 0xff);
+
+		ret = devm_request_irq(mdev->dev, dev->hif2->irq,
+				       mt7915_irq_handler, IRQF_SHARED,
+				       KBUILD_MODNAME "-hif", dev);
+		if (ret)
+			goto free_hif2;
+	}
+
+	ret = mt7915_register_device(dev);
+	if (ret)
+		goto free_hif2_irq;
+
+	return 0;
 
+free_hif2_irq:
+	if (dev->hif2)
+		devm_free_irq(mdev->dev, dev->hif2->irq, dev);
+free_hif2:
+	if (dev->hif2)
+		put_device(dev->hif2->dev);
+	devm_free_irq(mdev->dev, irq, dev);
+free_irq_vector:
 	pci_free_irq_vectors(pdev);
+free_device:
+	mt76_free_device(&dev->mt76);
 
 	return ret;
 }
-- 
2.35.3