[source] kernel: bgmac: add support for BCM53573

LEDE Commits lede-commits at lists.infradead.org
Wed Aug 17 22:28:53 PDT 2016


rmilecki pushed a commit to source.git, branch master:
https://git.lede-project.org/?p=source.git;a=commitdiff;h=27f47f6ad493636229c7117e1239f8aea36e5133

commit 27f47f6ad493636229c7117e1239f8aea36e5133
Author: Rafał Miłecki <rafal at milecki.pl>
AuthorDate: Thu Aug 18 06:59:09 2016 +0200

    kernel: bgmac: add support for BCM53573
    
    Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 ...ac-support-Ethernet-core-on-BCM53573-SoCs.patch | 160 +++++++++++++++++++++
 .../patches-4.4/773-bgmac-add-srab-switch.patch    |  22 +--
 2 files changed, 171 insertions(+), 11 deletions(-)

diff --git a/target/linux/generic/patches-4.4/171-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch b/target/linux/generic/patches-4.4/171-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch
new file mode 100644
index 0000000..51e7623
--- /dev/null
+++ b/target/linux/generic/patches-4.4/171-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch
@@ -0,0 +1,160 @@
+From 7d9acff816e15f7d8a51f912bc663373f1d31e7b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
+Date: Wed, 17 Aug 2016 22:47:22 +0200
+Subject: [PATCH net-next] net: bgmac: support Ethernet core on BCM53573 SoCs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BCM53573 is a new series of Broadcom's SoCs. It's based on ARM and can
+be found in two packages (versions): BCM53573 and BCM47189. It shares
+some code with the Northstar family, but also requires some new quirks.
+
+First of all there can be up to 2 Ethernet cores on this SoC. If that is
+the case, they are connected to two different switch ports allowing some
+more complex/optimized setups. It seems the second unit doesn't come
+fully configured and requires some IRQ quirk.
+
+Other than that only the first core is connected to the PHY. For the
+second one we have to register fixed PHY (similarly to the Northstar),
+otherwise generic PHY driver would get some invalid info.
+
+This has been successfully tested on Tenda AC9 (BCM47189B0).
+
+Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+---
+ drivers/net/ethernet/broadcom/bgmac-bcma.c | 19 ++++++++++++++++++-
+ drivers/net/ethernet/broadcom/bgmac.c      | 25 +++++++++++++++++++++++++
+ drivers/net/ethernet/broadcom/bgmac.h      | 19 +++++++++++++++++++
+ include/linux/bcma/bcma.h                  |  3 +++
+ include/linux/bcma/bcma_regs.h             |  1 +
+ 5 files changed, 66 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
++++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
+@@ -92,6 +92,7 @@ MODULE_DEVICE_TABLE(bcma, bgmac_bcma_tbl
+ /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipattach */
+ static int bgmac_probe(struct bcma_device *core)
+ {
++	struct bcma_chipinfo *ci = &core->bus->chipinfo;
+ 	struct ssb_sprom *sprom = &core->bus->sprom;
+ 	struct mii_bus *mii_bus;
+ 	struct bgmac *bgmac;
+@@ -157,7 +158,8 @@ static int bgmac_probe(struct bcma_devic
+ 	dev_info(bgmac->dev, "Found PHY addr: %d%s\n", bgmac->phyaddr,
+ 		 bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
+ 
+-	if (!bgmac_is_bcm4707_family(core)) {
++	if (!bgmac_is_bcm4707_family(core) &&
++	    !(ci->id == BCMA_CHIP_ID_BCM53573 && core->core_unit == 1)) {
+ 		mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
+ 		if (IS_ERR(mii_bus)) {
+ 			err = PTR_ERR(mii_bus);
+@@ -230,6 +232,21 @@ static int bgmac_probe(struct bcma_devic
+ 		bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
+ 		bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
+ 		break;
++	case BCMA_CHIP_ID_BCM53573:
++		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++		bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++		if (ci->pkg == BCMA_PKG_ID_BCM47189)
++			bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
++		if (core->core_unit == 0) {
++			bgmac->feature_flags |= BGMAC_FEAT_CC4_IF_SW_TYPE;
++			if (ci->pkg == BCMA_PKG_ID_BCM47189)
++				bgmac->feature_flags |=
++					BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII;
++		} else if (core->core_unit == 1) {
++			bgmac->feature_flags |= BGMAC_FEAT_IRQ_ID_OOB_6;
++			bgmac->feature_flags |= BGMAC_FEAT_CC7_IF_TYPE_RGMII;
++		}
++		break;
+ 	default:
+ 		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+ 		bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -940,6 +940,27 @@ static void bgmac_chip_reset(struct bgma
+ 		bgmac_cco_ctl_maskset(bgmac, 1, ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK |
+ 						  BGMAC_CHIPCTL_1_SW_TYPE_MASK),
+ 				      sw_type);
++	} else if (bgmac->feature_flags & BGMAC_FEAT_CC4_IF_SW_TYPE) {
++		u32 sw_type = BGMAC_CHIPCTL_4_IF_TYPE_MII |
++			      BGMAC_CHIPCTL_4_SW_TYPE_EPHY;
++		u8 et_swtype = 0;
++		char buf[4];
++
++		if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
++			if (kstrtou8(buf, 0, &et_swtype))
++				dev_err(bgmac->dev, "Failed to parse et_swtype (%s)\n",
++					buf);
++			sw_type = (et_swtype & 0x0f) << 12;
++		} else if (bgmac->feature_flags & BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII) {
++			sw_type = BGMAC_CHIPCTL_4_IF_TYPE_RGMII |
++				  BGMAC_CHIPCTL_4_SW_TYPE_RGMII;
++		}
++		bgmac_cco_ctl_maskset(bgmac, 4, ~(BGMAC_CHIPCTL_4_IF_TYPE_MASK |
++						  BGMAC_CHIPCTL_4_SW_TYPE_MASK),
++				      sw_type);
++	} else if (bgmac->feature_flags & BGMAC_FEAT_CC7_IF_TYPE_RGMII) {
++		bgmac_cco_ctl_maskset(bgmac, 7, ~BGMAC_CHIPCTL_7_IF_TYPE_MASK,
++				      BGMAC_CHIPCTL_7_IF_TYPE_RGMII);
+ 	}
+ 
+ 	if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
+@@ -1483,6 +1504,10 @@ int bgmac_enet_probe(struct bgmac *info)
+ 	 */
+ 	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);
++
+ 	bgmac_chip_reset(bgmac);
+ 
+ 	err = bgmac_dma_alloc(bgmac);
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -369,6 +369,21 @@
+ #define BGMAC_CHIPCTL_1_SW_TYPE_RGMII		0x000000C0
+ #define BGMAC_CHIPCTL_1_RXC_DLL_BYPASS		0x00010000
+ 
++#define BGMAC_CHIPCTL_4_IF_TYPE_MASK		0x00003000
++#define BGMAC_CHIPCTL_4_IF_TYPE_RMII		0x00000000
++#define BGMAC_CHIPCTL_4_IF_TYPE_MII		0x00001000
++#define BGMAC_CHIPCTL_4_IF_TYPE_RGMII		0x00002000
++#define BGMAC_CHIPCTL_4_SW_TYPE_MASK		0x0000C000
++#define BGMAC_CHIPCTL_4_SW_TYPE_EPHY		0x00000000
++#define BGMAC_CHIPCTL_4_SW_TYPE_EPHYMII		0x00004000
++#define BGMAC_CHIPCTL_4_SW_TYPE_EPHYRMII	0x00008000
++#define BGMAC_CHIPCTL_4_SW_TYPE_RGMII		0x0000C000
++
++#define BGMAC_CHIPCTL_7_IF_TYPE_MASK		0x000000C0
++#define BGMAC_CHIPCTL_7_IF_TYPE_RMII		0x00000000
++#define BGMAC_CHIPCTL_7_IF_TYPE_MII		0x00000040
++#define BGMAC_CHIPCTL_7_IF_TYPE_RGMII		0x00000080
++
+ #define BGMAC_WEIGHT	64
+ 
+ #define ETHER_MAX_LEN   1518
+@@ -390,6 +405,10 @@
+ #define BGMAC_FEAT_NO_CLR_MIB		BIT(13)
+ #define BGMAC_FEAT_FORCE_SPEED_2500	BIT(14)
+ #define BGMAC_FEAT_CMDCFG_SR_REV4	BIT(15)
++#define BGMAC_FEAT_IRQ_ID_OOB_6		BIT(16)
++#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)
+ 
+ struct bgmac_slot_info {
+ 	union {
+--- a/include/linux/bcma/bcma_regs.h
++++ b/include/linux/bcma/bcma_regs.h
+@@ -23,6 +23,7 @@
+ #define  BCMA_CLKCTLST_4328A0_HAVEALP	0x00020000 /* 4328a0 has reversed bits */
+ 
+ /* Agent registers (common for every core) */
++#define BCMA_OOB_SEL_OUT_A30		0x0100
+ #define BCMA_IOCTL			0x0408 /* IO control */
+ #define  BCMA_IOCTL_CLK			0x0001
+ #define  BCMA_IOCTL_FGC			0x0002
diff --git a/target/linux/generic/patches-4.4/773-bgmac-add-srab-switch.patch b/target/linux/generic/patches-4.4/773-bgmac-add-srab-switch.patch
index d578978..e5c0a63 100644
--- a/target/linux/generic/patches-4.4/773-bgmac-add-srab-switch.patch
+++ b/target/linux/generic/patches-4.4/773-bgmac-add-srab-switch.patch
@@ -12,7 +12,7 @@ Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
  #include <linux/bcm47xx_nvram.h>
  #include "bgmac.h"
  
-@@ -1378,6 +1379,17 @@ static const struct ethtool_ops bgmac_et
+@@ -1399,6 +1400,17 @@ static const struct ethtool_ops bgmac_et
  	.get_drvinfo		= bgmac_get_drvinfo,
  };
  
@@ -30,7 +30,7 @@ Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
  /**************************************************
   * MII
   **************************************************/
-@@ -1510,6 +1522,14 @@ int bgmac_enet_probe(struct bgmac *info)
+@@ -1535,6 +1547,14 @@ int bgmac_enet_probe(struct bgmac *info)
  	net_dev->hw_features = net_dev->features;
  	net_dev->vlan_features = net_dev->features;
  
@@ -45,7 +45,7 @@ Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
  	err = register_netdev(bgmac->net_dev);
  	if (err) {
  		dev_err(bgmac->dev, "Cannot register net device\n");
-@@ -1533,6 +1553,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);
+@@ -1558,6 +1578,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);
  
  void bgmac_enet_remove(struct bgmac *bgmac)
  {
@@ -58,15 +58,15 @@ Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
  	netif_napi_del(&bgmac->napi);
 --- a/drivers/net/ethernet/broadcom/bgmac.h
 +++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -390,6 +390,7 @@
- #define BGMAC_FEAT_NO_CLR_MIB		BIT(13)
- #define BGMAC_FEAT_FORCE_SPEED_2500	BIT(14)
- #define BGMAC_FEAT_CMDCFG_SR_REV4	BIT(15)
-+#define BGMAC_FEAT_SRAB			BIT(16)
+@@ -409,6 +409,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_SRAB			BIT(20)
  
  struct bgmac_slot_info {
  	union {
-@@ -494,6 +495,9 @@ struct bgmac {
+@@ -513,6 +514,9 @@ struct bgmac {
  	u32 (*get_bus_clock)(struct bgmac *bgmac);
  	void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
  			      u32 set);
@@ -78,11 +78,11 @@ Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
  int bgmac_enet_probe(struct bgmac *info);
 --- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
 +++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -229,6 +229,7 @@ static int bgmac_probe(struct bcma_devic
+@@ -231,6 +231,7 @@ static int bgmac_probe(struct bcma_devic
  		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
  		bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
  		bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
 +		bgmac->feature_flags |= BGMAC_FEAT_SRAB;
  		break;
- 	default:
+ 	case BCMA_CHIP_ID_BCM53573:
  		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;



More information about the lede-commits mailing list