linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Extend BGMAC driver for Stingray SoC
@ 2017-07-13 19:04 Abhishek Shah
  2017-07-13 19:04 ` [PATCH 1/3] net: ethernet: bgmac: Remove unnecessary 'return' from platform_bgmac_idm_write Abhishek Shah
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Abhishek Shah @ 2017-07-13 19:04 UTC (permalink / raw)
  To: Rafał Miłecki, Florian Fainelli, David S . Miller,
	Jon Mason, Rob Herring, Mark Rutland
  Cc: netdev, linux-kernel, linux-arm-kernel, devicetree,
	bcm-kernel-feedback-list, Abhishek Shah

The patchset extends Broadcom BGMAC driver for Broadcom Stingray SoC.

This patchset is based on Linux-4.12 and tested on NS2 and Stingray.

Abhishek Shah (3):
  net: ethernet: bgmac: Remove unnecessary 'return' from
    platform_bgmac_idm_write
  net: ethernet: bgmac: Make IDM register space optional in BGMAC driver
  Documentation: devicetree: net: optional idm regs for bgmac

 .../devicetree/bindings/net/brcm,amac.txt          |  1 +
 drivers/net/ethernet/broadcom/bgmac-platform.c     | 21 ++++---
 drivers/net/ethernet/broadcom/bgmac.c              | 70 +++++++++++++---------
 drivers/net/ethernet/broadcom/bgmac.h              |  1 +
 4 files changed, 57 insertions(+), 36 deletions(-)

-- 
2.7.4

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

* [PATCH 1/3] net: ethernet: bgmac: Remove unnecessary 'return' from platform_bgmac_idm_write
  2017-07-13 19:04 [PATCH 0/3] Extend BGMAC driver for Stingray SoC Abhishek Shah
@ 2017-07-13 19:04 ` Abhishek Shah
  2017-07-13 19:04 ` [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional Abhishek Shah
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Abhishek Shah @ 2017-07-13 19:04 UTC (permalink / raw)
  To: Rafał Miłecki, Florian Fainelli, David S . Miller,
	Jon Mason, Rob Herring, Mark Rutland
  Cc: netdev, linux-kernel, linux-arm-kernel, devicetree,
	bcm-kernel-feedback-list, Abhishek Shah

Return type for idm register write callback should be void as 'writel'
API is used for write operation. However, there no need to have 'return'
in this function.

Signed-off-by: Abhishek Shah <abhishek.shah@broadcom.com>
Reviewed-by: Oza Oza <oza.oza@broadcom.com>
Reviewed-by: Ray Jui <ray.jui@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
---
 drivers/net/ethernet/broadcom/bgmac-platform.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/broadcom/bgmac-platform.c b/drivers/net/ethernet/broadcom/bgmac-platform.c
index 73aca97..1ca75de 100644
--- a/drivers/net/ethernet/broadcom/bgmac-platform.c
+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
@@ -50,7 +50,7 @@ static u32 platform_bgmac_idm_read(struct bgmac *bgmac, u16 offset)
 
 static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
 {
-	return writel(value, bgmac->plat.idm_base + offset);
+	writel(value, bgmac->plat.idm_base + offset);
 }
 
 static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
-- 
2.7.4

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

* [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional
  2017-07-13 19:04 [PATCH 0/3] Extend BGMAC driver for Stingray SoC Abhishek Shah
  2017-07-13 19:04 ` [PATCH 1/3] net: ethernet: bgmac: Remove unnecessary 'return' from platform_bgmac_idm_write Abhishek Shah
@ 2017-07-13 19:04 ` Abhishek Shah
  2017-07-17 15:04   ` Jon Mason
  2017-07-13 19:04 ` [PATCH 3/3] Documentation: devicetree: net: optional idm regs for bgmac Abhishek Shah
  2017-07-15 21:30 ` [PATCH 0/3] Extend BGMAC driver for Stingray SoC David Miller
  3 siblings, 1 reply; 8+ messages in thread
From: Abhishek Shah @ 2017-07-13 19:04 UTC (permalink / raw)
  To: Rafał Miłecki, Florian Fainelli, David S . Miller,
	Jon Mason, Rob Herring, Mark Rutland
  Cc: netdev, linux-kernel, linux-arm-kernel, devicetree,
	bcm-kernel-feedback-list, Abhishek Shah

IDM operations are usually one time ops and should be done in
firmware itself. Driver is not supposed to touch IDM registers.

However, for some SoCs', driver is performing IDM read/writes.
So this patch masks IDM operations in case firmware is taking
care of IDM operations.

Signed-off-by: Abhishek Shah <abhishek.shah@broadcom.com>
Reviewed-by: Oza Oza <oza.oza@broadcom.com>
Reviewed-by: Ray Jui <ray.jui@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
---
 drivers/net/ethernet/broadcom/bgmac-platform.c | 19 ++++---
 drivers/net/ethernet/broadcom/bgmac.c          | 70 +++++++++++++++-----------
 drivers/net/ethernet/broadcom/bgmac.h          |  1 +
 3 files changed, 55 insertions(+), 35 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bgmac-platform.c b/drivers/net/ethernet/broadcom/bgmac-platform.c
index 1ca75de..d937083d 100644
--- a/drivers/net/ethernet/broadcom/bgmac-platform.c
+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
@@ -55,6 +55,9 @@ static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
 
 static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
 {
+	if (!bgmac->plat.idm_base)
+		return true;
+
 	if ((bgmac_idm_read(bgmac, BCMA_IOCTL) & BGMAC_CLK_EN) != BGMAC_CLK_EN)
 		return false;
 	if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
@@ -66,6 +69,9 @@ static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
 {
 	u32 val;
 
+	if (!bgmac->plat.idm_base)
+		return;
+
 	/* The Reset Control register only contains a single bit to show if the
 	 * controller is currently in reset.  Do a sanity check here, just in
 	 * case the bootloader happened to leave the device in reset.
@@ -180,6 +186,7 @@ static int bgmac_probe(struct platform_device *pdev)
 	bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
 	bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
 	bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
+	bgmac->feature_flags |= BGMAC_FEAT_IDM_MASK;
 
 	bgmac->dev = &pdev->dev;
 	bgmac->dma_dev = &pdev->dev;
@@ -207,15 +214,13 @@ static int bgmac_probe(struct platform_device *pdev)
 		return PTR_ERR(bgmac->plat.base);
 
 	regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "idm_base");
-	if (!regs) {
-		dev_err(&pdev->dev, "Unable to obtain idm resource\n");
-		return -EINVAL;
+	if (regs) {
+		bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
+		if (IS_ERR(bgmac->plat.idm_base))
+			return PTR_ERR(bgmac->plat.idm_base);
+		bgmac->feature_flags &= ~BGMAC_FEAT_IDM_MASK;
 	}
 
-	bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
-	if (IS_ERR(bgmac->plat.idm_base))
-		return PTR_ERR(bgmac->plat.idm_base);
-
 	regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nicpm_base");
 	if (regs) {
 		bgmac->plat.nicpm_base = devm_ioremap_resource(&pdev->dev,
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
index ba4d2e1..48d672b 100644
--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -622,9 +622,11 @@ static int bgmac_dma_alloc(struct bgmac *bgmac)
 	BUILD_BUG_ON(BGMAC_MAX_TX_RINGS > ARRAY_SIZE(ring_base));
 	BUILD_BUG_ON(BGMAC_MAX_RX_RINGS > ARRAY_SIZE(ring_base));
 
-	if (!(bgmac_idm_read(bgmac, BCMA_IOST) & BCMA_IOST_DMA64)) {
-		dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
-		return -ENOTSUPP;
+	if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) {
+		if (!(bgmac_idm_read(bgmac, BCMA_IOST) & BCMA_IOST_DMA64)) {
+			dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
+			return -ENOTSUPP;
+		}
 	}
 
 	for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
@@ -855,9 +857,11 @@ static void bgmac_mac_speed(struct bgmac *bgmac)
 static void bgmac_miiconfig(struct bgmac *bgmac)
 {
 	if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
-		bgmac_idm_write(bgmac, BCMA_IOCTL,
-				bgmac_idm_read(bgmac, BCMA_IOCTL) | 0x40 |
-				BGMAC_BCMA_IOCTL_SW_CLKEN);
+		if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) {
+			bgmac_idm_write(bgmac, BCMA_IOCTL,
+					bgmac_idm_read(bgmac, BCMA_IOCTL) |
+					0x40 | BGMAC_BCMA_IOCTL_SW_CLKEN);
+		}
 		bgmac->mac_speed = SPEED_2500;
 		bgmac->mac_duplex = DUPLEX_FULL;
 		bgmac_mac_speed(bgmac);
@@ -874,11 +878,36 @@ static void bgmac_miiconfig(struct bgmac *bgmac)
 	}
 }
 
+static void bgmac_chip_reset_idm_config(struct bgmac *bgmac)
+{
+	u32 iost;
+
+	iost = bgmac_idm_read(bgmac, BCMA_IOST);
+	if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
+		iost &= ~BGMAC_BCMA_IOST_ATTACHED;
+
+	/* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
+	if (!(bgmac->feature_flags & BGMAC_FEAT_NO_RESET)) {
+		u32 flags = 0;
+
+		if (iost & BGMAC_BCMA_IOST_ATTACHED) {
+			flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
+			if (!bgmac->has_robosw)
+				flags |= BGMAC_BCMA_IOCTL_SW_RESET;
+		}
+		bgmac_clk_enable(bgmac, flags);
+	}
+
+	if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
+		bgmac_idm_write(bgmac, BCMA_IOCTL,
+				bgmac_idm_read(bgmac, BCMA_IOCTL) &
+				~BGMAC_BCMA_IOCTL_SW_RESET);
+}
+
 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipreset */
 static void bgmac_chip_reset(struct bgmac *bgmac)
 {
 	u32 cmdcfg_sr;
-	u32 iost;
 	int i;
 
 	if (bgmac_clk_enabled(bgmac)) {
@@ -899,20 +928,8 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
 		/* TODO: Clear software multicast filter list */
 	}
 
-	iost = bgmac_idm_read(bgmac, BCMA_IOST);
-	if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
-		iost &= ~BGMAC_BCMA_IOST_ATTACHED;
-
-	/* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
-	if (!(bgmac->feature_flags & BGMAC_FEAT_NO_RESET)) {
-		u32 flags = 0;
-		if (iost & BGMAC_BCMA_IOST_ATTACHED) {
-			flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
-			if (!bgmac->has_robosw)
-				flags |= BGMAC_BCMA_IOCTL_SW_RESET;
-		}
-		bgmac_clk_enable(bgmac, flags);
-	}
+	if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK))
+		bgmac_chip_reset_idm_config(bgmac);
 
 	/* Request Misc PLL for corerev > 2 */
 	if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
@@ -970,11 +987,6 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
 				      BGMAC_CHIPCTL_7_IF_TYPE_RGMII);
 	}
 
-	if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
-		bgmac_idm_write(bgmac, BCMA_IOCTL,
-				bgmac_idm_read(bgmac, BCMA_IOCTL) &
-				~BGMAC_BCMA_IOCTL_SW_RESET);
-
 	/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_reset
 	 * Specs don't say about using BGMAC_CMDCFG_SR, but in this routine
 	 * BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
@@ -1497,8 +1509,10 @@ int bgmac_enet_probe(struct bgmac *bgmac)
 	bgmac_clk_enable(bgmac, 0);
 
 	/* This seems to be fixing IRQ by assigning OOB #6 to the core */
-	if (bgmac->feature_flags & BGMAC_FEAT_IRQ_ID_OOB_6)
-		bgmac_idm_write(bgmac, BCMA_OOB_SEL_OUT_A30, 0x86);
+	if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) {
+		if (bgmac->feature_flags & BGMAC_FEAT_IRQ_ID_OOB_6)
+			bgmac_idm_write(bgmac, BCMA_OOB_SEL_OUT_A30, 0x86);
+	}
 
 	bgmac_chip_reset(bgmac);
 
diff --git a/drivers/net/ethernet/broadcom/bgmac.h b/drivers/net/ethernet/broadcom/bgmac.h
index c181876..443d57b 100644
--- a/drivers/net/ethernet/broadcom/bgmac.h
+++ b/drivers/net/ethernet/broadcom/bgmac.h
@@ -425,6 +425,7 @@
 #define BGMAC_FEAT_CC4_IF_SW_TYPE	BIT(17)
 #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII	BIT(18)
 #define BGMAC_FEAT_CC7_IF_TYPE_RGMII	BIT(19)
+#define BGMAC_FEAT_IDM_MASK		BIT(20)
 
 struct bgmac_slot_info {
 	union {
-- 
2.7.4

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

* [PATCH 3/3] Documentation: devicetree: net: optional idm regs for bgmac
  2017-07-13 19:04 [PATCH 0/3] Extend BGMAC driver for Stingray SoC Abhishek Shah
  2017-07-13 19:04 ` [PATCH 1/3] net: ethernet: bgmac: Remove unnecessary 'return' from platform_bgmac_idm_write Abhishek Shah
  2017-07-13 19:04 ` [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional Abhishek Shah
@ 2017-07-13 19:04 ` Abhishek Shah
  2017-07-15 21:30 ` [PATCH 0/3] Extend BGMAC driver for Stingray SoC David Miller
  3 siblings, 0 replies; 8+ messages in thread
From: Abhishek Shah @ 2017-07-13 19:04 UTC (permalink / raw)
  To: Rafał Miłecki, Florian Fainelli, David S . Miller,
	Jon Mason, Rob Herring, Mark Rutland
  Cc: netdev, linux-kernel, linux-arm-kernel, devicetree,
	bcm-kernel-feedback-list, Abhishek Shah

Specifying IDM register space in DT is not mendatory for SoCs
where firmware takes care of IDM operations. This patch updates
BGMAC driver's DT binding documentation indicating the same.

Signed-off-by: Abhishek Shah <abhishek.shah@broadcom.com>
Reviewed-by: Ray Jui <ray.jui@broadcom.com>
Reviewed-by: Oza Oza <oza.oza@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
---
 Documentation/devicetree/bindings/net/brcm,amac.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/net/brcm,amac.txt b/Documentation/devicetree/bindings/net/brcm,amac.txt
index 2fefa1a..ad16c1f 100644
--- a/Documentation/devicetree/bindings/net/brcm,amac.txt
+++ b/Documentation/devicetree/bindings/net/brcm,amac.txt
@@ -11,6 +11,7 @@ Required properties:
  - reg-names:	Names of the registers.
 		"amac_base":	Address and length of the GMAC registers
 		"idm_base":	Address and length of the GMAC IDM registers
+				(required for NSP and Northstar2)
 		"nicpm_base":	Address and length of the NIC Port Manager
 				registers (required for Northstar2)
  - interrupts:	Interrupt number
-- 
2.7.4

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

* Re: [PATCH 0/3] Extend BGMAC driver for Stingray SoC
  2017-07-13 19:04 [PATCH 0/3] Extend BGMAC driver for Stingray SoC Abhishek Shah
                   ` (2 preceding siblings ...)
  2017-07-13 19:04 ` [PATCH 3/3] Documentation: devicetree: net: optional idm regs for bgmac Abhishek Shah
@ 2017-07-15 21:30 ` David Miller
  3 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2017-07-15 21:30 UTC (permalink / raw)
  To: abhishek.shah
  Cc: rafal, f.fainelli, jon.mason, robh+dt, mark.rutland, netdev,
	linux-kernel, linux-arm-kernel, devicetree,
	bcm-kernel-feedback-list

From: Abhishek Shah <abhishek.shah@broadcom.com>
Date: Fri, 14 Jul 2017 00:34:06 +0530

> The patchset extends Broadcom BGMAC driver for Broadcom Stingray SoC.
> 
> This patchset is based on Linux-4.12 and tested on NS2 and Stingray.

Series applied.

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

* Re: [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional
  2017-07-13 19:04 ` [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional Abhishek Shah
@ 2017-07-17 15:04   ` Jon Mason
  2017-07-17 18:37     ` Abhishek Shah
  0 siblings, 1 reply; 8+ messages in thread
From: Jon Mason @ 2017-07-17 15:04 UTC (permalink / raw)
  To: Abhishek Shah
  Cc: Rafał Miłecki, Florian Fainelli, David S . Miller,
	Rob Herring, Mark Rutland, Network Development, open list,
	linux-arm-kernel,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	BCM Kernel Feedback

On Thu, Jul 13, 2017 at 3:04 PM, Abhishek Shah
<abhishek.shah@broadcom.com> wrote:
> IDM operations are usually one time ops and should be done in
> firmware itself. Driver is not supposed to touch IDM registers.
>
> However, for some SoCs', driver is performing IDM read/writes.
> So this patch masks IDM operations in case firmware is taking
> care of IDM operations.
>
> Signed-off-by: Abhishek Shah <abhishek.shah@broadcom.com>
> Reviewed-by: Oza Oza <oza.oza@broadcom.com>
> Reviewed-by: Ray Jui <ray.jui@broadcom.com>
> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> ---
>  drivers/net/ethernet/broadcom/bgmac-platform.c | 19 ++++---
>  drivers/net/ethernet/broadcom/bgmac.c          | 70 +++++++++++++++-----------
>  drivers/net/ethernet/broadcom/bgmac.h          |  1 +
>  3 files changed, 55 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/bgmac-platform.c b/drivers/net/ethernet/broadcom/bgmac-platform.c
> index 1ca75de..d937083d 100644
> --- a/drivers/net/ethernet/broadcom/bgmac-platform.c
> +++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
> @@ -55,6 +55,9 @@ static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
>
>  static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
>  {
> +       if (!bgmac->plat.idm_base)
> +               return true;
> +
>         if ((bgmac_idm_read(bgmac, BCMA_IOCTL) & BGMAC_CLK_EN) != BGMAC_CLK_EN)
>                 return false;
>         if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
> @@ -66,6 +69,9 @@ static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
>  {
>         u32 val;
>
> +       if (!bgmac->plat.idm_base)
> +               return;
> +
>         /* The Reset Control register only contains a single bit to show if the
>          * controller is currently in reset.  Do a sanity check here, just in
>          * case the bootloader happened to leave the device in reset.
> @@ -180,6 +186,7 @@ static int bgmac_probe(struct platform_device *pdev)
>         bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
>         bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
>         bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
> +       bgmac->feature_flags |= BGMAC_FEAT_IDM_MASK;
>
>         bgmac->dev = &pdev->dev;
>         bgmac->dma_dev = &pdev->dev;
> @@ -207,15 +214,13 @@ static int bgmac_probe(struct platform_device *pdev)
>                 return PTR_ERR(bgmac->plat.base);
>
>         regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "idm_base");
> -       if (!regs) {
> -               dev_err(&pdev->dev, "Unable to obtain idm resource\n");
> -               return -EINVAL;
> +       if (regs) {
> +               bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
> +               if (IS_ERR(bgmac->plat.idm_base))
> +                       return PTR_ERR(bgmac->plat.idm_base);
> +               bgmac->feature_flags &= ~BGMAC_FEAT_IDM_MASK;
>         }
>
> -       bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
> -       if (IS_ERR(bgmac->plat.idm_base))
> -               return PTR_ERR(bgmac->plat.idm_base);
> -
>         regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nicpm_base");
>         if (regs) {
>                 bgmac->plat.nicpm_base = devm_ioremap_resource(&pdev->dev,
> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
> index ba4d2e1..48d672b 100644
> --- a/drivers/net/ethernet/broadcom/bgmac.c
> +++ b/drivers/net/ethernet/broadcom/bgmac.c
> @@ -622,9 +622,11 @@ static int bgmac_dma_alloc(struct bgmac *bgmac)
>         BUILD_BUG_ON(BGMAC_MAX_TX_RINGS > ARRAY_SIZE(ring_base));
>         BUILD_BUG_ON(BGMAC_MAX_RX_RINGS > ARRAY_SIZE(ring_base));
>
> -       if (!(bgmac_idm_read(bgmac, BCMA_IOST) & BCMA_IOST_DMA64)) {
> -               dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
> -               return -ENOTSUPP;
> +       if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) {
> +               if (!(bgmac_idm_read(bgmac, BCMA_IOST) & BCMA_IOST_DMA64)) {
> +                       dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
> +                       return -ENOTSUPP;
> +               }
>         }
>
>         for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
> @@ -855,9 +857,11 @@ static void bgmac_mac_speed(struct bgmac *bgmac)
>  static void bgmac_miiconfig(struct bgmac *bgmac)
>  {
>         if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
> -               bgmac_idm_write(bgmac, BCMA_IOCTL,
> -                               bgmac_idm_read(bgmac, BCMA_IOCTL) | 0x40 |
> -                               BGMAC_BCMA_IOCTL_SW_CLKEN);
> +               if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) {
> +                       bgmac_idm_write(bgmac, BCMA_IOCTL,
> +                                       bgmac_idm_read(bgmac, BCMA_IOCTL) |
> +                                       0x40 | BGMAC_BCMA_IOCTL_SW_CLKEN);
> +               }
>                 bgmac->mac_speed = SPEED_2500;
>                 bgmac->mac_duplex = DUPLEX_FULL;
>                 bgmac_mac_speed(bgmac);
> @@ -874,11 +878,36 @@ static void bgmac_miiconfig(struct bgmac *bgmac)
>         }
>  }
>
> +static void bgmac_chip_reset_idm_config(struct bgmac *bgmac)
> +{
> +       u32 iost;
> +
> +       iost = bgmac_idm_read(bgmac, BCMA_IOST);
> +       if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
> +               iost &= ~BGMAC_BCMA_IOST_ATTACHED;
> +
> +       /* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
> +       if (!(bgmac->feature_flags & BGMAC_FEAT_NO_RESET)) {
> +               u32 flags = 0;
> +
> +               if (iost & BGMAC_BCMA_IOST_ATTACHED) {
> +                       flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
> +                       if (!bgmac->has_robosw)
> +                               flags |= BGMAC_BCMA_IOCTL_SW_RESET;
> +               }
> +               bgmac_clk_enable(bgmac, flags);
> +       }
> +
> +       if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
> +               bgmac_idm_write(bgmac, BCMA_IOCTL,
> +                               bgmac_idm_read(bgmac, BCMA_IOCTL) &
> +                               ~BGMAC_BCMA_IOCTL_SW_RESET);
> +}
> +
>  /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipreset */
>  static void bgmac_chip_reset(struct bgmac *bgmac)
>  {
>         u32 cmdcfg_sr;
> -       u32 iost;
>         int i;
>
>         if (bgmac_clk_enabled(bgmac)) {
> @@ -899,20 +928,8 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
>                 /* TODO: Clear software multicast filter list */
>         }
>
> -       iost = bgmac_idm_read(bgmac, BCMA_IOST);
> -       if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
> -               iost &= ~BGMAC_BCMA_IOST_ATTACHED;
> -
> -       /* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
> -       if (!(bgmac->feature_flags & BGMAC_FEAT_NO_RESET)) {
> -               u32 flags = 0;
> -               if (iost & BGMAC_BCMA_IOST_ATTACHED) {
> -                       flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
> -                       if (!bgmac->has_robosw)
> -                               flags |= BGMAC_BCMA_IOCTL_SW_RESET;
> -               }
> -               bgmac_clk_enable(bgmac, flags);
> -       }
> +       if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK))
> +               bgmac_chip_reset_idm_config(bgmac);
>
>         /* Request Misc PLL for corerev > 2 */
>         if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
> @@ -970,11 +987,6 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
>                                       BGMAC_CHIPCTL_7_IF_TYPE_RGMII);
>         }
>
> -       if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
> -               bgmac_idm_write(bgmac, BCMA_IOCTL,
> -                               bgmac_idm_read(bgmac, BCMA_IOCTL) &
> -                               ~BGMAC_BCMA_IOCTL_SW_RESET);
> -
>         /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_reset
>          * Specs don't say about using BGMAC_CMDCFG_SR, but in this routine
>          * BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
> @@ -1497,8 +1509,10 @@ int bgmac_enet_probe(struct bgmac *bgmac)
>         bgmac_clk_enable(bgmac, 0);
>
>         /* This seems to be fixing IRQ by assigning OOB #6 to the core */
> -       if (bgmac->feature_flags & BGMAC_FEAT_IRQ_ID_OOB_6)
> -               bgmac_idm_write(bgmac, BCMA_OOB_SEL_OUT_A30, 0x86);
> +       if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) {
> +               if (bgmac->feature_flags & BGMAC_FEAT_IRQ_ID_OOB_6)
> +                       bgmac_idm_write(bgmac, BCMA_OOB_SEL_OUT_A30, 0x86);
> +       }
>
>         bgmac_chip_reset(bgmac);
>
> diff --git a/drivers/net/ethernet/broadcom/bgmac.h b/drivers/net/ethernet/broadcom/bgmac.h
> index c181876..443d57b 100644
> --- a/drivers/net/ethernet/broadcom/bgmac.h
> +++ b/drivers/net/ethernet/broadcom/bgmac.h
> @@ -425,6 +425,7 @@
>  #define BGMAC_FEAT_CC4_IF_SW_TYPE      BIT(17)
>  #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII        BIT(18)
>  #define BGMAC_FEAT_CC7_IF_TYPE_RGMII   BIT(19)
> +#define BGMAC_FEAT_IDM_MASK            BIT(20)

This also will need to be added to
drivers/net/ethernet/broadcom/bgmac-bcma.c.  Otherwise, the driver
will no longer work for those platforms.  Since this was already
accepted, please push out a fix ASAP.

Thanks,
Jon

>
>  struct bgmac_slot_info {
>         union {
> --
> 2.7.4
>

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

* Re: [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional
  2017-07-17 15:04   ` Jon Mason
@ 2017-07-17 18:37     ` Abhishek Shah
  2017-07-17 19:05       ` Jon Mason
  0 siblings, 1 reply; 8+ messages in thread
From: Abhishek Shah @ 2017-07-17 18:37 UTC (permalink / raw)
  To: Jon Mason
  Cc: Rafał Miłecki, Florian Fainelli, David S . Miller,
	Rob Herring, Mark Rutland, Network Development, open list,
	linux-arm-kernel,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	BCM Kernel Feedback

Hi Jon,

> This also will need to be added to
> drivers/net/ethernet/broadcom/bgmac-bcma.c.  Otherwise, the driver
> will no longer work for those platforms.  Since this was already
> accepted, please push out a fix ASAP.
>
I do not see how the bcma driver [bgmac-bcma.c] will no longer work.
The whole idea behind introducing this  BGMAC_FEAT_IDM_MASK bit
was to keep bcma driver's functionality intact.

The BGMAC_FEAT_IDM_MASK bit is explicitly set by the bgmac-platform driver
and is unset inside the same if the idm register base is provided.

For BCMA driver case, I do not touch BGMAC_FEAT_IDM_MASK bit, i.e. it
is *not* set.
And if it is not set, each idm operation done in bgmac.c will take place.
Please explain if I am missing something here.


Regards,
Abhishek

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

* Re: [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional
  2017-07-17 18:37     ` Abhishek Shah
@ 2017-07-17 19:05       ` Jon Mason
  0 siblings, 0 replies; 8+ messages in thread
From: Jon Mason @ 2017-07-17 19:05 UTC (permalink / raw)
  To: Abhishek Shah
  Cc: Rafał Miłecki, Florian Fainelli, David S . Miller,
	Rob Herring, Mark Rutland, Network Development, open list,
	linux-arm-kernel,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	BCM Kernel Feedback

On Mon, Jul 17, 2017 at 2:37 PM, Abhishek Shah
<abhishek.shah@broadcom.com> wrote:
> Hi Jon,
>
>> This also will need to be added to
>> drivers/net/ethernet/broadcom/bgmac-bcma.c.  Otherwise, the driver
>> will no longer work for those platforms.  Since this was already
>> accepted, please push out a fix ASAP.
>>
> I do not see how the bcma driver [bgmac-bcma.c] will no longer work.
> The whole idea behind introducing this  BGMAC_FEAT_IDM_MASK bit
> was to keep bcma driver's functionality intact.
>
> The BGMAC_FEAT_IDM_MASK bit is explicitly set by the bgmac-platform driver
> and is unset inside the same if the idm register base is provided.
>
> For BCMA driver case, I do not touch BGMAC_FEAT_IDM_MASK bit, i.e. it
> is *not* set.
> And if it is not set, each idm operation done in bgmac.c will take place.
> Please explain if I am missing something here.

Sorry, I had it flipped in my mind.  Please disregard.

>
>
> Regards,
> Abhishek

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

end of thread, other threads:[~2017-07-17 19:05 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-13 19:04 [PATCH 0/3] Extend BGMAC driver for Stingray SoC Abhishek Shah
2017-07-13 19:04 ` [PATCH 1/3] net: ethernet: bgmac: Remove unnecessary 'return' from platform_bgmac_idm_write Abhishek Shah
2017-07-13 19:04 ` [PATCH 2/3] net: ethernet: bgmac: Make IDM register space optional Abhishek Shah
2017-07-17 15:04   ` Jon Mason
2017-07-17 18:37     ` Abhishek Shah
2017-07-17 19:05       ` Jon Mason
2017-07-13 19:04 ` [PATCH 3/3] Documentation: devicetree: net: optional idm regs for bgmac Abhishek Shah
2017-07-15 21:30 ` [PATCH 0/3] Extend BGMAC driver for Stingray SoC David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).