All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] bcma: add helpers bringing PCIe hosted bus up / down
@ 2015-01-30 17:22 Rafał Miłecki
  2015-01-30 17:22 ` [PATCH 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
                   ` (3 more replies)
  0 siblings, 4 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-01-30 17:22 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Bringing PCIe hosted bus up requires operating on host-related core.
Since we plan to support PCIe Gen 2 devices we should provide a helper
picking the correct one (PCIE or PCIE2).

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/bcma_private.h                    |  2 ++
 drivers/bcma/driver_pci.c                      | 20 ++----------------
 drivers/bcma/host_pci.c                        | 28 ++++++++++++++++++++++++++
 drivers/net/wireless/b43/main.c                |  4 ++--
 drivers/net/wireless/brcm80211/brcmsmac/main.c |  8 ++++----
 include/linux/bcma/bcma.h                      |  3 +++
 include/linux/bcma/bcma_driver_pci.h           |  2 --
 7 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index ac6c5fc..351f4af 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -101,6 +101,8 @@ static inline void __exit bcma_host_soc_unregister_driver(void)
 
 /* driver_pci.c */
 u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
+void bcma_core_pci_up(struct bcma_drv_pci *pc);
+void bcma_core_pci_down(struct bcma_drv_pci *pc);
 
 extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
 
diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index 7866664..cf92bfa 100644
--- a/drivers/bcma/driver_pci.c
+++ b/drivers/bcma/driver_pci.c
@@ -328,28 +328,12 @@ static void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
 	bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG);
 }
 
-void bcma_core_pci_up(struct bcma_bus *bus)
+void bcma_core_pci_up(struct bcma_drv_pci *pc)
 {
-	struct bcma_drv_pci *pc;
-
-	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
-		return;
-
-	pc = &bus->drv_pci[0];
-
 	bcma_core_pci_extend_L1timer(pc, true);
 }
-EXPORT_SYMBOL_GPL(bcma_core_pci_up);
 
-void bcma_core_pci_down(struct bcma_bus *bus)
+void bcma_core_pci_down(struct bcma_drv_pci *pc)
 {
-	struct bcma_drv_pci *pc;
-
-	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
-		return;
-
-	pc = &bus->drv_pci[0];
-
 	bcma_core_pci_extend_L1timer(pc, false);
 }
-EXPORT_SYMBOL_GPL(bcma_core_pci_down);
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 53c6a8a..8dd37dc 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -310,3 +310,31 @@ void __exit bcma_host_pci_exit(void)
 {
 	pci_unregister_driver(&bcma_pci_bridge_driver);
 }
+
+/**************************************************
+ * Runtime ops for drivers.
+ **************************************************/
+
+/* See also pcicore_up */
+void bcma_host_pci_up(struct bcma_bus *bus)
+{
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
+		return;
+
+	if (bus->host_is_pcie2)
+		pr_warn("Bringing up bus with PCIe Gen 2 host is unsupported yet\n");
+	else
+		bcma_core_pci_up(&bus->drv_pci[0]);
+}
+EXPORT_SYMBOL_GPL(bcma_host_pci_up);
+
+/* See also pcicore_down */
+void bcma_host_pci_down(struct bcma_bus *bus)
+{
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
+		return;
+
+	if (!bus->host_is_pcie2)
+		bcma_core_pci_down(&bus->drv_pci[0]);
+}
+EXPORT_SYMBOL_GPL(bcma_host_pci_down);
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 2c90886..e129b4c 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4819,7 +4819,7 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
 	switch (dev->dev->bus_type) {
 #ifdef CONFIG_B43_BCMA
 	case B43_BUS_BCMA:
-		bcma_core_pci_down(dev->dev->bdev->bus);
+		bcma_host_pci_down(dev->dev->bdev->bus);
 		break;
 #endif
 #ifdef CONFIG_B43_SSB
@@ -4868,7 +4868,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
 	case B43_BUS_BCMA:
 		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
 				      dev->dev->bdev, true);
-		bcma_core_pci_up(dev->dev->bdev->bus);
+		bcma_host_pci_up(dev->dev->bdev->bus);
 		break;
 #endif
 #ifdef CONFIG_B43_SSB
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index eb8584a..bcbfc6e 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4668,7 +4668,7 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
 	brcms_c_coredisable(wlc_hw);
 
 	/* Match driver "down" state */
-	bcma_core_pci_down(wlc_hw->d11core->bus);
+	bcma_host_pci_down(wlc_hw->d11core->bus);
 
 	/* turn off pll and xtal to match driver "down" state */
 	brcms_b_xtal(wlc_hw, OFF);
@@ -4969,12 +4969,12 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
 	 */
 	if (brcms_b_radio_read_hwdisabled(wlc_hw)) {
 		/* put SB PCI in down state again */
-		bcma_core_pci_down(wlc_hw->d11core->bus);
+		bcma_host_pci_down(wlc_hw->d11core->bus);
 		brcms_b_xtal(wlc_hw, OFF);
 		return -ENOMEDIUM;
 	}
 
-	bcma_core_pci_up(wlc_hw->d11core->bus);
+	bcma_host_pci_up(wlc_hw->d11core->bus);
 
 	/* reset the d11 core */
 	brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
@@ -5171,7 +5171,7 @@ static int brcms_b_down_finish(struct brcms_hardware *wlc_hw)
 
 		/* turn off primary xtal and pll */
 		if (!wlc_hw->noreset) {
-			bcma_core_pci_down(wlc_hw->d11core->bus);
+			bcma_host_pci_down(wlc_hw->d11core->bus);
 			brcms_b_xtal(wlc_hw, OFF);
 		}
 	}
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 994739d..037620b 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -434,6 +434,9 @@ static inline struct bcma_device *bcma_find_core(struct bcma_bus *bus,
 	return bcma_find_core_unit(bus, coreid, 0);
 }
 
+extern void bcma_host_pci_up(struct bcma_bus *bus);
+extern void bcma_host_pci_down(struct bcma_bus *bus);
+
 extern bool bcma_core_is_enabled(struct bcma_device *core);
 extern void bcma_core_disable(struct bcma_device *core, u32 flags);
 extern int bcma_core_enable(struct bcma_device *core, u32 flags);
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h
index 3f809ae..23af893 100644
--- a/include/linux/bcma/bcma_driver_pci.h
+++ b/include/linux/bcma/bcma_driver_pci.h
@@ -242,8 +242,6 @@ extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
 extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
 extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
 				 struct bcma_device *core, bool enable);
-extern void bcma_core_pci_up(struct bcma_bus *bus);
-extern void bcma_core_pci_down(struct bcma_bus *bus);
 extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 
 extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 2/4] bcma: change IRQ control function to accept bus as an argument
  2015-01-30 17:22 [PATCH 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
@ 2015-01-30 17:22 ` Rafał Miłecki
  2015-01-30 17:22 ` [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-01-30 17:22 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

It doesn't operate on PCI core, but PCI host device, so there is no
point of passing core related struct.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/driver_pci.c                      | 6 +++---
 drivers/net/wireless/b43/main.c                | 2 +-
 drivers/net/wireless/brcm80211/brcmsmac/main.c | 2 +-
 include/linux/bcma/bcma_driver_pci.h           | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index cf92bfa..cfd35bc 100644
--- a/drivers/bcma/driver_pci.c
+++ b/drivers/bcma/driver_pci.c
@@ -282,21 +282,21 @@ void bcma_core_pci_power_save(struct bcma_bus *bus, bool up)
 }
 EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
 
-int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
+int bcma_core_pci_irq_ctl(struct bcma_bus *bus, struct bcma_device *core,
 			  bool enable)
 {
 	struct pci_dev *pdev;
 	u32 coremask, tmp;
 	int err = 0;
 
-	if (!pc || core->bus->hosttype != BCMA_HOSTTYPE_PCI) {
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI) {
 		/* This bcma device is not on a PCI host-bus. So the IRQs are
 		 * not routed through the PCI core.
 		 * So we must not enable routing through the PCI core. */
 		goto out;
 	}
 
-	pdev = pc->core->bus->host_pci;
+	pdev = bus->host_pci;
 
 	err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
 	if (err)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index e129b4c..44794d2 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4866,7 +4866,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
 	switch (dev->dev->bus_type) {
 #ifdef CONFIG_B43_BCMA
 	case B43_BUS_BCMA:
-		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
+		bcma_core_pci_irq_ctl(dev->dev->bdev->bus,
 				      dev->dev->bdev, true);
 		bcma_host_pci_up(dev->dev->bdev->bus);
 		break;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index bcbfc6e..c84af1d 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4959,7 +4959,7 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
 	 * Configure pci/pcmcia here instead of in brcms_c_attach()
 	 * to allow mfg hotswap:  down, hotswap (chip power cycle), up.
 	 */
-	bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core,
+	bcma_core_pci_irq_ctl(wlc_hw->d11core->bus, wlc_hw->d11core,
 			      true);
 
 	/*
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h
index 23af893..6b8bca6 100644
--- a/include/linux/bcma/bcma_driver_pci.h
+++ b/include/linux/bcma/bcma_driver_pci.h
@@ -240,7 +240,7 @@ struct bcma_drv_pci {
 
 extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
 extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
-extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
+extern int bcma_core_pci_irq_ctl(struct bcma_bus *bus,
 				 struct bcma_device *core, bool enable);
 extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2
  2015-01-30 17:22 [PATCH 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  2015-01-30 17:22 ` [PATCH 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
@ 2015-01-30 17:22 ` Rafał Miłecki
  2015-01-30 19:59   ` Hauke Mehrtens
  2015-01-30 17:22 ` [PATCH 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
  2015-02-08 15:31 ` [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  3 siblings, 1 reply; 17+ messages in thread
From: Rafał Miłecki @ 2015-01-30 17:22 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/bcma_private.h            |  3 +++
 drivers/bcma/driver_pcie2.c            | 24 ++++++++++++++++++++++--
 drivers/bcma/host_pci.c                |  2 +-
 include/linux/bcma/bcma_driver_pcie2.h |  2 ++
 4 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index 351f4af..3692912 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -104,6 +104,9 @@ u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
 void bcma_core_pci_up(struct bcma_drv_pci *pc);
 void bcma_core_pci_down(struct bcma_drv_pci *pc);
 
+/* driver_pcie2.c */
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2);
+
 extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
 
 #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
diff --git a/drivers/bcma/driver_pcie2.c b/drivers/bcma/driver_pcie2.c
index e4be537..c8913bc 100644
--- a/drivers/bcma/driver_pcie2.c
+++ b/drivers/bcma/driver_pcie2.c
@@ -156,14 +156,20 @@ static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2)
 
 void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
 {
-	struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo;
+	struct bcma_bus *bus = pcie2->core->bus;
+	struct bcma_chipinfo *ci = &bus->chipinfo;
 	u32 tmp;
 
 	tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54));
 	if ((tmp & 0xe) >> 1 == 2)
 		bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17);
 
-	/* TODO: Do we need pcie_reqsize? */
+	switch (bus->chipinfo.id) {
+	case BCMA_CHIP_ID_BCM4360:
+	case BCMA_CHIP_ID_BCM4352:
+		pcie2->reqsize = 0x3000; /* TODO: PCI_EXP_DEVCTL_READRQ_1024B */
+		break;
+	}
 
 	if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3)
 		bcma_core_pcie2_war_delay_perst_enab(pcie2, true);
@@ -173,3 +179,17 @@ void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
 	pciedev_crwlpciegen2_180(pcie2);
 	pciedev_crwlpciegen2_182(pcie2);
 }
+
+/**************************************************
+ * Runtime ops.
+ **************************************************/
+
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
+{
+	struct bcma_bus *bus = pcie2->core->bus;
+	struct pci_dev *dev = bus->host_pci;
+
+	pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
+					   PCI_EXP_DEVCTL_READRQ,
+					   pcie2->reqsize);
+}
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 8dd37dc..5fb87a8 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -322,7 +322,7 @@ void bcma_host_pci_up(struct bcma_bus *bus)
 		return;
 
 	if (bus->host_is_pcie2)
-		pr_warn("Bringing up bus with PCIe Gen 2 host is unsupported yet\n");
+		bcma_core_pcie2_up(&bus->drv_pcie2);
 	else
 		bcma_core_pci_up(&bus->drv_pci[0]);
 }
diff --git a/include/linux/bcma/bcma_driver_pcie2.h b/include/linux/bcma/bcma_driver_pcie2.h
index 5988b05..d8c4329 100644
--- a/include/linux/bcma/bcma_driver_pcie2.h
+++ b/include/linux/bcma/bcma_driver_pcie2.h
@@ -143,6 +143,8 @@
 
 struct bcma_drv_pcie2 {
 	struct bcma_device *core;
+
+	u16 reqsize;
 };
 
 #define pcie2_read16(pcie2, offset)		bcma_read16((pcie2)->core, offset)
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 4/4] bcma: enable support for PCIe Gen 2 host devices
  2015-01-30 17:22 [PATCH 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  2015-01-30 17:22 ` [PATCH 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
  2015-01-30 17:22 ` [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
@ 2015-01-30 17:22 ` Rafał Miłecki
  2015-02-08 15:31 ` [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-01-30 17:22 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/bcma_private.h |  1 +
 drivers/bcma/host_pci.c     | 15 ++++++++++++++-
 drivers/bcma/main.c         |  2 +-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index 3692912..29565e3 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -26,6 +26,7 @@ bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
 		     int timeout);
 void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core);
 void bcma_init_bus(struct bcma_bus *bus);
+void bcma_unregister_cores(struct bcma_bus *bus);
 int bcma_bus_register(struct bcma_bus *bus);
 void bcma_bus_unregister(struct bcma_bus *bus);
 int __init bcma_bus_early_register(struct bcma_bus *bus);
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 5fb87a8..a62a2f9 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -213,16 +213,26 @@ static int bcma_host_pci_probe(struct pci_dev *dev,
 	/* Initialize struct, detect chip */
 	bcma_init_bus(bus);
 
+	/* Scan bus to find out generation of PCIe core */
+	err = bcma_bus_scan(bus);
+	if (err)
+		goto err_pci_unmap_mmio;
+
+	if (bcma_find_core(bus, BCMA_CORE_PCIE2))
+		bus->host_is_pcie2 = true;
+
 	/* Register */
 	err = bcma_bus_register(bus);
 	if (err)
-		goto err_pci_unmap_mmio;
+		goto err_unregister_cores;
 
 	pci_set_drvdata(dev, bus);
 
 out:
 	return err;
 
+err_unregister_cores:
+	bcma_unregister_cores(bus);
 err_pci_unmap_mmio:
 	pci_iounmap(dev, bus->mmio);
 err_pci_release_regions:
@@ -283,9 +293,12 @@ static const struct pci_device_id bcma_pci_bridge_tbl[] = {
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43b1) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) },	/* 0xa8db, BCM43217 (sic!) */
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43228) },	/* 0xa8dc */
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index 38bde6e..9635f10 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -363,7 +363,7 @@ static int bcma_register_devices(struct bcma_bus *bus)
 	return 0;
 }
 
-static void bcma_unregister_cores(struct bcma_bus *bus)
+void bcma_unregister_cores(struct bcma_bus *bus)
 {
 	struct bcma_device *core, *tmp;
 
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2
  2015-01-30 17:22 ` [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
@ 2015-01-30 19:59   ` Hauke Mehrtens
  2015-01-30 23:08     ` Rafał Miłecki
  0 siblings, 1 reply; 17+ messages in thread
From: Hauke Mehrtens @ 2015-01-30 19:59 UTC (permalink / raw)
  To: Rafał Miłecki, Kalle Valo, linux-wireless; +Cc: brcm80211-dev-list



On 01/30/2015 06:22 PM, Rafał Miłecki wrote:
> Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
> ---
>  drivers/bcma/bcma_private.h            |  3 +++
>  drivers/bcma/driver_pcie2.c            | 24 ++++++++++++++++++++++--
>  drivers/bcma/host_pci.c                |  2 +-
>  include/linux/bcma/bcma_driver_pcie2.h |  2 ++
>  4 files changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
> index 351f4af..3692912 100644
> --- a/drivers/bcma/bcma_private.h
> +++ b/drivers/bcma/bcma_private.h
> @@ -104,6 +104,9 @@ u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
>  void bcma_core_pci_up(struct bcma_drv_pci *pc);
>  void bcma_core_pci_down(struct bcma_drv_pci *pc);
>  
> +/* driver_pcie2.c */
> +void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2);
> +
>  extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
>  
>  #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
> diff --git a/drivers/bcma/driver_pcie2.c b/drivers/bcma/driver_pcie2.c
> index e4be537..c8913bc 100644
> --- a/drivers/bcma/driver_pcie2.c
> +++ b/drivers/bcma/driver_pcie2.c
> @@ -156,14 +156,20 @@ static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2)
>  
>  void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
>  {
> -	struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo;
> +	struct bcma_bus *bus = pcie2->core->bus;
> +	struct bcma_chipinfo *ci = &bus->chipinfo;
>  	u32 tmp;
>  
>  	tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54));
>  	if ((tmp & 0xe) >> 1 == 2)
>  		bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17);
>  
> -	/* TODO: Do we need pcie_reqsize? */
> +	switch (bus->chipinfo.id) {
> +	case BCMA_CHIP_ID_BCM4360:
> +	case BCMA_CHIP_ID_BCM4352:
> +		pcie2->reqsize = 0x3000; /* TODO: PCI_EXP_DEVCTL_READRQ_1024B */
> +		break;
> +	}

In the PCIe controller used in the BCM4706 there was a bug, so that it
did not support a request size bigger than 128 bytes. Broadcom "fixed"
that in the PCIe device driver code by decreasing the value, but we
fixed that in the PCIe controller code, see:

commit f4a83e578e0011ddcfdbe1c62d0916dadb4802aa
Author: Hauke Mehrtens <hauke@hauke-m.de>
Date:   Fri Aug 23 23:22:29 2013 +0200

    bcma: change max PCI read request size to 128

It could be that the PCIe controller used on ARM SoCs has similar
problems but supports bigger sizes now, but not so big ones.

This is just an assumption.

What is the default value for pcie2->reqsize?

>  
>  	if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3)
>  		bcma_core_pcie2_war_delay_perst_enab(pcie2, true);
> @@ -173,3 +179,17 @@ void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
>  	pciedev_crwlpciegen2_180(pcie2);
>  	pciedev_crwlpciegen2_182(pcie2);
>  }
> +
> +/**************************************************
> + * Runtime ops.
> + **************************************************/
> +
> +void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
> +{
> +	struct bcma_bus *bus = pcie2->core->bus;
> +	struct pci_dev *dev = bus->host_pci;
> +
> +	pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
> +					   PCI_EXP_DEVCTL_READRQ,
> +					   pcie2->reqsize);

Use pcie_set_readrq() if it is needed.

> +}
> diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
> index 8dd37dc..5fb87a8 100644
> --- a/drivers/bcma/host_pci.c
> +++ b/drivers/bcma/host_pci.c
> @@ -322,7 +322,7 @@ void bcma_host_pci_up(struct bcma_bus *bus)
>  		return;
>  
>  	if (bus->host_is_pcie2)
> -		pr_warn("Bringing up bus with PCIe Gen 2 host is unsupported yet\n");
> +		bcma_core_pcie2_up(&bus->drv_pcie2);
>  	else
>  		bcma_core_pci_up(&bus->drv_pci[0]);
>  }
> diff --git a/include/linux/bcma/bcma_driver_pcie2.h b/include/linux/bcma/bcma_driver_pcie2.h
> index 5988b05..d8c4329 100644
> --- a/include/linux/bcma/bcma_driver_pcie2.h
> +++ b/include/linux/bcma/bcma_driver_pcie2.h
> @@ -143,6 +143,8 @@
>  
>  struct bcma_drv_pcie2 {
>  	struct bcma_device *core;
> +
> +	u16 reqsize;
>  };
>  
>  #define pcie2_read16(pcie2, offset)		bcma_read16((pcie2)->core, offset)
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2
  2015-01-30 19:59   ` Hauke Mehrtens
@ 2015-01-30 23:08     ` Rafał Miłecki
  2015-02-06  6:56       ` Kalle Valo
  0 siblings, 1 reply; 17+ messages in thread
From: Rafał Miłecki @ 2015-01-30 23:08 UTC (permalink / raw)
  To: Hauke Mehrtens; +Cc: Kalle Valo, linux-wireless, brcm80211 development

On 30 January 2015 at 20:59, Hauke Mehrtens <hauke@hauke-m.de> wrote:
> On 01/30/2015 06:22 PM, Rafał Miłecki wrote:
>> Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
>> ---
>>  drivers/bcma/bcma_private.h            |  3 +++
>>  drivers/bcma/driver_pcie2.c            | 24 ++++++++++++++++++++++--
>>  drivers/bcma/host_pci.c                |  2 +-
>>  include/linux/bcma/bcma_driver_pcie2.h |  2 ++
>>  4 files changed, 28 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
>> index 351f4af..3692912 100644
>> --- a/drivers/bcma/bcma_private.h
>> +++ b/drivers/bcma/bcma_private.h
>> @@ -104,6 +104,9 @@ u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
>>  void bcma_core_pci_up(struct bcma_drv_pci *pc);
>>  void bcma_core_pci_down(struct bcma_drv_pci *pc);
>>
>> +/* driver_pcie2.c */
>> +void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2);
>> +
>>  extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
>>
>>  #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
>> diff --git a/drivers/bcma/driver_pcie2.c b/drivers/bcma/driver_pcie2.c
>> index e4be537..c8913bc 100644
>> --- a/drivers/bcma/driver_pcie2.c
>> +++ b/drivers/bcma/driver_pcie2.c
>> @@ -156,14 +156,20 @@ static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2)
>>
>>  void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
>>  {
>> -     struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo;
>> +     struct bcma_bus *bus = pcie2->core->bus;
>> +     struct bcma_chipinfo *ci = &bus->chipinfo;
>>       u32 tmp;
>>
>>       tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54));
>>       if ((tmp & 0xe) >> 1 == 2)
>>               bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17);
>>
>> -     /* TODO: Do we need pcie_reqsize? */
>> +     switch (bus->chipinfo.id) {
>> +     case BCMA_CHIP_ID_BCM4360:
>> +     case BCMA_CHIP_ID_BCM4352:
>> +             pcie2->reqsize = 0x3000; /* TODO: PCI_EXP_DEVCTL_READRQ_1024B */
>> +             break;
>> +     }
>
> In the PCIe controller used in the BCM4706 there was a bug, so that it
> did not support a request size bigger than 128 bytes. Broadcom "fixed"
> that in the PCIe device driver code by decreasing the value, but we
> fixed that in the PCIe controller code, see:
>
> commit f4a83e578e0011ddcfdbe1c62d0916dadb4802aa
> Author: Hauke Mehrtens <hauke@hauke-m.de>
> Date:   Fri Aug 23 23:22:29 2013 +0200
>
>     bcma: change max PCI read request size to 128
>
> It could be that the PCIe controller used on ARM SoCs has similar
> problems but supports bigger sizes now, but not so big ones.

Thanks for your comment! It seems indeed that Broadcom's shared code
provides function called si_pcie_set_request_size
My guess is that wl.ko has to contain something like
if (BCM4331)
        si_pcie_set_request_size(sih, 128);

So the question is: does wl.ko contain similar code for
BCM4352/BCM4360. It appears that wl.ko (at least for x86_64) uses
system calls for PCI R/W. So I've put debugging messages and there is
what I got:
[  235.036193] [pci_bus_read_config_dword]  pos:180 data:0x00102C10
[  235.036195] [pci_bus_write_config_dword] pos:180 value:0x00103C10
[  235.036199] [pci_bus_read_config_dword]  pos:180 data:0x00103C10
As you can see PCI_EXP_DEVCTL_READRQ has been changed from
boot-default 512B to default 1024B. It appears that wl.ko didn't call
si_pcie_set_request_size for my 14e4:43b1 BCM4352.

Of course it may be different for non x86_64 architectures, but I
can't say it at this point.

So the proposed code seems OK to me, we may need to modify it in the
future for some SoCs, but we can't say that right now.


> What is the default value for pcie2->reqsize?

0x0000 which is 128B.


>> +void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
>> +{
>> +     struct bcma_bus *bus = pcie2->core->bus;
>> +     struct pci_dev *dev = bus->host_pci;
>> +
>> +     pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
>> +                                        PCI_EXP_DEVCTL_READRQ,
>> +                                        pcie2->reqsize);
>
> Use pcie_set_readrq() if it is needed.

What do you mean by "if needed"? Is there anything wrong?

-- 
Rafał

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2
  2015-01-30 23:08     ` Rafał Miłecki
@ 2015-02-06  6:56       ` Kalle Valo
  2015-02-08 14:12         ` Hauke Mehrtens
  0 siblings, 1 reply; 17+ messages in thread
From: Kalle Valo @ 2015-02-06  6:56 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Hauke Mehrtens, linux-wireless, brcm80211 development

Rafał Miłecki <zajec5@gmail.com> writes:

>>> +void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
>>> +{
>>> +     struct bcma_bus *bus = pcie2->core->bus;
>>> +     struct pci_dev *dev = bus->host_pci;
>>> +
>>> +     pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
>>> +                                        PCI_EXP_DEVCTL_READRQ,
>>> +                                        pcie2->reqsize);
>>
>> Use pcie_set_readrq() if it is needed.
>
> What do you mean by "if needed"? Is there anything wrong?

So what's the conclusion? Can I apply these?

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2
  2015-02-06  6:56       ` Kalle Valo
@ 2015-02-08 14:12         ` Hauke Mehrtens
  0 siblings, 0 replies; 17+ messages in thread
From: Hauke Mehrtens @ 2015-02-08 14:12 UTC (permalink / raw)
  To: Kalle Valo, Rafał Miłecki; +Cc: linux-wireless, brcm80211 development

On 02/06/2015 07:56 AM, Kalle Valo wrote:
> Rafał Miłecki <zajec5@gmail.com> writes:
> 
>>>> +void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
>>>> +{
>>>> +     struct bcma_bus *bus = pcie2->core->bus;
>>>> +     struct pci_dev *dev = bus->host_pci;
>>>> +
>>>> +     pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
>>>> +                                        PCI_EXP_DEVCTL_READRQ,
>>>> +                                        pcie2->reqsize);
>>>
>>> Use pcie_set_readrq() if it is needed.
>>
>> What do you mean by "if needed"? Is there anything wrong?
> 
> So what's the conclusion? Can I apply these?
> 
Ah sorry,

The "if needed" referenced the comment above about if setting this is
needed at all, or if this should be done by the driver for the (broken?)
PCIe controller.

pcie_set_readrq() does the setting of this register in the Linux kernel
and does some additional checks, I would suggest using this function
instead of setting this register by yourself.

Hauke

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down
  2015-01-30 17:22 [PATCH 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
                   ` (2 preceding siblings ...)
  2015-01-30 17:22 ` [PATCH 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
@ 2015-02-08 15:31 ` Rafał Miłecki
  2015-02-08 15:31   ` [PATCH V2 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
                     ` (3 more replies)
  3 siblings, 4 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 15:31 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Bringing PCIe hosted bus up requires operating on host-related core.
Since we plan to support PCIe Gen 2 devices we should provide a helper
picking the correct one (PCIE or PCIE2).

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/bcma_private.h                    |  2 ++
 drivers/bcma/driver_pci.c                      | 20 ++----------------
 drivers/bcma/host_pci.c                        | 28 ++++++++++++++++++++++++++
 drivers/net/wireless/b43/main.c                |  4 ++--
 drivers/net/wireless/brcm80211/brcmsmac/main.c |  8 ++++----
 include/linux/bcma/bcma.h                      |  3 +++
 include/linux/bcma/bcma_driver_pci.h           |  2 --
 7 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index ac6c5fc..351f4af 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -101,6 +101,8 @@ static inline void __exit bcma_host_soc_unregister_driver(void)
 
 /* driver_pci.c */
 u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
+void bcma_core_pci_up(struct bcma_drv_pci *pc);
+void bcma_core_pci_down(struct bcma_drv_pci *pc);
 
 extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
 
diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index 7866664..cf92bfa 100644
--- a/drivers/bcma/driver_pci.c
+++ b/drivers/bcma/driver_pci.c
@@ -328,28 +328,12 @@ static void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
 	bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG);
 }
 
-void bcma_core_pci_up(struct bcma_bus *bus)
+void bcma_core_pci_up(struct bcma_drv_pci *pc)
 {
-	struct bcma_drv_pci *pc;
-
-	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
-		return;
-
-	pc = &bus->drv_pci[0];
-
 	bcma_core_pci_extend_L1timer(pc, true);
 }
-EXPORT_SYMBOL_GPL(bcma_core_pci_up);
 
-void bcma_core_pci_down(struct bcma_bus *bus)
+void bcma_core_pci_down(struct bcma_drv_pci *pc)
 {
-	struct bcma_drv_pci *pc;
-
-	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
-		return;
-
-	pc = &bus->drv_pci[0];
-
 	bcma_core_pci_extend_L1timer(pc, false);
 }
-EXPORT_SYMBOL_GPL(bcma_core_pci_down);
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 53c6a8a..8dd37dc 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -310,3 +310,31 @@ void __exit bcma_host_pci_exit(void)
 {
 	pci_unregister_driver(&bcma_pci_bridge_driver);
 }
+
+/**************************************************
+ * Runtime ops for drivers.
+ **************************************************/
+
+/* See also pcicore_up */
+void bcma_host_pci_up(struct bcma_bus *bus)
+{
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
+		return;
+
+	if (bus->host_is_pcie2)
+		pr_warn("Bringing up bus with PCIe Gen 2 host is unsupported yet\n");
+	else
+		bcma_core_pci_up(&bus->drv_pci[0]);
+}
+EXPORT_SYMBOL_GPL(bcma_host_pci_up);
+
+/* See also pcicore_down */
+void bcma_host_pci_down(struct bcma_bus *bus)
+{
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
+		return;
+
+	if (!bus->host_is_pcie2)
+		bcma_core_pci_down(&bus->drv_pci[0]);
+}
+EXPORT_SYMBOL_GPL(bcma_host_pci_down);
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 2c90886..e129b4c 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4819,7 +4819,7 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
 	switch (dev->dev->bus_type) {
 #ifdef CONFIG_B43_BCMA
 	case B43_BUS_BCMA:
-		bcma_core_pci_down(dev->dev->bdev->bus);
+		bcma_host_pci_down(dev->dev->bdev->bus);
 		break;
 #endif
 #ifdef CONFIG_B43_SSB
@@ -4868,7 +4868,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
 	case B43_BUS_BCMA:
 		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
 				      dev->dev->bdev, true);
-		bcma_core_pci_up(dev->dev->bdev->bus);
+		bcma_host_pci_up(dev->dev->bdev->bus);
 		break;
 #endif
 #ifdef CONFIG_B43_SSB
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index eb8584a..bcbfc6e 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4668,7 +4668,7 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
 	brcms_c_coredisable(wlc_hw);
 
 	/* Match driver "down" state */
-	bcma_core_pci_down(wlc_hw->d11core->bus);
+	bcma_host_pci_down(wlc_hw->d11core->bus);
 
 	/* turn off pll and xtal to match driver "down" state */
 	brcms_b_xtal(wlc_hw, OFF);
@@ -4969,12 +4969,12 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
 	 */
 	if (brcms_b_radio_read_hwdisabled(wlc_hw)) {
 		/* put SB PCI in down state again */
-		bcma_core_pci_down(wlc_hw->d11core->bus);
+		bcma_host_pci_down(wlc_hw->d11core->bus);
 		brcms_b_xtal(wlc_hw, OFF);
 		return -ENOMEDIUM;
 	}
 
-	bcma_core_pci_up(wlc_hw->d11core->bus);
+	bcma_host_pci_up(wlc_hw->d11core->bus);
 
 	/* reset the d11 core */
 	brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
@@ -5171,7 +5171,7 @@ static int brcms_b_down_finish(struct brcms_hardware *wlc_hw)
 
 		/* turn off primary xtal and pll */
 		if (!wlc_hw->noreset) {
-			bcma_core_pci_down(wlc_hw->d11core->bus);
+			bcma_host_pci_down(wlc_hw->d11core->bus);
 			brcms_b_xtal(wlc_hw, OFF);
 		}
 	}
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 994739d..037620b 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -434,6 +434,9 @@ static inline struct bcma_device *bcma_find_core(struct bcma_bus *bus,
 	return bcma_find_core_unit(bus, coreid, 0);
 }
 
+extern void bcma_host_pci_up(struct bcma_bus *bus);
+extern void bcma_host_pci_down(struct bcma_bus *bus);
+
 extern bool bcma_core_is_enabled(struct bcma_device *core);
 extern void bcma_core_disable(struct bcma_device *core, u32 flags);
 extern int bcma_core_enable(struct bcma_device *core, u32 flags);
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h
index 3f809ae..23af893 100644
--- a/include/linux/bcma/bcma_driver_pci.h
+++ b/include/linux/bcma/bcma_driver_pci.h
@@ -242,8 +242,6 @@ extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
 extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
 extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
 				 struct bcma_device *core, bool enable);
-extern void bcma_core_pci_up(struct bcma_bus *bus);
-extern void bcma_core_pci_down(struct bcma_bus *bus);
 extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 
 extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH V2 2/4] bcma: change IRQ control function to accept bus as an argument
  2015-02-08 15:31 ` [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
@ 2015-02-08 15:31   ` Rafał Miłecki
  2015-02-08 15:31   ` [PATCH V2 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 15:31 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

It doesn't operate on PCI core, but PCI host device, so there is no
point of passing core related struct.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/driver_pci.c                      | 6 +++---
 drivers/net/wireless/b43/main.c                | 2 +-
 drivers/net/wireless/brcm80211/brcmsmac/main.c | 2 +-
 include/linux/bcma/bcma_driver_pci.h           | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index cf92bfa..cfd35bc 100644
--- a/drivers/bcma/driver_pci.c
+++ b/drivers/bcma/driver_pci.c
@@ -282,21 +282,21 @@ void bcma_core_pci_power_save(struct bcma_bus *bus, bool up)
 }
 EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
 
-int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
+int bcma_core_pci_irq_ctl(struct bcma_bus *bus, struct bcma_device *core,
 			  bool enable)
 {
 	struct pci_dev *pdev;
 	u32 coremask, tmp;
 	int err = 0;
 
-	if (!pc || core->bus->hosttype != BCMA_HOSTTYPE_PCI) {
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI) {
 		/* This bcma device is not on a PCI host-bus. So the IRQs are
 		 * not routed through the PCI core.
 		 * So we must not enable routing through the PCI core. */
 		goto out;
 	}
 
-	pdev = pc->core->bus->host_pci;
+	pdev = bus->host_pci;
 
 	err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
 	if (err)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index e129b4c..44794d2 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4866,7 +4866,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
 	switch (dev->dev->bus_type) {
 #ifdef CONFIG_B43_BCMA
 	case B43_BUS_BCMA:
-		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
+		bcma_core_pci_irq_ctl(dev->dev->bdev->bus,
 				      dev->dev->bdev, true);
 		bcma_host_pci_up(dev->dev->bdev->bus);
 		break;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index bcbfc6e..c84af1d 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4959,7 +4959,7 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
 	 * Configure pci/pcmcia here instead of in brcms_c_attach()
 	 * to allow mfg hotswap:  down, hotswap (chip power cycle), up.
 	 */
-	bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core,
+	bcma_core_pci_irq_ctl(wlc_hw->d11core->bus, wlc_hw->d11core,
 			      true);
 
 	/*
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h
index 23af893..6b8bca6 100644
--- a/include/linux/bcma/bcma_driver_pci.h
+++ b/include/linux/bcma/bcma_driver_pci.h
@@ -240,7 +240,7 @@ struct bcma_drv_pci {
 
 extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
 extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
-extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
+extern int bcma_core_pci_irq_ctl(struct bcma_bus *bus,
 				 struct bcma_device *core, bool enable);
 extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH V2 3/4] bcma: support bringing up bus hosted on PCIe Gen 2
  2015-02-08 15:31 ` [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  2015-02-08 15:31   ` [PATCH V2 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
@ 2015-02-08 15:31   ` Rafał Miłecki
  2015-02-08 15:31   ` [PATCH V2 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
  2015-02-08 16:11   ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 15:31 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
V2: Use pcie_set_readrq helper instead of pcie_capability_clear_and_set_word
---
 drivers/bcma/bcma_private.h            |  3 +++
 drivers/bcma/driver_pcie2.c            | 22 ++++++++++++++++++++--
 drivers/bcma/host_pci.c                |  2 +-
 include/linux/bcma/bcma_driver_pcie2.h |  2 ++
 4 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index 351f4af..3692912 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -104,6 +104,9 @@ u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
 void bcma_core_pci_up(struct bcma_drv_pci *pc);
 void bcma_core_pci_down(struct bcma_drv_pci *pc);
 
+/* driver_pcie2.c */
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2);
+
 extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
 
 #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
diff --git a/drivers/bcma/driver_pcie2.c b/drivers/bcma/driver_pcie2.c
index e4be537..72cf529 100644
--- a/drivers/bcma/driver_pcie2.c
+++ b/drivers/bcma/driver_pcie2.c
@@ -156,14 +156,20 @@ static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2)
 
 void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
 {
-	struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo;
+	struct bcma_bus *bus = pcie2->core->bus;
+	struct bcma_chipinfo *ci = &bus->chipinfo;
 	u32 tmp;
 
 	tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54));
 	if ((tmp & 0xe) >> 1 == 2)
 		bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17);
 
-	/* TODO: Do we need pcie_reqsize? */
+	switch (bus->chipinfo.id) {
+	case BCMA_CHIP_ID_BCM4360:
+	case BCMA_CHIP_ID_BCM4352:
+		pcie2->reqsize = 0x3000; /* TODO: PCI_EXP_DEVCTL_READRQ_1024B */
+		break;
+	}
 
 	if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3)
 		bcma_core_pcie2_war_delay_perst_enab(pcie2, true);
@@ -173,3 +179,15 @@ void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
 	pciedev_crwlpciegen2_180(pcie2);
 	pciedev_crwlpciegen2_182(pcie2);
 }
+
+/**************************************************
+ * Runtime ops.
+ **************************************************/
+
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
+{
+	struct bcma_bus *bus = pcie2->core->bus;
+	struct pci_dev *dev = bus->host_pci;
+
+	pcie_set_readrq(dev, pcie2->reqsize);
+}
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 8dd37dc..5fb87a8 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -322,7 +322,7 @@ void bcma_host_pci_up(struct bcma_bus *bus)
 		return;
 
 	if (bus->host_is_pcie2)
-		pr_warn("Bringing up bus with PCIe Gen 2 host is unsupported yet\n");
+		bcma_core_pcie2_up(&bus->drv_pcie2);
 	else
 		bcma_core_pci_up(&bus->drv_pci[0]);
 }
diff --git a/include/linux/bcma/bcma_driver_pcie2.h b/include/linux/bcma/bcma_driver_pcie2.h
index 5988b05..d8c4329 100644
--- a/include/linux/bcma/bcma_driver_pcie2.h
+++ b/include/linux/bcma/bcma_driver_pcie2.h
@@ -143,6 +143,8 @@
 
 struct bcma_drv_pcie2 {
 	struct bcma_device *core;
+
+	u16 reqsize;
 };
 
 #define pcie2_read16(pcie2, offset)		bcma_read16((pcie2)->core, offset)
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH V2 4/4] bcma: enable support for PCIe Gen 2 host devices
  2015-02-08 15:31 ` [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  2015-02-08 15:31   ` [PATCH V2 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
  2015-02-08 15:31   ` [PATCH V2 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
@ 2015-02-08 15:31   ` Rafał Miłecki
  2015-02-08 16:11   ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 15:31 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/bcma_private.h |  1 +
 drivers/bcma/host_pci.c     | 15 ++++++++++++++-
 drivers/bcma/main.c         |  2 +-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index 3692912..29565e3 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -26,6 +26,7 @@ bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
 		     int timeout);
 void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core);
 void bcma_init_bus(struct bcma_bus *bus);
+void bcma_unregister_cores(struct bcma_bus *bus);
 int bcma_bus_register(struct bcma_bus *bus);
 void bcma_bus_unregister(struct bcma_bus *bus);
 int __init bcma_bus_early_register(struct bcma_bus *bus);
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 5fb87a8..a62a2f9 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -213,16 +213,26 @@ static int bcma_host_pci_probe(struct pci_dev *dev,
 	/* Initialize struct, detect chip */
 	bcma_init_bus(bus);
 
+	/* Scan bus to find out generation of PCIe core */
+	err = bcma_bus_scan(bus);
+	if (err)
+		goto err_pci_unmap_mmio;
+
+	if (bcma_find_core(bus, BCMA_CORE_PCIE2))
+		bus->host_is_pcie2 = true;
+
 	/* Register */
 	err = bcma_bus_register(bus);
 	if (err)
-		goto err_pci_unmap_mmio;
+		goto err_unregister_cores;
 
 	pci_set_drvdata(dev, bus);
 
 out:
 	return err;
 
+err_unregister_cores:
+	bcma_unregister_cores(bus);
 err_pci_unmap_mmio:
 	pci_iounmap(dev, bus->mmio);
 err_pci_release_regions:
@@ -283,9 +293,12 @@ static const struct pci_device_id bcma_pci_bridge_tbl[] = {
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43b1) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) },	/* 0xa8db, BCM43217 (sic!) */
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43228) },	/* 0xa8dc */
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index 38bde6e..9635f10 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -363,7 +363,7 @@ static int bcma_register_devices(struct bcma_bus *bus)
 	return 0;
 }
 
-static void bcma_unregister_cores(struct bcma_bus *bus)
+void bcma_unregister_cores(struct bcma_bus *bus)
 {
 	struct bcma_device *core, *tmp;
 
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down
  2015-02-08 15:31 ` [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
                     ` (2 preceding siblings ...)
  2015-02-08 15:31   ` [PATCH V2 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
@ 2015-02-08 16:11   ` Rafał Miłecki
  2015-02-08 16:11     ` [PATCH V3 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
                       ` (3 more replies)
  3 siblings, 4 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 16:11 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Bringing PCIe hosted bus up requires operating on host-related core.
Since we plan to support PCIe Gen 2 devices we should provide a helper
picking the correct one (PCIE or PCIE2).

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/bcma_private.h                    |  2 ++
 drivers/bcma/driver_pci.c                      | 20 ++----------------
 drivers/bcma/host_pci.c                        | 28 ++++++++++++++++++++++++++
 drivers/net/wireless/b43/main.c                |  4 ++--
 drivers/net/wireless/brcm80211/brcmsmac/main.c |  8 ++++----
 include/linux/bcma/bcma.h                      |  3 +++
 include/linux/bcma/bcma_driver_pci.h           |  2 --
 7 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index ac6c5fc..351f4af 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -101,6 +101,8 @@ static inline void __exit bcma_host_soc_unregister_driver(void)
 
 /* driver_pci.c */
 u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
+void bcma_core_pci_up(struct bcma_drv_pci *pc);
+void bcma_core_pci_down(struct bcma_drv_pci *pc);
 
 extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
 
diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index 7866664..cf92bfa 100644
--- a/drivers/bcma/driver_pci.c
+++ b/drivers/bcma/driver_pci.c
@@ -328,28 +328,12 @@ static void bcma_core_pci_extend_L1timer(struct bcma_drv_pci *pc, bool extend)
 	bcma_pcie_read(pc, BCMA_CORE_PCI_DLLP_PMTHRESHREG);
 }
 
-void bcma_core_pci_up(struct bcma_bus *bus)
+void bcma_core_pci_up(struct bcma_drv_pci *pc)
 {
-	struct bcma_drv_pci *pc;
-
-	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
-		return;
-
-	pc = &bus->drv_pci[0];
-
 	bcma_core_pci_extend_L1timer(pc, true);
 }
-EXPORT_SYMBOL_GPL(bcma_core_pci_up);
 
-void bcma_core_pci_down(struct bcma_bus *bus)
+void bcma_core_pci_down(struct bcma_drv_pci *pc)
 {
-	struct bcma_drv_pci *pc;
-
-	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
-		return;
-
-	pc = &bus->drv_pci[0];
-
 	bcma_core_pci_extend_L1timer(pc, false);
 }
-EXPORT_SYMBOL_GPL(bcma_core_pci_down);
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 53c6a8a..8dd37dc 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -310,3 +310,31 @@ void __exit bcma_host_pci_exit(void)
 {
 	pci_unregister_driver(&bcma_pci_bridge_driver);
 }
+
+/**************************************************
+ * Runtime ops for drivers.
+ **************************************************/
+
+/* See also pcicore_up */
+void bcma_host_pci_up(struct bcma_bus *bus)
+{
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
+		return;
+
+	if (bus->host_is_pcie2)
+		pr_warn("Bringing up bus with PCIe Gen 2 host is unsupported yet\n");
+	else
+		bcma_core_pci_up(&bus->drv_pci[0]);
+}
+EXPORT_SYMBOL_GPL(bcma_host_pci_up);
+
+/* See also pcicore_down */
+void bcma_host_pci_down(struct bcma_bus *bus)
+{
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI)
+		return;
+
+	if (!bus->host_is_pcie2)
+		bcma_core_pci_down(&bus->drv_pci[0]);
+}
+EXPORT_SYMBOL_GPL(bcma_host_pci_down);
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 2c90886..e129b4c 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4819,7 +4819,7 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
 	switch (dev->dev->bus_type) {
 #ifdef CONFIG_B43_BCMA
 	case B43_BUS_BCMA:
-		bcma_core_pci_down(dev->dev->bdev->bus);
+		bcma_host_pci_down(dev->dev->bdev->bus);
 		break;
 #endif
 #ifdef CONFIG_B43_SSB
@@ -4868,7 +4868,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
 	case B43_BUS_BCMA:
 		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
 				      dev->dev->bdev, true);
-		bcma_core_pci_up(dev->dev->bdev->bus);
+		bcma_host_pci_up(dev->dev->bdev->bus);
 		break;
 #endif
 #ifdef CONFIG_B43_SSB
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index eb8584a..bcbfc6e 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4668,7 +4668,7 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
 	brcms_c_coredisable(wlc_hw);
 
 	/* Match driver "down" state */
-	bcma_core_pci_down(wlc_hw->d11core->bus);
+	bcma_host_pci_down(wlc_hw->d11core->bus);
 
 	/* turn off pll and xtal to match driver "down" state */
 	brcms_b_xtal(wlc_hw, OFF);
@@ -4969,12 +4969,12 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
 	 */
 	if (brcms_b_radio_read_hwdisabled(wlc_hw)) {
 		/* put SB PCI in down state again */
-		bcma_core_pci_down(wlc_hw->d11core->bus);
+		bcma_host_pci_down(wlc_hw->d11core->bus);
 		brcms_b_xtal(wlc_hw, OFF);
 		return -ENOMEDIUM;
 	}
 
-	bcma_core_pci_up(wlc_hw->d11core->bus);
+	bcma_host_pci_up(wlc_hw->d11core->bus);
 
 	/* reset the d11 core */
 	brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
@@ -5171,7 +5171,7 @@ static int brcms_b_down_finish(struct brcms_hardware *wlc_hw)
 
 		/* turn off primary xtal and pll */
 		if (!wlc_hw->noreset) {
-			bcma_core_pci_down(wlc_hw->d11core->bus);
+			bcma_host_pci_down(wlc_hw->d11core->bus);
 			brcms_b_xtal(wlc_hw, OFF);
 		}
 	}
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 994739d..037620b 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -434,6 +434,9 @@ static inline struct bcma_device *bcma_find_core(struct bcma_bus *bus,
 	return bcma_find_core_unit(bus, coreid, 0);
 }
 
+extern void bcma_host_pci_up(struct bcma_bus *bus);
+extern void bcma_host_pci_down(struct bcma_bus *bus);
+
 extern bool bcma_core_is_enabled(struct bcma_device *core);
 extern void bcma_core_disable(struct bcma_device *core, u32 flags);
 extern int bcma_core_enable(struct bcma_device *core, u32 flags);
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h
index 3f809ae..23af893 100644
--- a/include/linux/bcma/bcma_driver_pci.h
+++ b/include/linux/bcma/bcma_driver_pci.h
@@ -242,8 +242,6 @@ extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
 extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
 extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
 				 struct bcma_device *core, bool enable);
-extern void bcma_core_pci_up(struct bcma_bus *bus);
-extern void bcma_core_pci_down(struct bcma_bus *bus);
 extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 
 extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH V3 2/4] bcma: change IRQ control function to accept bus as an argument
  2015-02-08 16:11   ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
@ 2015-02-08 16:11     ` Rafał Miłecki
  2015-02-08 16:11     ` [PATCH V3 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
                       ` (2 subsequent siblings)
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 16:11 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

It doesn't operate on PCI core, but PCI host device, so there is no
point of passing core related struct.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/driver_pci.c                      | 6 +++---
 drivers/net/wireless/b43/main.c                | 2 +-
 drivers/net/wireless/brcm80211/brcmsmac/main.c | 2 +-
 include/linux/bcma/bcma_driver_pci.h           | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c
index cf92bfa..cfd35bc 100644
--- a/drivers/bcma/driver_pci.c
+++ b/drivers/bcma/driver_pci.c
@@ -282,21 +282,21 @@ void bcma_core_pci_power_save(struct bcma_bus *bus, bool up)
 }
 EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
 
-int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
+int bcma_core_pci_irq_ctl(struct bcma_bus *bus, struct bcma_device *core,
 			  bool enable)
 {
 	struct pci_dev *pdev;
 	u32 coremask, tmp;
 	int err = 0;
 
-	if (!pc || core->bus->hosttype != BCMA_HOSTTYPE_PCI) {
+	if (bus->hosttype != BCMA_HOSTTYPE_PCI) {
 		/* This bcma device is not on a PCI host-bus. So the IRQs are
 		 * not routed through the PCI core.
 		 * So we must not enable routing through the PCI core. */
 		goto out;
 	}
 
-	pdev = pc->core->bus->host_pci;
+	pdev = bus->host_pci;
 
 	err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
 	if (err)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index e129b4c..44794d2 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4866,7 +4866,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
 	switch (dev->dev->bus_type) {
 #ifdef CONFIG_B43_BCMA
 	case B43_BUS_BCMA:
-		bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
+		bcma_core_pci_irq_ctl(dev->dev->bdev->bus,
 				      dev->dev->bdev, true);
 		bcma_host_pci_up(dev->dev->bdev->bus);
 		break;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index bcbfc6e..c84af1d 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4959,7 +4959,7 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
 	 * Configure pci/pcmcia here instead of in brcms_c_attach()
 	 * to allow mfg hotswap:  down, hotswap (chip power cycle), up.
 	 */
-	bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core,
+	bcma_core_pci_irq_ctl(wlc_hw->d11core->bus, wlc_hw->d11core,
 			      true);
 
 	/*
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h
index 23af893..6b8bca6 100644
--- a/include/linux/bcma/bcma_driver_pci.h
+++ b/include/linux/bcma/bcma_driver_pci.h
@@ -240,7 +240,7 @@ struct bcma_drv_pci {
 
 extern void bcma_core_pci_early_init(struct bcma_drv_pci *pc);
 extern void bcma_core_pci_init(struct bcma_drv_pci *pc);
-extern int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc,
+extern int bcma_core_pci_irq_ctl(struct bcma_bus *bus,
 				 struct bcma_device *core, bool enable);
 extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
 
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH V3 3/4] bcma: support bringing up bus hosted on PCIe Gen 2
  2015-02-08 16:11   ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  2015-02-08 16:11     ` [PATCH V3 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
@ 2015-02-08 16:11     ` Rafał Miłecki
  2015-02-08 16:11     ` [PATCH V3 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
  2015-03-02 15:00     ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Kalle Valo
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 16:11 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
V2: Use pcie_set_readrq helper instead of pcie_capability_clear_and_set_word
V3: Fix pcie_set_readrq argument
    Print error if pcie_set_readrq fails
---
 drivers/bcma/bcma_private.h            |  3 +++
 drivers/bcma/driver_pcie2.c            | 28 ++++++++++++++++++++++++++--
 drivers/bcma/host_pci.c                |  2 +-
 include/linux/bcma/bcma_driver_pcie2.h |  2 ++
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index 351f4af..3692912 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -104,6 +104,9 @@ u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
 void bcma_core_pci_up(struct bcma_drv_pci *pc);
 void bcma_core_pci_down(struct bcma_drv_pci *pc);
 
+/* driver_pcie2.c */
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2);
+
 extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc);
 
 #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
diff --git a/drivers/bcma/driver_pcie2.c b/drivers/bcma/driver_pcie2.c
index e4be537..4568bc7 100644
--- a/drivers/bcma/driver_pcie2.c
+++ b/drivers/bcma/driver_pcie2.c
@@ -156,14 +156,23 @@ static void pciedev_reg_pm_clk_period(struct bcma_drv_pcie2 *pcie2)
 
 void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
 {
-	struct bcma_chipinfo *ci = &pcie2->core->bus->chipinfo;
+	struct bcma_bus *bus = pcie2->core->bus;
+	struct bcma_chipinfo *ci = &bus->chipinfo;
 	u32 tmp;
 
 	tmp = pcie2_read32(pcie2, BCMA_CORE_PCIE2_SPROM(54));
 	if ((tmp & 0xe) >> 1 == 2)
 		bcma_core_pcie2_cfg_write(pcie2, 0x4e0, 0x17);
 
-	/* TODO: Do we need pcie_reqsize? */
+	switch (bus->chipinfo.id) {
+	case BCMA_CHIP_ID_BCM4360:
+	case BCMA_CHIP_ID_BCM4352:
+		pcie2->reqsize = 1024;
+		break;
+	default:
+		pcie2->reqsize = 128;
+		break;
+	}
 
 	if (ci->id == BCMA_CHIP_ID_BCM4360 && ci->rev > 3)
 		bcma_core_pcie2_war_delay_perst_enab(pcie2, true);
@@ -173,3 +182,18 @@ void bcma_core_pcie2_init(struct bcma_drv_pcie2 *pcie2)
 	pciedev_crwlpciegen2_180(pcie2);
 	pciedev_crwlpciegen2_182(pcie2);
 }
+
+/**************************************************
+ * Runtime ops.
+ **************************************************/
+
+void bcma_core_pcie2_up(struct bcma_drv_pcie2 *pcie2)
+{
+	struct bcma_bus *bus = pcie2->core->bus;
+	struct pci_dev *dev = bus->host_pci;
+	int err;
+
+	err = pcie_set_readrq(dev, pcie2->reqsize);
+	if (err)
+		bcma_err(bus, "Error setting PCI_EXP_DEVCTL_READRQ: %d\n", err);
+}
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 8dd37dc..5fb87a8 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -322,7 +322,7 @@ void bcma_host_pci_up(struct bcma_bus *bus)
 		return;
 
 	if (bus->host_is_pcie2)
-		pr_warn("Bringing up bus with PCIe Gen 2 host is unsupported yet\n");
+		bcma_core_pcie2_up(&bus->drv_pcie2);
 	else
 		bcma_core_pci_up(&bus->drv_pci[0]);
 }
diff --git a/include/linux/bcma/bcma_driver_pcie2.h b/include/linux/bcma/bcma_driver_pcie2.h
index 5988b05..d8c4329 100644
--- a/include/linux/bcma/bcma_driver_pcie2.h
+++ b/include/linux/bcma/bcma_driver_pcie2.h
@@ -143,6 +143,8 @@
 
 struct bcma_drv_pcie2 {
 	struct bcma_device *core;
+
+	u16 reqsize;
 };
 
 #define pcie2_read16(pcie2, offset)		bcma_read16((pcie2)->core, offset)
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH V3 4/4] bcma: enable support for PCIe Gen 2 host devices
  2015-02-08 16:11   ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
  2015-02-08 16:11     ` [PATCH V3 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
  2015-02-08 16:11     ` [PATCH V3 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
@ 2015-02-08 16:11     ` Rafał Miłecki
  2015-03-02 15:00     ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Kalle Valo
  3 siblings, 0 replies; 17+ messages in thread
From: Rafał Miłecki @ 2015-02-08 16:11 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless
  Cc: Hauke Mehrtens, brcm80211-dev-list, Rafał Miłecki

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/bcma/bcma_private.h |  1 +
 drivers/bcma/host_pci.c     | 15 ++++++++++++++-
 drivers/bcma/main.c         |  2 +-
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index 3692912..29565e3 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -26,6 +26,7 @@ bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
 		     int timeout);
 void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core);
 void bcma_init_bus(struct bcma_bus *bus);
+void bcma_unregister_cores(struct bcma_bus *bus);
 int bcma_bus_register(struct bcma_bus *bus);
 void bcma_bus_unregister(struct bcma_bus *bus);
 int __init bcma_bus_early_register(struct bcma_bus *bus);
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 5fb87a8..a62a2f9 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -213,16 +213,26 @@ static int bcma_host_pci_probe(struct pci_dev *dev,
 	/* Initialize struct, detect chip */
 	bcma_init_bus(bus);
 
+	/* Scan bus to find out generation of PCIe core */
+	err = bcma_bus_scan(bus);
+	if (err)
+		goto err_pci_unmap_mmio;
+
+	if (bcma_find_core(bus, BCMA_CORE_PCIE2))
+		bus->host_is_pcie2 = true;
+
 	/* Register */
 	err = bcma_bus_register(bus);
 	if (err)
-		goto err_pci_unmap_mmio;
+		goto err_unregister_cores;
 
 	pci_set_drvdata(dev, bus);
 
 out:
 	return err;
 
+err_unregister_cores:
+	bcma_unregister_cores(bus);
 err_pci_unmap_mmio:
 	pci_iounmap(dev, bus->mmio);
 err_pci_release_regions:
@@ -283,9 +293,12 @@ static const struct pci_device_id bcma_pci_bridge_tbl[] = {
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) },
+	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43b1) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43227) },	/* 0xa8db, BCM43217 (sic!) */
 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43228) },	/* 0xa8dc */
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index 38bde6e..9635f10 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -363,7 +363,7 @@ static int bcma_register_devices(struct bcma_bus *bus)
 	return 0;
 }
 
-static void bcma_unregister_cores(struct bcma_bus *bus)
+void bcma_unregister_cores(struct bcma_bus *bus)
 {
 	struct bcma_device *core, *tmp;
 
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down
  2015-02-08 16:11   ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
                       ` (2 preceding siblings ...)
  2015-02-08 16:11     ` [PATCH V3 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
@ 2015-03-02 15:00     ` Kalle Valo
  3 siblings, 0 replies; 17+ messages in thread
From: Kalle Valo @ 2015-03-02 15:00 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: linux-wireless, Hauke Mehrtens, brcm80211-dev-list

Rafał Miłecki <zajec5@gmail.com> writes:

> Bringing PCIe hosted bus up requires operating on host-related core.
> Since we plan to support PCIe Gen 2 devices we should provide a helper
> picking the correct one (PCIE or PCIE2).
>
> Signed-off-by: Rafał Miłecki <zajec5@gmail.com>

Thanks, all four patches applied.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2015-03-02 15:00 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-30 17:22 [PATCH 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
2015-01-30 17:22 ` [PATCH 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
2015-01-30 17:22 ` [PATCH 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
2015-01-30 19:59   ` Hauke Mehrtens
2015-01-30 23:08     ` Rafał Miłecki
2015-02-06  6:56       ` Kalle Valo
2015-02-08 14:12         ` Hauke Mehrtens
2015-01-30 17:22 ` [PATCH 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
2015-02-08 15:31 ` [PATCH V2 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
2015-02-08 15:31   ` [PATCH V2 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
2015-02-08 15:31   ` [PATCH V2 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
2015-02-08 15:31   ` [PATCH V2 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
2015-02-08 16:11   ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Rafał Miłecki
2015-02-08 16:11     ` [PATCH V3 2/4] bcma: change IRQ control function to accept bus as an argument Rafał Miłecki
2015-02-08 16:11     ` [PATCH V3 3/4] bcma: support bringing up bus hosted on PCIe Gen 2 Rafał Miłecki
2015-02-08 16:11     ` [PATCH V3 4/4] bcma: enable support for PCIe Gen 2 host devices Rafał Miłecki
2015-03-02 15:00     ` [PATCH V3 1/4] bcma: add helpers bringing PCIe hosted bus up / down Kalle Valo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.