kernel: bgmac: add support for BCM53573
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
83f6cf649a
commit
27f47f6ad4
2 changed files with 171 additions and 11 deletions
|
@ -0,0 +1,160 @@
|
||||||
|
From 7d9acff816e15f7d8a51f912bc663373f1d31e7b Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@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@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
|
|
@ -12,7 +12,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
#include <linux/bcm47xx_nvram.h>
|
#include <linux/bcm47xx_nvram.h>
|
||||||
#include "bgmac.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,
|
.get_drvinfo = bgmac_get_drvinfo,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
/**************************************************
|
/**************************************************
|
||||||
* MII
|
* 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->hw_features = net_dev->features;
|
||||||
net_dev->vlan_features = net_dev->features;
|
net_dev->vlan_features = net_dev->features;
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
err = register_netdev(bgmac->net_dev);
|
err = register_netdev(bgmac->net_dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(bgmac->dev, "Cannot register net device\n");
|
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)
|
void bgmac_enet_remove(struct bgmac *bgmac)
|
||||||
{
|
{
|
||||||
|
@ -58,15 +58,15 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
netif_napi_del(&bgmac->napi);
|
netif_napi_del(&bgmac->napi);
|
||||||
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
||||||
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
||||||
@@ -390,6 +390,7 @@
|
@@ -409,6 +409,7 @@
|
||||||
#define BGMAC_FEAT_NO_CLR_MIB BIT(13)
|
#define BGMAC_FEAT_CC4_IF_SW_TYPE BIT(17)
|
||||||
#define BGMAC_FEAT_FORCE_SPEED_2500 BIT(14)
|
#define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18)
|
||||||
#define BGMAC_FEAT_CMDCFG_SR_REV4 BIT(15)
|
#define BGMAC_FEAT_CC7_IF_TYPE_RGMII BIT(19)
|
||||||
+#define BGMAC_FEAT_SRAB BIT(16)
|
+#define BGMAC_FEAT_SRAB BIT(20)
|
||||||
|
|
||||||
struct bgmac_slot_info {
|
struct bgmac_slot_info {
|
||||||
union {
|
union {
|
||||||
@@ -494,6 +495,9 @@ struct bgmac {
|
@@ -513,6 +514,9 @@ struct bgmac {
|
||||||
u32 (*get_bus_clock)(struct bgmac *bgmac);
|
u32 (*get_bus_clock)(struct bgmac *bgmac);
|
||||||
void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
|
void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
|
||||||
u32 set);
|
u32 set);
|
||||||
|
@ -78,11 +78,11 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
int bgmac_enet_probe(struct bgmac *info);
|
int bgmac_enet_probe(struct bgmac *info);
|
||||||
--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
|
--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
|
||||||
+++ b/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_CLKCTLST;
|
||||||
bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
|
bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
|
||||||
bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
|
bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
|
||||||
+ bgmac->feature_flags |= BGMAC_FEAT_SRAB;
|
+ bgmac->feature_flags |= BGMAC_FEAT_SRAB;
|
||||||
break;
|
break;
|
||||||
default:
|
case BCMA_CHIP_ID_BCM53573:
|
||||||
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
|
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
|
||||||
|
|
Loading…
Reference in a new issue