kernel: rename bgmac patches to squeeze them
authorRafał Miłecki <rafal@milecki.pl>
Tue, 31 Jan 2017 20:00:51 +0000 (21:00 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Tue, 31 Jan 2017 21:04:08 +0000 (22:04 +0100)
This is a pure rename without any changes. It makes maintaining bgmac
simpler and will hopefully make adding new kernel a bit easier.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
52 files changed:
target/linux/generic/patches-4.4/070-0001-bgmac-fix-a-missing-check-for-build_skb.patch [deleted file]
target/linux/generic/patches-4.4/070-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch [deleted file]
target/linux/generic/patches-4.4/070-v4.5-0001-bgmac-fix-a-missing-check-for-build_skb.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.5-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.5-0003-net-bgmac-clarify-CONFIG_BCMA-dependency.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.6-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.6-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.6-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.6-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.8-0001-bgmac-Bind-net_device-with-backing-device-structure.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.8-0002-bgmac-Add-support-for-ethtool-statistics.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.8-0003-bgmac-Maintain-some-netdev-statistics.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/070-v4.8-0004-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-0000-net-bgmac-clarify-CONFIG_BCMA-dependency.patch [deleted file]
target/linux/generic/patches-4.4/071-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch [deleted file]
target/linux/generic/patches-4.4/071-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch [deleted file]
target/linux/generic/patches-4.4/071-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch [deleted file]
target/linux/generic/patches-4.4/071-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch [deleted file]
target/linux/generic/patches-4.4/071-v4.7-0001-net-bgmac-Fix-SOF-bit-checking.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.7-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.7-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0004-net-ethernet-bgmac-convert-to-feature-flags.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0005-net-ethernet-bgmac-Add-platform-device-support.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0006-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0007-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.8-0009-net-bgmac-fix-reversed-check-for-MII-registration-er.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.9-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.9-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.9-0003-net-bgmac-Fix-errant-feature-flag-check.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/071-v4.9-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch [new file with mode: 0644]
target/linux/generic/patches-4.4/072-0001-bgmac-Bind-net_device-with-backing-device-structure.patch [deleted file]
target/linux/generic/patches-4.4/072-0002-bgmac-Add-support-for-ethtool-statistics.patch [deleted file]
target/linux/generic/patches-4.4/072-0003-bgmac-Maintain-some-netdev-statistics.patch [deleted file]
target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch [deleted file]
target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch [deleted file]
target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch [deleted file]
target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch [deleted file]
target/linux/generic/patches-4.4/075-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch [deleted file]
target/linux/generic/patches-4.4/075-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch [deleted file]
target/linux/generic/patches-4.4/075-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch [deleted file]
target/linux/generic/patches-4.4/075-0004-net-ethernet-bgmac-convert-to-feature-flags.patch [deleted file]
target/linux/generic/patches-4.4/075-0005-net-ethernet-bgmac-Add-platform-device-support.patch [deleted file]
target/linux/generic/patches-4.4/076-0001-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch [deleted file]
target/linux/generic/patches-4.4/076-0002-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch [deleted file]
target/linux/generic/patches-4.4/076-0004-net-bgmac-fix-reversed-check-for-MII-registration-er.patch [deleted file]
target/linux/generic/patches-4.4/077-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch [deleted file]
target/linux/generic/patches-4.4/077-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch [deleted file]
target/linux/generic/patches-4.4/077-0003-net-bgmac-Fix-errant-feature-flag-check.patch [deleted file]
target/linux/generic/patches-4.4/077-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch [deleted file]

diff --git a/target/linux/generic/patches-4.4/070-0001-bgmac-fix-a-missing-check-for-build_skb.patch b/target/linux/generic/patches-4.4/070-0001-bgmac-fix-a-missing-check-for-build_skb.patch
deleted file mode 100644 (file)
index 99f9de6..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From f1640c3ddeec12804bc9a21feee85fc15aca95f6 Mon Sep 17 00:00:00 2001
-From: wangweidong <wangweidong1@huawei.com>
-Date: Wed, 13 Jan 2016 11:06:41 +0800
-Subject: [PATCH] bgmac: fix a missing check for build_skb
-
-when build_skb failed, it may occure a NULL pointer.
-So add a 'NULL check' for it.
-
-Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -469,6 +469,11 @@ static int bgmac_dma_rx_read(struct bgma
-                       len -= ETH_FCS_LEN;
-                       skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
-+                      if (unlikely(skb)) {
-+                              bgmac_err(bgmac, "build_skb failed\n");
-+                              put_page(virt_to_head_page(buf));
-+                              break;
-+                      }
-                       skb_put(skb, BGMAC_RX_FRAME_OFFSET +
-                               BGMAC_RX_BUF_OFFSET + len);
-                       skb_pull(skb, BGMAC_RX_FRAME_OFFSET +
diff --git a/target/linux/generic/patches-4.4/070-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch b/target/linux/generic/patches-4.4/070-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch
deleted file mode 100644 (file)
index eebcded..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From 750afbf8ee9c6a1c74a1fe5fc9852146b1d72687 Mon Sep 17 00:00:00 2001
-From: "David S. Miller" <davem@davemloft.net>
-Date: Fri, 15 Jan 2016 16:07:13 -0500
-Subject: [PATCH] bgmac: Fix reversed test of build_skb() return value.
-
-Fixes: f1640c3ddeec ("bgmac: fix a missing check for build_skb")
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -469,7 +469,7 @@ static int bgmac_dma_rx_read(struct bgma
-                       len -= ETH_FCS_LEN;
-                       skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
--                      if (unlikely(skb)) {
-+                      if (unlikely(!skb)) {
-                               bgmac_err(bgmac, "build_skb failed\n");
-                               put_page(virt_to_head_page(buf));
-                               break;
diff --git a/target/linux/generic/patches-4.4/070-v4.5-0001-bgmac-fix-a-missing-check-for-build_skb.patch b/target/linux/generic/patches-4.4/070-v4.5-0001-bgmac-fix-a-missing-check-for-build_skb.patch
new file mode 100644 (file)
index 0000000..99f9de6
--- /dev/null
@@ -0,0 +1,28 @@
+From f1640c3ddeec12804bc9a21feee85fc15aca95f6 Mon Sep 17 00:00:00 2001
+From: wangweidong <wangweidong1@huawei.com>
+Date: Wed, 13 Jan 2016 11:06:41 +0800
+Subject: [PATCH] bgmac: fix a missing check for build_skb
+
+when build_skb failed, it may occure a NULL pointer.
+So add a 'NULL check' for it.
+
+Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -469,6 +469,11 @@ static int bgmac_dma_rx_read(struct bgma
+                       len -= ETH_FCS_LEN;
+                       skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
++                      if (unlikely(skb)) {
++                              bgmac_err(bgmac, "build_skb failed\n");
++                              put_page(virt_to_head_page(buf));
++                              break;
++                      }
+                       skb_put(skb, BGMAC_RX_FRAME_OFFSET +
+                               BGMAC_RX_BUF_OFFSET + len);
+                       skb_pull(skb, BGMAC_RX_FRAME_OFFSET +
diff --git a/target/linux/generic/patches-4.4/070-v4.5-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch b/target/linux/generic/patches-4.4/070-v4.5-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch
new file mode 100644 (file)
index 0000000..eebcded
--- /dev/null
@@ -0,0 +1,22 @@
+From 750afbf8ee9c6a1c74a1fe5fc9852146b1d72687 Mon Sep 17 00:00:00 2001
+From: "David S. Miller" <davem@davemloft.net>
+Date: Fri, 15 Jan 2016 16:07:13 -0500
+Subject: [PATCH] bgmac: Fix reversed test of build_skb() return value.
+
+Fixes: f1640c3ddeec ("bgmac: fix a missing check for build_skb")
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -469,7 +469,7 @@ static int bgmac_dma_rx_read(struct bgma
+                       len -= ETH_FCS_LEN;
+                       skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
+-                      if (unlikely(skb)) {
++                      if (unlikely(!skb)) {
+                               bgmac_err(bgmac, "build_skb failed\n");
+                               put_page(virt_to_head_page(buf));
+                               break;
diff --git a/target/linux/generic/patches-4.4/070-v4.5-0003-net-bgmac-clarify-CONFIG_BCMA-dependency.patch b/target/linux/generic/patches-4.4/070-v4.5-0003-net-bgmac-clarify-CONFIG_BCMA-dependency.patch
new file mode 100644 (file)
index 0000000..cd0d098
--- /dev/null
@@ -0,0 +1,46 @@
+From 1f820f538f7396db7fd40684b9c3620816acc5a3 Mon Sep 17 00:00:00 2001
+From: Arnd Bergmann <arnd@arndb.de>
+Date: Fri, 29 Jan 2016 12:39:12 +0100
+Subject: [PATCH] net: bgmac: clarify CONFIG_BCMA dependency
+
+The bgmac driver depends on BCMA_HOST_SOC, which is only used
+when CONFIG_BCMA is enabled. However, it is a bool option and can
+be set when CONFIG_BCMA=m, and then bgmac can be built-in, leading
+to an obvious link error:
+
+drivers/built-in.o: In function `bgmac_init':
+:(.init.text+0x7f2c): undefined reference to `__bcma_driver_register'
+drivers/built-in.o: In function `bgmac_exit':
+:(.exit.text+0x110a): undefined reference to `bcma_driver_unregister'
+
+To avoid this case, we need to depend on both BCMA and BCMA_SOC,
+as this patch does. I'm also trying to make the dependency more
+readable by splitting it into three lines, and adding a COMPILE_TEST
+alternative so we can test-build it in all configurations that
+support BCMA.
+
+The added dependency on FIXED_PHY addresses a related issue where
+we cannot call fixed_phy_register() when CONFIG_FIXED_PHY=m and
+CONFIG_BGMAC=y.
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/Kconfig | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/Kconfig
++++ b/drivers/net/ethernet/broadcom/Kconfig
+@@ -151,8 +151,11 @@ config BNX2X_VXLAN
+ config BGMAC
+       tristate "BCMA bus GBit core support"
+-      depends on BCMA_HOST_SOC && HAS_DMA && (BCM47XX || ARCH_BCM_5301X)
++      depends on BCMA && BCMA_HOST_SOC
++      depends on HAS_DMA
++      depends on BCM47XX || ARCH_BCM_5301X || COMPILE_TEST
+       select PHYLIB
++      select FIXED_PHY
+       ---help---
+         This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
+         They can be found on BCM47xx SoCs and provide gigabit ethernet.
diff --git a/target/linux/generic/patches-4.4/070-v4.6-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch b/target/linux/generic/patches-4.4/070-v4.6-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch
new file mode 100644 (file)
index 0000000..0c00756
--- /dev/null
@@ -0,0 +1,106 @@
+From 387b75f8b31437792e8334390fdf5cf060d1e3da Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 2 Feb 2016 07:47:14 +0100
+Subject: [PATCH] bgmac: add helper checking for BCM4707 / BCM53018 chip id
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Chipsets with BCM4707 / BCM53018 ID require special handling at a few
+places in the code. It's likely there will be more IDs to check in the
+future. To simplify it add this trivial helper.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 30 ++++++++++++++++--------------
+ 1 file changed, 16 insertions(+), 14 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -26,6 +26,17 @@ static const struct bcma_device_id bgmac
+ };
+ MODULE_DEVICE_TABLE(bcma, bgmac_bcma_tbl);
++static inline bool bgmac_is_bcm4707_family(struct bgmac *bgmac)
++{
++      switch (bgmac->core->bus->chipinfo.id) {
++      case BCMA_CHIP_ID_BCM4707:
++      case BCMA_CHIP_ID_BCM53018:
++              return true;
++      default:
++              return false;
++      }
++}
++
+ static bool bgmac_wait_value(struct bcma_device *core, u16 reg, u32 mask,
+                            u32 value, int timeout)
+ {
+@@ -990,11 +1001,9 @@ static void bgmac_mac_speed(struct bgmac
+ static void bgmac_miiconfig(struct bgmac *bgmac)
+ {
+       struct bcma_device *core = bgmac->core;
+-      struct bcma_chipinfo *ci = &core->bus->chipinfo;
+       u8 imode;
+-      if (ci->id == BCMA_CHIP_ID_BCM4707 ||
+-          ci->id == BCMA_CHIP_ID_BCM53018) {
++      if (bgmac_is_bcm4707_family(bgmac)) {
+               bcma_awrite32(core, BCMA_IOCTL,
+                             bcma_aread32(core, BCMA_IOCTL) | 0x40 |
+                             BGMAC_BCMA_IOCTL_SW_CLKEN);
+@@ -1058,9 +1067,7 @@ static void bgmac_chip_reset(struct bgma
+       }
+       /* Request Misc PLL for corerev > 2 */
+-      if (core->id.rev > 2 &&
+-          ci->id != BCMA_CHIP_ID_BCM4707 &&
+-          ci->id != BCMA_CHIP_ID_BCM53018) {
++      if (core->id.rev > 2 && !bgmac_is_bcm4707_family(bgmac)) {
+               bgmac_set(bgmac, BCMA_CLKCTLST,
+                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
+               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
+@@ -1196,8 +1203,7 @@ static void bgmac_enable(struct bgmac *b
+               break;
+       }
+-      if (ci->id != BCMA_CHIP_ID_BCM4707 &&
+-          ci->id != BCMA_CHIP_ID_BCM53018) {
++      if (!bgmac_is_bcm4707_family(bgmac)) {
+               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
+               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
+               bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
+@@ -1475,14 +1481,12 @@ static int bgmac_fixed_phy_register(stru
+ static int bgmac_mii_register(struct bgmac *bgmac)
+ {
+-      struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
+       struct mii_bus *mii_bus;
+       struct phy_device *phy_dev;
+       char bus_id[MII_BUS_ID_SIZE + 3];
+       int i, err = 0;
+-      if (ci->id == BCMA_CHIP_ID_BCM4707 ||
+-          ci->id == BCMA_CHIP_ID_BCM53018)
++      if (bgmac_is_bcm4707_family(bgmac))
+               return bgmac_fixed_phy_register(bgmac);
+       mii_bus = mdiobus_alloc();
+@@ -1553,7 +1557,6 @@ static void bgmac_mii_unregister(struct
+ /* 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 net_device *net_dev;
+       struct bgmac *bgmac;
+       struct ssb_sprom *sprom = &core->bus->sprom;
+@@ -1634,8 +1637,7 @@ static int bgmac_probe(struct bcma_devic
+       bgmac_chip_reset(bgmac);
+       /* For Northstar, we have to take all GMAC core out of reset */
+-      if (ci->id == BCMA_CHIP_ID_BCM4707 ||
+-          ci->id == BCMA_CHIP_ID_BCM53018) {
++      if (bgmac_is_bcm4707_family(bgmac)) {
+               struct bcma_device *ns_core;
+               int ns_gmac;
diff --git a/target/linux/generic/patches-4.4/070-v4.6-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch b/target/linux/generic/patches-4.4/070-v4.6-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch
new file mode 100644 (file)
index 0000000..d00c2bd
--- /dev/null
@@ -0,0 +1,39 @@
+From 9e4e6206c67ae11d68fc96882256f37c237087d4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Mon, 22 Feb 2016 22:51:13 +0100
+Subject: [PATCH] bgmac: support Ethernet device on BCM47094 SoC
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It needs very similar workarounds to the one on BCM4707. It was tested
+on D-Link DIR-885L home router.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -30,6 +30,7 @@ static inline bool bgmac_is_bcm4707_fami
+ {
+       switch (bgmac->core->bus->chipinfo.id) {
+       case BCMA_CHIP_ID_BCM4707:
++      case BCMA_CHIP_ID_BCM47094:
+       case BCMA_CHIP_ID_BCM53018:
+               return true;
+       default:
+@@ -1055,8 +1056,9 @@ static void bgmac_chip_reset(struct bgma
+           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
+               iost &= ~BGMAC_BCMA_IOST_ATTACHED;
+-      /* 3GMAC: for BCM4707, only do core reset at bgmac_probe() */
+-      if (ci->id != BCMA_CHIP_ID_BCM4707) {
++      /* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
++      if (ci->id != BCMA_CHIP_ID_BCM4707 &&
++          ci->id != BCMA_CHIP_ID_BCM47094) {
+               flags = 0;
+               if (iost & BGMAC_BCMA_IOST_ATTACHED) {
+                       flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
diff --git a/target/linux/generic/patches-4.4/070-v4.6-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch b/target/linux/generic/patches-4.4/070-v4.6-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch
new file mode 100644 (file)
index 0000000..021a591
--- /dev/null
@@ -0,0 +1,31 @@
+From b4dfd8e92956b396d3438212bc9a0be6267b8b34 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 12 Apr 2016 13:30:45 +0200
+Subject: [PATCH] bgmac: reset & enable Ethernet core before using it
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This fixes Ethernet on D-Link DIR-885L with BCM47094 SoC. Felix reported
+similar fix was needed for his BCM4709 device (Buffalo WXR-1900DHP?).
+I tested this for regressions on BCM4706, BCM4708A0 and BCM47081A0.
+
+Cc: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1586,6 +1586,11 @@ static int bgmac_probe(struct bcma_devic
+               dev_warn(&core->dev, "Using random MAC: %pM\n", mac);
+       }
++      /* This (reset &) enable is not preset in specs or reference driver but
++       * Broadcom does it in arch PCI code when enabling fake PCI device.
++       */
++      bcma_core_enable(core, 0);
++
+       /* Allocation and references */
+       net_dev = alloc_etherdev(sizeof(*bgmac));
+       if (!net_dev)
diff --git a/target/linux/generic/patches-4.4/070-v4.6-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch b/target/linux/generic/patches-4.4/070-v4.6-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch
new file mode 100644 (file)
index 0000000..a5fcaab
--- /dev/null
@@ -0,0 +1,34 @@
+From c02bc350f9dbce7d637c394a6e1c4d29dc5b28b2 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Tue, 12 Apr 2016 18:27:29 +0200
+Subject: [PATCH] bgmac: fix MAC soft-reset bit for corerev > 4
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Only core revisions older than 4 use BGMAC_CMDCFG_SR_REV0. This mainly
+fixes support for BCM4708A0KF SoCs with Ethernet core rev 5 (it means
+only some devices as most of BCM4708A0KF-s got core rev 4).
+This was tested for regressions on BCM47094 which doesn't seem to care
+which bit gets used.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -199,9 +199,9 @@
+ #define  BGMAC_CMDCFG_TAI                     0x00000200
+ #define  BGMAC_CMDCFG_HD                      0x00000400      /* Set if in half duplex mode */
+ #define  BGMAC_CMDCFG_HD_SHIFT                        10
+-#define  BGMAC_CMDCFG_SR_REV0                 0x00000800      /* Set to reset mode, for other revs */
+-#define  BGMAC_CMDCFG_SR_REV4                 0x00002000      /* Set to reset mode, only for core rev 4 */
+-#define  BGMAC_CMDCFG_SR(rev)  ((rev == 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
++#define  BGMAC_CMDCFG_SR_REV0                 0x00000800      /* Set to reset mode, for core rev 0-3 */
++#define  BGMAC_CMDCFG_SR_REV4                 0x00002000      /* Set to reset mode, for core rev >= 4 */
++#define  BGMAC_CMDCFG_SR(rev)  ((rev >= 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
+ #define  BGMAC_CMDCFG_ML                      0x00008000      /* Set to activate mac loopback mode */
+ #define  BGMAC_CMDCFG_AE                      0x00400000
+ #define  BGMAC_CMDCFG_CFE                     0x00800000
diff --git a/target/linux/generic/patches-4.4/070-v4.8-0001-bgmac-Bind-net_device-with-backing-device-structure.patch b/target/linux/generic/patches-4.4/070-v4.8-0001-bgmac-Bind-net_device-with-backing-device-structure.patch
new file mode 100644 (file)
index 0000000..4d00094
--- /dev/null
@@ -0,0 +1,25 @@
+From 2022e9d50798aa592887ccb5a7d045e537f3855f Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Tue, 7 Jun 2016 15:06:13 -0700
+Subject: [PATCH 1/3] bgmac: Bind net_device with backing device structure
+
+In preparation for allowing different helpers to be utilized against
+network devices created by the bgmac driver, make sure that we bind the
+net_device with core->dev.
+
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1602,6 +1602,7 @@ static int bgmac_probe(struct bcma_devic
+       bgmac->net_dev = net_dev;
+       bgmac->core = core;
+       bcma_set_drvdata(core, bgmac);
++      SET_NETDEV_DEV(net_dev, &core->dev);
+       /* Defaults */
+       memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
diff --git a/target/linux/generic/patches-4.4/070-v4.8-0002-bgmac-Add-support-for-ethtool-statistics.patch b/target/linux/generic/patches-4.4/070-v4.8-0002-bgmac-Add-support-for-ethtool-statistics.patch
new file mode 100644 (file)
index 0000000..cff7080
--- /dev/null
@@ -0,0 +1,175 @@
+From f6613d4fa937fa8388f2c1cb4e69ccc25e9e2336 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Tue, 7 Jun 2016 15:06:14 -0700
+Subject: [PATCH 2/3] bgmac: Add support for ethtool statistics
+
+Read the statistics from the BGMAC's builtin MAC and return them to
+user-space using the standard ethtool helpers.
+
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 124 ++++++++++++++++++++++++++++++++++
+ drivers/net/ethernet/broadcom/bgmac.h |   4 +-
+ 2 files changed, 126 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1385,6 +1385,127 @@ static const struct net_device_ops bgmac
+  * ethtool_ops
+  **************************************************/
++struct bgmac_stat {
++      u8 size;
++      u32 offset;
++      const char *name;
++};
++
++static struct bgmac_stat bgmac_get_strings_stats[] = {
++      { 8, BGMAC_TX_GOOD_OCTETS, "tx_good_octets" },
++      { 4, BGMAC_TX_GOOD_PKTS, "tx_good" },
++      { 8, BGMAC_TX_OCTETS, "tx_octets" },
++      { 4, BGMAC_TX_PKTS, "tx_pkts" },
++      { 4, BGMAC_TX_BROADCAST_PKTS, "tx_broadcast" },
++      { 4, BGMAC_TX_MULTICAST_PKTS, "tx_multicast" },
++      { 4, BGMAC_TX_LEN_64, "tx_64" },
++      { 4, BGMAC_TX_LEN_65_TO_127, "tx_65_127" },
++      { 4, BGMAC_TX_LEN_128_TO_255, "tx_128_255" },
++      { 4, BGMAC_TX_LEN_256_TO_511, "tx_256_511" },
++      { 4, BGMAC_TX_LEN_512_TO_1023, "tx_512_1023" },
++      { 4, BGMAC_TX_LEN_1024_TO_1522, "tx_1024_1522" },
++      { 4, BGMAC_TX_LEN_1523_TO_2047, "tx_1523_2047" },
++      { 4, BGMAC_TX_LEN_2048_TO_4095, "tx_2048_4095" },
++      { 4, BGMAC_TX_LEN_4096_TO_8191, "tx_4096_8191" },
++      { 4, BGMAC_TX_LEN_8192_TO_MAX, "tx_8192_max" },
++      { 4, BGMAC_TX_JABBER_PKTS, "tx_jabber" },
++      { 4, BGMAC_TX_OVERSIZE_PKTS, "tx_oversize" },
++      { 4, BGMAC_TX_FRAGMENT_PKTS, "tx_fragment" },
++      { 4, BGMAC_TX_UNDERRUNS, "tx_underruns" },
++      { 4, BGMAC_TX_TOTAL_COLS, "tx_total_cols" },
++      { 4, BGMAC_TX_SINGLE_COLS, "tx_single_cols" },
++      { 4, BGMAC_TX_MULTIPLE_COLS, "tx_multiple_cols" },
++      { 4, BGMAC_TX_EXCESSIVE_COLS, "tx_excessive_cols" },
++      { 4, BGMAC_TX_LATE_COLS, "tx_late_cols" },
++      { 4, BGMAC_TX_DEFERED, "tx_defered" },
++      { 4, BGMAC_TX_CARRIER_LOST, "tx_carrier_lost" },
++      { 4, BGMAC_TX_PAUSE_PKTS, "tx_pause" },
++      { 4, BGMAC_TX_UNI_PKTS, "tx_unicast" },
++      { 4, BGMAC_TX_Q0_PKTS, "tx_q0" },
++      { 8, BGMAC_TX_Q0_OCTETS, "tx_q0_octets" },
++      { 4, BGMAC_TX_Q1_PKTS, "tx_q1" },
++      { 8, BGMAC_TX_Q1_OCTETS, "tx_q1_octets" },
++      { 4, BGMAC_TX_Q2_PKTS, "tx_q2" },
++      { 8, BGMAC_TX_Q2_OCTETS, "tx_q2_octets" },
++      { 4, BGMAC_TX_Q3_PKTS, "tx_q3" },
++      { 8, BGMAC_TX_Q3_OCTETS, "tx_q3_octets" },
++      { 8, BGMAC_RX_GOOD_OCTETS, "rx_good_octets" },
++      { 4, BGMAC_RX_GOOD_PKTS, "rx_good" },
++      { 8, BGMAC_RX_OCTETS, "rx_octets" },
++      { 4, BGMAC_RX_PKTS, "rx_pkts" },
++      { 4, BGMAC_RX_BROADCAST_PKTS, "rx_broadcast" },
++      { 4, BGMAC_RX_MULTICAST_PKTS, "rx_multicast" },
++      { 4, BGMAC_RX_LEN_64, "rx_64" },
++      { 4, BGMAC_RX_LEN_65_TO_127, "rx_65_127" },
++      { 4, BGMAC_RX_LEN_128_TO_255, "rx_128_255" },
++      { 4, BGMAC_RX_LEN_256_TO_511, "rx_256_511" },
++      { 4, BGMAC_RX_LEN_512_TO_1023, "rx_512_1023" },
++      { 4, BGMAC_RX_LEN_1024_TO_1522, "rx_1024_1522" },
++      { 4, BGMAC_RX_LEN_1523_TO_2047, "rx_1523_2047" },
++      { 4, BGMAC_RX_LEN_2048_TO_4095, "rx_2048_4095" },
++      { 4, BGMAC_RX_LEN_4096_TO_8191, "rx_4096_8191" },
++      { 4, BGMAC_RX_LEN_8192_TO_MAX, "rx_8192_max" },
++      { 4, BGMAC_RX_JABBER_PKTS, "rx_jabber" },
++      { 4, BGMAC_RX_OVERSIZE_PKTS, "rx_oversize" },
++      { 4, BGMAC_RX_FRAGMENT_PKTS, "rx_fragment" },
++      { 4, BGMAC_RX_MISSED_PKTS, "rx_missed" },
++      { 4, BGMAC_RX_CRC_ALIGN_ERRS, "rx_crc_align" },
++      { 4, BGMAC_RX_UNDERSIZE, "rx_undersize" },
++      { 4, BGMAC_RX_CRC_ERRS, "rx_crc" },
++      { 4, BGMAC_RX_ALIGN_ERRS, "rx_align" },
++      { 4, BGMAC_RX_SYMBOL_ERRS, "rx_symbol" },
++      { 4, BGMAC_RX_PAUSE_PKTS, "rx_pause" },
++      { 4, BGMAC_RX_NONPAUSE_PKTS, "rx_nonpause" },
++      { 4, BGMAC_RX_SACHANGES, "rx_sa_changes" },
++      { 4, BGMAC_RX_UNI_PKTS, "rx_unicast" },
++};
++
++#define BGMAC_STATS_LEN       ARRAY_SIZE(bgmac_get_strings_stats)
++
++static int bgmac_get_sset_count(struct net_device *dev, int string_set)
++{
++      switch (string_set) {
++      case ETH_SS_STATS:
++              return BGMAC_STATS_LEN;
++      }
++
++      return -EOPNOTSUPP;
++}
++
++static void bgmac_get_strings(struct net_device *dev, u32 stringset,
++                            u8 *data)
++{
++      int i;
++
++      if (stringset != ETH_SS_STATS)
++              return;
++
++      for (i = 0; i < BGMAC_STATS_LEN; i++)
++              strlcpy(data + i * ETH_GSTRING_LEN,
++                      bgmac_get_strings_stats[i].name, ETH_GSTRING_LEN);
++}
++
++static void bgmac_get_ethtool_stats(struct net_device *dev,
++                                  struct ethtool_stats *ss, uint64_t *data)
++{
++      struct bgmac *bgmac = netdev_priv(dev);
++      const struct bgmac_stat *s;
++      unsigned int i;
++      u64 val;
++
++      if (!netif_running(dev))
++              return;
++
++      for (i = 0; i < BGMAC_STATS_LEN; i++) {
++              s = &bgmac_get_strings_stats[i];
++              val = 0;
++              if (s->size == 8)
++                      val = (u64)bgmac_read(bgmac, s->offset + 4) << 32;
++              val |= bgmac_read(bgmac, s->offset);
++              data[i] = val;
++      }
++}
++
+ static int bgmac_get_settings(struct net_device *net_dev,
+                             struct ethtool_cmd *cmd)
+ {
+@@ -1409,6 +1530,9 @@ static void bgmac_get_drvinfo(struct net
+ }
+ static const struct ethtool_ops bgmac_ethtool_ops = {
++      .get_strings            = bgmac_get_strings,
++      .get_sset_count         = bgmac_get_sset_count,
++      .get_ethtool_stats      = bgmac_get_ethtool_stats,
+       .get_settings           = bgmac_get_settings,
+       .set_settings           = bgmac_set_settings,
+       .get_drvinfo            = bgmac_get_drvinfo,
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -123,7 +123,7 @@
+ #define BGMAC_TX_LEN_1024_TO_1522             0x334
+ #define BGMAC_TX_LEN_1523_TO_2047             0x338
+ #define BGMAC_TX_LEN_2048_TO_4095             0x33c
+-#define BGMAC_TX_LEN_4095_TO_8191             0x340
++#define BGMAC_TX_LEN_4096_TO_8191             0x340
+ #define BGMAC_TX_LEN_8192_TO_MAX              0x344
+ #define BGMAC_TX_JABBER_PKTS                  0x348           /* Error */
+ #define BGMAC_TX_OVERSIZE_PKTS                        0x34c           /* Error */
+@@ -166,7 +166,7 @@
+ #define BGMAC_RX_LEN_1024_TO_1522             0x3e4
+ #define BGMAC_RX_LEN_1523_TO_2047             0x3e8
+ #define BGMAC_RX_LEN_2048_TO_4095             0x3ec
+-#define BGMAC_RX_LEN_4095_TO_8191             0x3f0
++#define BGMAC_RX_LEN_4096_TO_8191             0x3f0
+ #define BGMAC_RX_LEN_8192_TO_MAX              0x3f4
+ #define BGMAC_RX_JABBER_PKTS                  0x3f8           /* Error */
+ #define BGMAC_RX_OVERSIZE_PKTS                        0x3fc           /* Error */
diff --git a/target/linux/generic/patches-4.4/070-v4.8-0003-bgmac-Maintain-some-netdev-statistics.patch b/target/linux/generic/patches-4.4/070-v4.8-0003-bgmac-Maintain-some-netdev-statistics.patch
new file mode 100644 (file)
index 0000000..322851d
--- /dev/null
@@ -0,0 +1,68 @@
+From 6d490f62a4c7f11c552591bdd08eda3636aa0db9 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Tue, 7 Jun 2016 15:06:15 -0700
+Subject: [PATCH 3/3] bgmac: Maintain some netdev statistics
+
+Add a few netdev statistics to report transmitted and received bytes and
+packets and a few obvious errors.
+
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -246,6 +246,8 @@ err_dma_head:
+ err_drop:
+       dev_kfree_skb(skb);
++      net_dev->stats.tx_dropped++;
++      net_dev->stats.tx_errors++;
+       return NETDEV_TX_OK;
+ }
+@@ -284,6 +286,8 @@ static void bgmac_dma_tx_free(struct bgm
+                                      DMA_TO_DEVICE);
+               if (slot->skb) {
++                      bgmac->net_dev->stats.tx_bytes += slot->skb->len;
++                      bgmac->net_dev->stats.tx_packets++;
+                       bytes_compl += slot->skb->len;
+                       pkts_compl++;
+@@ -467,6 +471,7 @@ static int bgmac_dma_rx_read(struct bgma
+                               bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
+                                         ring->start);
+                               put_page(virt_to_head_page(buf));
++                              bgmac->net_dev->stats.rx_errors++;
+                               break;
+                       }
+@@ -474,6 +479,8 @@ static int bgmac_dma_rx_read(struct bgma
+                               bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n",
+                                         ring->start);
+                               put_page(virt_to_head_page(buf));
++                              bgmac->net_dev->stats.rx_length_errors++;
++                              bgmac->net_dev->stats.rx_errors++;
+                               break;
+                       }
+@@ -484,6 +491,7 @@ static int bgmac_dma_rx_read(struct bgma
+                       if (unlikely(!skb)) {
+                               bgmac_err(bgmac, "build_skb failed\n");
+                               put_page(virt_to_head_page(buf));
++                              bgmac->net_dev->stats.rx_errors++;
+                               break;
+                       }
+                       skb_put(skb, BGMAC_RX_FRAME_OFFSET +
+@@ -493,6 +501,8 @@ static int bgmac_dma_rx_read(struct bgma
+                       skb_checksum_none_assert(skb);
+                       skb->protocol = eth_type_trans(skb, bgmac->net_dev);
++                      bgmac->net_dev->stats.rx_bytes += len;
++                      bgmac->net_dev->stats.rx_packets++;
+                       napi_gro_receive(&bgmac->napi, skb);
+                       handled++;
+               } while (0);
diff --git a/target/linux/generic/patches-4.4/070-v4.8-0004-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch b/target/linux/generic/patches-4.4/070-v4.8-0004-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch
new file mode 100644 (file)
index 0000000..8c97b09
--- /dev/null
@@ -0,0 +1,105 @@
+From b21fcb259313bcf7d4f73ecd5e44948995c8957c Mon Sep 17 00:00:00 2001
+From: Philippe Reynes <tremyfr@gmail.com>
+Date: Sun, 19 Jun 2016 22:37:05 +0200
+Subject: [PATCH 1/2] net: ethernet: bgmac: use phydev from struct net_device
+
+The private structure contain a pointer to phydev, but the structure
+net_device already contain such pointer. So we can remove the pointer
+phydev in the private structure, and update the driver to use the
+one contained in struct net_device.
+
+Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 17 ++++++-----------
+ drivers/net/ethernet/broadcom/bgmac.h |  1 -
+ 2 files changed, 6 insertions(+), 12 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1323,7 +1323,7 @@ static int bgmac_open(struct net_device
+       }
+       napi_enable(&bgmac->napi);
+-      phy_start(bgmac->phy_dev);
++      phy_start(net_dev->phydev);
+       netif_carrier_on(net_dev);
+       return 0;
+@@ -1335,7 +1335,7 @@ static int bgmac_stop(struct net_device
+       netif_carrier_off(net_dev);
+-      phy_stop(bgmac->phy_dev);
++      phy_stop(net_dev->phydev);
+       napi_disable(&bgmac->napi);
+       bgmac_chip_intrs_off(bgmac);
+@@ -1373,12 +1373,10 @@ static int bgmac_set_mac_address(struct
+ static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
+ {
+-      struct bgmac *bgmac = netdev_priv(net_dev);
+-
+       if (!netif_running(net_dev))
+               return -EINVAL;
+-      return phy_mii_ioctl(bgmac->phy_dev, ifr, cmd);
++      return phy_mii_ioctl(net_dev->phydev, ifr, cmd);
+ }
+ static const struct net_device_ops bgmac_netdev_ops = {
+@@ -1521,7 +1519,7 @@ static int bgmac_get_settings(struct net
+ {
+       struct bgmac *bgmac = netdev_priv(net_dev);
+-      return phy_ethtool_gset(bgmac->phy_dev, cmd);
++      return phy_ethtool_gset(net_dev->phydev, cmd);
+ }
+ static int bgmac_set_settings(struct net_device *net_dev,
+@@ -1529,7 +1527,7 @@ static int bgmac_set_settings(struct net
+ {
+       struct bgmac *bgmac = netdev_priv(net_dev);
+-      return phy_ethtool_sset(bgmac->phy_dev, cmd);
++      return phy_ethtool_sset(net_dev->phydev, cmd);
+ }
+ static void bgmac_get_drvinfo(struct net_device *net_dev,
+@@ -1566,7 +1564,7 @@ static int bgmac_mii_write(struct mii_bu
+ static void bgmac_adjust_link(struct net_device *net_dev)
+ {
+       struct bgmac *bgmac = netdev_priv(net_dev);
+-      struct phy_device *phy_dev = bgmac->phy_dev;
++      struct phy_device *phy_dev = net_dev->phydev;
+       bool update = false;
+       if (phy_dev->link) {
+@@ -1610,8 +1608,6 @@ static int bgmac_fixed_phy_register(stru
+               return err;
+       }
+-      bgmac->phy_dev = phy_dev;
+-
+       return err;
+ }
+@@ -1664,7 +1660,6 @@ static int bgmac_mii_register(struct bgm
+               err = PTR_ERR(phy_dev);
+               goto err_unregister_bus;
+       }
+-      bgmac->phy_dev = phy_dev;
+       return err;
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -441,7 +441,6 @@ struct bgmac {
+       struct net_device *net_dev;
+       struct napi_struct napi;
+       struct mii_bus *mii_bus;
+-      struct phy_device *phy_dev;
+       /* DMA */
+       struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
diff --git a/target/linux/generic/patches-4.4/071-0000-net-bgmac-clarify-CONFIG_BCMA-dependency.patch b/target/linux/generic/patches-4.4/071-0000-net-bgmac-clarify-CONFIG_BCMA-dependency.patch
deleted file mode 100644 (file)
index cd0d098..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From 1f820f538f7396db7fd40684b9c3620816acc5a3 Mon Sep 17 00:00:00 2001
-From: Arnd Bergmann <arnd@arndb.de>
-Date: Fri, 29 Jan 2016 12:39:12 +0100
-Subject: [PATCH] net: bgmac: clarify CONFIG_BCMA dependency
-
-The bgmac driver depends on BCMA_HOST_SOC, which is only used
-when CONFIG_BCMA is enabled. However, it is a bool option and can
-be set when CONFIG_BCMA=m, and then bgmac can be built-in, leading
-to an obvious link error:
-
-drivers/built-in.o: In function `bgmac_init':
-:(.init.text+0x7f2c): undefined reference to `__bcma_driver_register'
-drivers/built-in.o: In function `bgmac_exit':
-:(.exit.text+0x110a): undefined reference to `bcma_driver_unregister'
-
-To avoid this case, we need to depend on both BCMA and BCMA_SOC,
-as this patch does. I'm also trying to make the dependency more
-readable by splitting it into three lines, and adding a COMPILE_TEST
-alternative so we can test-build it in all configurations that
-support BCMA.
-
-The added dependency on FIXED_PHY addresses a related issue where
-we cannot call fixed_phy_register() when CONFIG_FIXED_PHY=m and
-CONFIG_BGMAC=y.
-
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/Kconfig | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/broadcom/Kconfig
-+++ b/drivers/net/ethernet/broadcom/Kconfig
-@@ -151,8 +151,11 @@ config BNX2X_VXLAN
- config BGMAC
-       tristate "BCMA bus GBit core support"
--      depends on BCMA_HOST_SOC && HAS_DMA && (BCM47XX || ARCH_BCM_5301X)
-+      depends on BCMA && BCMA_HOST_SOC
-+      depends on HAS_DMA
-+      depends on BCM47XX || ARCH_BCM_5301X || COMPILE_TEST
-       select PHYLIB
-+      select FIXED_PHY
-       ---help---
-         This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
-         They can be found on BCM47xx SoCs and provide gigabit ethernet.
diff --git a/target/linux/generic/patches-4.4/071-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch b/target/linux/generic/patches-4.4/071-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch
deleted file mode 100644 (file)
index 0c00756..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-From 387b75f8b31437792e8334390fdf5cf060d1e3da Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Tue, 2 Feb 2016 07:47:14 +0100
-Subject: [PATCH] bgmac: add helper checking for BCM4707 / BCM53018 chip id
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Chipsets with BCM4707 / BCM53018 ID require special handling at a few
-places in the code. It's likely there will be more IDs to check in the
-future. To simplify it add this trivial helper.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 30 ++++++++++++++++--------------
- 1 file changed, 16 insertions(+), 14 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -26,6 +26,17 @@ static const struct bcma_device_id bgmac
- };
- MODULE_DEVICE_TABLE(bcma, bgmac_bcma_tbl);
-+static inline bool bgmac_is_bcm4707_family(struct bgmac *bgmac)
-+{
-+      switch (bgmac->core->bus->chipinfo.id) {
-+      case BCMA_CHIP_ID_BCM4707:
-+      case BCMA_CHIP_ID_BCM53018:
-+              return true;
-+      default:
-+              return false;
-+      }
-+}
-+
- static bool bgmac_wait_value(struct bcma_device *core, u16 reg, u32 mask,
-                            u32 value, int timeout)
- {
-@@ -990,11 +1001,9 @@ static void bgmac_mac_speed(struct bgmac
- static void bgmac_miiconfig(struct bgmac *bgmac)
- {
-       struct bcma_device *core = bgmac->core;
--      struct bcma_chipinfo *ci = &core->bus->chipinfo;
-       u8 imode;
--      if (ci->id == BCMA_CHIP_ID_BCM4707 ||
--          ci->id == BCMA_CHIP_ID_BCM53018) {
-+      if (bgmac_is_bcm4707_family(bgmac)) {
-               bcma_awrite32(core, BCMA_IOCTL,
-                             bcma_aread32(core, BCMA_IOCTL) | 0x40 |
-                             BGMAC_BCMA_IOCTL_SW_CLKEN);
-@@ -1058,9 +1067,7 @@ static void bgmac_chip_reset(struct bgma
-       }
-       /* Request Misc PLL for corerev > 2 */
--      if (core->id.rev > 2 &&
--          ci->id != BCMA_CHIP_ID_BCM4707 &&
--          ci->id != BCMA_CHIP_ID_BCM53018) {
-+      if (core->id.rev > 2 && !bgmac_is_bcm4707_family(bgmac)) {
-               bgmac_set(bgmac, BCMA_CLKCTLST,
-                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
-               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
-@@ -1196,8 +1203,7 @@ static void bgmac_enable(struct bgmac *b
-               break;
-       }
--      if (ci->id != BCMA_CHIP_ID_BCM4707 &&
--          ci->id != BCMA_CHIP_ID_BCM53018) {
-+      if (!bgmac_is_bcm4707_family(bgmac)) {
-               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
-               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
-               bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
-@@ -1475,14 +1481,12 @@ static int bgmac_fixed_phy_register(stru
- static int bgmac_mii_register(struct bgmac *bgmac)
- {
--      struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
-       struct mii_bus *mii_bus;
-       struct phy_device *phy_dev;
-       char bus_id[MII_BUS_ID_SIZE + 3];
-       int i, err = 0;
--      if (ci->id == BCMA_CHIP_ID_BCM4707 ||
--          ci->id == BCMA_CHIP_ID_BCM53018)
-+      if (bgmac_is_bcm4707_family(bgmac))
-               return bgmac_fixed_phy_register(bgmac);
-       mii_bus = mdiobus_alloc();
-@@ -1553,7 +1557,6 @@ static void bgmac_mii_unregister(struct
- /* 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 net_device *net_dev;
-       struct bgmac *bgmac;
-       struct ssb_sprom *sprom = &core->bus->sprom;
-@@ -1634,8 +1637,7 @@ static int bgmac_probe(struct bcma_devic
-       bgmac_chip_reset(bgmac);
-       /* For Northstar, we have to take all GMAC core out of reset */
--      if (ci->id == BCMA_CHIP_ID_BCM4707 ||
--          ci->id == BCMA_CHIP_ID_BCM53018) {
-+      if (bgmac_is_bcm4707_family(bgmac)) {
-               struct bcma_device *ns_core;
-               int ns_gmac;
diff --git a/target/linux/generic/patches-4.4/071-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch b/target/linux/generic/patches-4.4/071-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch
deleted file mode 100644 (file)
index d00c2bd..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-From 9e4e6206c67ae11d68fc96882256f37c237087d4 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Mon, 22 Feb 2016 22:51:13 +0100
-Subject: [PATCH] bgmac: support Ethernet device on BCM47094 SoC
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-It needs very similar workarounds to the one on BCM4707. It was tested
-on D-Link DIR-885L home router.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -30,6 +30,7 @@ static inline bool bgmac_is_bcm4707_fami
- {
-       switch (bgmac->core->bus->chipinfo.id) {
-       case BCMA_CHIP_ID_BCM4707:
-+      case BCMA_CHIP_ID_BCM47094:
-       case BCMA_CHIP_ID_BCM53018:
-               return true;
-       default:
-@@ -1055,8 +1056,9 @@ static void bgmac_chip_reset(struct bgma
-           (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
-               iost &= ~BGMAC_BCMA_IOST_ATTACHED;
--      /* 3GMAC: for BCM4707, only do core reset at bgmac_probe() */
--      if (ci->id != BCMA_CHIP_ID_BCM4707) {
-+      /* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
-+      if (ci->id != BCMA_CHIP_ID_BCM4707 &&
-+          ci->id != BCMA_CHIP_ID_BCM47094) {
-               flags = 0;
-               if (iost & BGMAC_BCMA_IOST_ATTACHED) {
-                       flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
diff --git a/target/linux/generic/patches-4.4/071-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch b/target/linux/generic/patches-4.4/071-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch
deleted file mode 100644 (file)
index 021a591..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From b4dfd8e92956b396d3438212bc9a0be6267b8b34 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Tue, 12 Apr 2016 13:30:45 +0200
-Subject: [PATCH] bgmac: reset & enable Ethernet core before using it
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This fixes Ethernet on D-Link DIR-885L with BCM47094 SoC. Felix reported
-similar fix was needed for his BCM4709 device (Buffalo WXR-1900DHP?).
-I tested this for regressions on BCM4706, BCM4708A0 and BCM47081A0.
-
-Cc: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1586,6 +1586,11 @@ static int bgmac_probe(struct bcma_devic
-               dev_warn(&core->dev, "Using random MAC: %pM\n", mac);
-       }
-+      /* This (reset &) enable is not preset in specs or reference driver but
-+       * Broadcom does it in arch PCI code when enabling fake PCI device.
-+       */
-+      bcma_core_enable(core, 0);
-+
-       /* Allocation and references */
-       net_dev = alloc_etherdev(sizeof(*bgmac));
-       if (!net_dev)
diff --git a/target/linux/generic/patches-4.4/071-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch b/target/linux/generic/patches-4.4/071-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch
deleted file mode 100644 (file)
index a5fcaab..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From c02bc350f9dbce7d637c394a6e1c4d29dc5b28b2 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Tue, 12 Apr 2016 18:27:29 +0200
-Subject: [PATCH] bgmac: fix MAC soft-reset bit for corerev > 4
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Only core revisions older than 4 use BGMAC_CMDCFG_SR_REV0. This mainly
-fixes support for BCM4708A0KF SoCs with Ethernet core rev 5 (it means
-only some devices as most of BCM4708A0KF-s got core rev 4).
-This was tested for regressions on BCM47094 which doesn't seem to care
-which bit gets used.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -199,9 +199,9 @@
- #define  BGMAC_CMDCFG_TAI                     0x00000200
- #define  BGMAC_CMDCFG_HD                      0x00000400      /* Set if in half duplex mode */
- #define  BGMAC_CMDCFG_HD_SHIFT                        10
--#define  BGMAC_CMDCFG_SR_REV0                 0x00000800      /* Set to reset mode, for other revs */
--#define  BGMAC_CMDCFG_SR_REV4                 0x00002000      /* Set to reset mode, only for core rev 4 */
--#define  BGMAC_CMDCFG_SR(rev)  ((rev == 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
-+#define  BGMAC_CMDCFG_SR_REV0                 0x00000800      /* Set to reset mode, for core rev 0-3 */
-+#define  BGMAC_CMDCFG_SR_REV4                 0x00002000      /* Set to reset mode, for core rev >= 4 */
-+#define  BGMAC_CMDCFG_SR(rev)  ((rev >= 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
- #define  BGMAC_CMDCFG_ML                      0x00008000      /* Set to activate mac loopback mode */
- #define  BGMAC_CMDCFG_AE                      0x00400000
- #define  BGMAC_CMDCFG_CFE                     0x00800000
diff --git a/target/linux/generic/patches-4.4/071-v4.7-0001-net-bgmac-Fix-SOF-bit-checking.patch b/target/linux/generic/patches-4.4/071-v4.7-0001-net-bgmac-Fix-SOF-bit-checking.patch
new file mode 100644 (file)
index 0000000..ea73fda
--- /dev/null
@@ -0,0 +1,37 @@
+From d2b13233879ca1268a1c027d4573109e5a777811 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 23 Jun 2016 14:23:12 -0700
+Subject: [PATCH 1/3] net: bgmac: Fix SOF bit checking
+
+We are checking for the Start of Frame bit in the ctl1 word, while this
+bit is set in the ctl0 word instead. Read the ctl0 word and update the
+check to verify that.
+
+Fixes: 9cde94506eac ("bgmac: implement scatter/gather support")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -269,15 +269,16 @@ static void bgmac_dma_tx_free(struct bgm
+       while (ring->start != ring->end) {
+               int slot_idx = ring->start % BGMAC_TX_RING_SLOTS;
+               struct bgmac_slot_info *slot = &ring->slots[slot_idx];
+-              u32 ctl1;
++              u32 ctl0, ctl1;
+               int len;
+               if (slot_idx == empty_slot)
+                       break;
++              ctl0 = le32_to_cpu(ring->cpu_base[slot_idx].ctl0);
+               ctl1 = le32_to_cpu(ring->cpu_base[slot_idx].ctl1);
+               len = ctl1 & BGMAC_DESC_CTL1_LEN;
+-              if (ctl1 & BGMAC_DESC_CTL0_SOF)
++              if (ctl0 & BGMAC_DESC_CTL0_SOF)
+                       /* Unmap no longer used buffer */
+                       dma_unmap_single(dma_dev, slot->dma_addr, len,
+                                        DMA_TO_DEVICE);
diff --git a/target/linux/generic/patches-4.4/071-v4.7-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch b/target/linux/generic/patches-4.4/071-v4.7-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch
new file mode 100644 (file)
index 0000000..6a866bc
--- /dev/null
@@ -0,0 +1,28 @@
+From c3897f2a69e54dd113fc9abd2daf872e5b495798 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 23 Jun 2016 14:25:32 -0700
+Subject: [PATCH 2/3] net: bgmac: Start transmit queue in bgmac_open
+
+The driver does not start the transmit queue in bgmac_open(). If the
+queue was stopped prior to closing then re-opening the interface, we
+would never be able to wake-up again.
+
+Fixes: dd4544f05469 ("bgmac: driver for GBit MAC core on BCMA bus")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1327,6 +1327,9 @@ static int bgmac_open(struct net_device
+       phy_start(net_dev->phydev);
+       netif_carrier_on(net_dev);
++
++      netif_start_queue(net_dev);
++
+       return 0;
+ }
diff --git a/target/linux/generic/patches-4.4/071-v4.7-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch b/target/linux/generic/patches-4.4/071-v4.7-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch
new file mode 100644 (file)
index 0000000..0edf9ee
--- /dev/null
@@ -0,0 +1,28 @@
+From 3894396e64994f31c3ef5c7e6f63dded0593e567 Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Thu, 23 Jun 2016 14:25:33 -0700
+Subject: [PATCH 3/3] net: bgmac: Remove superflous netif_carrier_on()
+
+bgmac_open() calls phy_start() to initialize the PHY state machine,
+which will set the interface's carrier state accordingly, no need to
+force that as this could be conflicting with the PHY state determined by
+PHYLIB.
+
+Fixes: dd4544f05469 ("bgmac: driver for GBit MAC core on BCMA bus")
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1326,8 +1326,6 @@ static int bgmac_open(struct net_device
+       phy_start(net_dev->phydev);
+-      netif_carrier_on(net_dev);
+-
+       netif_start_queue(net_dev);
+       return 0;
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch b/target/linux/generic/patches-4.4/071-v4.8-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch
new file mode 100644 (file)
index 0000000..3837b60
--- /dev/null
@@ -0,0 +1,407 @@
+From d00a8281bcc962027dfe409c2f3e3f0546be9200 Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@broadcom.com>
+Date: Thu, 7 Jul 2016 19:08:53 -0400
+Subject: [PATCH 1/5] net: ethernet: bgmac: change bgmac_* prints to dev_*
+ prints
+
+The bgmac_* print wrappers call dev_* prints with the dev pointer from
+the bcma core.  In anticipation of removing the bcma requirement for
+this driver, these must be changed to not reference that struct.  So,
+simply change all of the bgmac_* prints to their dev_* counterparts.  In
+some cases netdev_* prints are more appropriate, so change those as
+well.
+
+Signed-off-by: Jon Mason <jon.mason@broadcom.com>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Tested-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 103 +++++++++++++++++-----------------
+ drivers/net/ethernet/broadcom/bgmac.h |  14 +----
+ 2 files changed, 55 insertions(+), 62 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -50,7 +50,7 @@ static bool bgmac_wait_value(struct bcma
+                       return true;
+               udelay(10);
+       }
+-      pr_err("Timeout waiting for reg 0x%X\n", reg);
++      dev_err(&core->dev, "Timeout waiting for reg 0x%X\n", reg);
+       return false;
+ }
+@@ -84,8 +84,8 @@ static void bgmac_dma_tx_reset(struct bg
+               udelay(10);
+       }
+       if (i)
+-              bgmac_err(bgmac, "Timeout suspending DMA TX ring 0x%X (BGMAC_DMA_TX_STAT: 0x%08X)\n",
+-                        ring->mmio_base, val);
++              dev_err(bgmac->dev, "Timeout suspending DMA TX ring 0x%X (BGMAC_DMA_TX_STAT: 0x%08X)\n",
++                      ring->mmio_base, val);
+       /* Remove SUSPEND bit */
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, 0);
+@@ -93,13 +93,13 @@ static void bgmac_dma_tx_reset(struct bg
+                             ring->mmio_base + BGMAC_DMA_TX_STATUS,
+                             BGMAC_DMA_TX_STAT, BGMAC_DMA_TX_STAT_DISABLED,
+                             10000)) {
+-              bgmac_warn(bgmac, "DMA TX ring 0x%X wasn't disabled on time, waiting additional 300us\n",
+-                         ring->mmio_base);
++              dev_warn(bgmac->dev, "DMA TX ring 0x%X wasn't disabled on time, waiting additional 300us\n",
++                       ring->mmio_base);
+               udelay(300);
+               val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
+               if ((val & BGMAC_DMA_TX_STAT) != BGMAC_DMA_TX_STAT_DISABLED)
+-                      bgmac_err(bgmac, "Reset of DMA TX ring 0x%X failed\n",
+-                                ring->mmio_base);
++                      dev_err(bgmac->dev, "Reset of DMA TX ring 0x%X failed\n",
++                              ring->mmio_base);
+       }
+ }
+@@ -161,7 +161,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
+       int i;
+       if (skb->len > BGMAC_DESC_CTL1_LEN) {
+-              bgmac_err(bgmac, "Too long skb (%d)\n", skb->len);
++              netdev_err(bgmac->net_dev, "Too long skb (%d)\n", skb->len);
+               goto err_drop;
+       }
+@@ -174,7 +174,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
+        * even when ring->end overflows
+        */
+       if (ring->end - ring->start + nr_frags + 1 >= BGMAC_TX_RING_SLOTS) {
+-              bgmac_err(bgmac, "TX ring is full, queue should be stopped!\n");
++              netdev_err(bgmac->net_dev, "TX ring is full, queue should be stopped!\n");
+               netif_stop_queue(net_dev);
+               return NETDEV_TX_BUSY;
+       }
+@@ -241,8 +241,8 @@ err_dma:
+       }
+ err_dma_head:
+-      bgmac_err(bgmac, "Mapping error of skb on ring 0x%X\n",
+-                ring->mmio_base);
++      netdev_err(bgmac->net_dev, "Mapping error of skb on ring 0x%X\n",
++                 ring->mmio_base);
+ err_drop:
+       dev_kfree_skb(skb);
+@@ -321,8 +321,8 @@ static void bgmac_dma_rx_reset(struct bg
+                             ring->mmio_base + BGMAC_DMA_RX_STATUS,
+                             BGMAC_DMA_RX_STAT, BGMAC_DMA_RX_STAT_DISABLED,
+                             10000))
+-              bgmac_err(bgmac, "Reset of ring 0x%X RX failed\n",
+-                        ring->mmio_base);
++              dev_err(bgmac->dev, "Reset of ring 0x%X RX failed\n",
++                      ring->mmio_base);
+ }
+ static void bgmac_dma_rx_enable(struct bgmac *bgmac,
+@@ -374,7 +374,7 @@ static int bgmac_dma_rx_skb_for_slot(str
+       dma_addr = dma_map_single(dma_dev, buf + BGMAC_RX_BUF_OFFSET,
+                                 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
+       if (dma_mapping_error(dma_dev, dma_addr)) {
+-              bgmac_err(bgmac, "DMA mapping error\n");
++              netdev_err(bgmac->net_dev, "DMA mapping error\n");
+               put_page(virt_to_head_page(buf));
+               return -ENOMEM;
+       }
+@@ -469,16 +469,16 @@ static int bgmac_dma_rx_read(struct bgma
+                       /* Check for poison and drop or pass the packet */
+                       if (len == 0xdead && flags == 0xbeef) {
+-                              bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
+-                                        ring->start);
++                              netdev_err(bgmac->net_dev, "Found poisoned packet at slot %d, DMA issue!\n",
++                                         ring->start);
+                               put_page(virt_to_head_page(buf));
+                               bgmac->net_dev->stats.rx_errors++;
+                               break;
+                       }
+                       if (len > BGMAC_RX_ALLOC_SIZE) {
+-                              bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n",
+-                                        ring->start);
++                              netdev_err(bgmac->net_dev, "Found oversized packet at slot %d, DMA issue!\n",
++                                         ring->start);
+                               put_page(virt_to_head_page(buf));
+                               bgmac->net_dev->stats.rx_length_errors++;
+                               bgmac->net_dev->stats.rx_errors++;
+@@ -490,7 +490,7 @@ static int bgmac_dma_rx_read(struct bgma
+                       skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
+                       if (unlikely(!skb)) {
+-                              bgmac_err(bgmac, "build_skb failed\n");
++                              netdev_err(bgmac->net_dev, "build_skb failed\n");
+                               put_page(virt_to_head_page(buf));
+                               bgmac->net_dev->stats.rx_errors++;
+                               break;
+@@ -644,7 +644,7 @@ static int bgmac_dma_alloc(struct bgmac
+       BUILD_BUG_ON(BGMAC_MAX_RX_RINGS > ARRAY_SIZE(ring_base));
+       if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) {
+-              bgmac_err(bgmac, "Core does not report 64-bit DMA\n");
++              dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
+               return -ENOTSUPP;
+       }
+@@ -658,8 +658,8 @@ static int bgmac_dma_alloc(struct bgmac
+                                                    &ring->dma_base,
+                                                    GFP_KERNEL);
+               if (!ring->cpu_base) {
+-                      bgmac_err(bgmac, "Allocation of TX ring 0x%X failed\n",
+-                                ring->mmio_base);
++                      dev_err(bgmac->dev, "Allocation of TX ring 0x%X failed\n",
++                              ring->mmio_base);
+                       goto err_dma_free;
+               }
+@@ -683,8 +683,8 @@ static int bgmac_dma_alloc(struct bgmac
+                                                    &ring->dma_base,
+                                                    GFP_KERNEL);
+               if (!ring->cpu_base) {
+-                      bgmac_err(bgmac, "Allocation of RX ring 0x%X failed\n",
+-                                ring->mmio_base);
++                      dev_err(bgmac->dev, "Allocation of RX ring 0x%X failed\n",
++                              ring->mmio_base);
+                       err = -ENOMEM;
+                       goto err_dma_free;
+               }
+@@ -803,8 +803,8 @@ static u16 bgmac_phy_read(struct bgmac *
+       bcma_write32(core, phy_access_addr, tmp);
+       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
+-              bgmac_err(bgmac, "Reading PHY %d register 0x%X failed\n",
+-                        phyaddr, reg);
++              dev_err(bgmac->dev, "Reading PHY %d register 0x%X failed\n",
++                      phyaddr, reg);
+               return 0xffff;
+       }
+@@ -836,7 +836,7 @@ static int bgmac_phy_write(struct bgmac
+       bgmac_write(bgmac, BGMAC_INT_STATUS, BGMAC_IS_MDIO);
+       if (bgmac_read(bgmac, BGMAC_INT_STATUS) & BGMAC_IS_MDIO)
+-              bgmac_warn(bgmac, "Error setting MDIO int\n");
++              dev_warn(bgmac->dev, "Error setting MDIO int\n");
+       tmp = BGMAC_PA_START;
+       tmp |= BGMAC_PA_WRITE;
+@@ -846,8 +846,8 @@ static int bgmac_phy_write(struct bgmac
+       bcma_write32(core, phy_access_addr, tmp);
+       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
+-              bgmac_err(bgmac, "Writing to PHY %d register 0x%X failed\n",
+-                        phyaddr, reg);
++              dev_err(bgmac->dev, "Writing to PHY %d register 0x%X failed\n",
++                      phyaddr, reg);
+               return -ETIMEDOUT;
+       }
+@@ -900,7 +900,7 @@ static void bgmac_phy_reset(struct bgmac
+       bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET);
+       udelay(100);
+       if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET)
+-              bgmac_err(bgmac, "PHY reset failed\n");
++              dev_err(bgmac->dev, "PHY reset failed\n");
+       bgmac_phy_init(bgmac);
+ }
+@@ -1001,7 +1001,8 @@ static void bgmac_mac_speed(struct bgmac
+               set |= BGMAC_CMDCFG_ES_2500;
+               break;
+       default:
+-              bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed);
++              dev_err(bgmac->dev, "Unsupported speed: %d\n",
++                      bgmac->mac_speed);
+       }
+       if (bgmac->mac_duplex == DUPLEX_HALF)
+@@ -1100,8 +1101,8 @@ static void bgmac_chip_reset(struct bgma
+               if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
+                       if (kstrtou8(buf, 0, &et_swtype))
+-                              bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n",
+-                                        buf);
++                              dev_err(bgmac->dev, "Failed to parse et_swtype (%s)\n",
++                                      buf);
+                       et_swtype &= 0x0f;
+                       et_swtype <<= 4;
+                       sw_type = et_swtype;
+@@ -1264,7 +1265,7 @@ static irqreturn_t bgmac_interrupt(int i
+       int_status &= ~(BGMAC_IS_TX0 | BGMAC_IS_RX);
+       if (int_status)
+-              bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", int_status);
++              dev_err(bgmac->dev, "Unknown IRQs: 0x%08X\n", int_status);
+       /* Disable new interrupts until handling existing ones */
+       bgmac_chip_intrs_off(bgmac);
+@@ -1318,7 +1319,7 @@ static int bgmac_open(struct net_device
+       err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED,
+                         KBUILD_MODNAME, net_dev);
+       if (err < 0) {
+-              bgmac_err(bgmac, "IRQ request error: %d!\n", err);
++              dev_err(bgmac->dev, "IRQ request error: %d!\n", err);
+               bgmac_dma_cleanup(bgmac);
+               return err;
+       }
+@@ -1599,14 +1600,14 @@ static int bgmac_fixed_phy_register(stru
+       phy_dev = fixed_phy_register(PHY_POLL, &fphy_status, -1, NULL);
+       if (!phy_dev || IS_ERR(phy_dev)) {
+-              bgmac_err(bgmac, "Failed to register fixed PHY device\n");
++              dev_err(bgmac->dev, "Failed to register fixed PHY device\n");
+               return -ENODEV;
+       }
+       err = phy_connect_direct(bgmac->net_dev, phy_dev, bgmac_adjust_link,
+                                PHY_INTERFACE_MODE_MII);
+       if (err) {
+-              bgmac_err(bgmac, "Connecting PHY failed\n");
++              dev_err(bgmac->dev, "Connecting PHY failed\n");
+               return err;
+       }
+@@ -1646,7 +1647,7 @@ static int bgmac_mii_register(struct bgm
+       err = mdiobus_register(mii_bus);
+       if (err) {
+-              bgmac_err(bgmac, "Registration of mii bus failed\n");
++              dev_err(bgmac->dev, "Registration of mii bus failed\n");
+               goto err_free_irq;
+       }
+@@ -1658,7 +1659,7 @@ static int bgmac_mii_register(struct bgm
+       phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
+                             PHY_INTERFACE_MODE_MII);
+       if (IS_ERR(phy_dev)) {
+-              bgmac_err(bgmac, "PHY connecton failed\n");
++              dev_err(bgmac->dev, "PHY connecton failed\n");
+               err = PTR_ERR(phy_dev);
+               goto err_unregister_bus;
+       }
+@@ -1707,7 +1708,8 @@ static int bgmac_probe(struct bcma_devic
+               mac = sprom->et2mac;
+               break;
+       default:
+-              pr_err("Unsupported core_unit %d\n", core->core_unit);
++              dev_err(&core->dev, "Unsupported core_unit %d\n",
++                      core->core_unit);
+               return -ENOTSUPP;
+       }
+@@ -1730,6 +1732,7 @@ static int bgmac_probe(struct bcma_devic
+       net_dev->irq = core->irq;
+       net_dev->ethtool_ops = &bgmac_ethtool_ops;
+       bgmac = netdev_priv(net_dev);
++      bgmac->dev = &core->dev;
+       bgmac->net_dev = net_dev;
+       bgmac->core = core;
+       bcma_set_drvdata(core, bgmac);
+@@ -1741,7 +1744,7 @@ static int bgmac_probe(struct bcma_devic
+       /* On BCM4706 we need common core to access PHY */
+       if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
+           !core->bus->drv_gmac_cmn.core) {
+-              bgmac_err(bgmac, "GMAC CMN core not found (required for BCM4706)\n");
++              dev_err(bgmac->dev, "GMAC CMN core not found (required for BCM4706)\n");
+               err = -ENODEV;
+               goto err_netdev_free;
+       }
+@@ -1760,15 +1763,15 @@ static int bgmac_probe(struct bcma_devic
+       }
+       bgmac->phyaddr &= BGMAC_PHY_MASK;
+       if (bgmac->phyaddr == BGMAC_PHY_MASK) {
+-              bgmac_err(bgmac, "No PHY found\n");
++              dev_err(bgmac->dev, "No PHY found\n");
+               err = -ENODEV;
+               goto err_netdev_free;
+       }
+-      bgmac_info(bgmac, "Found PHY addr: %d%s\n", bgmac->phyaddr,
+-                 bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
++      dev_info(bgmac->dev, "Found PHY addr: %d%s\n", bgmac->phyaddr,
++               bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
+       if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
+-              bgmac_err(bgmac, "PCI setup not implemented\n");
++              dev_err(bgmac->dev, "PCI setup not implemented\n");
+               err = -ENOTSUPP;
+               goto err_netdev_free;
+       }
+@@ -1797,7 +1800,7 @@ static int bgmac_probe(struct bcma_devic
+       err = bgmac_dma_alloc(bgmac);
+       if (err) {
+-              bgmac_err(bgmac, "Unable to alloc memory for DMA\n");
++              dev_err(bgmac->dev, "Unable to alloc memory for DMA\n");
+               goto err_netdev_free;
+       }
+@@ -1811,16 +1814,16 @@ static int bgmac_probe(struct bcma_devic
+       bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
+                              BGMAC_BFL_ENETROBO);
+       if (bgmac->has_robosw)
+-              bgmac_warn(bgmac, "Support for Roboswitch not implemented\n");
++              dev_warn(bgmac->dev, "Support for Roboswitch not implemented\n");
+       if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
+-              bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n");
++              dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
+       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
+       err = bgmac_mii_register(bgmac);
+       if (err) {
+-              bgmac_err(bgmac, "Cannot register MDIO\n");
++              dev_err(bgmac->dev, "Cannot connect to phy\n");
+               goto err_dma_free;
+       }
+@@ -1830,7 +1833,7 @@ static int bgmac_probe(struct bcma_devic
+       err = register_netdev(bgmac->net_dev);
+       if (err) {
+-              bgmac_err(bgmac, "Cannot register net device\n");
++              dev_err(bgmac->dev, "Cannot register net device\n");
+               goto err_mii_unregister;
+       }
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -1,17 +1,6 @@
+ #ifndef _BGMAC_H
+ #define _BGMAC_H
+-#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
+-
+-#define bgmac_err(bgmac, fmt, ...) \
+-      dev_err(&(bgmac)->core->dev, fmt, ##__VA_ARGS__)
+-#define bgmac_warn(bgmac, fmt, ...) \
+-      dev_warn(&(bgmac)->core->dev, fmt,  ##__VA_ARGS__)
+-#define bgmac_info(bgmac, fmt, ...) \
+-      dev_info(&(bgmac)->core->dev, fmt,  ##__VA_ARGS__)
+-#define bgmac_dbg(bgmac, fmt, ...) \
+-      dev_dbg(&(bgmac)->core->dev, fmt, ##__VA_ARGS__)
+-
+ #include <linux/bcma/bcma.h>
+ #include <linux/brcmphy.h>
+ #include <linux/netdevice.h>
+@@ -438,6 +427,8 @@ struct bgmac_rx_header {
+ struct bgmac {
+       struct bcma_device *core;
+       struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
++
++      struct device *dev;
+       struct net_device *net_dev;
+       struct napi_struct napi;
+       struct mii_bus *mii_bus;
+@@ -489,5 +480,4 @@ static inline void bgmac_set(struct bgma
+ {
+       bgmac_maskset(bgmac, offset, ~0, set);
+ }
+-
+ #endif /* _BGMAC_H */
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch b/target/linux/generic/patches-4.4/071-v4.8-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch
new file mode 100644 (file)
index 0000000..dd5b877
--- /dev/null
@@ -0,0 +1,112 @@
+From a0b68486f6f680c7c0352a47c60042d7d95ffd87 Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@broadcom.com>
+Date: Thu, 7 Jul 2016 19:08:54 -0400
+Subject: [PATCH 2/5] net: ethernet: bgmac: add dma_dev pointer
+
+The dma buffer allocation, etc references a dma_dev device pointer from
+the bcma core.  In anticipation of removing the bcma requirement for
+this driver, these must be changed to not reference that struct.  Add a
+dma_dev device pointer to the bgmac stuct and reference that instead.
+
+Signed-off-by: Jon Mason <jon.mason@broadcom.com>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Tested-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 17 +++++++++--------
+ drivers/net/ethernet/broadcom/bgmac.h |  1 +
+ 2 files changed, 10 insertions(+), 8 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -152,7 +152,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
+                                   struct bgmac_dma_ring *ring,
+                                   struct sk_buff *skb)
+ {
+-      struct device *dma_dev = bgmac->core->dma_dev;
++      struct device *dma_dev = bgmac->dma_dev;
+       struct net_device *net_dev = bgmac->net_dev;
+       int index = ring->end % BGMAC_TX_RING_SLOTS;
+       struct bgmac_slot_info *slot = &ring->slots[index];
+@@ -254,7 +254,7 @@ err_drop:
+ /* Free transmitted packets */
+ static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
+ {
+-      struct device *dma_dev = bgmac->core->dma_dev;
++      struct device *dma_dev = bgmac->dma_dev;
+       int empty_slot;
+       bool freed = false;
+       unsigned bytes_compl = 0, pkts_compl = 0;
+@@ -355,7 +355,7 @@ static void bgmac_dma_rx_enable(struct b
+ static int bgmac_dma_rx_skb_for_slot(struct bgmac *bgmac,
+                                    struct bgmac_slot_info *slot)
+ {
+-      struct device *dma_dev = bgmac->core->dma_dev;
++      struct device *dma_dev = bgmac->dma_dev;
+       dma_addr_t dma_addr;
+       struct bgmac_rx_header *rx;
+       void *buf;
+@@ -444,7 +444,7 @@ static int bgmac_dma_rx_read(struct bgma
+       end_slot /= sizeof(struct bgmac_dma_desc);
+       while (ring->start != end_slot) {
+-              struct device *dma_dev = bgmac->core->dma_dev;
++              struct device *dma_dev = bgmac->dma_dev;
+               struct bgmac_slot_info *slot = &ring->slots[ring->start];
+               struct bgmac_rx_header *rx = slot->buf + BGMAC_RX_BUF_OFFSET;
+               struct sk_buff *skb;
+@@ -547,7 +547,7 @@ static bool bgmac_dma_unaligned(struct b
+ static void bgmac_dma_tx_ring_free(struct bgmac *bgmac,
+                                  struct bgmac_dma_ring *ring)
+ {
+-      struct device *dma_dev = bgmac->core->dma_dev;
++      struct device *dma_dev = bgmac->dma_dev;
+       struct bgmac_dma_desc *dma_desc = ring->cpu_base;
+       struct bgmac_slot_info *slot;
+       int i;
+@@ -573,7 +573,7 @@ static void bgmac_dma_tx_ring_free(struc
+ static void bgmac_dma_rx_ring_free(struct bgmac *bgmac,
+                                  struct bgmac_dma_ring *ring)
+ {
+-      struct device *dma_dev = bgmac->core->dma_dev;
++      struct device *dma_dev = bgmac->dma_dev;
+       struct bgmac_slot_info *slot;
+       int i;
+@@ -594,7 +594,7 @@ static void bgmac_dma_ring_desc_free(str
+                                    struct bgmac_dma_ring *ring,
+                                    int num_slots)
+ {
+-      struct device *dma_dev = bgmac->core->dma_dev;
++      struct device *dma_dev = bgmac->dma_dev;
+       int size;
+       if (!ring->cpu_base)
+@@ -632,7 +632,7 @@ static void bgmac_dma_free(struct bgmac
+ static int bgmac_dma_alloc(struct bgmac *bgmac)
+ {
+-      struct device *dma_dev = bgmac->core->dma_dev;
++      struct device *dma_dev = bgmac->dma_dev;
+       struct bgmac_dma_ring *ring;
+       static const u16 ring_base[] = { BGMAC_DMA_BASE0, BGMAC_DMA_BASE1,
+                                        BGMAC_DMA_BASE2, BGMAC_DMA_BASE3, };
+@@ -1733,6 +1733,7 @@ static int bgmac_probe(struct bcma_devic
+       net_dev->ethtool_ops = &bgmac_ethtool_ops;
+       bgmac = netdev_priv(net_dev);
+       bgmac->dev = &core->dev;
++      bgmac->dma_dev = core->dma_dev;
+       bgmac->net_dev = net_dev;
+       bgmac->core = core;
+       bcma_set_drvdata(core, bgmac);
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -429,6 +429,7 @@ struct bgmac {
+       struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
+       struct device *dev;
++      struct device *dma_dev;
+       struct net_device *net_dev;
+       struct napi_struct napi;
+       struct mii_bus *mii_bus;
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch b/target/linux/generic/patches-4.4/071-v4.8-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch
new file mode 100644 (file)
index 0000000..bc7b246
--- /dev/null
@@ -0,0 +1,676 @@
+From 55954f3bfdacc5908515b0c306cea23e77fab740 Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@broadcom.com>
+Date: Thu, 7 Jul 2016 19:08:55 -0400
+Subject: [PATCH 3/5] net: ethernet: bgmac: move BCMA MDIO Phy code into a
+ separate file
+
+Move the BCMA MDIO phy into a separate file, as it is very tightly
+coupled with the BCMA bus.  This will help with the upcoming BCMA
+removal from the bgmac driver.  Optimally, this should be moved into
+phy drivers, but it is too tightly coupled with the bgmac driver to
+effectively move it without more changes to the driver.
+
+Note: the phy_reset was intentionally removed, as the mdio phy subsystem
+automatically resets the phy if a reset function pointer is present.  In
+addition to the moving of the driver, this reset function is added.
+
+Signed-off-by: Jon Mason <jon.mason@broadcom.com>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Tested-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/Makefile          |   2 +-
+ drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c | 264 ++++++++++++++++++++++++
+ drivers/net/ethernet/broadcom/bgmac.c           | 246 +++-------------------
+ drivers/net/ethernet/broadcom/bgmac.h           |   3 +
+ 4 files changed, 298 insertions(+), 217 deletions(-)
+ create mode 100644 drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
+
+--- a/drivers/net/ethernet/broadcom/Makefile
++++ b/drivers/net/ethernet/broadcom/Makefile
+@@ -10,6 +10,6 @@ obj-$(CONFIG_CNIC) += cnic.o
+ obj-$(CONFIG_BNX2X) += bnx2x/
+ obj-$(CONFIG_SB1250_MAC) += sb1250-mac.o
+ obj-$(CONFIG_TIGON3) += tg3.o
+-obj-$(CONFIG_BGMAC) += bgmac.o
++obj-$(CONFIG_BGMAC) += bgmac.o bgmac-bcma-mdio.o
+ obj-$(CONFIG_SYSTEMPORT) += bcmsysport.o
+ obj-$(CONFIG_BNXT) += bnxt/
+--- /dev/null
++++ b/drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
+@@ -0,0 +1,275 @@
++/*
++ * Driver for (BCM4706)? GBit MAC core on BCMA bus.
++ *
++ * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com>
++ *
++ * Licensed under the GNU/GPL. See COPYING for details.
++ */
++
++#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
++
++#include <linux/bcma/bcma.h>
++#include <linux/brcmphy.h>
++#include "bgmac.h"
++
++struct bcma_mdio {
++      struct bcma_device *core;
++      u8 phyaddr;
++};
++
++static bool bcma_mdio_wait_value(struct bcma_device *core, u16 reg, u32 mask,
++                               u32 value, int timeout)
++{
++      u32 val;
++      int i;
++
++      for (i = 0; i < timeout / 10; i++) {
++              val = bcma_read32(core, reg);
++              if ((val & mask) == value)
++                      return true;
++              udelay(10);
++      }
++      dev_err(&core->dev, "Timeout waiting for reg 0x%X\n", reg);
++      return false;
++}
++
++/**************************************************
++ * PHY ops
++ **************************************************/
++
++static u16 bcma_mdio_phy_read(struct bcma_mdio *bcma_mdio, u8 phyaddr, u8 reg)
++{
++      struct bcma_device *core;
++      u16 phy_access_addr;
++      u16 phy_ctl_addr;
++      u32 tmp;
++
++      BUILD_BUG_ON(BGMAC_PA_DATA_MASK != BCMA_GMAC_CMN_PA_DATA_MASK);
++      BUILD_BUG_ON(BGMAC_PA_ADDR_MASK != BCMA_GMAC_CMN_PA_ADDR_MASK);
++      BUILD_BUG_ON(BGMAC_PA_ADDR_SHIFT != BCMA_GMAC_CMN_PA_ADDR_SHIFT);
++      BUILD_BUG_ON(BGMAC_PA_REG_MASK != BCMA_GMAC_CMN_PA_REG_MASK);
++      BUILD_BUG_ON(BGMAC_PA_REG_SHIFT != BCMA_GMAC_CMN_PA_REG_SHIFT);
++      BUILD_BUG_ON(BGMAC_PA_WRITE != BCMA_GMAC_CMN_PA_WRITE);
++      BUILD_BUG_ON(BGMAC_PA_START != BCMA_GMAC_CMN_PA_START);
++      BUILD_BUG_ON(BGMAC_PC_EPA_MASK != BCMA_GMAC_CMN_PC_EPA_MASK);
++      BUILD_BUG_ON(BGMAC_PC_MCT_MASK != BCMA_GMAC_CMN_PC_MCT_MASK);
++      BUILD_BUG_ON(BGMAC_PC_MCT_SHIFT != BCMA_GMAC_CMN_PC_MCT_SHIFT);
++      BUILD_BUG_ON(BGMAC_PC_MTE != BCMA_GMAC_CMN_PC_MTE);
++
++      if (bcma_mdio->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
++              core = bcma_mdio->core->bus->drv_gmac_cmn.core;
++              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
++              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
++      } else {
++              core = bcma_mdio->core;
++              phy_access_addr = BGMAC_PHY_ACCESS;
++              phy_ctl_addr = BGMAC_PHY_CNTL;
++      }
++
++      tmp = bcma_read32(core, phy_ctl_addr);
++      tmp &= ~BGMAC_PC_EPA_MASK;
++      tmp |= phyaddr;
++      bcma_write32(core, phy_ctl_addr, tmp);
++
++      tmp = BGMAC_PA_START;
++      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
++      tmp |= reg << BGMAC_PA_REG_SHIFT;
++      bcma_write32(core, phy_access_addr, tmp);
++
++      if (!bcma_mdio_wait_value(core, phy_access_addr, BGMAC_PA_START, 0,
++                                1000)) {
++              dev_err(&core->dev, "Reading PHY %d register 0x%X failed\n",
++                      phyaddr, reg);
++              return 0xffff;
++      }
++
++      return bcma_read32(core, phy_access_addr) & BGMAC_PA_DATA_MASK;
++}
++
++/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphywr */
++static int bcma_mdio_phy_write(struct bcma_mdio *bcma_mdio, u8 phyaddr, u8 reg,
++                             u16 value)
++{
++      struct bcma_device *core;
++      u16 phy_access_addr;
++      u16 phy_ctl_addr;
++      u32 tmp;
++
++      if (bcma_mdio->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
++              core = bcma_mdio->core->bus->drv_gmac_cmn.core;
++              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
++              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
++      } else {
++              core = bcma_mdio->core;
++              phy_access_addr = BGMAC_PHY_ACCESS;
++              phy_ctl_addr = BGMAC_PHY_CNTL;
++      }
++
++      tmp = bcma_read32(core, phy_ctl_addr);
++      tmp &= ~BGMAC_PC_EPA_MASK;
++      tmp |= phyaddr;
++      bcma_write32(core, phy_ctl_addr, tmp);
++
++      bcma_write32(bcma_mdio->core, BGMAC_INT_STATUS, BGMAC_IS_MDIO);
++      if (bcma_read32(bcma_mdio->core, BGMAC_INT_STATUS) & BGMAC_IS_MDIO)
++              dev_warn(&core->dev, "Error setting MDIO int\n");
++
++      tmp = BGMAC_PA_START;
++      tmp |= BGMAC_PA_WRITE;
++      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
++      tmp |= reg << BGMAC_PA_REG_SHIFT;
++      tmp |= value;
++      bcma_write32(core, phy_access_addr, tmp);
++
++      if (!bcma_mdio_wait_value(core, phy_access_addr, BGMAC_PA_START, 0,
++                                1000)) {
++              dev_err(&core->dev, "Writing to PHY %d register 0x%X failed\n",
++                      phyaddr, reg);
++              return -ETIMEDOUT;
++      }
++
++      return 0;
++}
++
++/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
++static void bcma_mdio_phy_init(struct bcma_mdio *bcma_mdio)
++{
++      struct bcma_chipinfo *ci = &bcma_mdio->core->bus->chipinfo;
++      u8 i;
++
++      if (ci->id == BCMA_CHIP_ID_BCM5356) {
++              for (i = 0; i < 5; i++) {
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x008b);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x15, 0x0100);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000f);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x12, 0x2aaa);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000b);
++              }
++      }
++      if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg != 10) ||
++          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg != 10) ||
++          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg != 9)) {
++              struct bcma_drv_cc *cc = &bcma_mdio->core->bus->drv_cc;
++
++              bcma_chipco_chipctl_maskset(cc, 2, ~0xc0000000, 0);
++              bcma_chipco_chipctl_maskset(cc, 4, ~0x80000000, 0);
++              for (i = 0; i < 5; i++) {
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000f);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x16, 0x5284);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000b);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x0010);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000f);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x16, 0x5296);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x1073);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x9073);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x16, 0x52b6);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x9273);
++                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000b);
++              }
++      }
++}
++
++/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyreset */
++static int bcma_mdio_phy_reset(struct mii_bus *bus)
++{
++      struct bcma_mdio *bcma_mdio = bus->priv;
++      u8 phyaddr = bcma_mdio->phyaddr;
++
++      if (bcma_mdio->phyaddr == BGMAC_PHY_NOREGS)
++              return 0;
++
++      bcma_mdio_phy_write(bcma_mdio, phyaddr, MII_BMCR, BMCR_RESET);
++      udelay(100);
++      if (bcma_mdio_phy_read(bcma_mdio, phyaddr, MII_BMCR) & BMCR_RESET)
++              dev_err(&bcma_mdio->core->dev, "PHY reset failed\n");
++      bcma_mdio_phy_init(bcma_mdio);
++
++      return 0;
++}
++
++/**************************************************
++ * MII
++ **************************************************/
++
++static int bcma_mdio_mii_read(struct mii_bus *bus, int mii_id, int regnum)
++{
++      return bcma_mdio_phy_read(bus->priv, mii_id, regnum);
++}
++
++static int bcma_mdio_mii_write(struct mii_bus *bus, int mii_id, int regnum,
++                             u16 value)
++{
++      return bcma_mdio_phy_write(bus->priv, mii_id, regnum, value);
++}
++
++struct mii_bus *bcma_mdio_mii_register(struct bcma_device *core, u8 phyaddr)
++{
++      struct bcma_mdio *bcma_mdio;
++      struct mii_bus *mii_bus;
++      int i, err;
++
++      bcma_mdio = kzalloc(sizeof(*bcma_mdio), GFP_KERNEL);
++      if (!bcma_mdio)
++              return ERR_PTR(-ENOMEM);
++
++      mii_bus = mdiobus_alloc();
++      if (!mii_bus) {
++              err = -ENOMEM;
++              goto err;
++      }
++
++      mii_bus->name = "bcma_mdio mii bus";
++      sprintf(mii_bus->id, "%s-%d-%d", "bcma_mdio", core->bus->num,
++              core->core_unit);
++      mii_bus->priv = bcma_mdio;
++      mii_bus->read = bcma_mdio_mii_read;
++      mii_bus->write = bcma_mdio_mii_write;
++      mii_bus->reset = bcma_mdio_phy_reset;
++      mii_bus->parent = &core->dev;
++      mii_bus->phy_mask = ~(1 << phyaddr);
++ 
++      mii_bus->irq = kmalloc_array(PHY_MAX_ADDR, sizeof(int), GFP_KERNEL);
++      if (!mii_bus->irq) {
++              err = -ENOMEM;
++              goto err_free_bus;
++      }
++      for (i = 0; i < PHY_MAX_ADDR; i++)
++              mii_bus->irq[i] = PHY_POLL;
++
++      bcma_mdio->core = core;
++      bcma_mdio->phyaddr = phyaddr;
++
++      err = mdiobus_register(mii_bus);
++      if (err) {
++              dev_err(&core->dev, "Registration of mii bus failed\n");
++              goto err_free_irq;
++      }
++
++      return mii_bus;
++
++err_free_irq:
++      kfree(mii_bus->irq);
++err_free_bus:
++      mdiobus_free(mii_bus);
++err:
++      kfree(bcma_mdio);
++      return ERR_PTR(err);
++}
++
++void bcma_mdio_mii_unregister(struct mii_bus *mii_bus)
++{
++      struct bcma_mdio *bcma_mdio;
++
++      if (!mii_bus)
++              return;
++
++      bcma_mdio = mii_bus->priv;
++
++      mdiobus_unregister(mii_bus);
++      kfree(mii_bus->irq);
++      mdiobus_free(mii_bus);
++      kfree(bcma_mdio);
++}
++
++MODULE_AUTHOR("Rafał Miłecki");
++MODULE_LICENSE("GPL");
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -759,150 +759,6 @@ error:
+       return err;
+ }
+-/**************************************************
+- * PHY ops
+- **************************************************/
+-
+-static u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg)
+-{
+-      struct bcma_device *core;
+-      u16 phy_access_addr;
+-      u16 phy_ctl_addr;
+-      u32 tmp;
+-
+-      BUILD_BUG_ON(BGMAC_PA_DATA_MASK != BCMA_GMAC_CMN_PA_DATA_MASK);
+-      BUILD_BUG_ON(BGMAC_PA_ADDR_MASK != BCMA_GMAC_CMN_PA_ADDR_MASK);
+-      BUILD_BUG_ON(BGMAC_PA_ADDR_SHIFT != BCMA_GMAC_CMN_PA_ADDR_SHIFT);
+-      BUILD_BUG_ON(BGMAC_PA_REG_MASK != BCMA_GMAC_CMN_PA_REG_MASK);
+-      BUILD_BUG_ON(BGMAC_PA_REG_SHIFT != BCMA_GMAC_CMN_PA_REG_SHIFT);
+-      BUILD_BUG_ON(BGMAC_PA_WRITE != BCMA_GMAC_CMN_PA_WRITE);
+-      BUILD_BUG_ON(BGMAC_PA_START != BCMA_GMAC_CMN_PA_START);
+-      BUILD_BUG_ON(BGMAC_PC_EPA_MASK != BCMA_GMAC_CMN_PC_EPA_MASK);
+-      BUILD_BUG_ON(BGMAC_PC_MCT_MASK != BCMA_GMAC_CMN_PC_MCT_MASK);
+-      BUILD_BUG_ON(BGMAC_PC_MCT_SHIFT != BCMA_GMAC_CMN_PC_MCT_SHIFT);
+-      BUILD_BUG_ON(BGMAC_PC_MTE != BCMA_GMAC_CMN_PC_MTE);
+-
+-      if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
+-              core = bgmac->core->bus->drv_gmac_cmn.core;
+-              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
+-              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
+-      } else {
+-              core = bgmac->core;
+-              phy_access_addr = BGMAC_PHY_ACCESS;
+-              phy_ctl_addr = BGMAC_PHY_CNTL;
+-      }
+-
+-      tmp = bcma_read32(core, phy_ctl_addr);
+-      tmp &= ~BGMAC_PC_EPA_MASK;
+-      tmp |= phyaddr;
+-      bcma_write32(core, phy_ctl_addr, tmp);
+-
+-      tmp = BGMAC_PA_START;
+-      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
+-      tmp |= reg << BGMAC_PA_REG_SHIFT;
+-      bcma_write32(core, phy_access_addr, tmp);
+-
+-      if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
+-              dev_err(bgmac->dev, "Reading PHY %d register 0x%X failed\n",
+-                      phyaddr, reg);
+-              return 0xffff;
+-      }
+-
+-      return bcma_read32(core, phy_access_addr) & BGMAC_PA_DATA_MASK;
+-}
+-
+-/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphywr */
+-static int bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value)
+-{
+-      struct bcma_device *core;
+-      u16 phy_access_addr;
+-      u16 phy_ctl_addr;
+-      u32 tmp;
+-
+-      if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
+-              core = bgmac->core->bus->drv_gmac_cmn.core;
+-              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
+-              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
+-      } else {
+-              core = bgmac->core;
+-              phy_access_addr = BGMAC_PHY_ACCESS;
+-              phy_ctl_addr = BGMAC_PHY_CNTL;
+-      }
+-
+-      tmp = bcma_read32(core, phy_ctl_addr);
+-      tmp &= ~BGMAC_PC_EPA_MASK;
+-      tmp |= phyaddr;
+-      bcma_write32(core, phy_ctl_addr, tmp);
+-
+-      bgmac_write(bgmac, BGMAC_INT_STATUS, BGMAC_IS_MDIO);
+-      if (bgmac_read(bgmac, BGMAC_INT_STATUS) & BGMAC_IS_MDIO)
+-              dev_warn(bgmac->dev, "Error setting MDIO int\n");
+-
+-      tmp = BGMAC_PA_START;
+-      tmp |= BGMAC_PA_WRITE;
+-      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
+-      tmp |= reg << BGMAC_PA_REG_SHIFT;
+-      tmp |= value;
+-      bcma_write32(core, phy_access_addr, tmp);
+-
+-      if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
+-              dev_err(bgmac->dev, "Writing to PHY %d register 0x%X failed\n",
+-                      phyaddr, reg);
+-              return -ETIMEDOUT;
+-      }
+-
+-      return 0;
+-}
+-
+-/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
+-static void bgmac_phy_init(struct bgmac *bgmac)
+-{
+-      struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
+-      struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
+-      u8 i;
+-
+-      if (ci->id == BCMA_CHIP_ID_BCM5356) {
+-              for (i = 0; i < 5; i++) {
+-                      bgmac_phy_write(bgmac, i, 0x1f, 0x008b);
+-                      bgmac_phy_write(bgmac, i, 0x15, 0x0100);
+-                      bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
+-                      bgmac_phy_write(bgmac, i, 0x12, 0x2aaa);
+-                      bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
+-              }
+-      }
+-      if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg != 10) ||
+-          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg != 10) ||
+-          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg != 9)) {
+-              bcma_chipco_chipctl_maskset(cc, 2, ~0xc0000000, 0);
+-              bcma_chipco_chipctl_maskset(cc, 4, ~0x80000000, 0);
+-              for (i = 0; i < 5; i++) {
+-                      bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
+-                      bgmac_phy_write(bgmac, i, 0x16, 0x5284);
+-                      bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
+-                      bgmac_phy_write(bgmac, i, 0x17, 0x0010);
+-                      bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
+-                      bgmac_phy_write(bgmac, i, 0x16, 0x5296);
+-                      bgmac_phy_write(bgmac, i, 0x17, 0x1073);
+-                      bgmac_phy_write(bgmac, i, 0x17, 0x9073);
+-                      bgmac_phy_write(bgmac, i, 0x16, 0x52b6);
+-                      bgmac_phy_write(bgmac, i, 0x17, 0x9273);
+-                      bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
+-              }
+-      }
+-}
+-
+-/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyreset */
+-static void bgmac_phy_reset(struct bgmac *bgmac)
+-{
+-      if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
+-              return;
+-
+-      bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET);
+-      udelay(100);
+-      if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET)
+-              dev_err(bgmac->dev, "PHY reset failed\n");
+-      bgmac_phy_init(bgmac);
+-}
+ /**************************************************
+  * Chip ops
+@@ -1159,7 +1015,8 @@ static void bgmac_chip_reset(struct bgma
+       else
+               bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE);
+       bgmac_miiconfig(bgmac);
+-      bgmac_phy_init(bgmac);
++      if (bgmac->mii_bus)
++              bgmac->mii_bus->reset(bgmac->mii_bus);
+       netdev_reset_queue(bgmac->net_dev);
+ }
+@@ -1553,17 +1410,6 @@ static const struct ethtool_ops bgmac_et
+  * MII
+  **************************************************/
+-static int bgmac_mii_read(struct mii_bus *bus, int mii_id, int regnum)
+-{
+-      return bgmac_phy_read(bus->priv, mii_id, regnum);
+-}
+-
+-static int bgmac_mii_write(struct mii_bus *bus, int mii_id, int regnum,
+-                         u16 value)
+-{
+-      return bgmac_phy_write(bus->priv, mii_id, regnum, value);
+-}
+-
+ static void bgmac_adjust_link(struct net_device *net_dev)
+ {
+       struct bgmac *bgmac = netdev_priv(net_dev);
+@@ -1588,7 +1434,7 @@ static void bgmac_adjust_link(struct net
+       }
+ }
+-static int bgmac_fixed_phy_register(struct bgmac *bgmac)
++static int bgmac_phy_connect_direct(struct bgmac *bgmac)
+ {
+       struct fixed_phy_status fphy_status = {
+               .link = 1,
+@@ -1614,81 +1460,24 @@ static int bgmac_fixed_phy_register(stru
+       return err;
+ }
+-static int bgmac_mii_register(struct bgmac *bgmac)
++static int bgmac_phy_connect(struct bgmac *bgmac)
+ {
+-      struct mii_bus *mii_bus;
+       struct phy_device *phy_dev;
+       char bus_id[MII_BUS_ID_SIZE + 3];
+-      int i, err = 0;
+-
+-      if (bgmac_is_bcm4707_family(bgmac))
+-              return bgmac_fixed_phy_register(bgmac);
+-
+-      mii_bus = mdiobus_alloc();
+-      if (!mii_bus)
+-              return -ENOMEM;
+-
+-      mii_bus->name = "bgmac mii bus";
+-      sprintf(mii_bus->id, "%s-%d-%d", "bgmac", bgmac->core->bus->num,
+-              bgmac->core->core_unit);
+-      mii_bus->priv = bgmac;
+-      mii_bus->read = bgmac_mii_read;
+-      mii_bus->write = bgmac_mii_write;
+-      mii_bus->parent = &bgmac->core->dev;
+-      mii_bus->phy_mask = ~(1 << bgmac->phyaddr);
+-
+-      mii_bus->irq = kmalloc_array(PHY_MAX_ADDR, sizeof(int), GFP_KERNEL);
+-      if (!mii_bus->irq) {
+-              err = -ENOMEM;
+-              goto err_free_bus;
+-      }
+-      for (i = 0; i < PHY_MAX_ADDR; i++)
+-              mii_bus->irq[i] = PHY_POLL;
+-
+-      err = mdiobus_register(mii_bus);
+-      if (err) {
+-              dev_err(bgmac->dev, "Registration of mii bus failed\n");
+-              goto err_free_irq;
+-      }
+-
+-      bgmac->mii_bus = mii_bus;
+       /* Connect to the PHY */
+-      snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id,
++      snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, bgmac->mii_bus->id,
+                bgmac->phyaddr);
+       phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
+                             PHY_INTERFACE_MODE_MII);
+       if (IS_ERR(phy_dev)) {
+               dev_err(bgmac->dev, "PHY connecton failed\n");
+-              err = PTR_ERR(phy_dev);
+-              goto err_unregister_bus;
++              return PTR_ERR(phy_dev);
+       }
+-      return err;
+-
+-err_unregister_bus:
+-      mdiobus_unregister(mii_bus);
+-err_free_irq:
+-      kfree(mii_bus->irq);
+-err_free_bus:
+-      mdiobus_free(mii_bus);
+-      return err;
+-}
+-
+-static void bgmac_mii_unregister(struct bgmac *bgmac)
+-{
+-      struct mii_bus *mii_bus = bgmac->mii_bus;
+-
+-      mdiobus_unregister(mii_bus);
+-      kfree(mii_bus->irq);
+-      mdiobus_free(mii_bus);
++      return 0;
+ }
+-/**************************************************
+- * BCMA bus ops
+- **************************************************/
+-
+-/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipattach */
+ static int bgmac_probe(struct bcma_device *core)
+ {
+       struct net_device *net_dev;
+@@ -1809,9 +1598,6 @@ static int bgmac_probe(struct bcma_devic
+       if (bcm47xx_nvram_getenv("et0_no_txint", NULL, 0) == 0)
+               bgmac->int_mask &= ~BGMAC_IS_TX_MASK;
+-      /* TODO: reset the external phy. Specs are needed */
+-      bgmac_phy_reset(bgmac);
+-
+       bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
+                              BGMAC_BFL_ENETROBO);
+       if (bgmac->has_robosw)
+@@ -1822,10 +1608,25 @@ static int bgmac_probe(struct bcma_devic
+       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
+-      err = bgmac_mii_register(bgmac);
++      if (!bgmac_is_bcm4707_family(bgmac)) {
++              struct mii_bus *mii_bus;
++
++              mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
++              if (!IS_ERR(mii_bus)) {
++                      err = PTR_ERR(mii_bus);
++                      goto err_dma_free;
++              }
++
++              bgmac->mii_bus = mii_bus;
++      }
++
++      if (!bgmac->mii_bus)
++              err = bgmac_phy_connect_direct(bgmac);
++      else
++              err = bgmac_phy_connect(bgmac);
+       if (err) {
+               dev_err(bgmac->dev, "Cannot connect to phy\n");
+-              goto err_dma_free;
++              goto err_mii_unregister;
+       }
+       net_dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+@@ -1835,18 +1636,19 @@ static int bgmac_probe(struct bcma_devic
+       err = register_netdev(bgmac->net_dev);
+       if (err) {
+               dev_err(bgmac->dev, "Cannot register net device\n");
+-              goto err_mii_unregister;
++              goto err_phy_disconnect;
+       }
+       netif_carrier_off(net_dev);
+       return 0;
++err_phy_disconnect:
++      phy_disconnect(net_dev->phydev);
+ err_mii_unregister:
+-      bgmac_mii_unregister(bgmac);
++      bcma_mdio_mii_unregister(bgmac->mii_bus);
+ err_dma_free:
+       bgmac_dma_free(bgmac);
+-
+ err_netdev_free:
+       bcma_set_drvdata(core, NULL);
+       free_netdev(net_dev);
+@@ -1859,7 +1661,8 @@ static void bgmac_remove(struct bcma_dev
+       struct bgmac *bgmac = bcma_get_drvdata(core);
+       unregister_netdev(bgmac->net_dev);
+-      bgmac_mii_unregister(bgmac);
++      phy_disconnect(bgmac->net_dev->phydev);
++      bcma_mdio_mii_unregister(bgmac->mii_bus);
+       netif_napi_del(&bgmac->napi);
+       bgmac_dma_free(bgmac);
+       bcma_set_drvdata(core, NULL);
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -456,6 +456,9 @@ struct bgmac {
+       bool loopback;
+ };
++struct mii_bus *bcma_mdio_mii_register(struct bcma_device *core, u8 phyaddr);
++void bcma_mdio_mii_unregister(struct mii_bus *mii_bus);
++
+ static inline u32 bgmac_read(struct bgmac *bgmac, u16 offset)
+ {
+       return bcma_read32(bgmac->core, offset);
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0004-net-ethernet-bgmac-convert-to-feature-flags.patch b/target/linux/generic/patches-4.4/071-v4.8-0004-net-ethernet-bgmac-convert-to-feature-flags.patch
new file mode 100644 (file)
index 0000000..0f62791
--- /dev/null
@@ -0,0 +1,384 @@
+From db791eb2970bad193b1dc95a4461b222dd22cb64 Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@broadcom.com>
+Date: Thu, 7 Jul 2016 19:08:56 -0400
+Subject: [PATCH 4/5] net: ethernet: bgmac: convert to feature flags
+
+The bgmac driver is using the bcma provides device ID and revision, as
+well as the SoC ID and package, to determine which features are
+necessary to enable, reset, etc in the driver.   In anticipation of
+removing the bcma requirement for this driver, these must be changed to
+not reference that struct.  In place of that, each "feature" has been
+given a flag, and the flags are enabled for their respective device and
+SoC.
+
+Signed-off-by: Jon Mason <jon.mason@broadcom.com>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Tested-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 167 ++++++++++++++++++++++++----------
+ drivers/net/ethernet/broadcom/bgmac.h |  21 ++++-
+ 2 files changed, 140 insertions(+), 48 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -109,7 +109,7 @@ static void bgmac_dma_tx_enable(struct b
+       u32 ctl;
+       ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
+-      if (bgmac->core->id.rev >= 4) {
++      if (bgmac->feature_flags & BGMAC_FEAT_TX_MASK_SETUP) {
+               ctl &= ~BGMAC_DMA_TX_BL_MASK;
+               ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT;
+@@ -335,7 +335,7 @@ static void bgmac_dma_rx_enable(struct b
+       /* preserve ONLY bits 16-17 from current hardware value */
+       ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
+-      if (bgmac->core->id.rev >= 4) {
++      if (bgmac->feature_flags & BGMAC_FEAT_RX_MASK_SETUP) {
+               ctl &= ~BGMAC_DMA_RX_BL_MASK;
+               ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
+@@ -772,14 +772,20 @@ static void bgmac_cmdcfg_maskset(struct
+ {
+       u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
+       u32 new_val = (cmdcfg & mask) | set;
++      u32 cmdcfg_sr;
+-      bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
++      if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
++              cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
++      else
++              cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
++
++      bgmac_set(bgmac, BGMAC_CMDCFG, cmdcfg_sr);
+       udelay(2);
+       if (new_val != cmdcfg || force)
+               bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
+-      bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
++      bgmac_mask(bgmac, BGMAC_CMDCFG, ~cmdcfg_sr);
+       udelay(2);
+ }
+@@ -808,7 +814,7 @@ static void bgmac_chip_stats_update(stru
+ {
+       int i;
+-      if (bgmac->core->id.id != BCMA_CORE_4706_MAC_GBIT) {
++      if (!(bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)) {
+               for (i = 0; i < BGMAC_NUM_MIB_TX_REGS; i++)
+                       bgmac->mib_tx_regs[i] =
+                               bgmac_read(bgmac,
+@@ -827,7 +833,7 @@ static void bgmac_clear_mib(struct bgmac
+ {
+       int i;
+-      if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT)
++      if (bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)
+               return;
+       bgmac_set(bgmac, BGMAC_DEV_CTL, BGMAC_DC_MROR);
+@@ -870,9 +876,8 @@ static void bgmac_mac_speed(struct bgmac
+ static void bgmac_miiconfig(struct bgmac *bgmac)
+ {
+       struct bcma_device *core = bgmac->core;
+-      u8 imode;
+-      if (bgmac_is_bcm4707_family(bgmac)) {
++      if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
+               bcma_awrite32(core, BCMA_IOCTL,
+                             bcma_aread32(core, BCMA_IOCTL) | 0x40 |
+                             BGMAC_BCMA_IOCTL_SW_CLKEN);
+@@ -880,6 +885,8 @@ static void bgmac_miiconfig(struct bgmac
+               bgmac->mac_duplex = DUPLEX_FULL;
+               bgmac_mac_speed(bgmac);
+       } else {
++              u8 imode;
++
+               imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
+                       BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
+               if (imode == 0 || imode == 1) {
+@@ -894,9 +901,7 @@ static void bgmac_miiconfig(struct bgmac
+ static void bgmac_chip_reset(struct bgmac *bgmac)
+ {
+       struct bcma_device *core = bgmac->core;
+-      struct bcma_bus *bus = core->bus;
+-      struct bcma_chipinfo *ci = &bus->chipinfo;
+-      u32 flags;
++      u32 cmdcfg_sr;
+       u32 iost;
+       int i;
+@@ -919,15 +924,12 @@ static void bgmac_chip_reset(struct bgma
+       }
+       iost = bcma_aread32(core, BCMA_IOST);
+-      if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
+-          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
+-          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
++      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 (ci->id != BCMA_CHIP_ID_BCM4707 &&
+-          ci->id != BCMA_CHIP_ID_BCM47094) {
+-              flags = 0;
++      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)
+@@ -937,7 +939,7 @@ static void bgmac_chip_reset(struct bgma
+       }
+       /* Request Misc PLL for corerev > 2 */
+-      if (core->id.rev > 2 && !bgmac_is_bcm4707_family(bgmac)) {
++      if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
+               bgmac_set(bgmac, BCMA_CLKCTLST,
+                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
+               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
+@@ -946,9 +948,7 @@ static void bgmac_chip_reset(struct bgma
+                                1000);
+       }
+-      if (ci->id == BCMA_CHIP_ID_BCM5357 ||
+-          ci->id == BCMA_CHIP_ID_BCM4749 ||
+-          ci->id == BCMA_CHIP_ID_BCM53572) {
++      if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_PHY) {
+               struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
+               u8 et_swtype = 0;
+               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
+@@ -962,11 +962,9 @@ static void bgmac_chip_reset(struct bgma
+                       et_swtype &= 0x0f;
+                       et_swtype <<= 4;
+                       sw_type = et_swtype;
+-              } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) {
++              } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII) {
+                       sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
+-              } else if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
+-                         (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
+-                         (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
++              } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_RGMII) {
+                       sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
+                                 BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
+               }
+@@ -986,6 +984,11 @@ static void bgmac_chip_reset(struct bgma
+        * BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
+        * be keps until taking MAC out of the reset.
+        */
++      if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
++              cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
++      else
++              cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
++
+       bgmac_cmdcfg_maskset(bgmac,
+                            ~(BGMAC_CMDCFG_TE |
+                              BGMAC_CMDCFG_RE |
+@@ -1003,13 +1006,13 @@ static void bgmac_chip_reset(struct bgma
+                            BGMAC_CMDCFG_PROM |
+                            BGMAC_CMDCFG_NLC |
+                            BGMAC_CMDCFG_CFE |
+-                           BGMAC_CMDCFG_SR(core->id.rev),
++                           cmdcfg_sr,
+                            false);
+       bgmac->mac_speed = SPEED_UNKNOWN;
+       bgmac->mac_duplex = DUPLEX_UNKNOWN;
+       bgmac_clear_mib(bgmac);
+-      if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
++      if (bgmac->feature_flags & BGMAC_FEAT_CMN_PHY_CTL)
+               bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0,
+                              BCMA_GMAC_CMN_PC_MTE);
+       else
+@@ -1035,46 +1038,48 @@ static void bgmac_chip_intrs_off(struct
+ /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_enable */
+ static void bgmac_enable(struct bgmac *bgmac)
+ {
+-      struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
++      u32 cmdcfg_sr;
+       u32 cmdcfg;
+       u32 mode;
+-      u32 rxq_ctl;
+-      u32 fl_ctl;
+-      u16 bp_clk;
+-      u8 mdp;
++
++      if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
++              cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
++      else
++              cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
+       cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
+       bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
+-                           BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
++                           cmdcfg_sr, true);
+       udelay(2);
+       cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
+       bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
+       mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
+               BGMAC_DS_MM_SHIFT;
+-      if (ci->id != BCMA_CHIP_ID_BCM47162 || mode != 0)
++      if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
+               bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
+-      if (ci->id == BCMA_CHIP_ID_BCM47162 && mode == 2)
++      if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
+               bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0,
+                                           BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
+-      switch (ci->id) {
+-      case BCMA_CHIP_ID_BCM5357:
+-      case BCMA_CHIP_ID_BCM4749:
+-      case BCMA_CHIP_ID_BCM53572:
+-      case BCMA_CHIP_ID_BCM4716:
+-      case BCMA_CHIP_ID_BCM47162:
+-              fl_ctl = 0x03cb04cb;
+-              if (ci->id == BCMA_CHIP_ID_BCM5357 ||
+-                  ci->id == BCMA_CHIP_ID_BCM4749 ||
+-                  ci->id == BCMA_CHIP_ID_BCM53572)
++      if (bgmac->feature_flags & (BGMAC_FEAT_FLW_CTRL1 |
++                                  BGMAC_FEAT_FLW_CTRL2)) {
++              u32 fl_ctl;
++
++              if (bgmac->feature_flags & BGMAC_FEAT_FLW_CTRL1)
+                       fl_ctl = 0x2300e1;
++              else
++                      fl_ctl = 0x03cb04cb;
++
+               bgmac_write(bgmac, BGMAC_FLOW_CTL_THRESH, fl_ctl);
+               bgmac_write(bgmac, BGMAC_PAUSE_CTL, 0x27fff);
+-              break;
+       }
+-      if (!bgmac_is_bcm4707_family(bgmac)) {
++      if (bgmac->feature_flags & BGMAC_FEAT_SET_RXQ_CLK) {
++              u32 rxq_ctl;
++              u16 bp_clk;
++              u8 mdp;
++
+               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
+               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
+               bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
+@@ -1606,6 +1611,74 @@ static int bgmac_probe(struct bcma_devic
+       if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
+               dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
++      /* Feature Flags */
++      switch (core->bus->chipinfo.id) {
++      case BCMA_CHIP_ID_BCM5357:
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
++              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
++              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
++                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
++              }
++              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
++              break;
++      case BCMA_CHIP_ID_BCM53572:
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
++              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
++              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
++                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
++              }
++              break;
++      case BCMA_CHIP_ID_BCM4749:
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
++              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
++              if (core->bus->chipinfo.pkg == 10) {
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
++                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
++              }
++              break;
++      case BCMA_CHIP_ID_BCM4716:
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              /* fallthrough */
++      case BCMA_CHIP_ID_BCM47162:
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              break;
++      /* bcm4707_family */
++      case BCMA_CHIP_ID_BCM4707:
++      case BCMA_CHIP_ID_BCM47094:
++      case BCMA_CHIP_ID_BCM53018:
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
++              bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
++              break;
++      default:
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++      }
++
++      if (!bgmac_is_bcm4707_family(bgmac) && core->id.rev > 2)
++              bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
++
++      if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
++              bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
++              bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
++      }
++
++      if (core->id.rev >= 4) {
++              bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
++              bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
++              bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
++      }
++
+       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
+       if (!bgmac_is_bcm4707_family(bgmac)) {
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -190,7 +190,6 @@
+ #define  BGMAC_CMDCFG_HD_SHIFT                        10
+ #define  BGMAC_CMDCFG_SR_REV0                 0x00000800      /* Set to reset mode, for core rev 0-3 */
+ #define  BGMAC_CMDCFG_SR_REV4                 0x00002000      /* Set to reset mode, for core rev >= 4 */
+-#define  BGMAC_CMDCFG_SR(rev)  ((rev >= 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
+ #define  BGMAC_CMDCFG_ML                      0x00008000      /* Set to activate mac loopback mode */
+ #define  BGMAC_CMDCFG_AE                      0x00400000
+ #define  BGMAC_CMDCFG_CFE                     0x00800000
+@@ -376,6 +375,24 @@
+ #define ETHER_MAX_LEN   1518
++/* Feature Flags */
++#define BGMAC_FEAT_TX_MASK_SETUP      BIT(0)
++#define BGMAC_FEAT_RX_MASK_SETUP      BIT(1)
++#define BGMAC_FEAT_IOST_ATTACHED      BIT(2)
++#define BGMAC_FEAT_NO_RESET           BIT(3)
++#define BGMAC_FEAT_MISC_PLL_REQ               BIT(4)
++#define BGMAC_FEAT_SW_TYPE_PHY                BIT(5)
++#define BGMAC_FEAT_SW_TYPE_EPHYRMII   BIT(6)
++#define BGMAC_FEAT_SW_TYPE_RGMII      BIT(7)
++#define BGMAC_FEAT_CMN_PHY_CTL                BIT(8)
++#define BGMAC_FEAT_FLW_CTRL1          BIT(9)
++#define BGMAC_FEAT_FLW_CTRL2          BIT(10)
++#define BGMAC_FEAT_SET_RXQ_CLK                BIT(11)
++#define BGMAC_FEAT_CLKCTLST           BIT(12)
++#define BGMAC_FEAT_NO_CLR_MIB         BIT(13)
++#define BGMAC_FEAT_FORCE_SPEED_2500   BIT(14)
++#define BGMAC_FEAT_CMDCFG_SR_REV4     BIT(15)
++
+ struct bgmac_slot_info {
+       union {
+               struct sk_buff *skb;
+@@ -430,6 +447,8 @@ struct bgmac {
+       struct device *dev;
+       struct device *dma_dev;
++      u32 feature_flags;
++
+       struct net_device *net_dev;
+       struct napi_struct napi;
+       struct mii_bus *mii_bus;
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0005-net-ethernet-bgmac-Add-platform-device-support.patch b/target/linux/generic/patches-4.4/071-v4.8-0005-net-ethernet-bgmac-Add-platform-device-support.patch
new file mode 100644 (file)
index 0000000..5755184
--- /dev/null
@@ -0,0 +1,1260 @@
+From f6a95a24957aec5bb488c3f978c4ed508177998f Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@broadcom.com>
+Date: Thu, 7 Jul 2016 19:08:57 -0400
+Subject: [PATCH 5/5] net: ethernet: bgmac: Add platform device support
+
+The bcma portion of the driver has been split off into a bcma specific
+driver.  This has been mirrored for the platform driver.  The last
+references to the bcma core struct have been changed into a generic
+function call.  These function calls are wrappers to either the original
+bcma code or new platform functions that access the same areas via MMIO.
+This necessitated adding function pointers for both platform and bcma to
+hide which backend is being used from the generic bgmac code.
+
+Signed-off-by: Jon Mason <jon.mason@broadcom.com>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Tested-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/Kconfig           |  23 +-
+ drivers/net/ethernet/broadcom/Makefile          |   4 +-
+ drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c |   2 +
+ drivers/net/ethernet/broadcom/bgmac-bcma.c      | 315 +++++++++++++++++++++++
+ drivers/net/ethernet/broadcom/bgmac-platform.c  | 189 ++++++++++++++
+ drivers/net/ethernet/broadcom/bgmac.c           | 329 ++++--------------------
+ drivers/net/ethernet/broadcom/bgmac.h           |  73 +++++-
+ 7 files changed, 650 insertions(+), 285 deletions(-)
+ create mode 100644 drivers/net/ethernet/broadcom/bgmac-bcma.c
+ create mode 100644 drivers/net/ethernet/broadcom/bgmac-platform.c
+
+--- a/drivers/net/ethernet/broadcom/Kconfig
++++ b/drivers/net/ethernet/broadcom/Kconfig
+@@ -150,10 +150,18 @@ config BNX2X_VXLAN
+         Virtual eXtensible Local Area Network (VXLAN) in the driver.
+ config BGMAC
+-      tristate "BCMA bus GBit core support"
++      tristate
++      help
++        This enables the integrated ethernet controller support for many
++        Broadcom (mostly iProc) SoCs. An appropriate bus interface driver
++        needs to be enabled to select this.
++
++config BGMAC_BCMA
++      tristate "Broadcom iProc GBit BCMA support"
+       depends on BCMA && BCMA_HOST_SOC
+       depends on HAS_DMA
+       depends on BCM47XX || ARCH_BCM_5301X || COMPILE_TEST
++      select BGMAC
+       select PHYLIB
+       select FIXED_PHY
+       ---help---
+@@ -162,6 +170,19 @@ config BGMAC
+         In case of using this driver on BCM4706 it's also requires to enable
+         BCMA_DRIVER_GMAC_CMN to make it work.
++config BGMAC_PLATFORM
++      tristate "Broadcom iProc GBit platform support"
++      depends on HAS_DMA
++      depends on ARCH_BCM_IPROC || COMPILE_TEST
++      depends on OF
++      select BGMAC
++      select PHYLIB
++      select FIXED_PHY
++      default ARCH_BCM_IPROC
++      ---help---
++        Say Y here if you want to use the Broadcom iProc Gigabit Ethernet
++        controller through the generic platform interface
++
+ config SYSTEMPORT
+       tristate "Broadcom SYSTEMPORT internal MAC support"
+       depends on OF
+--- a/drivers/net/ethernet/broadcom/Makefile
++++ b/drivers/net/ethernet/broadcom/Makefile
+@@ -10,6 +10,8 @@ obj-$(CONFIG_CNIC) += cnic.o
+ obj-$(CONFIG_BNX2X) += bnx2x/
+ obj-$(CONFIG_SB1250_MAC) += sb1250-mac.o
+ obj-$(CONFIG_TIGON3) += tg3.o
+-obj-$(CONFIG_BGMAC) += bgmac.o bgmac-bcma-mdio.o
++obj-$(CONFIG_BGMAC) += bgmac.o
++obj-$(CONFIG_BGMAC_BCMA) += bgmac-bcma.o bgmac-bcma-mdio.o
++obj-$(CONFIG_BGMAC_PLATFORM) += bgmac-platform.o
+ obj-$(CONFIG_SYSTEMPORT) += bcmsysport.o
+ obj-$(CONFIG_BNXT) += bnxt/
+--- a/drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
++++ b/drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
+@@ -255,6 +255,7 @@ err:
+       kfree(bcma_mdio);
+       return ERR_PTR(err);
+ }
++EXPORT_SYMBOL_GPL(bcma_mdio_mii_register);
+ void bcma_mdio_mii_unregister(struct mii_bus *mii_bus)
+ {
+@@ -270,6 +271,7 @@ void bcma_mdio_mii_unregister(struct mii
+       mdiobus_free(mii_bus);
+       kfree(bcma_mdio);
+ }
++EXPORT_SYMBOL_GPL(bcma_mdio_mii_unregister);
+ MODULE_AUTHOR("Rafał Miłecki");
+ MODULE_LICENSE("GPL");
+--- /dev/null
++++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
+@@ -0,0 +1,315 @@
++/*
++ * Driver for (BCM4706)? GBit MAC core on BCMA bus.
++ *
++ * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com>
++ *
++ * Licensed under the GNU/GPL. See COPYING for details.
++ */
++
++#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
++
++#include <linux/bcma/bcma.h>
++#include <linux/brcmphy.h>
++#include <linux/etherdevice.h>
++#include "bgmac.h"
++
++static inline bool bgmac_is_bcm4707_family(struct bcma_device *core)
++{
++      switch (core->bus->chipinfo.id) {
++      case BCMA_CHIP_ID_BCM4707:
++      case BCMA_CHIP_ID_BCM47094:
++      case BCMA_CHIP_ID_BCM53018:
++              return true;
++      default:
++              return false;
++      }
++}
++
++/**************************************************
++ * BCMA bus ops
++ **************************************************/
++
++static u32 bcma_bgmac_read(struct bgmac *bgmac, u16 offset)
++{
++      return bcma_read32(bgmac->bcma.core, offset);
++}
++
++static void bcma_bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
++{
++      bcma_write32(bgmac->bcma.core, offset, value);
++}
++
++static u32 bcma_bgmac_idm_read(struct bgmac *bgmac, u16 offset)
++{
++      return bcma_aread32(bgmac->bcma.core, offset);
++}
++
++static void bcma_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
++{
++      return bcma_awrite32(bgmac->bcma.core, offset, value);
++}
++
++static bool bcma_bgmac_clk_enabled(struct bgmac *bgmac)
++{
++      return bcma_core_is_enabled(bgmac->bcma.core);
++}
++
++static void bcma_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
++{
++      bcma_core_enable(bgmac->bcma.core, flags);
++}
++
++static void bcma_bgmac_cco_ctl_maskset(struct bgmac *bgmac, u32 offset,
++                                     u32 mask, u32 set)
++{
++      struct bcma_drv_cc *cc = &bgmac->bcma.core->bus->drv_cc;
++
++      bcma_chipco_chipctl_maskset(cc, offset, mask, set);
++}
++
++static u32 bcma_bgmac_get_bus_clock(struct bgmac *bgmac)
++{
++      struct bcma_drv_cc *cc = &bgmac->bcma.core->bus->drv_cc;
++
++      return bcma_pmu_get_bus_clock(cc);
++}
++
++static void bcma_bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset, u32 mask,
++                                   u32 set)
++{
++      bcma_maskset32(bgmac->bcma.cmn, offset, mask, set);
++}
++
++static const struct bcma_device_id bgmac_bcma_tbl[] = {
++      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_4706_MAC_GBIT,
++                BCMA_ANY_REV, BCMA_ANY_CLASS),
++      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_MAC_GBIT, BCMA_ANY_REV,
++                BCMA_ANY_CLASS),
++      {},
++};
++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 ssb_sprom *sprom = &core->bus->sprom;
++      struct mii_bus *mii_bus;
++      struct bgmac *bgmac;
++      u8 *mac;
++      int err;
++
++      bgmac = kzalloc(sizeof(*bgmac), GFP_KERNEL);
++      if (!bgmac)
++              return -ENOMEM;
++
++      bgmac->bcma.core = core;
++      bgmac->dev = &core->dev;
++      bgmac->dma_dev = core->dma_dev;
++      bgmac->irq = core->irq;
++
++      bcma_set_drvdata(core, bgmac);
++
++      switch (core->core_unit) {
++      case 0:
++              mac = sprom->et0mac;
++              break;
++      case 1:
++              mac = sprom->et1mac;
++              break;
++      case 2:
++              mac = sprom->et2mac;
++              break;
++      default:
++              dev_err(bgmac->dev, "Unsupported core_unit %d\n",
++                      core->core_unit);
++              err = -ENOTSUPP;
++              goto err;
++      }
++
++      ether_addr_copy(bgmac->mac_addr, mac);
++
++      /* On BCM4706 we need common core to access PHY */
++      if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
++          !core->bus->drv_gmac_cmn.core) {
++              dev_err(bgmac->dev, "GMAC CMN core not found (required for BCM4706)\n");
++              err = -ENODEV;
++              goto err;
++      }
++      bgmac->bcma.cmn = core->bus->drv_gmac_cmn.core;
++
++      switch (core->core_unit) {
++      case 0:
++              bgmac->phyaddr = sprom->et0phyaddr;
++              break;
++      case 1:
++              bgmac->phyaddr = sprom->et1phyaddr;
++              break;
++      case 2:
++              bgmac->phyaddr = sprom->et2phyaddr;
++              break;
++      }
++      bgmac->phyaddr &= BGMAC_PHY_MASK;
++      if (bgmac->phyaddr == BGMAC_PHY_MASK) {
++              dev_err(bgmac->dev, "No PHY found\n");
++              err = -ENODEV;
++              goto err;
++      }
++      dev_info(bgmac->dev, "Found PHY addr: %d%s\n", bgmac->phyaddr,
++               bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
++
++      if (!bgmac_is_bcm4707_family(core)) {
++              mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
++              if (!IS_ERR(mii_bus)) {
++                      err = PTR_ERR(mii_bus);
++                      goto err;
++              }
++
++              bgmac->mii_bus = mii_bus;
++      }
++
++      if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
++              dev_err(bgmac->dev, "PCI setup not implemented\n");
++              err = -ENOTSUPP;
++              goto err1;
++      }
++
++      bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
++                             BGMAC_BFL_ENETROBO);
++      if (bgmac->has_robosw)
++              dev_warn(bgmac->dev, "Support for Roboswitch not implemented\n");
++
++      if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
++              dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
++
++      /* Feature Flags */
++      switch (core->bus->chipinfo.id) {
++      case BCMA_CHIP_ID_BCM5357:
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
++              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
++              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
++                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
++              }
++              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
++              break;
++      case BCMA_CHIP_ID_BCM53572:
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
++              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
++              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
++                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
++              }
++              break;
++      case BCMA_CHIP_ID_BCM4749:
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
++              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
++              if (core->bus->chipinfo.pkg == 10) {
++                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
++                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
++              }
++              break;
++      case BCMA_CHIP_ID_BCM4716:
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              /* fallthrough */
++      case BCMA_CHIP_ID_BCM47162:
++              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++              break;
++      /* bcm4707_family */
++      case BCMA_CHIP_ID_BCM4707:
++      case BCMA_CHIP_ID_BCM47094:
++      case BCMA_CHIP_ID_BCM53018:
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
++              bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
++              break;
++      default:
++              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
++              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
++      }
++
++      if (!bgmac_is_bcm4707_family(core) && core->id.rev > 2)
++              bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
++
++      if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
++              bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
++              bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
++      }
++
++      if (core->id.rev >= 4) {
++              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->read = bcma_bgmac_read;
++      bgmac->write = bcma_bgmac_write;
++      bgmac->idm_read = bcma_bgmac_idm_read;
++      bgmac->idm_write = bcma_bgmac_idm_write;
++      bgmac->clk_enabled = bcma_bgmac_clk_enabled;
++      bgmac->clk_enable = bcma_bgmac_clk_enable;
++      bgmac->cco_ctl_maskset = bcma_bgmac_cco_ctl_maskset;
++      bgmac->get_bus_clock = bcma_bgmac_get_bus_clock;
++      bgmac->cmn_maskset32 = bcma_bgmac_cmn_maskset32;
++
++      err = bgmac_enet_probe(bgmac);
++      if (err)
++              goto err1;
++
++      return 0;
++
++err1:
++      bcma_mdio_mii_unregister(bgmac->mii_bus);
++err:
++      kfree(bgmac);
++      bcma_set_drvdata(core, NULL);
++
++      return err;
++}
++
++static void bgmac_remove(struct bcma_device *core)
++{
++      struct bgmac *bgmac = bcma_get_drvdata(core);
++
++      bcma_mdio_mii_unregister(bgmac->mii_bus);
++      bgmac_enet_remove(bgmac);
++      bcma_set_drvdata(core, NULL);
++      kfree(bgmac);
++}
++
++static struct bcma_driver bgmac_bcma_driver = {
++      .name           = KBUILD_MODNAME,
++      .id_table       = bgmac_bcma_tbl,
++      .probe          = bgmac_probe,
++      .remove         = bgmac_remove,
++};
++
++static int __init bgmac_init(void)
++{
++      int err;
++
++      err = bcma_driver_register(&bgmac_bcma_driver);
++      if (err)
++              return err;
++      pr_info("Broadcom 47xx GBit MAC driver loaded\n");
++
++      return 0;
++}
++
++static void __exit bgmac_exit(void)
++{
++      bcma_driver_unregister(&bgmac_bcma_driver);
++}
++
++module_init(bgmac_init)
++module_exit(bgmac_exit)
++
++MODULE_AUTHOR("Rafał Miłecki");
++MODULE_LICENSE("GPL");
+--- /dev/null
++++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
+@@ -0,0 +1,189 @@
++/*
++ * Copyright (C) 2016 Broadcom
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ */
++
++#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
++
++#include <linux/bcma/bcma.h>
++#include <linux/etherdevice.h>
++#include <linux/of_address.h>
++#include <linux/of_net.h>
++#include "bgmac.h"
++
++static u32 platform_bgmac_read(struct bgmac *bgmac, u16 offset)
++{
++      return readl(bgmac->plat.base + offset);
++}
++
++static void platform_bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
++{
++      writel(value, bgmac->plat.base + offset);
++}
++
++static u32 platform_bgmac_idm_read(struct bgmac *bgmac, u16 offset)
++{
++      return readl(bgmac->plat.idm_base + offset);
++}
++
++static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
++{
++      return writel(value, bgmac->plat.idm_base + offset);
++}
++
++static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
++{
++      if ((bgmac_idm_read(bgmac, BCMA_IOCTL) &
++           (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) != BCMA_IOCTL_CLK)
++              return false;
++      if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
++              return false;
++      return true;
++}
++
++static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
++{
++      bgmac_idm_write(bgmac, BCMA_IOCTL,
++                      (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
++      bgmac_idm_read(bgmac, BCMA_IOCTL);
++
++      bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0);
++      bgmac_idm_read(bgmac, BCMA_RESET_CTL);
++      udelay(1);
++
++      bgmac_idm_write(bgmac, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
++      bgmac_idm_read(bgmac, BCMA_IOCTL);
++      udelay(1);
++}
++
++static void platform_bgmac_cco_ctl_maskset(struct bgmac *bgmac, u32 offset,
++                                         u32 mask, u32 set)
++{
++      /* This shouldn't be encountered */
++      WARN_ON(1);
++}
++
++static u32 platform_bgmac_get_bus_clock(struct bgmac *bgmac)
++{
++      /* This shouldn't be encountered */
++      WARN_ON(1);
++
++      return 0;
++}
++
++static void platform_bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset,
++                                       u32 mask, u32 set)
++{
++      /* This shouldn't be encountered */
++      WARN_ON(1);
++}
++
++static int bgmac_probe(struct platform_device *pdev)
++{
++      struct device_node *np = pdev->dev.of_node;
++      struct bgmac *bgmac;
++      struct resource *regs;
++      const u8 *mac_addr;
++
++      bgmac = devm_kzalloc(&pdev->dev, sizeof(*bgmac), GFP_KERNEL);
++      if (!bgmac)
++              return -ENOMEM;
++
++      platform_set_drvdata(pdev, bgmac);
++
++      /* Set the features of the 4707 family */
++      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_CMDCFG_SR_REV4;
++      bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
++      bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
++
++      bgmac->dev = &pdev->dev;
++      bgmac->dma_dev = &pdev->dev;
++
++      mac_addr = of_get_mac_address(np);
++      if (mac_addr)
++              ether_addr_copy(bgmac->mac_addr, mac_addr);
++      else
++              dev_warn(&pdev->dev, "MAC address not present in device tree\n");
++
++      bgmac->irq = platform_get_irq(pdev, 0);
++      if (bgmac->irq < 0) {
++              dev_err(&pdev->dev, "Unable to obtain IRQ\n");
++              return bgmac->irq;
++      }
++
++      regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "amac_base");
++      if (!regs) {
++              dev_err(&pdev->dev, "Unable to obtain base resource\n");
++              return -EINVAL;
++      }
++
++      bgmac->plat.base = devm_ioremap_resource(&pdev->dev, regs);
++      if (IS_ERR(bgmac->plat.base)) {
++              dev_err(&pdev->dev, "Unable to map base resource\n");
++              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;
++      }
++
++      bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
++      if (!bgmac->plat.idm_base) {
++              dev_err(&pdev->dev, "Unable to map idm resource\n");
++              return PTR_ERR(bgmac->plat.idm_base);
++      }
++
++      bgmac->read = platform_bgmac_read;
++      bgmac->write = platform_bgmac_write;
++      bgmac->idm_read = platform_bgmac_idm_read;
++      bgmac->idm_write = platform_bgmac_idm_write;
++      bgmac->clk_enabled = platform_bgmac_clk_enabled;
++      bgmac->clk_enable = platform_bgmac_clk_enable;
++      bgmac->cco_ctl_maskset = platform_bgmac_cco_ctl_maskset;
++      bgmac->get_bus_clock = platform_bgmac_get_bus_clock;
++      bgmac->cmn_maskset32 = platform_bgmac_cmn_maskset32;
++
++      return bgmac_enet_probe(bgmac);
++}
++
++static int bgmac_remove(struct platform_device *pdev)
++{
++      struct bgmac *bgmac = platform_get_drvdata(pdev);
++
++      bgmac_enet_remove(bgmac);
++
++      return 0;
++}
++
++static const struct of_device_id bgmac_of_enet_match[] = {
++      {.compatible = "brcm,amac",},
++      {.compatible = "brcm,nsp-amac",},
++      {},
++};
++
++MODULE_DEVICE_TABLE(of, bgmac_of_enet_match);
++
++static struct platform_driver bgmac_enet_driver = {
++      .driver = {
++              .name  = "bgmac-enet",
++              .of_match_table = bgmac_of_enet_match,
++      },
++      .probe = bgmac_probe,
++      .remove = bgmac_remove,
++};
++
++module_platform_driver(bgmac_enet_driver);
++MODULE_LICENSE("GPL");
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -6,51 +6,27 @@
+  * Licensed under the GNU/GPL. See COPYING for details.
+  */
+-#include "bgmac.h"
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+-#include <linux/delay.h>
++#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
++
++#include <linux/bcma/bcma.h>
+ #include <linux/etherdevice.h>
+-#include <linux/mii.h>
+-#include <linux/phy.h>
+-#include <linux/phy_fixed.h>
+-#include <linux/interrupt.h>
+-#include <linux/dma-mapping.h>
+ #include <linux/bcm47xx_nvram.h>
++#include "bgmac.h"
+-static const struct bcma_device_id bgmac_bcma_tbl[] = {
+-      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_4706_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS),
+-      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS),
+-      {},
+-};
+-MODULE_DEVICE_TABLE(bcma, bgmac_bcma_tbl);
+-
+-static inline bool bgmac_is_bcm4707_family(struct bgmac *bgmac)
+-{
+-      switch (bgmac->core->bus->chipinfo.id) {
+-      case BCMA_CHIP_ID_BCM4707:
+-      case BCMA_CHIP_ID_BCM47094:
+-      case BCMA_CHIP_ID_BCM53018:
+-              return true;
+-      default:
+-              return false;
+-      }
+-}
+-
+-static bool bgmac_wait_value(struct bcma_device *core, u16 reg, u32 mask,
++static bool bgmac_wait_value(struct bgmac *bgmac, u16 reg, u32 mask,
+                            u32 value, int timeout)
+ {
+       u32 val;
+       int i;
+       for (i = 0; i < timeout / 10; i++) {
+-              val = bcma_read32(core, reg);
++              val = bgmac_read(bgmac, reg);
+               if ((val & mask) == value)
+                       return true;
+               udelay(10);
+       }
+-      dev_err(&core->dev, "Timeout waiting for reg 0x%X\n", reg);
++      dev_err(bgmac->dev, "Timeout waiting for reg 0x%X\n", reg);
+       return false;
+ }
+@@ -89,7 +65,7 @@ static void bgmac_dma_tx_reset(struct bg
+       /* Remove SUSPEND bit */
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, 0);
+-      if (!bgmac_wait_value(bgmac->core,
++      if (!bgmac_wait_value(bgmac,
+                             ring->mmio_base + BGMAC_DMA_TX_STATUS,
+                             BGMAC_DMA_TX_STAT, BGMAC_DMA_TX_STAT_DISABLED,
+                             10000)) {
+@@ -317,7 +293,7 @@ static void bgmac_dma_rx_reset(struct bg
+               return;
+       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, 0);
+-      if (!bgmac_wait_value(bgmac->core,
++      if (!bgmac_wait_value(bgmac,
+                             ring->mmio_base + BGMAC_DMA_RX_STATUS,
+                             BGMAC_DMA_RX_STAT, BGMAC_DMA_RX_STAT_DISABLED,
+                             10000))
+@@ -643,7 +619,7 @@ static int bgmac_dma_alloc(struct bgmac
+       BUILD_BUG_ON(BGMAC_MAX_TX_RINGS > ARRAY_SIZE(ring_base));
+       BUILD_BUG_ON(BGMAC_MAX_RX_RINGS > ARRAY_SIZE(ring_base));
+-      if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) {
++      if (!(bgmac_idm_read(bgmac, BCMA_IOST) & BCMA_IOST_DMA64)) {
+               dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
+               return -ENOTSUPP;
+       }
+@@ -875,12 +851,10 @@ static void bgmac_mac_speed(struct bgmac
+ static void bgmac_miiconfig(struct bgmac *bgmac)
+ {
+-      struct bcma_device *core = bgmac->core;
+-
+       if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
+-              bcma_awrite32(core, BCMA_IOCTL,
+-                            bcma_aread32(core, BCMA_IOCTL) | 0x40 |
+-                            BGMAC_BCMA_IOCTL_SW_CLKEN);
++              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);
+@@ -900,12 +874,11 @@ static void bgmac_miiconfig(struct bgmac
+ /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipreset */
+ static void bgmac_chip_reset(struct bgmac *bgmac)
+ {
+-      struct bcma_device *core = bgmac->core;
+       u32 cmdcfg_sr;
+       u32 iost;
+       int i;
+-      if (bcma_core_is_enabled(core)) {
++      if (bgmac_clk_enabled(bgmac)) {
+               if (!bgmac->stats_grabbed) {
+                       /* bgmac_chip_stats_update(bgmac); */
+                       bgmac->stats_grabbed = true;
+@@ -923,7 +896,7 @@ static void bgmac_chip_reset(struct bgma
+               /* TODO: Clear software multicast filter list */
+       }
+-      iost = bcma_aread32(core, BCMA_IOST);
++      iost = bgmac_idm_read(bgmac, BCMA_IOST);
+       if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
+               iost &= ~BGMAC_BCMA_IOST_ATTACHED;
+@@ -935,21 +908,20 @@ static void bgmac_chip_reset(struct bgma
+                       if (!bgmac->has_robosw)
+                               flags |= BGMAC_BCMA_IOCTL_SW_RESET;
+               }
+-              bcma_core_enable(core, flags);
++              bgmac_clk_enable(bgmac, flags);
+       }
+       /* Request Misc PLL for corerev > 2 */
+       if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
+               bgmac_set(bgmac, BCMA_CLKCTLST,
+                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
+-              bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
++              bgmac_wait_value(bgmac, BCMA_CLKCTLST,
+                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
+                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
+                                1000);
+       }
+       if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_PHY) {
+-              struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
+               u8 et_swtype = 0;
+               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
+                            BGMAC_CHIPCTL_1_IF_TYPE_MII;
+@@ -968,16 +940,15 @@ static void bgmac_chip_reset(struct bgma
+                       sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
+                                 BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
+               }
+-              bcma_chipco_chipctl_maskset(cc, 1,
+-                                          ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK |
+-                                            BGMAC_CHIPCTL_1_SW_TYPE_MASK),
+-                                          sw_type);
++              bgmac_cco_ctl_maskset(bgmac, 1, ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK |
++                                                BGMAC_CHIPCTL_1_SW_TYPE_MASK),
++                                    sw_type);
+       }
+       if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
+-              bcma_awrite32(core, BCMA_IOCTL,
+-                            bcma_aread32(core, BCMA_IOCTL) &
+-                            ~BGMAC_BCMA_IOCTL_SW_RESET);
++              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
+@@ -1013,8 +984,8 @@ static void bgmac_chip_reset(struct bgma
+       bgmac_clear_mib(bgmac);
+       if (bgmac->feature_flags & BGMAC_FEAT_CMN_PHY_CTL)
+-              bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0,
+-                             BCMA_GMAC_CMN_PC_MTE);
++              bgmac_cmn_maskset32(bgmac, BCMA_GMAC_CMN_PHY_CTL, ~0,
++                                  BCMA_GMAC_CMN_PC_MTE);
+       else
+               bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE);
+       bgmac_miiconfig(bgmac);
+@@ -1059,8 +1030,8 @@ static void bgmac_enable(struct bgmac *b
+       if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
+               bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
+       if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
+-              bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0,
+-                                          BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
++              bgmac_cco_ctl_maskset(bgmac, 1, ~0,
++                                    BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
+       if (bgmac->feature_flags & (BGMAC_FEAT_FLW_CTRL1 |
+                                   BGMAC_FEAT_FLW_CTRL2)) {
+@@ -1082,8 +1053,7 @@ static void bgmac_enable(struct bgmac *b
+               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
+               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
+-              bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
+-                              1000000;
++              bp_clk = bgmac_get_bus_clock(bgmac) / 1000000;
+               mdp = (bp_clk * 128 / 1000) - 3;
+               rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
+               bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
+@@ -1178,7 +1148,7 @@ static int bgmac_open(struct net_device
+       /* Specs say about reclaiming rings here, but we do that in DMA init */
+       bgmac_chip_init(bgmac);
+-      err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED,
++      err = request_irq(bgmac->irq, bgmac_interrupt, IRQF_SHARED,
+                         KBUILD_MODNAME, net_dev);
+       if (err < 0) {
+               dev_err(bgmac->dev, "IRQ request error: %d!\n", err);
+@@ -1204,7 +1174,7 @@ static int bgmac_stop(struct net_device
+       napi_disable(&bgmac->napi);
+       bgmac_chip_intrs_off(bgmac);
+-      free_irq(bgmac->core->irq, net_dev);
++      free_irq(bgmac->irq, net_dev);
+       bgmac_chip_reset(bgmac);
+       bgmac_dma_cleanup(bgmac);
+@@ -1399,7 +1369,7 @@ static void bgmac_get_drvinfo(struct net
+                             struct ethtool_drvinfo *info)
+ {
+       strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
+-      strlcpy(info->bus_info, "BCMA", sizeof(info->bus_info));
++      strlcpy(info->bus_info, "AXI", sizeof(info->bus_info));
+ }
+ static const struct ethtool_ops bgmac_ethtool_ops = {
+@@ -1483,116 +1453,41 @@ static int bgmac_phy_connect(struct bgma
+       return 0;
+ }
+-static int bgmac_probe(struct bcma_device *core)
++int bgmac_enet_probe(struct bgmac *info)
+ {
+       struct net_device *net_dev;
+       struct bgmac *bgmac;
+-      struct ssb_sprom *sprom = &core->bus->sprom;
+-      u8 *mac;
+       int err;
+-      switch (core->core_unit) {
+-      case 0:
+-              mac = sprom->et0mac;
+-              break;
+-      case 1:
+-              mac = sprom->et1mac;
+-              break;
+-      case 2:
+-              mac = sprom->et2mac;
+-              break;
+-      default:
+-              dev_err(&core->dev, "Unsupported core_unit %d\n",
+-                      core->core_unit);
+-              return -ENOTSUPP;
+-      }
+-
+-      if (!is_valid_ether_addr(mac)) {
+-              dev_err(&core->dev, "Invalid MAC addr: %pM\n", mac);
+-              eth_random_addr(mac);
+-              dev_warn(&core->dev, "Using random MAC: %pM\n", mac);
+-      }
+-
+-      /* This (reset &) enable is not preset in specs or reference driver but
+-       * Broadcom does it in arch PCI code when enabling fake PCI device.
+-       */
+-      bcma_core_enable(core, 0);
+-
+       /* Allocation and references */
+       net_dev = alloc_etherdev(sizeof(*bgmac));
+       if (!net_dev)
+               return -ENOMEM;
++
+       net_dev->netdev_ops = &bgmac_netdev_ops;
+-      net_dev->irq = core->irq;
+       net_dev->ethtool_ops = &bgmac_ethtool_ops;
+       bgmac = netdev_priv(net_dev);
+-      bgmac->dev = &core->dev;
+-      bgmac->dma_dev = core->dma_dev;
++      memcpy(bgmac, info, sizeof(*bgmac));
+       bgmac->net_dev = net_dev;
+-      bgmac->core = core;
+-      bcma_set_drvdata(core, bgmac);
+-      SET_NETDEV_DEV(net_dev, &core->dev);
+-
+-      /* Defaults */
+-      memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
+-
+-      /* On BCM4706 we need common core to access PHY */
+-      if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
+-          !core->bus->drv_gmac_cmn.core) {
+-              dev_err(bgmac->dev, "GMAC CMN core not found (required for BCM4706)\n");
+-              err = -ENODEV;
+-              goto err_netdev_free;
+-      }
+-      bgmac->cmn = core->bus->drv_gmac_cmn.core;
++      net_dev->irq = bgmac->irq;
++      SET_NETDEV_DEV(net_dev, bgmac->dev);
+-      switch (core->core_unit) {
+-      case 0:
+-              bgmac->phyaddr = sprom->et0phyaddr;
+-              break;
+-      case 1:
+-              bgmac->phyaddr = sprom->et1phyaddr;
+-              break;
+-      case 2:
+-              bgmac->phyaddr = sprom->et2phyaddr;
+-              break;
++      if (!is_valid_ether_addr(bgmac->mac_addr)) {
++              dev_err(bgmac->dev, "Invalid MAC addr: %pM\n",
++                      bgmac->mac_addr);
++              eth_random_addr(bgmac->mac_addr);
++              dev_warn(bgmac->dev, "Using random MAC: %pM\n",
++                       bgmac->mac_addr);
+       }
+-      bgmac->phyaddr &= BGMAC_PHY_MASK;
+-      if (bgmac->phyaddr == BGMAC_PHY_MASK) {
+-              dev_err(bgmac->dev, "No PHY found\n");
+-              err = -ENODEV;
+-              goto err_netdev_free;
+-      }
+-      dev_info(bgmac->dev, "Found PHY addr: %d%s\n", bgmac->phyaddr,
+-               bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
++      ether_addr_copy(net_dev->dev_addr, bgmac->mac_addr);
+-      if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
+-              dev_err(bgmac->dev, "PCI setup not implemented\n");
+-              err = -ENOTSUPP;
+-              goto err_netdev_free;
+-      }
++      /* This (reset &) enable is not preset in specs or reference driver but
++       * Broadcom does it in arch PCI code when enabling fake PCI device.
++       */
++      bgmac_clk_enable(bgmac, 0);
+       bgmac_chip_reset(bgmac);
+-      /* For Northstar, we have to take all GMAC core out of reset */
+-      if (bgmac_is_bcm4707_family(bgmac)) {
+-              struct bcma_device *ns_core;
+-              int ns_gmac;
+-
+-              /* Northstar has 4 GMAC cores */
+-              for (ns_gmac = 0; ns_gmac < 4; ns_gmac++) {
+-                      /* As Northstar requirement, we have to reset all GMACs
+-                       * before accessing one. bgmac_chip_reset() call
+-                       * bcma_core_enable() for this core. Then the other
+-                       * three GMACs didn't reset.  We do it here.
+-                       */
+-                      ns_core = bcma_find_core_unit(core->bus,
+-                                                    BCMA_CORE_MAC_GBIT,
+-                                                    ns_gmac);
+-                      if (ns_core && !bcma_core_is_enabled(ns_core))
+-                              bcma_core_enable(ns_core, 0);
+-              }
+-      }
+-
+       err = bgmac_dma_alloc(bgmac);
+       if (err) {
+               dev_err(bgmac->dev, "Unable to alloc memory for DMA\n");
+@@ -1603,103 +1498,15 @@ static int bgmac_probe(struct bcma_devic
+       if (bcm47xx_nvram_getenv("et0_no_txint", NULL, 0) == 0)
+               bgmac->int_mask &= ~BGMAC_IS_TX_MASK;
+-      bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
+-                             BGMAC_BFL_ENETROBO);
+-      if (bgmac->has_robosw)
+-              dev_warn(bgmac->dev, "Support for Roboswitch not implemented\n");
+-
+-      if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
+-              dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
+-
+-      /* Feature Flags */
+-      switch (core->bus->chipinfo.id) {
+-      case BCMA_CHIP_ID_BCM5357:
+-              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
+-              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+-              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
+-              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
+-              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
+-                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
+-                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
+-              }
+-              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
+-                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
+-              break;
+-      case BCMA_CHIP_ID_BCM53572:
+-              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
+-              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+-              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
+-              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
+-              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
+-                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
+-                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
+-              }
+-              break;
+-      case BCMA_CHIP_ID_BCM4749:
+-              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
+-              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+-              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
+-              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
+-              if (core->bus->chipinfo.pkg == 10) {
+-                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
+-                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
+-              }
+-              break;
+-      case BCMA_CHIP_ID_BCM4716:
+-              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+-              /* fallthrough */
+-      case BCMA_CHIP_ID_BCM47162:
+-              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
+-              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
+-              break;
+-      /* bcm4707_family */
+-      case BCMA_CHIP_ID_BCM4707:
+-      case BCMA_CHIP_ID_BCM47094:
+-      case BCMA_CHIP_ID_BCM53018:
+-              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+-              bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
+-              bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
+-              break;
+-      default:
+-              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+-              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
+-      }
+-
+-      if (!bgmac_is_bcm4707_family(bgmac) && core->id.rev > 2)
+-              bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
+-
+-      if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
+-              bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
+-              bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
+-      }
+-
+-      if (core->id.rev >= 4) {
+-              bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
+-              bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
+-              bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
+-      }
+-
+       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
+-      if (!bgmac_is_bcm4707_family(bgmac)) {
+-              struct mii_bus *mii_bus;
+-
+-              mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
+-              if (!IS_ERR(mii_bus)) {
+-                      err = PTR_ERR(mii_bus);
+-                      goto err_dma_free;
+-              }
+-
+-              bgmac->mii_bus = mii_bus;
+-      }
+-
+       if (!bgmac->mii_bus)
+               err = bgmac_phy_connect_direct(bgmac);
+       else
+               err = bgmac_phy_connect(bgmac);
+       if (err) {
+               dev_err(bgmac->dev, "Cannot connect to phy\n");
+-              goto err_mii_unregister;
++              goto err_dma_free;
+       }
+       net_dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+@@ -1718,56 +1525,24 @@ static int bgmac_probe(struct bcma_devic
+ err_phy_disconnect:
+       phy_disconnect(net_dev->phydev);
+-err_mii_unregister:
+-      bcma_mdio_mii_unregister(bgmac->mii_bus);
+ err_dma_free:
+       bgmac_dma_free(bgmac);
+ err_netdev_free:
+-      bcma_set_drvdata(core, NULL);
+       free_netdev(net_dev);
+       return err;
+ }
++EXPORT_SYMBOL_GPL(bgmac_enet_probe);
+-static void bgmac_remove(struct bcma_device *core)
++void bgmac_enet_remove(struct bgmac *bgmac)
+ {
+-      struct bgmac *bgmac = bcma_get_drvdata(core);
+-
+       unregister_netdev(bgmac->net_dev);
+       phy_disconnect(bgmac->net_dev->phydev);
+-      bcma_mdio_mii_unregister(bgmac->mii_bus);
+       netif_napi_del(&bgmac->napi);
+       bgmac_dma_free(bgmac);
+-      bcma_set_drvdata(core, NULL);
+       free_netdev(bgmac->net_dev);
+ }
+-
+-static struct bcma_driver bgmac_bcma_driver = {
+-      .name           = KBUILD_MODNAME,
+-      .id_table       = bgmac_bcma_tbl,
+-      .probe          = bgmac_probe,
+-      .remove         = bgmac_remove,
+-};
+-
+-static int __init bgmac_init(void)
+-{
+-      int err;
+-
+-      err = bcma_driver_register(&bgmac_bcma_driver);
+-      if (err)
+-              return err;
+-      pr_info("Broadcom 47xx GBit MAC driver loaded\n");
+-
+-      return 0;
+-}
+-
+-static void __exit bgmac_exit(void)
+-{
+-      bcma_driver_unregister(&bgmac_bcma_driver);
+-}
+-
+-module_init(bgmac_init)
+-module_exit(bgmac_exit)
++EXPORT_SYMBOL_GPL(bgmac_enet_remove);
+ MODULE_AUTHOR("Rafał Miłecki");
+ MODULE_LICENSE("GPL");
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -1,8 +1,6 @@
+ #ifndef _BGMAC_H
+ #define _BGMAC_H
+-#include <linux/bcma/bcma.h>
+-#include <linux/brcmphy.h>
+ #include <linux/netdevice.h>
+ #define BGMAC_DEV_CTL                         0x000
+@@ -442,11 +440,21 @@ struct bgmac_rx_header {
+ };
+ struct bgmac {
+-      struct bcma_device *core;
+-      struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
++      union {
++              struct {
++                      void *base;
++                      void *idm_base;
++              } plat;
++              struct {
++                      struct bcma_device *core;
++                      /* Reference to CMN core for BCM4706 */
++                      struct bcma_device *cmn;
++              } bcma;
++      };
+       struct device *dev;
+       struct device *dma_dev;
++      unsigned char mac_addr[ETH_ALEN];
+       u32 feature_flags;
+       struct net_device *net_dev;
+@@ -463,6 +471,7 @@ struct bgmac {
+       u32 mib_rx_regs[BGMAC_NUM_MIB_RX_REGS];
+       /* Int */
++      int irq;
+       u32 int_mask;
+       /* Current MAC state */
+@@ -473,19 +482,71 @@ struct bgmac {
+       bool has_robosw;
+       bool loopback;
++
++      u32 (*read)(struct bgmac *bgmac, u16 offset);
++      void (*write)(struct bgmac *bgmac, u16 offset, u32 value);
++      u32 (*idm_read)(struct bgmac *bgmac, u16 offset);
++      void (*idm_write)(struct bgmac *bgmac, u16 offset, u32 value);
++      bool (*clk_enabled)(struct bgmac *bgmac);
++      void (*clk_enable)(struct bgmac *bgmac, u32 flags);
++      void (*cco_ctl_maskset)(struct bgmac *bgmac, u32 offset, u32 mask,
++                              u32 set);
++      u32 (*get_bus_clock)(struct bgmac *bgmac);
++      void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
++                            u32 set);
+ };
++int bgmac_enet_probe(struct bgmac *info);
++void bgmac_enet_remove(struct bgmac *bgmac);
++
+ struct mii_bus *bcma_mdio_mii_register(struct bcma_device *core, u8 phyaddr);
+ void bcma_mdio_mii_unregister(struct mii_bus *mii_bus);
+ static inline u32 bgmac_read(struct bgmac *bgmac, u16 offset)
+ {
+-      return bcma_read32(bgmac->core, offset);
++      return bgmac->read(bgmac, offset);
+ }
+ static inline void bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
+ {
+-      bcma_write32(bgmac->core, offset, value);
++      bgmac->write(bgmac, offset, value);
++}
++
++static inline u32 bgmac_idm_read(struct bgmac *bgmac, u16 offset)
++{
++      return bgmac->idm_read(bgmac, offset);
++}
++
++static inline void bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
++{
++      bgmac->idm_write(bgmac, offset, value);
++}
++
++static inline bool bgmac_clk_enabled(struct bgmac *bgmac)
++{
++      return bgmac->clk_enabled(bgmac);
++}
++
++static inline void bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
++{
++      bgmac->clk_enable(bgmac, flags);
++}
++
++static inline void bgmac_cco_ctl_maskset(struct bgmac *bgmac, u32 offset,
++                                       u32 mask, u32 set)
++{
++      bgmac->cco_ctl_maskset(bgmac, offset, mask, set);
++}
++
++static inline u32 bgmac_get_bus_clock(struct bgmac *bgmac)
++{
++      return bgmac->get_bus_clock(bgmac);
++}
++
++static inline void bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset,
++                                     u32 mask, u32 set)
++{
++      bgmac->cmn_maskset32(bgmac, offset, mask, set);
+ }
+ static inline void bgmac_maskset(struct bgmac *bgmac, u16 offset, u32 mask,
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0006-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch b/target/linux/generic/patches-4.4/071-v4.8-0006-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch
new file mode 100644 (file)
index 0000000..e0431c1
--- /dev/null
@@ -0,0 +1,26 @@
+From 12c2e32f14da857b58af281b029d4549d24c3292 Mon Sep 17 00:00:00 2001
+From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
+Date: Tue, 12 Jul 2016 00:17:28 +0000
+Subject: [PATCH] net: ethernet: bgmac: Fix return value check in bgmac_probe()
+
+In case of error, the function devm_ioremap_resource() returns ERR_PTR()
+and never returns NULL. The NULL test in the return value check should be
+replaced with IS_ERR().
+
+Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac-platform.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac-platform.c
++++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
+@@ -141,7 +141,7 @@ static int bgmac_probe(struct platform_d
+       }
+       bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
+-      if (!bgmac->plat.idm_base) {
++      if (IS_ERR(bgmac->plat.idm_base)) {
+               dev_err(&pdev->dev, "Unable to map idm resource\n");
+               return PTR_ERR(bgmac->plat.idm_base);
+       }
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0007-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch b/target/linux/generic/patches-4.4/071-v4.8-0007-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch
new file mode 100644 (file)
index 0000000..4790948
--- /dev/null
@@ -0,0 +1,42 @@
+From ce3a380dddd0cb16cb3d8d947b69657d7646c121 Mon Sep 17 00:00:00 2001
+From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
+Date: Wed, 13 Jul 2016 12:46:57 +0000
+Subject: [PATCH] net: ethernet: bgmac: Remove redundant dev_err call in
+ bgmac_probe()
+
+There is a error message within devm_ioremap_resource
+already, so remove the dev_err call to avoid redundant
+error message.
+
+Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac-platform.c | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac-platform.c
++++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
+@@ -129,10 +129,8 @@ static int bgmac_probe(struct platform_d
+       }
+       bgmac->plat.base = devm_ioremap_resource(&pdev->dev, regs);
+-      if (IS_ERR(bgmac->plat.base)) {
+-              dev_err(&pdev->dev, "Unable to map base resource\n");
++      if (IS_ERR(bgmac->plat.base))
+               return PTR_ERR(bgmac->plat.base);
+-      }
+       regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "idm_base");
+       if (!regs) {
+@@ -141,10 +139,8 @@ static int bgmac_probe(struct platform_d
+       }
+       bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
+-      if (IS_ERR(bgmac->plat.idm_base)) {
+-              dev_err(&pdev->dev, "Unable to map idm resource\n");
++      if (IS_ERR(bgmac->plat.idm_base))
+               return PTR_ERR(bgmac->plat.idm_base);
+-      }
+       bgmac->read = platform_bgmac_read;
+       bgmac->write = platform_bgmac_write;
diff --git a/target/linux/generic/patches-4.4/071-v4.8-0009-net-bgmac-fix-reversed-check-for-MII-registration-er.patch b/target/linux/generic/patches-4.4/071-v4.8-0009-net-bgmac-fix-reversed-check-for-MII-registration-er.patch
new file mode 100644 (file)
index 0000000..945546d
--- /dev/null
@@ -0,0 +1,28 @@
+From b9f63ae7ba2de2ba19137c5757c0607ce40f3ed5 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 15:37:14 +0200
+Subject: [PATCH] net: bgmac: fix reversed check for MII registration error
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It was failing on successful registration returning meaningless errors.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+Fixes: 55954f3bfdac ("net: ethernet: bgmac: move BCMA MDIO Phy code into a separate file")
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac-bcma.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
++++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
+@@ -159,7 +159,7 @@ static int bgmac_probe(struct bcma_devic
+       if (!bgmac_is_bcm4707_family(core)) {
+               mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
+-              if (!IS_ERR(mii_bus)) {
++              if (IS_ERR(mii_bus)) {
+                       err = PTR_ERR(mii_bus);
+                       goto err;
+               }
diff --git a/target/linux/generic/patches-4.4/071-v4.9-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch b/target/linux/generic/patches-4.4/071-v4.9-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch
new file mode 100644 (file)
index 0000000..82d3fe4
--- /dev/null
@@ -0,0 +1,161 @@
+From 1cb94db3d1bfe0075bde78fb2989f17e0a8a3936 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 23:00:30 +0200
+Subject: [PATCH] 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>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ 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
+@@ -943,6 +943,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)
+@@ -1486,6 +1507,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/071-v4.9-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch b/target/linux/generic/patches-4.4/071-v4.9-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch
new file mode 100644 (file)
index 0000000..272ec5c
--- /dev/null
@@ -0,0 +1,31 @@
+From e2d8f646c79f26e094bfaf9b21be614d1e148a67 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 23:11:52 +0200
+Subject: [PATCH] net: bgmac: make it clear when setting interface type to RMII
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It doesn't really change anything as BGMAC_CHIPCTL_1_IF_TYPE_RMII is
+equal to 0. It make code a bit clener, so far when reading it one could
+think we forgot to set a proper mode. It also keeps this mode code in
+sync with other ones.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -935,7 +935,8 @@ static void bgmac_chip_reset(struct bgma
+                       et_swtype <<= 4;
+                       sw_type = et_swtype;
+               } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII) {
+-                      sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
++                      sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RMII |
++                                BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
+               } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_RGMII) {
+                       sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
+                                 BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
diff --git a/target/linux/generic/patches-4.4/071-v4.9-0003-net-bgmac-Fix-errant-feature-flag-check.patch b/target/linux/generic/patches-4.4/071-v4.9-0003-net-bgmac-Fix-errant-feature-flag-check.patch
new file mode 100644 (file)
index 0000000..830d8cc
--- /dev/null
@@ -0,0 +1,33 @@
+From 4af1474e6198b10fee7bb20e81f7e033ad1b586c Mon Sep 17 00:00:00 2001
+From: Jon Mason <jon.mason@broadcom.com>
+Date: Wed, 5 Oct 2016 15:36:49 -0400
+Subject: [PATCH] net: bgmac: Fix errant feature flag check
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+During the conversion to the feature flags, a check against
+ci->id != BCMA_CHIP_ID_BCM47162
+became
+bgmac->feature_flags & BGMAC_FEAT_CLKCTLS
+instead of
+!(bgmac->feature_flags & BGMAC_FEAT_CLKCTLS)
+
+Reported-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Jon Mason <jon.mason@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1049,7 +1049,7 @@ static void bgmac_enable(struct bgmac *b
+       mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
+               BGMAC_DS_MM_SHIFT;
+-      if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
++      if (!(bgmac->feature_flags & BGMAC_FEAT_CLKCTLST) || mode != 0)
+               bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
+       if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
+               bgmac_cco_ctl_maskset(bgmac, 1, ~0,
diff --git a/target/linux/generic/patches-4.4/071-v4.9-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch b/target/linux/generic/patches-4.4/071-v4.9-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch
new file mode 100644 (file)
index 0000000..5721abc
--- /dev/null
@@ -0,0 +1,25 @@
+From c121f72a66c5f92fbe2fc53baa274eef39875cec Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king@canonical.com>
+Date: Mon, 24 Oct 2016 23:46:18 +0100
+Subject: [PATCH] net: bgmac: fix spelling mistake: "connecton" -> "connection"
+
+trivial fix to spelling mistake in dev_err message
+
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Acked-by: Jon Mason <jon.mason@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/broadcom/bgmac.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -1468,7 +1468,7 @@ static int bgmac_phy_connect(struct bgma
+       phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
+                             PHY_INTERFACE_MODE_MII);
+       if (IS_ERR(phy_dev)) {
+-              dev_err(bgmac->dev, "PHY connecton failed\n");
++              dev_err(bgmac->dev, "PHY connection failed\n");
+               return PTR_ERR(phy_dev);
+       }
diff --git a/target/linux/generic/patches-4.4/072-0001-bgmac-Bind-net_device-with-backing-device-structure.patch b/target/linux/generic/patches-4.4/072-0001-bgmac-Bind-net_device-with-backing-device-structure.patch
deleted file mode 100644 (file)
index 4d00094..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From 2022e9d50798aa592887ccb5a7d045e537f3855f Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Tue, 7 Jun 2016 15:06:13 -0700
-Subject: [PATCH 1/3] bgmac: Bind net_device with backing device structure
-
-In preparation for allowing different helpers to be utilized against
-network devices created by the bgmac driver, make sure that we bind the
-net_device with core->dev.
-
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1602,6 +1602,7 @@ static int bgmac_probe(struct bcma_devic
-       bgmac->net_dev = net_dev;
-       bgmac->core = core;
-       bcma_set_drvdata(core, bgmac);
-+      SET_NETDEV_DEV(net_dev, &core->dev);
-       /* Defaults */
-       memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
diff --git a/target/linux/generic/patches-4.4/072-0002-bgmac-Add-support-for-ethtool-statistics.patch b/target/linux/generic/patches-4.4/072-0002-bgmac-Add-support-for-ethtool-statistics.patch
deleted file mode 100644 (file)
index cff7080..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-From f6613d4fa937fa8388f2c1cb4e69ccc25e9e2336 Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Tue, 7 Jun 2016 15:06:14 -0700
-Subject: [PATCH 2/3] bgmac: Add support for ethtool statistics
-
-Read the statistics from the BGMAC's builtin MAC and return them to
-user-space using the standard ethtool helpers.
-
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 124 ++++++++++++++++++++++++++++++++++
- drivers/net/ethernet/broadcom/bgmac.h |   4 +-
- 2 files changed, 126 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1385,6 +1385,127 @@ static const struct net_device_ops bgmac
-  * ethtool_ops
-  **************************************************/
-+struct bgmac_stat {
-+      u8 size;
-+      u32 offset;
-+      const char *name;
-+};
-+
-+static struct bgmac_stat bgmac_get_strings_stats[] = {
-+      { 8, BGMAC_TX_GOOD_OCTETS, "tx_good_octets" },
-+      { 4, BGMAC_TX_GOOD_PKTS, "tx_good" },
-+      { 8, BGMAC_TX_OCTETS, "tx_octets" },
-+      { 4, BGMAC_TX_PKTS, "tx_pkts" },
-+      { 4, BGMAC_TX_BROADCAST_PKTS, "tx_broadcast" },
-+      { 4, BGMAC_TX_MULTICAST_PKTS, "tx_multicast" },
-+      { 4, BGMAC_TX_LEN_64, "tx_64" },
-+      { 4, BGMAC_TX_LEN_65_TO_127, "tx_65_127" },
-+      { 4, BGMAC_TX_LEN_128_TO_255, "tx_128_255" },
-+      { 4, BGMAC_TX_LEN_256_TO_511, "tx_256_511" },
-+      { 4, BGMAC_TX_LEN_512_TO_1023, "tx_512_1023" },
-+      { 4, BGMAC_TX_LEN_1024_TO_1522, "tx_1024_1522" },
-+      { 4, BGMAC_TX_LEN_1523_TO_2047, "tx_1523_2047" },
-+      { 4, BGMAC_TX_LEN_2048_TO_4095, "tx_2048_4095" },
-+      { 4, BGMAC_TX_LEN_4096_TO_8191, "tx_4096_8191" },
-+      { 4, BGMAC_TX_LEN_8192_TO_MAX, "tx_8192_max" },
-+      { 4, BGMAC_TX_JABBER_PKTS, "tx_jabber" },
-+      { 4, BGMAC_TX_OVERSIZE_PKTS, "tx_oversize" },
-+      { 4, BGMAC_TX_FRAGMENT_PKTS, "tx_fragment" },
-+      { 4, BGMAC_TX_UNDERRUNS, "tx_underruns" },
-+      { 4, BGMAC_TX_TOTAL_COLS, "tx_total_cols" },
-+      { 4, BGMAC_TX_SINGLE_COLS, "tx_single_cols" },
-+      { 4, BGMAC_TX_MULTIPLE_COLS, "tx_multiple_cols" },
-+      { 4, BGMAC_TX_EXCESSIVE_COLS, "tx_excessive_cols" },
-+      { 4, BGMAC_TX_LATE_COLS, "tx_late_cols" },
-+      { 4, BGMAC_TX_DEFERED, "tx_defered" },
-+      { 4, BGMAC_TX_CARRIER_LOST, "tx_carrier_lost" },
-+      { 4, BGMAC_TX_PAUSE_PKTS, "tx_pause" },
-+      { 4, BGMAC_TX_UNI_PKTS, "tx_unicast" },
-+      { 4, BGMAC_TX_Q0_PKTS, "tx_q0" },
-+      { 8, BGMAC_TX_Q0_OCTETS, "tx_q0_octets" },
-+      { 4, BGMAC_TX_Q1_PKTS, "tx_q1" },
-+      { 8, BGMAC_TX_Q1_OCTETS, "tx_q1_octets" },
-+      { 4, BGMAC_TX_Q2_PKTS, "tx_q2" },
-+      { 8, BGMAC_TX_Q2_OCTETS, "tx_q2_octets" },
-+      { 4, BGMAC_TX_Q3_PKTS, "tx_q3" },
-+      { 8, BGMAC_TX_Q3_OCTETS, "tx_q3_octets" },
-+      { 8, BGMAC_RX_GOOD_OCTETS, "rx_good_octets" },
-+      { 4, BGMAC_RX_GOOD_PKTS, "rx_good" },
-+      { 8, BGMAC_RX_OCTETS, "rx_octets" },
-+      { 4, BGMAC_RX_PKTS, "rx_pkts" },
-+      { 4, BGMAC_RX_BROADCAST_PKTS, "rx_broadcast" },
-+      { 4, BGMAC_RX_MULTICAST_PKTS, "rx_multicast" },
-+      { 4, BGMAC_RX_LEN_64, "rx_64" },
-+      { 4, BGMAC_RX_LEN_65_TO_127, "rx_65_127" },
-+      { 4, BGMAC_RX_LEN_128_TO_255, "rx_128_255" },
-+      { 4, BGMAC_RX_LEN_256_TO_511, "rx_256_511" },
-+      { 4, BGMAC_RX_LEN_512_TO_1023, "rx_512_1023" },
-+      { 4, BGMAC_RX_LEN_1024_TO_1522, "rx_1024_1522" },
-+      { 4, BGMAC_RX_LEN_1523_TO_2047, "rx_1523_2047" },
-+      { 4, BGMAC_RX_LEN_2048_TO_4095, "rx_2048_4095" },
-+      { 4, BGMAC_RX_LEN_4096_TO_8191, "rx_4096_8191" },
-+      { 4, BGMAC_RX_LEN_8192_TO_MAX, "rx_8192_max" },
-+      { 4, BGMAC_RX_JABBER_PKTS, "rx_jabber" },
-+      { 4, BGMAC_RX_OVERSIZE_PKTS, "rx_oversize" },
-+      { 4, BGMAC_RX_FRAGMENT_PKTS, "rx_fragment" },
-+      { 4, BGMAC_RX_MISSED_PKTS, "rx_missed" },
-+      { 4, BGMAC_RX_CRC_ALIGN_ERRS, "rx_crc_align" },
-+      { 4, BGMAC_RX_UNDERSIZE, "rx_undersize" },
-+      { 4, BGMAC_RX_CRC_ERRS, "rx_crc" },
-+      { 4, BGMAC_RX_ALIGN_ERRS, "rx_align" },
-+      { 4, BGMAC_RX_SYMBOL_ERRS, "rx_symbol" },
-+      { 4, BGMAC_RX_PAUSE_PKTS, "rx_pause" },
-+      { 4, BGMAC_RX_NONPAUSE_PKTS, "rx_nonpause" },
-+      { 4, BGMAC_RX_SACHANGES, "rx_sa_changes" },
-+      { 4, BGMAC_RX_UNI_PKTS, "rx_unicast" },
-+};
-+
-+#define BGMAC_STATS_LEN       ARRAY_SIZE(bgmac_get_strings_stats)
-+
-+static int bgmac_get_sset_count(struct net_device *dev, int string_set)
-+{
-+      switch (string_set) {
-+      case ETH_SS_STATS:
-+              return BGMAC_STATS_LEN;
-+      }
-+
-+      return -EOPNOTSUPP;
-+}
-+
-+static void bgmac_get_strings(struct net_device *dev, u32 stringset,
-+                            u8 *data)
-+{
-+      int i;
-+
-+      if (stringset != ETH_SS_STATS)
-+              return;
-+
-+      for (i = 0; i < BGMAC_STATS_LEN; i++)
-+              strlcpy(data + i * ETH_GSTRING_LEN,
-+                      bgmac_get_strings_stats[i].name, ETH_GSTRING_LEN);
-+}
-+
-+static void bgmac_get_ethtool_stats(struct net_device *dev,
-+                                  struct ethtool_stats *ss, uint64_t *data)
-+{
-+      struct bgmac *bgmac = netdev_priv(dev);
-+      const struct bgmac_stat *s;
-+      unsigned int i;
-+      u64 val;
-+
-+      if (!netif_running(dev))
-+              return;
-+
-+      for (i = 0; i < BGMAC_STATS_LEN; i++) {
-+              s = &bgmac_get_strings_stats[i];
-+              val = 0;
-+              if (s->size == 8)
-+                      val = (u64)bgmac_read(bgmac, s->offset + 4) << 32;
-+              val |= bgmac_read(bgmac, s->offset);
-+              data[i] = val;
-+      }
-+}
-+
- static int bgmac_get_settings(struct net_device *net_dev,
-                             struct ethtool_cmd *cmd)
- {
-@@ -1409,6 +1530,9 @@ static void bgmac_get_drvinfo(struct net
- }
- static const struct ethtool_ops bgmac_ethtool_ops = {
-+      .get_strings            = bgmac_get_strings,
-+      .get_sset_count         = bgmac_get_sset_count,
-+      .get_ethtool_stats      = bgmac_get_ethtool_stats,
-       .get_settings           = bgmac_get_settings,
-       .set_settings           = bgmac_set_settings,
-       .get_drvinfo            = bgmac_get_drvinfo,
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -123,7 +123,7 @@
- #define BGMAC_TX_LEN_1024_TO_1522             0x334
- #define BGMAC_TX_LEN_1523_TO_2047             0x338
- #define BGMAC_TX_LEN_2048_TO_4095             0x33c
--#define BGMAC_TX_LEN_4095_TO_8191             0x340
-+#define BGMAC_TX_LEN_4096_TO_8191             0x340
- #define BGMAC_TX_LEN_8192_TO_MAX              0x344
- #define BGMAC_TX_JABBER_PKTS                  0x348           /* Error */
- #define BGMAC_TX_OVERSIZE_PKTS                        0x34c           /* Error */
-@@ -166,7 +166,7 @@
- #define BGMAC_RX_LEN_1024_TO_1522             0x3e4
- #define BGMAC_RX_LEN_1523_TO_2047             0x3e8
- #define BGMAC_RX_LEN_2048_TO_4095             0x3ec
--#define BGMAC_RX_LEN_4095_TO_8191             0x3f0
-+#define BGMAC_RX_LEN_4096_TO_8191             0x3f0
- #define BGMAC_RX_LEN_8192_TO_MAX              0x3f4
- #define BGMAC_RX_JABBER_PKTS                  0x3f8           /* Error */
- #define BGMAC_RX_OVERSIZE_PKTS                        0x3fc           /* Error */
diff --git a/target/linux/generic/patches-4.4/072-0003-bgmac-Maintain-some-netdev-statistics.patch b/target/linux/generic/patches-4.4/072-0003-bgmac-Maintain-some-netdev-statistics.patch
deleted file mode 100644 (file)
index 322851d..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-From 6d490f62a4c7f11c552591bdd08eda3636aa0db9 Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Tue, 7 Jun 2016 15:06:15 -0700
-Subject: [PATCH 3/3] bgmac: Maintain some netdev statistics
-
-Add a few netdev statistics to report transmitted and received bytes and
-packets and a few obvious errors.
-
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -246,6 +246,8 @@ err_dma_head:
- err_drop:
-       dev_kfree_skb(skb);
-+      net_dev->stats.tx_dropped++;
-+      net_dev->stats.tx_errors++;
-       return NETDEV_TX_OK;
- }
-@@ -284,6 +286,8 @@ static void bgmac_dma_tx_free(struct bgm
-                                      DMA_TO_DEVICE);
-               if (slot->skb) {
-+                      bgmac->net_dev->stats.tx_bytes += slot->skb->len;
-+                      bgmac->net_dev->stats.tx_packets++;
-                       bytes_compl += slot->skb->len;
-                       pkts_compl++;
-@@ -467,6 +471,7 @@ static int bgmac_dma_rx_read(struct bgma
-                               bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
-                                         ring->start);
-                               put_page(virt_to_head_page(buf));
-+                              bgmac->net_dev->stats.rx_errors++;
-                               break;
-                       }
-@@ -474,6 +479,8 @@ static int bgmac_dma_rx_read(struct bgma
-                               bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n",
-                                         ring->start);
-                               put_page(virt_to_head_page(buf));
-+                              bgmac->net_dev->stats.rx_length_errors++;
-+                              bgmac->net_dev->stats.rx_errors++;
-                               break;
-                       }
-@@ -484,6 +491,7 @@ static int bgmac_dma_rx_read(struct bgma
-                       if (unlikely(!skb)) {
-                               bgmac_err(bgmac, "build_skb failed\n");
-                               put_page(virt_to_head_page(buf));
-+                              bgmac->net_dev->stats.rx_errors++;
-                               break;
-                       }
-                       skb_put(skb, BGMAC_RX_FRAME_OFFSET +
-@@ -493,6 +501,8 @@ static int bgmac_dma_rx_read(struct bgma
-                       skb_checksum_none_assert(skb);
-                       skb->protocol = eth_type_trans(skb, bgmac->net_dev);
-+                      bgmac->net_dev->stats.rx_bytes += len;
-+                      bgmac->net_dev->stats.rx_packets++;
-                       napi_gro_receive(&bgmac->napi, skb);
-                       handled++;
-               } while (0);
diff --git a/target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch b/target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch
deleted file mode 100644 (file)
index 8c97b09..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-From b21fcb259313bcf7d4f73ecd5e44948995c8957c Mon Sep 17 00:00:00 2001
-From: Philippe Reynes <tremyfr@gmail.com>
-Date: Sun, 19 Jun 2016 22:37:05 +0200
-Subject: [PATCH 1/2] net: ethernet: bgmac: use phydev from struct net_device
-
-The private structure contain a pointer to phydev, but the structure
-net_device already contain such pointer. So we can remove the pointer
-phydev in the private structure, and update the driver to use the
-one contained in struct net_device.
-
-Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 17 ++++++-----------
- drivers/net/ethernet/broadcom/bgmac.h |  1 -
- 2 files changed, 6 insertions(+), 12 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1323,7 +1323,7 @@ static int bgmac_open(struct net_device
-       }
-       napi_enable(&bgmac->napi);
--      phy_start(bgmac->phy_dev);
-+      phy_start(net_dev->phydev);
-       netif_carrier_on(net_dev);
-       return 0;
-@@ -1335,7 +1335,7 @@ static int bgmac_stop(struct net_device
-       netif_carrier_off(net_dev);
--      phy_stop(bgmac->phy_dev);
-+      phy_stop(net_dev->phydev);
-       napi_disable(&bgmac->napi);
-       bgmac_chip_intrs_off(bgmac);
-@@ -1373,12 +1373,10 @@ static int bgmac_set_mac_address(struct
- static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
- {
--      struct bgmac *bgmac = netdev_priv(net_dev);
--
-       if (!netif_running(net_dev))
-               return -EINVAL;
--      return phy_mii_ioctl(bgmac->phy_dev, ifr, cmd);
-+      return phy_mii_ioctl(net_dev->phydev, ifr, cmd);
- }
- static const struct net_device_ops bgmac_netdev_ops = {
-@@ -1521,7 +1519,7 @@ static int bgmac_get_settings(struct net
- {
-       struct bgmac *bgmac = netdev_priv(net_dev);
--      return phy_ethtool_gset(bgmac->phy_dev, cmd);
-+      return phy_ethtool_gset(net_dev->phydev, cmd);
- }
- static int bgmac_set_settings(struct net_device *net_dev,
-@@ -1529,7 +1527,7 @@ static int bgmac_set_settings(struct net
- {
-       struct bgmac *bgmac = netdev_priv(net_dev);
--      return phy_ethtool_sset(bgmac->phy_dev, cmd);
-+      return phy_ethtool_sset(net_dev->phydev, cmd);
- }
- static void bgmac_get_drvinfo(struct net_device *net_dev,
-@@ -1566,7 +1564,7 @@ static int bgmac_mii_write(struct mii_bu
- static void bgmac_adjust_link(struct net_device *net_dev)
- {
-       struct bgmac *bgmac = netdev_priv(net_dev);
--      struct phy_device *phy_dev = bgmac->phy_dev;
-+      struct phy_device *phy_dev = net_dev->phydev;
-       bool update = false;
-       if (phy_dev->link) {
-@@ -1610,8 +1608,6 @@ static int bgmac_fixed_phy_register(stru
-               return err;
-       }
--      bgmac->phy_dev = phy_dev;
--
-       return err;
- }
-@@ -1664,7 +1660,6 @@ static int bgmac_mii_register(struct bgm
-               err = PTR_ERR(phy_dev);
-               goto err_unregister_bus;
-       }
--      bgmac->phy_dev = phy_dev;
-       return err;
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -441,7 +441,6 @@ struct bgmac {
-       struct net_device *net_dev;
-       struct napi_struct napi;
-       struct mii_bus *mii_bus;
--      struct phy_device *phy_dev;
-       /* DMA */
-       struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];
diff --git a/target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch b/target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch
deleted file mode 100644 (file)
index ea73fda..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From d2b13233879ca1268a1c027d4573109e5a777811 Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Thu, 23 Jun 2016 14:23:12 -0700
-Subject: [PATCH 1/3] net: bgmac: Fix SOF bit checking
-
-We are checking for the Start of Frame bit in the ctl1 word, while this
-bit is set in the ctl0 word instead. Read the ctl0 word and update the
-check to verify that.
-
-Fixes: 9cde94506eac ("bgmac: implement scatter/gather support")
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -269,15 +269,16 @@ static void bgmac_dma_tx_free(struct bgm
-       while (ring->start != ring->end) {
-               int slot_idx = ring->start % BGMAC_TX_RING_SLOTS;
-               struct bgmac_slot_info *slot = &ring->slots[slot_idx];
--              u32 ctl1;
-+              u32 ctl0, ctl1;
-               int len;
-               if (slot_idx == empty_slot)
-                       break;
-+              ctl0 = le32_to_cpu(ring->cpu_base[slot_idx].ctl0);
-               ctl1 = le32_to_cpu(ring->cpu_base[slot_idx].ctl1);
-               len = ctl1 & BGMAC_DESC_CTL1_LEN;
--              if (ctl1 & BGMAC_DESC_CTL0_SOF)
-+              if (ctl0 & BGMAC_DESC_CTL0_SOF)
-                       /* Unmap no longer used buffer */
-                       dma_unmap_single(dma_dev, slot->dma_addr, len,
-                                        DMA_TO_DEVICE);
diff --git a/target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch b/target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch
deleted file mode 100644 (file)
index 6a866bc..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From c3897f2a69e54dd113fc9abd2daf872e5b495798 Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Thu, 23 Jun 2016 14:25:32 -0700
-Subject: [PATCH 2/3] net: bgmac: Start transmit queue in bgmac_open
-
-The driver does not start the transmit queue in bgmac_open(). If the
-queue was stopped prior to closing then re-opening the interface, we
-would never be able to wake-up again.
-
-Fixes: dd4544f05469 ("bgmac: driver for GBit MAC core on BCMA bus")
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1327,6 +1327,9 @@ static int bgmac_open(struct net_device
-       phy_start(net_dev->phydev);
-       netif_carrier_on(net_dev);
-+
-+      netif_start_queue(net_dev);
-+
-       return 0;
- }
diff --git a/target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch b/target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch
deleted file mode 100644 (file)
index 0edf9ee..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From 3894396e64994f31c3ef5c7e6f63dded0593e567 Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Thu, 23 Jun 2016 14:25:33 -0700
-Subject: [PATCH 3/3] net: bgmac: Remove superflous netif_carrier_on()
-
-bgmac_open() calls phy_start() to initialize the PHY state machine,
-which will set the interface's carrier state accordingly, no need to
-force that as this could be conflicting with the PHY state determined by
-PHYLIB.
-
-Fixes: dd4544f05469 ("bgmac: driver for GBit MAC core on BCMA bus")
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -1326,8 +1326,6 @@ static int bgmac_open(struct net_device
-       phy_start(net_dev->phydev);
--      netif_carrier_on(net_dev);
--
-       netif_start_queue(net_dev);
-       return 0;
diff --git a/target/linux/generic/patches-4.4/075-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch b/target/linux/generic/patches-4.4/075-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch
deleted file mode 100644 (file)
index 3837b60..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-From d00a8281bcc962027dfe409c2f3e3f0546be9200 Mon Sep 17 00:00:00 2001
-From: Jon Mason <jon.mason@broadcom.com>
-Date: Thu, 7 Jul 2016 19:08:53 -0400
-Subject: [PATCH 1/5] net: ethernet: bgmac: change bgmac_* prints to dev_*
- prints
-
-The bgmac_* print wrappers call dev_* prints with the dev pointer from
-the bcma core.  In anticipation of removing the bcma requirement for
-this driver, these must be changed to not reference that struct.  So,
-simply change all of the bgmac_* prints to their dev_* counterparts.  In
-some cases netdev_* prints are more appropriate, so change those as
-well.
-
-Signed-off-by: Jon Mason <jon.mason@broadcom.com>
-Acked-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Tested-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 103 +++++++++++++++++-----------------
- drivers/net/ethernet/broadcom/bgmac.h |  14 +----
- 2 files changed, 55 insertions(+), 62 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -50,7 +50,7 @@ static bool bgmac_wait_value(struct bcma
-                       return true;
-               udelay(10);
-       }
--      pr_err("Timeout waiting for reg 0x%X\n", reg);
-+      dev_err(&core->dev, "Timeout waiting for reg 0x%X\n", reg);
-       return false;
- }
-@@ -84,8 +84,8 @@ static void bgmac_dma_tx_reset(struct bg
-               udelay(10);
-       }
-       if (i)
--              bgmac_err(bgmac, "Timeout suspending DMA TX ring 0x%X (BGMAC_DMA_TX_STAT: 0x%08X)\n",
--                        ring->mmio_base, val);
-+              dev_err(bgmac->dev, "Timeout suspending DMA TX ring 0x%X (BGMAC_DMA_TX_STAT: 0x%08X)\n",
-+                      ring->mmio_base, val);
-       /* Remove SUSPEND bit */
-       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, 0);
-@@ -93,13 +93,13 @@ static void bgmac_dma_tx_reset(struct bg
-                             ring->mmio_base + BGMAC_DMA_TX_STATUS,
-                             BGMAC_DMA_TX_STAT, BGMAC_DMA_TX_STAT_DISABLED,
-                             10000)) {
--              bgmac_warn(bgmac, "DMA TX ring 0x%X wasn't disabled on time, waiting additional 300us\n",
--                         ring->mmio_base);
-+              dev_warn(bgmac->dev, "DMA TX ring 0x%X wasn't disabled on time, waiting additional 300us\n",
-+                       ring->mmio_base);
-               udelay(300);
-               val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS);
-               if ((val & BGMAC_DMA_TX_STAT) != BGMAC_DMA_TX_STAT_DISABLED)
--                      bgmac_err(bgmac, "Reset of DMA TX ring 0x%X failed\n",
--                                ring->mmio_base);
-+                      dev_err(bgmac->dev, "Reset of DMA TX ring 0x%X failed\n",
-+                              ring->mmio_base);
-       }
- }
-@@ -161,7 +161,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
-       int i;
-       if (skb->len > BGMAC_DESC_CTL1_LEN) {
--              bgmac_err(bgmac, "Too long skb (%d)\n", skb->len);
-+              netdev_err(bgmac->net_dev, "Too long skb (%d)\n", skb->len);
-               goto err_drop;
-       }
-@@ -174,7 +174,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
-        * even when ring->end overflows
-        */
-       if (ring->end - ring->start + nr_frags + 1 >= BGMAC_TX_RING_SLOTS) {
--              bgmac_err(bgmac, "TX ring is full, queue should be stopped!\n");
-+              netdev_err(bgmac->net_dev, "TX ring is full, queue should be stopped!\n");
-               netif_stop_queue(net_dev);
-               return NETDEV_TX_BUSY;
-       }
-@@ -241,8 +241,8 @@ err_dma:
-       }
- err_dma_head:
--      bgmac_err(bgmac, "Mapping error of skb on ring 0x%X\n",
--                ring->mmio_base);
-+      netdev_err(bgmac->net_dev, "Mapping error of skb on ring 0x%X\n",
-+                 ring->mmio_base);
- err_drop:
-       dev_kfree_skb(skb);
-@@ -321,8 +321,8 @@ static void bgmac_dma_rx_reset(struct bg
-                             ring->mmio_base + BGMAC_DMA_RX_STATUS,
-                             BGMAC_DMA_RX_STAT, BGMAC_DMA_RX_STAT_DISABLED,
-                             10000))
--              bgmac_err(bgmac, "Reset of ring 0x%X RX failed\n",
--                        ring->mmio_base);
-+              dev_err(bgmac->dev, "Reset of ring 0x%X RX failed\n",
-+                      ring->mmio_base);
- }
- static void bgmac_dma_rx_enable(struct bgmac *bgmac,
-@@ -374,7 +374,7 @@ static int bgmac_dma_rx_skb_for_slot(str
-       dma_addr = dma_map_single(dma_dev, buf + BGMAC_RX_BUF_OFFSET,
-                                 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
-       if (dma_mapping_error(dma_dev, dma_addr)) {
--              bgmac_err(bgmac, "DMA mapping error\n");
-+              netdev_err(bgmac->net_dev, "DMA mapping error\n");
-               put_page(virt_to_head_page(buf));
-               return -ENOMEM;
-       }
-@@ -469,16 +469,16 @@ static int bgmac_dma_rx_read(struct bgma
-                       /* Check for poison and drop or pass the packet */
-                       if (len == 0xdead && flags == 0xbeef) {
--                              bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n",
--                                        ring->start);
-+                              netdev_err(bgmac->net_dev, "Found poisoned packet at slot %d, DMA issue!\n",
-+                                         ring->start);
-                               put_page(virt_to_head_page(buf));
-                               bgmac->net_dev->stats.rx_errors++;
-                               break;
-                       }
-                       if (len > BGMAC_RX_ALLOC_SIZE) {
--                              bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n",
--                                        ring->start);
-+                              netdev_err(bgmac->net_dev, "Found oversized packet at slot %d, DMA issue!\n",
-+                                         ring->start);
-                               put_page(virt_to_head_page(buf));
-                               bgmac->net_dev->stats.rx_length_errors++;
-                               bgmac->net_dev->stats.rx_errors++;
-@@ -490,7 +490,7 @@ static int bgmac_dma_rx_read(struct bgma
-                       skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
-                       if (unlikely(!skb)) {
--                              bgmac_err(bgmac, "build_skb failed\n");
-+                              netdev_err(bgmac->net_dev, "build_skb failed\n");
-                               put_page(virt_to_head_page(buf));
-                               bgmac->net_dev->stats.rx_errors++;
-                               break;
-@@ -644,7 +644,7 @@ static int bgmac_dma_alloc(struct bgmac
-       BUILD_BUG_ON(BGMAC_MAX_RX_RINGS > ARRAY_SIZE(ring_base));
-       if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) {
--              bgmac_err(bgmac, "Core does not report 64-bit DMA\n");
-+              dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
-               return -ENOTSUPP;
-       }
-@@ -658,8 +658,8 @@ static int bgmac_dma_alloc(struct bgmac
-                                                    &ring->dma_base,
-                                                    GFP_KERNEL);
-               if (!ring->cpu_base) {
--                      bgmac_err(bgmac, "Allocation of TX ring 0x%X failed\n",
--                                ring->mmio_base);
-+                      dev_err(bgmac->dev, "Allocation of TX ring 0x%X failed\n",
-+                              ring->mmio_base);
-                       goto err_dma_free;
-               }
-@@ -683,8 +683,8 @@ static int bgmac_dma_alloc(struct bgmac
-                                                    &ring->dma_base,
-                                                    GFP_KERNEL);
-               if (!ring->cpu_base) {
--                      bgmac_err(bgmac, "Allocation of RX ring 0x%X failed\n",
--                                ring->mmio_base);
-+                      dev_err(bgmac->dev, "Allocation of RX ring 0x%X failed\n",
-+                              ring->mmio_base);
-                       err = -ENOMEM;
-                       goto err_dma_free;
-               }
-@@ -803,8 +803,8 @@ static u16 bgmac_phy_read(struct bgmac *
-       bcma_write32(core, phy_access_addr, tmp);
-       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
--              bgmac_err(bgmac, "Reading PHY %d register 0x%X failed\n",
--                        phyaddr, reg);
-+              dev_err(bgmac->dev, "Reading PHY %d register 0x%X failed\n",
-+                      phyaddr, reg);
-               return 0xffff;
-       }
-@@ -836,7 +836,7 @@ static int bgmac_phy_write(struct bgmac
-       bgmac_write(bgmac, BGMAC_INT_STATUS, BGMAC_IS_MDIO);
-       if (bgmac_read(bgmac, BGMAC_INT_STATUS) & BGMAC_IS_MDIO)
--              bgmac_warn(bgmac, "Error setting MDIO int\n");
-+              dev_warn(bgmac->dev, "Error setting MDIO int\n");
-       tmp = BGMAC_PA_START;
-       tmp |= BGMAC_PA_WRITE;
-@@ -846,8 +846,8 @@ static int bgmac_phy_write(struct bgmac
-       bcma_write32(core, phy_access_addr, tmp);
-       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
--              bgmac_err(bgmac, "Writing to PHY %d register 0x%X failed\n",
--                        phyaddr, reg);
-+              dev_err(bgmac->dev, "Writing to PHY %d register 0x%X failed\n",
-+                      phyaddr, reg);
-               return -ETIMEDOUT;
-       }
-@@ -900,7 +900,7 @@ static void bgmac_phy_reset(struct bgmac
-       bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET);
-       udelay(100);
-       if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET)
--              bgmac_err(bgmac, "PHY reset failed\n");
-+              dev_err(bgmac->dev, "PHY reset failed\n");
-       bgmac_phy_init(bgmac);
- }
-@@ -1001,7 +1001,8 @@ static void bgmac_mac_speed(struct bgmac
-               set |= BGMAC_CMDCFG_ES_2500;
-               break;
-       default:
--              bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed);
-+              dev_err(bgmac->dev, "Unsupported speed: %d\n",
-+                      bgmac->mac_speed);
-       }
-       if (bgmac->mac_duplex == DUPLEX_HALF)
-@@ -1100,8 +1101,8 @@ static void bgmac_chip_reset(struct bgma
-               if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
-                       if (kstrtou8(buf, 0, &et_swtype))
--                              bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n",
--                                        buf);
-+                              dev_err(bgmac->dev, "Failed to parse et_swtype (%s)\n",
-+                                      buf);
-                       et_swtype &= 0x0f;
-                       et_swtype <<= 4;
-                       sw_type = et_swtype;
-@@ -1264,7 +1265,7 @@ static irqreturn_t bgmac_interrupt(int i
-       int_status &= ~(BGMAC_IS_TX0 | BGMAC_IS_RX);
-       if (int_status)
--              bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", int_status);
-+              dev_err(bgmac->dev, "Unknown IRQs: 0x%08X\n", int_status);
-       /* Disable new interrupts until handling existing ones */
-       bgmac_chip_intrs_off(bgmac);
-@@ -1318,7 +1319,7 @@ static int bgmac_open(struct net_device
-       err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED,
-                         KBUILD_MODNAME, net_dev);
-       if (err < 0) {
--              bgmac_err(bgmac, "IRQ request error: %d!\n", err);
-+              dev_err(bgmac->dev, "IRQ request error: %d!\n", err);
-               bgmac_dma_cleanup(bgmac);
-               return err;
-       }
-@@ -1599,14 +1600,14 @@ static int bgmac_fixed_phy_register(stru
-       phy_dev = fixed_phy_register(PHY_POLL, &fphy_status, -1, NULL);
-       if (!phy_dev || IS_ERR(phy_dev)) {
--              bgmac_err(bgmac, "Failed to register fixed PHY device\n");
-+              dev_err(bgmac->dev, "Failed to register fixed PHY device\n");
-               return -ENODEV;
-       }
-       err = phy_connect_direct(bgmac->net_dev, phy_dev, bgmac_adjust_link,
-                                PHY_INTERFACE_MODE_MII);
-       if (err) {
--              bgmac_err(bgmac, "Connecting PHY failed\n");
-+              dev_err(bgmac->dev, "Connecting PHY failed\n");
-               return err;
-       }
-@@ -1646,7 +1647,7 @@ static int bgmac_mii_register(struct bgm
-       err = mdiobus_register(mii_bus);
-       if (err) {
--              bgmac_err(bgmac, "Registration of mii bus failed\n");
-+              dev_err(bgmac->dev, "Registration of mii bus failed\n");
-               goto err_free_irq;
-       }
-@@ -1658,7 +1659,7 @@ static int bgmac_mii_register(struct bgm
-       phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
-                             PHY_INTERFACE_MODE_MII);
-       if (IS_ERR(phy_dev)) {
--              bgmac_err(bgmac, "PHY connecton failed\n");
-+              dev_err(bgmac->dev, "PHY connecton failed\n");
-               err = PTR_ERR(phy_dev);
-               goto err_unregister_bus;
-       }
-@@ -1707,7 +1708,8 @@ static int bgmac_probe(struct bcma_devic
-               mac = sprom->et2mac;
-               break;
-       default:
--              pr_err("Unsupported core_unit %d\n", core->core_unit);
-+              dev_err(&core->dev, "Unsupported core_unit %d\n",
-+                      core->core_unit);
-               return -ENOTSUPP;
-       }
-@@ -1730,6 +1732,7 @@ static int bgmac_probe(struct bcma_devic
-       net_dev->irq = core->irq;
-       net_dev->ethtool_ops = &bgmac_ethtool_ops;
-       bgmac = netdev_priv(net_dev);
-+      bgmac->dev = &core->dev;
-       bgmac->net_dev = net_dev;
-       bgmac->core = core;
-       bcma_set_drvdata(core, bgmac);
-@@ -1741,7 +1744,7 @@ static int bgmac_probe(struct bcma_devic
-       /* On BCM4706 we need common core to access PHY */
-       if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
-           !core->bus->drv_gmac_cmn.core) {
--              bgmac_err(bgmac, "GMAC CMN core not found (required for BCM4706)\n");
-+              dev_err(bgmac->dev, "GMAC CMN core not found (required for BCM4706)\n");
-               err = -ENODEV;
-               goto err_netdev_free;
-       }
-@@ -1760,15 +1763,15 @@ static int bgmac_probe(struct bcma_devic
-       }
-       bgmac->phyaddr &= BGMAC_PHY_MASK;
-       if (bgmac->phyaddr == BGMAC_PHY_MASK) {
--              bgmac_err(bgmac, "No PHY found\n");
-+              dev_err(bgmac->dev, "No PHY found\n");
-               err = -ENODEV;
-               goto err_netdev_free;
-       }
--      bgmac_info(bgmac, "Found PHY addr: %d%s\n", bgmac->phyaddr,
--                 bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
-+      dev_info(bgmac->dev, "Found PHY addr: %d%s\n", bgmac->phyaddr,
-+               bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
-       if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
--              bgmac_err(bgmac, "PCI setup not implemented\n");
-+              dev_err(bgmac->dev, "PCI setup not implemented\n");
-               err = -ENOTSUPP;
-               goto err_netdev_free;
-       }
-@@ -1797,7 +1800,7 @@ static int bgmac_probe(struct bcma_devic
-       err = bgmac_dma_alloc(bgmac);
-       if (err) {
--              bgmac_err(bgmac, "Unable to alloc memory for DMA\n");
-+              dev_err(bgmac->dev, "Unable to alloc memory for DMA\n");
-               goto err_netdev_free;
-       }
-@@ -1811,16 +1814,16 @@ static int bgmac_probe(struct bcma_devic
-       bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
-                              BGMAC_BFL_ENETROBO);
-       if (bgmac->has_robosw)
--              bgmac_warn(bgmac, "Support for Roboswitch not implemented\n");
-+              dev_warn(bgmac->dev, "Support for Roboswitch not implemented\n");
-       if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
--              bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n");
-+              dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
-       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
-       err = bgmac_mii_register(bgmac);
-       if (err) {
--              bgmac_err(bgmac, "Cannot register MDIO\n");
-+              dev_err(bgmac->dev, "Cannot connect to phy\n");
-               goto err_dma_free;
-       }
-@@ -1830,7 +1833,7 @@ static int bgmac_probe(struct bcma_devic
-       err = register_netdev(bgmac->net_dev);
-       if (err) {
--              bgmac_err(bgmac, "Cannot register net device\n");
-+              dev_err(bgmac->dev, "Cannot register net device\n");
-               goto err_mii_unregister;
-       }
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -1,17 +1,6 @@
- #ifndef _BGMAC_H
- #define _BGMAC_H
--#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
--
--#define bgmac_err(bgmac, fmt, ...) \
--      dev_err(&(bgmac)->core->dev, fmt, ##__VA_ARGS__)
--#define bgmac_warn(bgmac, fmt, ...) \
--      dev_warn(&(bgmac)->core->dev, fmt,  ##__VA_ARGS__)
--#define bgmac_info(bgmac, fmt, ...) \
--      dev_info(&(bgmac)->core->dev, fmt,  ##__VA_ARGS__)
--#define bgmac_dbg(bgmac, fmt, ...) \
--      dev_dbg(&(bgmac)->core->dev, fmt, ##__VA_ARGS__)
--
- #include <linux/bcma/bcma.h>
- #include <linux/brcmphy.h>
- #include <linux/netdevice.h>
-@@ -438,6 +427,8 @@ struct bgmac_rx_header {
- struct bgmac {
-       struct bcma_device *core;
-       struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
-+
-+      struct device *dev;
-       struct net_device *net_dev;
-       struct napi_struct napi;
-       struct mii_bus *mii_bus;
-@@ -489,5 +480,4 @@ static inline void bgmac_set(struct bgma
- {
-       bgmac_maskset(bgmac, offset, ~0, set);
- }
--
- #endif /* _BGMAC_H */
diff --git a/target/linux/generic/patches-4.4/075-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch b/target/linux/generic/patches-4.4/075-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch
deleted file mode 100644 (file)
index dd5b877..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-From a0b68486f6f680c7c0352a47c60042d7d95ffd87 Mon Sep 17 00:00:00 2001
-From: Jon Mason <jon.mason@broadcom.com>
-Date: Thu, 7 Jul 2016 19:08:54 -0400
-Subject: [PATCH 2/5] net: ethernet: bgmac: add dma_dev pointer
-
-The dma buffer allocation, etc references a dma_dev device pointer from
-the bcma core.  In anticipation of removing the bcma requirement for
-this driver, these must be changed to not reference that struct.  Add a
-dma_dev device pointer to the bgmac stuct and reference that instead.
-
-Signed-off-by: Jon Mason <jon.mason@broadcom.com>
-Acked-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Tested-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 17 +++++++++--------
- drivers/net/ethernet/broadcom/bgmac.h |  1 +
- 2 files changed, 10 insertions(+), 8 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -152,7 +152,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru
-                                   struct bgmac_dma_ring *ring,
-                                   struct sk_buff *skb)
- {
--      struct device *dma_dev = bgmac->core->dma_dev;
-+      struct device *dma_dev = bgmac->dma_dev;
-       struct net_device *net_dev = bgmac->net_dev;
-       int index = ring->end % BGMAC_TX_RING_SLOTS;
-       struct bgmac_slot_info *slot = &ring->slots[index];
-@@ -254,7 +254,7 @@ err_drop:
- /* Free transmitted packets */
- static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring)
- {
--      struct device *dma_dev = bgmac->core->dma_dev;
-+      struct device *dma_dev = bgmac->dma_dev;
-       int empty_slot;
-       bool freed = false;
-       unsigned bytes_compl = 0, pkts_compl = 0;
-@@ -355,7 +355,7 @@ static void bgmac_dma_rx_enable(struct b
- static int bgmac_dma_rx_skb_for_slot(struct bgmac *bgmac,
-                                    struct bgmac_slot_info *slot)
- {
--      struct device *dma_dev = bgmac->core->dma_dev;
-+      struct device *dma_dev = bgmac->dma_dev;
-       dma_addr_t dma_addr;
-       struct bgmac_rx_header *rx;
-       void *buf;
-@@ -444,7 +444,7 @@ static int bgmac_dma_rx_read(struct bgma
-       end_slot /= sizeof(struct bgmac_dma_desc);
-       while (ring->start != end_slot) {
--              struct device *dma_dev = bgmac->core->dma_dev;
-+              struct device *dma_dev = bgmac->dma_dev;
-               struct bgmac_slot_info *slot = &ring->slots[ring->start];
-               struct bgmac_rx_header *rx = slot->buf + BGMAC_RX_BUF_OFFSET;
-               struct sk_buff *skb;
-@@ -547,7 +547,7 @@ static bool bgmac_dma_unaligned(struct b
- static void bgmac_dma_tx_ring_free(struct bgmac *bgmac,
-                                  struct bgmac_dma_ring *ring)
- {
--      struct device *dma_dev = bgmac->core->dma_dev;
-+      struct device *dma_dev = bgmac->dma_dev;
-       struct bgmac_dma_desc *dma_desc = ring->cpu_base;
-       struct bgmac_slot_info *slot;
-       int i;
-@@ -573,7 +573,7 @@ static void bgmac_dma_tx_ring_free(struc
- static void bgmac_dma_rx_ring_free(struct bgmac *bgmac,
-                                  struct bgmac_dma_ring *ring)
- {
--      struct device *dma_dev = bgmac->core->dma_dev;
-+      struct device *dma_dev = bgmac->dma_dev;
-       struct bgmac_slot_info *slot;
-       int i;
-@@ -594,7 +594,7 @@ static void bgmac_dma_ring_desc_free(str
-                                    struct bgmac_dma_ring *ring,
-                                    int num_slots)
- {
--      struct device *dma_dev = bgmac->core->dma_dev;
-+      struct device *dma_dev = bgmac->dma_dev;
-       int size;
-       if (!ring->cpu_base)
-@@ -632,7 +632,7 @@ static void bgmac_dma_free(struct bgmac
- static int bgmac_dma_alloc(struct bgmac *bgmac)
- {
--      struct device *dma_dev = bgmac->core->dma_dev;
-+      struct device *dma_dev = bgmac->dma_dev;
-       struct bgmac_dma_ring *ring;
-       static const u16 ring_base[] = { BGMAC_DMA_BASE0, BGMAC_DMA_BASE1,
-                                        BGMAC_DMA_BASE2, BGMAC_DMA_BASE3, };
-@@ -1733,6 +1733,7 @@ static int bgmac_probe(struct bcma_devic
-       net_dev->ethtool_ops = &bgmac_ethtool_ops;
-       bgmac = netdev_priv(net_dev);
-       bgmac->dev = &core->dev;
-+      bgmac->dma_dev = core->dma_dev;
-       bgmac->net_dev = net_dev;
-       bgmac->core = core;
-       bcma_set_drvdata(core, bgmac);
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -429,6 +429,7 @@ struct bgmac {
-       struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
-       struct device *dev;
-+      struct device *dma_dev;
-       struct net_device *net_dev;
-       struct napi_struct napi;
-       struct mii_bus *mii_bus;
diff --git a/target/linux/generic/patches-4.4/075-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch b/target/linux/generic/patches-4.4/075-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch
deleted file mode 100644 (file)
index bc7b246..0000000
+++ /dev/null
@@ -1,676 +0,0 @@
-From 55954f3bfdacc5908515b0c306cea23e77fab740 Mon Sep 17 00:00:00 2001
-From: Jon Mason <jon.mason@broadcom.com>
-Date: Thu, 7 Jul 2016 19:08:55 -0400
-Subject: [PATCH 3/5] net: ethernet: bgmac: move BCMA MDIO Phy code into a
- separate file
-
-Move the BCMA MDIO phy into a separate file, as it is very tightly
-coupled with the BCMA bus.  This will help with the upcoming BCMA
-removal from the bgmac driver.  Optimally, this should be moved into
-phy drivers, but it is too tightly coupled with the bgmac driver to
-effectively move it without more changes to the driver.
-
-Note: the phy_reset was intentionally removed, as the mdio phy subsystem
-automatically resets the phy if a reset function pointer is present.  In
-addition to the moving of the driver, this reset function is added.
-
-Signed-off-by: Jon Mason <jon.mason@broadcom.com>
-Acked-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Tested-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/Makefile          |   2 +-
- drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c | 264 ++++++++++++++++++++++++
- drivers/net/ethernet/broadcom/bgmac.c           | 246 +++-------------------
- drivers/net/ethernet/broadcom/bgmac.h           |   3 +
- 4 files changed, 298 insertions(+), 217 deletions(-)
- create mode 100644 drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
-
---- a/drivers/net/ethernet/broadcom/Makefile
-+++ b/drivers/net/ethernet/broadcom/Makefile
-@@ -10,6 +10,6 @@ obj-$(CONFIG_CNIC) += cnic.o
- obj-$(CONFIG_BNX2X) += bnx2x/
- obj-$(CONFIG_SB1250_MAC) += sb1250-mac.o
- obj-$(CONFIG_TIGON3) += tg3.o
--obj-$(CONFIG_BGMAC) += bgmac.o
-+obj-$(CONFIG_BGMAC) += bgmac.o bgmac-bcma-mdio.o
- obj-$(CONFIG_SYSTEMPORT) += bcmsysport.o
- obj-$(CONFIG_BNXT) += bnxt/
---- /dev/null
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
-@@ -0,0 +1,275 @@
-+/*
-+ * Driver for (BCM4706)? GBit MAC core on BCMA bus.
-+ *
-+ * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
-+
-+#include <linux/bcma/bcma.h>
-+#include <linux/brcmphy.h>
-+#include "bgmac.h"
-+
-+struct bcma_mdio {
-+      struct bcma_device *core;
-+      u8 phyaddr;
-+};
-+
-+static bool bcma_mdio_wait_value(struct bcma_device *core, u16 reg, u32 mask,
-+                               u32 value, int timeout)
-+{
-+      u32 val;
-+      int i;
-+
-+      for (i = 0; i < timeout / 10; i++) {
-+              val = bcma_read32(core, reg);
-+              if ((val & mask) == value)
-+                      return true;
-+              udelay(10);
-+      }
-+      dev_err(&core->dev, "Timeout waiting for reg 0x%X\n", reg);
-+      return false;
-+}
-+
-+/**************************************************
-+ * PHY ops
-+ **************************************************/
-+
-+static u16 bcma_mdio_phy_read(struct bcma_mdio *bcma_mdio, u8 phyaddr, u8 reg)
-+{
-+      struct bcma_device *core;
-+      u16 phy_access_addr;
-+      u16 phy_ctl_addr;
-+      u32 tmp;
-+
-+      BUILD_BUG_ON(BGMAC_PA_DATA_MASK != BCMA_GMAC_CMN_PA_DATA_MASK);
-+      BUILD_BUG_ON(BGMAC_PA_ADDR_MASK != BCMA_GMAC_CMN_PA_ADDR_MASK);
-+      BUILD_BUG_ON(BGMAC_PA_ADDR_SHIFT != BCMA_GMAC_CMN_PA_ADDR_SHIFT);
-+      BUILD_BUG_ON(BGMAC_PA_REG_MASK != BCMA_GMAC_CMN_PA_REG_MASK);
-+      BUILD_BUG_ON(BGMAC_PA_REG_SHIFT != BCMA_GMAC_CMN_PA_REG_SHIFT);
-+      BUILD_BUG_ON(BGMAC_PA_WRITE != BCMA_GMAC_CMN_PA_WRITE);
-+      BUILD_BUG_ON(BGMAC_PA_START != BCMA_GMAC_CMN_PA_START);
-+      BUILD_BUG_ON(BGMAC_PC_EPA_MASK != BCMA_GMAC_CMN_PC_EPA_MASK);
-+      BUILD_BUG_ON(BGMAC_PC_MCT_MASK != BCMA_GMAC_CMN_PC_MCT_MASK);
-+      BUILD_BUG_ON(BGMAC_PC_MCT_SHIFT != BCMA_GMAC_CMN_PC_MCT_SHIFT);
-+      BUILD_BUG_ON(BGMAC_PC_MTE != BCMA_GMAC_CMN_PC_MTE);
-+
-+      if (bcma_mdio->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
-+              core = bcma_mdio->core->bus->drv_gmac_cmn.core;
-+              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
-+              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
-+      } else {
-+              core = bcma_mdio->core;
-+              phy_access_addr = BGMAC_PHY_ACCESS;
-+              phy_ctl_addr = BGMAC_PHY_CNTL;
-+      }
-+
-+      tmp = bcma_read32(core, phy_ctl_addr);
-+      tmp &= ~BGMAC_PC_EPA_MASK;
-+      tmp |= phyaddr;
-+      bcma_write32(core, phy_ctl_addr, tmp);
-+
-+      tmp = BGMAC_PA_START;
-+      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
-+      tmp |= reg << BGMAC_PA_REG_SHIFT;
-+      bcma_write32(core, phy_access_addr, tmp);
-+
-+      if (!bcma_mdio_wait_value(core, phy_access_addr, BGMAC_PA_START, 0,
-+                                1000)) {
-+              dev_err(&core->dev, "Reading PHY %d register 0x%X failed\n",
-+                      phyaddr, reg);
-+              return 0xffff;
-+      }
-+
-+      return bcma_read32(core, phy_access_addr) & BGMAC_PA_DATA_MASK;
-+}
-+
-+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphywr */
-+static int bcma_mdio_phy_write(struct bcma_mdio *bcma_mdio, u8 phyaddr, u8 reg,
-+                             u16 value)
-+{
-+      struct bcma_device *core;
-+      u16 phy_access_addr;
-+      u16 phy_ctl_addr;
-+      u32 tmp;
-+
-+      if (bcma_mdio->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
-+              core = bcma_mdio->core->bus->drv_gmac_cmn.core;
-+              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
-+              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
-+      } else {
-+              core = bcma_mdio->core;
-+              phy_access_addr = BGMAC_PHY_ACCESS;
-+              phy_ctl_addr = BGMAC_PHY_CNTL;
-+      }
-+
-+      tmp = bcma_read32(core, phy_ctl_addr);
-+      tmp &= ~BGMAC_PC_EPA_MASK;
-+      tmp |= phyaddr;
-+      bcma_write32(core, phy_ctl_addr, tmp);
-+
-+      bcma_write32(bcma_mdio->core, BGMAC_INT_STATUS, BGMAC_IS_MDIO);
-+      if (bcma_read32(bcma_mdio->core, BGMAC_INT_STATUS) & BGMAC_IS_MDIO)
-+              dev_warn(&core->dev, "Error setting MDIO int\n");
-+
-+      tmp = BGMAC_PA_START;
-+      tmp |= BGMAC_PA_WRITE;
-+      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
-+      tmp |= reg << BGMAC_PA_REG_SHIFT;
-+      tmp |= value;
-+      bcma_write32(core, phy_access_addr, tmp);
-+
-+      if (!bcma_mdio_wait_value(core, phy_access_addr, BGMAC_PA_START, 0,
-+                                1000)) {
-+              dev_err(&core->dev, "Writing to PHY %d register 0x%X failed\n",
-+                      phyaddr, reg);
-+              return -ETIMEDOUT;
-+      }
-+
-+      return 0;
-+}
-+
-+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
-+static void bcma_mdio_phy_init(struct bcma_mdio *bcma_mdio)
-+{
-+      struct bcma_chipinfo *ci = &bcma_mdio->core->bus->chipinfo;
-+      u8 i;
-+
-+      if (ci->id == BCMA_CHIP_ID_BCM5356) {
-+              for (i = 0; i < 5; i++) {
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x008b);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x15, 0x0100);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000f);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x12, 0x2aaa);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000b);
-+              }
-+      }
-+      if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg != 10) ||
-+          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg != 10) ||
-+          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg != 9)) {
-+              struct bcma_drv_cc *cc = &bcma_mdio->core->bus->drv_cc;
-+
-+              bcma_chipco_chipctl_maskset(cc, 2, ~0xc0000000, 0);
-+              bcma_chipco_chipctl_maskset(cc, 4, ~0x80000000, 0);
-+              for (i = 0; i < 5; i++) {
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000f);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x16, 0x5284);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000b);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x0010);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000f);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x16, 0x5296);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x1073);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x9073);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x16, 0x52b6);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x17, 0x9273);
-+                      bcma_mdio_phy_write(bcma_mdio, i, 0x1f, 0x000b);
-+              }
-+      }
-+}
-+
-+/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyreset */
-+static int bcma_mdio_phy_reset(struct mii_bus *bus)
-+{
-+      struct bcma_mdio *bcma_mdio = bus->priv;
-+      u8 phyaddr = bcma_mdio->phyaddr;
-+
-+      if (bcma_mdio->phyaddr == BGMAC_PHY_NOREGS)
-+              return 0;
-+
-+      bcma_mdio_phy_write(bcma_mdio, phyaddr, MII_BMCR, BMCR_RESET);
-+      udelay(100);
-+      if (bcma_mdio_phy_read(bcma_mdio, phyaddr, MII_BMCR) & BMCR_RESET)
-+              dev_err(&bcma_mdio->core->dev, "PHY reset failed\n");
-+      bcma_mdio_phy_init(bcma_mdio);
-+
-+      return 0;
-+}
-+
-+/**************************************************
-+ * MII
-+ **************************************************/
-+
-+static int bcma_mdio_mii_read(struct mii_bus *bus, int mii_id, int regnum)
-+{
-+      return bcma_mdio_phy_read(bus->priv, mii_id, regnum);
-+}
-+
-+static int bcma_mdio_mii_write(struct mii_bus *bus, int mii_id, int regnum,
-+                             u16 value)
-+{
-+      return bcma_mdio_phy_write(bus->priv, mii_id, regnum, value);
-+}
-+
-+struct mii_bus *bcma_mdio_mii_register(struct bcma_device *core, u8 phyaddr)
-+{
-+      struct bcma_mdio *bcma_mdio;
-+      struct mii_bus *mii_bus;
-+      int i, err;
-+
-+      bcma_mdio = kzalloc(sizeof(*bcma_mdio), GFP_KERNEL);
-+      if (!bcma_mdio)
-+              return ERR_PTR(-ENOMEM);
-+
-+      mii_bus = mdiobus_alloc();
-+      if (!mii_bus) {
-+              err = -ENOMEM;
-+              goto err;
-+      }
-+
-+      mii_bus->name = "bcma_mdio mii bus";
-+      sprintf(mii_bus->id, "%s-%d-%d", "bcma_mdio", core->bus->num,
-+              core->core_unit);
-+      mii_bus->priv = bcma_mdio;
-+      mii_bus->read = bcma_mdio_mii_read;
-+      mii_bus->write = bcma_mdio_mii_write;
-+      mii_bus->reset = bcma_mdio_phy_reset;
-+      mii_bus->parent = &core->dev;
-+      mii_bus->phy_mask = ~(1 << phyaddr);
-+ 
-+      mii_bus->irq = kmalloc_array(PHY_MAX_ADDR, sizeof(int), GFP_KERNEL);
-+      if (!mii_bus->irq) {
-+              err = -ENOMEM;
-+              goto err_free_bus;
-+      }
-+      for (i = 0; i < PHY_MAX_ADDR; i++)
-+              mii_bus->irq[i] = PHY_POLL;
-+
-+      bcma_mdio->core = core;
-+      bcma_mdio->phyaddr = phyaddr;
-+
-+      err = mdiobus_register(mii_bus);
-+      if (err) {
-+              dev_err(&core->dev, "Registration of mii bus failed\n");
-+              goto err_free_irq;
-+      }
-+
-+      return mii_bus;
-+
-+err_free_irq:
-+      kfree(mii_bus->irq);
-+err_free_bus:
-+      mdiobus_free(mii_bus);
-+err:
-+      kfree(bcma_mdio);
-+      return ERR_PTR(err);
-+}
-+
-+void bcma_mdio_mii_unregister(struct mii_bus *mii_bus)
-+{
-+      struct bcma_mdio *bcma_mdio;
-+
-+      if (!mii_bus)
-+              return;
-+
-+      bcma_mdio = mii_bus->priv;
-+
-+      mdiobus_unregister(mii_bus);
-+      kfree(mii_bus->irq);
-+      mdiobus_free(mii_bus);
-+      kfree(bcma_mdio);
-+}
-+
-+MODULE_AUTHOR("Rafał Miłecki");
-+MODULE_LICENSE("GPL");
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -759,150 +759,6 @@ error:
-       return err;
- }
--/**************************************************
-- * PHY ops
-- **************************************************/
--
--static u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg)
--{
--      struct bcma_device *core;
--      u16 phy_access_addr;
--      u16 phy_ctl_addr;
--      u32 tmp;
--
--      BUILD_BUG_ON(BGMAC_PA_DATA_MASK != BCMA_GMAC_CMN_PA_DATA_MASK);
--      BUILD_BUG_ON(BGMAC_PA_ADDR_MASK != BCMA_GMAC_CMN_PA_ADDR_MASK);
--      BUILD_BUG_ON(BGMAC_PA_ADDR_SHIFT != BCMA_GMAC_CMN_PA_ADDR_SHIFT);
--      BUILD_BUG_ON(BGMAC_PA_REG_MASK != BCMA_GMAC_CMN_PA_REG_MASK);
--      BUILD_BUG_ON(BGMAC_PA_REG_SHIFT != BCMA_GMAC_CMN_PA_REG_SHIFT);
--      BUILD_BUG_ON(BGMAC_PA_WRITE != BCMA_GMAC_CMN_PA_WRITE);
--      BUILD_BUG_ON(BGMAC_PA_START != BCMA_GMAC_CMN_PA_START);
--      BUILD_BUG_ON(BGMAC_PC_EPA_MASK != BCMA_GMAC_CMN_PC_EPA_MASK);
--      BUILD_BUG_ON(BGMAC_PC_MCT_MASK != BCMA_GMAC_CMN_PC_MCT_MASK);
--      BUILD_BUG_ON(BGMAC_PC_MCT_SHIFT != BCMA_GMAC_CMN_PC_MCT_SHIFT);
--      BUILD_BUG_ON(BGMAC_PC_MTE != BCMA_GMAC_CMN_PC_MTE);
--
--      if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
--              core = bgmac->core->bus->drv_gmac_cmn.core;
--              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
--              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
--      } else {
--              core = bgmac->core;
--              phy_access_addr = BGMAC_PHY_ACCESS;
--              phy_ctl_addr = BGMAC_PHY_CNTL;
--      }
--
--      tmp = bcma_read32(core, phy_ctl_addr);
--      tmp &= ~BGMAC_PC_EPA_MASK;
--      tmp |= phyaddr;
--      bcma_write32(core, phy_ctl_addr, tmp);
--
--      tmp = BGMAC_PA_START;
--      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
--      tmp |= reg << BGMAC_PA_REG_SHIFT;
--      bcma_write32(core, phy_access_addr, tmp);
--
--      if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
--              dev_err(bgmac->dev, "Reading PHY %d register 0x%X failed\n",
--                      phyaddr, reg);
--              return 0xffff;
--      }
--
--      return bcma_read32(core, phy_access_addr) & BGMAC_PA_DATA_MASK;
--}
--
--/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphywr */
--static int bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value)
--{
--      struct bcma_device *core;
--      u16 phy_access_addr;
--      u16 phy_ctl_addr;
--      u32 tmp;
--
--      if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) {
--              core = bgmac->core->bus->drv_gmac_cmn.core;
--              phy_access_addr = BCMA_GMAC_CMN_PHY_ACCESS;
--              phy_ctl_addr = BCMA_GMAC_CMN_PHY_CTL;
--      } else {
--              core = bgmac->core;
--              phy_access_addr = BGMAC_PHY_ACCESS;
--              phy_ctl_addr = BGMAC_PHY_CNTL;
--      }
--
--      tmp = bcma_read32(core, phy_ctl_addr);
--      tmp &= ~BGMAC_PC_EPA_MASK;
--      tmp |= phyaddr;
--      bcma_write32(core, phy_ctl_addr, tmp);
--
--      bgmac_write(bgmac, BGMAC_INT_STATUS, BGMAC_IS_MDIO);
--      if (bgmac_read(bgmac, BGMAC_INT_STATUS) & BGMAC_IS_MDIO)
--              dev_warn(bgmac->dev, "Error setting MDIO int\n");
--
--      tmp = BGMAC_PA_START;
--      tmp |= BGMAC_PA_WRITE;
--      tmp |= phyaddr << BGMAC_PA_ADDR_SHIFT;
--      tmp |= reg << BGMAC_PA_REG_SHIFT;
--      tmp |= value;
--      bcma_write32(core, phy_access_addr, tmp);
--
--      if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) {
--              dev_err(bgmac->dev, "Writing to PHY %d register 0x%X failed\n",
--                      phyaddr, reg);
--              return -ETIMEDOUT;
--      }
--
--      return 0;
--}
--
--/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyinit */
--static void bgmac_phy_init(struct bgmac *bgmac)
--{
--      struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
--      struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
--      u8 i;
--
--      if (ci->id == BCMA_CHIP_ID_BCM5356) {
--              for (i = 0; i < 5; i++) {
--                      bgmac_phy_write(bgmac, i, 0x1f, 0x008b);
--                      bgmac_phy_write(bgmac, i, 0x15, 0x0100);
--                      bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
--                      bgmac_phy_write(bgmac, i, 0x12, 0x2aaa);
--                      bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
--              }
--      }
--      if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg != 10) ||
--          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg != 10) ||
--          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg != 9)) {
--              bcma_chipco_chipctl_maskset(cc, 2, ~0xc0000000, 0);
--              bcma_chipco_chipctl_maskset(cc, 4, ~0x80000000, 0);
--              for (i = 0; i < 5; i++) {
--                      bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
--                      bgmac_phy_write(bgmac, i, 0x16, 0x5284);
--                      bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
--                      bgmac_phy_write(bgmac, i, 0x17, 0x0010);
--                      bgmac_phy_write(bgmac, i, 0x1f, 0x000f);
--                      bgmac_phy_write(bgmac, i, 0x16, 0x5296);
--                      bgmac_phy_write(bgmac, i, 0x17, 0x1073);
--                      bgmac_phy_write(bgmac, i, 0x17, 0x9073);
--                      bgmac_phy_write(bgmac, i, 0x16, 0x52b6);
--                      bgmac_phy_write(bgmac, i, 0x17, 0x9273);
--                      bgmac_phy_write(bgmac, i, 0x1f, 0x000b);
--              }
--      }
--}
--
--/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyreset */
--static void bgmac_phy_reset(struct bgmac *bgmac)
--{
--      if (bgmac->phyaddr == BGMAC_PHY_NOREGS)
--              return;
--
--      bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET);
--      udelay(100);
--      if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET)
--              dev_err(bgmac->dev, "PHY reset failed\n");
--      bgmac_phy_init(bgmac);
--}
- /**************************************************
-  * Chip ops
-@@ -1159,7 +1015,8 @@ static void bgmac_chip_reset(struct bgma
-       else
-               bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE);
-       bgmac_miiconfig(bgmac);
--      bgmac_phy_init(bgmac);
-+      if (bgmac->mii_bus)
-+              bgmac->mii_bus->reset(bgmac->mii_bus);
-       netdev_reset_queue(bgmac->net_dev);
- }
-@@ -1553,17 +1410,6 @@ static const struct ethtool_ops bgmac_et
-  * MII
-  **************************************************/
--static int bgmac_mii_read(struct mii_bus *bus, int mii_id, int regnum)
--{
--      return bgmac_phy_read(bus->priv, mii_id, regnum);
--}
--
--static int bgmac_mii_write(struct mii_bus *bus, int mii_id, int regnum,
--                         u16 value)
--{
--      return bgmac_phy_write(bus->priv, mii_id, regnum, value);
--}
--
- static void bgmac_adjust_link(struct net_device *net_dev)
- {
-       struct bgmac *bgmac = netdev_priv(net_dev);
-@@ -1588,7 +1434,7 @@ static void bgmac_adjust_link(struct net
-       }
- }
--static int bgmac_fixed_phy_register(struct bgmac *bgmac)
-+static int bgmac_phy_connect_direct(struct bgmac *bgmac)
- {
-       struct fixed_phy_status fphy_status = {
-               .link = 1,
-@@ -1614,81 +1460,24 @@ static int bgmac_fixed_phy_register(stru
-       return err;
- }
--static int bgmac_mii_register(struct bgmac *bgmac)
-+static int bgmac_phy_connect(struct bgmac *bgmac)
- {
--      struct mii_bus *mii_bus;
-       struct phy_device *phy_dev;
-       char bus_id[MII_BUS_ID_SIZE + 3];
--      int i, err = 0;
--
--      if (bgmac_is_bcm4707_family(bgmac))
--              return bgmac_fixed_phy_register(bgmac);
--
--      mii_bus = mdiobus_alloc();
--      if (!mii_bus)
--              return -ENOMEM;
--
--      mii_bus->name = "bgmac mii bus";
--      sprintf(mii_bus->id, "%s-%d-%d", "bgmac", bgmac->core->bus->num,
--              bgmac->core->core_unit);
--      mii_bus->priv = bgmac;
--      mii_bus->read = bgmac_mii_read;
--      mii_bus->write = bgmac_mii_write;
--      mii_bus->parent = &bgmac->core->dev;
--      mii_bus->phy_mask = ~(1 << bgmac->phyaddr);
--
--      mii_bus->irq = kmalloc_array(PHY_MAX_ADDR, sizeof(int), GFP_KERNEL);
--      if (!mii_bus->irq) {
--              err = -ENOMEM;
--              goto err_free_bus;
--      }
--      for (i = 0; i < PHY_MAX_ADDR; i++)
--              mii_bus->irq[i] = PHY_POLL;
--
--      err = mdiobus_register(mii_bus);
--      if (err) {
--              dev_err(bgmac->dev, "Registration of mii bus failed\n");
--              goto err_free_irq;
--      }
--
--      bgmac->mii_bus = mii_bus;
-       /* Connect to the PHY */
--      snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id,
-+      snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, bgmac->mii_bus->id,
-                bgmac->phyaddr);
-       phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link,
-                             PHY_INTERFACE_MODE_MII);
-       if (IS_ERR(phy_dev)) {
-               dev_err(bgmac->dev, "PHY connecton failed\n");
--              err = PTR_ERR(phy_dev);
--              goto err_unregister_bus;
-+              return PTR_ERR(phy_dev);
-       }
--      return err;
--
--err_unregister_bus:
--      mdiobus_unregister(mii_bus);
--err_free_irq:
--      kfree(mii_bus->irq);
--err_free_bus:
--      mdiobus_free(mii_bus);
--      return err;
--}
--
--static void bgmac_mii_unregister(struct bgmac *bgmac)
--{
--      struct mii_bus *mii_bus = bgmac->mii_bus;
--
--      mdiobus_unregister(mii_bus);
--      kfree(mii_bus->irq);
--      mdiobus_free(mii_bus);
-+      return 0;
- }
--/**************************************************
-- * BCMA bus ops
-- **************************************************/
--
--/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipattach */
- static int bgmac_probe(struct bcma_device *core)
- {
-       struct net_device *net_dev;
-@@ -1809,9 +1598,6 @@ static int bgmac_probe(struct bcma_devic
-       if (bcm47xx_nvram_getenv("et0_no_txint", NULL, 0) == 0)
-               bgmac->int_mask &= ~BGMAC_IS_TX_MASK;
--      /* TODO: reset the external phy. Specs are needed */
--      bgmac_phy_reset(bgmac);
--
-       bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
-                              BGMAC_BFL_ENETROBO);
-       if (bgmac->has_robosw)
-@@ -1822,10 +1608,25 @@ static int bgmac_probe(struct bcma_devic
-       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
--      err = bgmac_mii_register(bgmac);
-+      if (!bgmac_is_bcm4707_family(bgmac)) {
-+              struct mii_bus *mii_bus;
-+
-+              mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
-+              if (!IS_ERR(mii_bus)) {
-+                      err = PTR_ERR(mii_bus);
-+                      goto err_dma_free;
-+              }
-+
-+              bgmac->mii_bus = mii_bus;
-+      }
-+
-+      if (!bgmac->mii_bus)
-+              err = bgmac_phy_connect_direct(bgmac);
-+      else
-+              err = bgmac_phy_connect(bgmac);
-       if (err) {
-               dev_err(bgmac->dev, "Cannot connect to phy\n");
--              goto err_dma_free;
-+              goto err_mii_unregister;
-       }
-       net_dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
-@@ -1835,18 +1636,19 @@ static int bgmac_probe(struct bcma_devic
-       err = register_netdev(bgmac->net_dev);
-       if (err) {
-               dev_err(bgmac->dev, "Cannot register net device\n");
--              goto err_mii_unregister;
-+              goto err_phy_disconnect;
-       }
-       netif_carrier_off(net_dev);
-       return 0;
-+err_phy_disconnect:
-+      phy_disconnect(net_dev->phydev);
- err_mii_unregister:
--      bgmac_mii_unregister(bgmac);
-+      bcma_mdio_mii_unregister(bgmac->mii_bus);
- err_dma_free:
-       bgmac_dma_free(bgmac);
--
- err_netdev_free:
-       bcma_set_drvdata(core, NULL);
-       free_netdev(net_dev);
-@@ -1859,7 +1661,8 @@ static void bgmac_remove(struct bcma_dev
-       struct bgmac *bgmac = bcma_get_drvdata(core);
-       unregister_netdev(bgmac->net_dev);
--      bgmac_mii_unregister(bgmac);
-+      phy_disconnect(bgmac->net_dev->phydev);
-+      bcma_mdio_mii_unregister(bgmac->mii_bus);
-       netif_napi_del(&bgmac->napi);
-       bgmac_dma_free(bgmac);
-       bcma_set_drvdata(core, NULL);
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -456,6 +456,9 @@ struct bgmac {
-       bool loopback;
- };
-+struct mii_bus *bcma_mdio_mii_register(struct bcma_device *core, u8 phyaddr);
-+void bcma_mdio_mii_unregister(struct mii_bus *mii_bus);
-+
- static inline u32 bgmac_read(struct bgmac *bgmac, u16 offset)
- {
-       return bcma_read32(bgmac->core, offset);
diff --git a/target/linux/generic/patches-4.4/075-0004-net-ethernet-bgmac-convert-to-feature-flags.patch b/target/linux/generic/patches-4.4/075-0004-net-ethernet-bgmac-convert-to-feature-flags.patch
deleted file mode 100644 (file)
index 0f62791..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-From db791eb2970bad193b1dc95a4461b222dd22cb64 Mon Sep 17 00:00:00 2001
-From: Jon Mason <jon.mason@broadcom.com>
-Date: Thu, 7 Jul 2016 19:08:56 -0400
-Subject: [PATCH 4/5] net: ethernet: bgmac: convert to feature flags
-
-The bgmac driver is using the bcma provides device ID and revision, as
-well as the SoC ID and package, to determine which features are
-necessary to enable, reset, etc in the driver.   In anticipation of
-removing the bcma requirement for this driver, these must be changed to
-not reference that struct.  In place of that, each "feature" has been
-given a flag, and the flags are enabled for their respective device and
-SoC.
-
-Signed-off-by: Jon Mason <jon.mason@broadcom.com>
-Acked-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Tested-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac.c | 167 ++++++++++++++++++++++++----------
- drivers/net/ethernet/broadcom/bgmac.h |  21 ++++-
- 2 files changed, 140 insertions(+), 48 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -109,7 +109,7 @@ static void bgmac_dma_tx_enable(struct b
-       u32 ctl;
-       ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
--      if (bgmac->core->id.rev >= 4) {
-+      if (bgmac->feature_flags & BGMAC_FEAT_TX_MASK_SETUP) {
-               ctl &= ~BGMAC_DMA_TX_BL_MASK;
-               ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT;
-@@ -335,7 +335,7 @@ static void bgmac_dma_rx_enable(struct b
-       /* preserve ONLY bits 16-17 from current hardware value */
-       ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
--      if (bgmac->core->id.rev >= 4) {
-+      if (bgmac->feature_flags & BGMAC_FEAT_RX_MASK_SETUP) {
-               ctl &= ~BGMAC_DMA_RX_BL_MASK;
-               ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
-@@ -772,14 +772,20 @@ static void bgmac_cmdcfg_maskset(struct
- {
-       u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
-       u32 new_val = (cmdcfg & mask) | set;
-+      u32 cmdcfg_sr;
--      bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
-+      if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
-+              cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
-+      else
-+              cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
-+
-+      bgmac_set(bgmac, BGMAC_CMDCFG, cmdcfg_sr);
-       udelay(2);
-       if (new_val != cmdcfg || force)
-               bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
--      bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
-+      bgmac_mask(bgmac, BGMAC_CMDCFG, ~cmdcfg_sr);
-       udelay(2);
- }
-@@ -808,7 +814,7 @@ static void bgmac_chip_stats_update(stru
- {
-       int i;
--      if (bgmac->core->id.id != BCMA_CORE_4706_MAC_GBIT) {
-+      if (!(bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)) {
-               for (i = 0; i < BGMAC_NUM_MIB_TX_REGS; i++)
-                       bgmac->mib_tx_regs[i] =
-                               bgmac_read(bgmac,
-@@ -827,7 +833,7 @@ static void bgmac_clear_mib(struct bgmac
- {
-       int i;
--      if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT)
-+      if (bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)
-               return;
-       bgmac_set(bgmac, BGMAC_DEV_CTL, BGMAC_DC_MROR);
-@@ -870,9 +876,8 @@ static void bgmac_mac_speed(struct bgmac
- static void bgmac_miiconfig(struct bgmac *bgmac)
- {
-       struct bcma_device *core = bgmac->core;
--      u8 imode;
--      if (bgmac_is_bcm4707_family(bgmac)) {
-+      if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
-               bcma_awrite32(core, BCMA_IOCTL,
-                             bcma_aread32(core, BCMA_IOCTL) | 0x40 |
-                             BGMAC_BCMA_IOCTL_SW_CLKEN);
-@@ -880,6 +885,8 @@ static void bgmac_miiconfig(struct bgmac
-               bgmac->mac_duplex = DUPLEX_FULL;
-               bgmac_mac_speed(bgmac);
-       } else {
-+              u8 imode;
-+
-               imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
-                       BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
-               if (imode == 0 || imode == 1) {
-@@ -894,9 +901,7 @@ static void bgmac_miiconfig(struct bgmac
- static void bgmac_chip_reset(struct bgmac *bgmac)
- {
-       struct bcma_device *core = bgmac->core;
--      struct bcma_bus *bus = core->bus;
--      struct bcma_chipinfo *ci = &bus->chipinfo;
--      u32 flags;
-+      u32 cmdcfg_sr;
-       u32 iost;
-       int i;
-@@ -919,15 +924,12 @@ static void bgmac_chip_reset(struct bgma
-       }
-       iost = bcma_aread32(core, BCMA_IOST);
--      if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
--          (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
--          (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
-+      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 (ci->id != BCMA_CHIP_ID_BCM4707 &&
--          ci->id != BCMA_CHIP_ID_BCM47094) {
--              flags = 0;
-+      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)
-@@ -937,7 +939,7 @@ static void bgmac_chip_reset(struct bgma
-       }
-       /* Request Misc PLL for corerev > 2 */
--      if (core->id.rev > 2 && !bgmac_is_bcm4707_family(bgmac)) {
-+      if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
-               bgmac_set(bgmac, BCMA_CLKCTLST,
-                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
-               bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
-@@ -946,9 +948,7 @@ static void bgmac_chip_reset(struct bgma
-                                1000);
-       }
--      if (ci->id == BCMA_CHIP_ID_BCM5357 ||
--          ci->id == BCMA_CHIP_ID_BCM4749 ||
--          ci->id == BCMA_CHIP_ID_BCM53572) {
-+      if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_PHY) {
-               struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
-               u8 et_swtype = 0;
-               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
-@@ -962,11 +962,9 @@ static void bgmac_chip_reset(struct bgma
-                       et_swtype &= 0x0f;
-                       et_swtype <<= 4;
-                       sw_type = et_swtype;
--              } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) {
-+              } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII) {
-                       sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
--              } else if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
--                         (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
--                         (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
-+              } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_RGMII) {
-                       sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
-                                 BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
-               }
-@@ -986,6 +984,11 @@ static void bgmac_chip_reset(struct bgma
-        * BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
-        * be keps until taking MAC out of the reset.
-        */
-+      if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
-+              cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
-+      else
-+              cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
-+
-       bgmac_cmdcfg_maskset(bgmac,
-                            ~(BGMAC_CMDCFG_TE |
-                              BGMAC_CMDCFG_RE |
-@@ -1003,13 +1006,13 @@ static void bgmac_chip_reset(struct bgma
-                            BGMAC_CMDCFG_PROM |
-                            BGMAC_CMDCFG_NLC |
-                            BGMAC_CMDCFG_CFE |
--                           BGMAC_CMDCFG_SR(core->id.rev),
-+                           cmdcfg_sr,
-                            false);
-       bgmac->mac_speed = SPEED_UNKNOWN;
-       bgmac->mac_duplex = DUPLEX_UNKNOWN;
-       bgmac_clear_mib(bgmac);
--      if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
-+      if (bgmac->feature_flags & BGMAC_FEAT_CMN_PHY_CTL)
-               bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0,
-                              BCMA_GMAC_CMN_PC_MTE);
-       else
-@@ -1035,46 +1038,48 @@ static void bgmac_chip_intrs_off(struct
- /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_enable */
- static void bgmac_enable(struct bgmac *bgmac)
- {
--      struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
-+      u32 cmdcfg_sr;
-       u32 cmdcfg;
-       u32 mode;
--      u32 rxq_ctl;
--      u32 fl_ctl;
--      u16 bp_clk;
--      u8 mdp;
-+
-+      if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
-+              cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
-+      else
-+              cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
-       cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
-       bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
--                           BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
-+                           cmdcfg_sr, true);
-       udelay(2);
-       cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
-       bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
-       mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
-               BGMAC_DS_MM_SHIFT;
--      if (ci->id != BCMA_CHIP_ID_BCM47162 || mode != 0)
-+      if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
-               bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
--      if (ci->id == BCMA_CHIP_ID_BCM47162 && mode == 2)
-+      if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
-               bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0,
-                                           BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
--      switch (ci->id) {
--      case BCMA_CHIP_ID_BCM5357:
--      case BCMA_CHIP_ID_BCM4749:
--      case BCMA_CHIP_ID_BCM53572:
--      case BCMA_CHIP_ID_BCM4716:
--      case BCMA_CHIP_ID_BCM47162:
--              fl_ctl = 0x03cb04cb;
--              if (ci->id == BCMA_CHIP_ID_BCM5357 ||
--                  ci->id == BCMA_CHIP_ID_BCM4749 ||
--                  ci->id == BCMA_CHIP_ID_BCM53572)
-+      if (bgmac->feature_flags & (BGMAC_FEAT_FLW_CTRL1 |
-+                                  BGMAC_FEAT_FLW_CTRL2)) {
-+              u32 fl_ctl;
-+
-+              if (bgmac->feature_flags & BGMAC_FEAT_FLW_CTRL1)
-                       fl_ctl = 0x2300e1;
-+              else
-+                      fl_ctl = 0x03cb04cb;
-+
-               bgmac_write(bgmac, BGMAC_FLOW_CTL_THRESH, fl_ctl);
-               bgmac_write(bgmac, BGMAC_PAUSE_CTL, 0x27fff);
--              break;
-       }
--      if (!bgmac_is_bcm4707_family(bgmac)) {
-+      if (bgmac->feature_flags & BGMAC_FEAT_SET_RXQ_CLK) {
-+              u32 rxq_ctl;
-+              u16 bp_clk;
-+              u8 mdp;
-+
-               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
-               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
-               bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
-@@ -1606,6 +1611,74 @@ static int bgmac_probe(struct bcma_devic
-       if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
-               dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
-+      /* Feature Flags */
-+      switch (core->bus->chipinfo.id) {
-+      case BCMA_CHIP_ID_BCM5357:
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
-+              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
-+              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
-+                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
-+              }
-+              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
-+              break;
-+      case BCMA_CHIP_ID_BCM53572:
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
-+              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
-+              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
-+                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
-+              }
-+              break;
-+      case BCMA_CHIP_ID_BCM4749:
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
-+              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
-+              if (core->bus->chipinfo.pkg == 10) {
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
-+                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
-+              }
-+              break;
-+      case BCMA_CHIP_ID_BCM4716:
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              /* fallthrough */
-+      case BCMA_CHIP_ID_BCM47162:
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              break;
-+      /* bcm4707_family */
-+      case BCMA_CHIP_ID_BCM4707:
-+      case BCMA_CHIP_ID_BCM47094:
-+      case BCMA_CHIP_ID_BCM53018:
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
-+              bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
-+              break;
-+      default:
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+      }
-+
-+      if (!bgmac_is_bcm4707_family(bgmac) && core->id.rev > 2)
-+              bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
-+
-+      if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
-+              bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
-+              bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
-+      }
-+
-+      if (core->id.rev >= 4) {
-+              bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
-+              bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
-+              bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
-+      }
-+
-       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
-       if (!bgmac_is_bcm4707_family(bgmac)) {
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -190,7 +190,6 @@
- #define  BGMAC_CMDCFG_HD_SHIFT                        10
- #define  BGMAC_CMDCFG_SR_REV0                 0x00000800      /* Set to reset mode, for core rev 0-3 */
- #define  BGMAC_CMDCFG_SR_REV4                 0x00002000      /* Set to reset mode, for core rev >= 4 */
--#define  BGMAC_CMDCFG_SR(rev)  ((rev >= 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
- #define  BGMAC_CMDCFG_ML                      0x00008000      /* Set to activate mac loopback mode */
- #define  BGMAC_CMDCFG_AE                      0x00400000
- #define  BGMAC_CMDCFG_CFE                     0x00800000
-@@ -376,6 +375,24 @@
- #define ETHER_MAX_LEN   1518
-+/* Feature Flags */
-+#define BGMAC_FEAT_TX_MASK_SETUP      BIT(0)
-+#define BGMAC_FEAT_RX_MASK_SETUP      BIT(1)
-+#define BGMAC_FEAT_IOST_ATTACHED      BIT(2)
-+#define BGMAC_FEAT_NO_RESET           BIT(3)
-+#define BGMAC_FEAT_MISC_PLL_REQ               BIT(4)
-+#define BGMAC_FEAT_SW_TYPE_PHY                BIT(5)
-+#define BGMAC_FEAT_SW_TYPE_EPHYRMII   BIT(6)
-+#define BGMAC_FEAT_SW_TYPE_RGMII      BIT(7)
-+#define BGMAC_FEAT_CMN_PHY_CTL                BIT(8)
-+#define BGMAC_FEAT_FLW_CTRL1          BIT(9)
-+#define BGMAC_FEAT_FLW_CTRL2          BIT(10)
-+#define BGMAC_FEAT_SET_RXQ_CLK                BIT(11)
-+#define BGMAC_FEAT_CLKCTLST           BIT(12)
-+#define BGMAC_FEAT_NO_CLR_MIB         BIT(13)
-+#define BGMAC_FEAT_FORCE_SPEED_2500   BIT(14)
-+#define BGMAC_FEAT_CMDCFG_SR_REV4     BIT(15)
-+
- struct bgmac_slot_info {
-       union {
-               struct sk_buff *skb;
-@@ -430,6 +447,8 @@ struct bgmac {
-       struct device *dev;
-       struct device *dma_dev;
-+      u32 feature_flags;
-+
-       struct net_device *net_dev;
-       struct napi_struct napi;
-       struct mii_bus *mii_bus;
diff --git a/target/linux/generic/patches-4.4/075-0005-net-ethernet-bgmac-Add-platform-device-support.patch b/target/linux/generic/patches-4.4/075-0005-net-ethernet-bgmac-Add-platform-device-support.patch
deleted file mode 100644 (file)
index 5755184..0000000
+++ /dev/null
@@ -1,1260 +0,0 @@
-From f6a95a24957aec5bb488c3f978c4ed508177998f Mon Sep 17 00:00:00 2001
-From: Jon Mason <jon.mason@broadcom.com>
-Date: Thu, 7 Jul 2016 19:08:57 -0400
-Subject: [PATCH 5/5] net: ethernet: bgmac: Add platform device support
-
-The bcma portion of the driver has been split off into a bcma specific
-driver.  This has been mirrored for the platform driver.  The last
-references to the bcma core struct have been changed into a generic
-function call.  These function calls are wrappers to either the original
-bcma code or new platform functions that access the same areas via MMIO.
-This necessitated adding function pointers for both platform and bcma to
-hide which backend is being used from the generic bgmac code.
-
-Signed-off-by: Jon Mason <jon.mason@broadcom.com>
-Acked-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Tested-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/Kconfig           |  23 +-
- drivers/net/ethernet/broadcom/Makefile          |   4 +-
- drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c |   2 +
- drivers/net/ethernet/broadcom/bgmac-bcma.c      | 315 +++++++++++++++++++++++
- drivers/net/ethernet/broadcom/bgmac-platform.c  | 189 ++++++++++++++
- drivers/net/ethernet/broadcom/bgmac.c           | 329 ++++--------------------
- drivers/net/ethernet/broadcom/bgmac.h           |  73 +++++-
- 7 files changed, 650 insertions(+), 285 deletions(-)
- create mode 100644 drivers/net/ethernet/broadcom/bgmac-bcma.c
- create mode 100644 drivers/net/ethernet/broadcom/bgmac-platform.c
-
---- a/drivers/net/ethernet/broadcom/Kconfig
-+++ b/drivers/net/ethernet/broadcom/Kconfig
-@@ -150,10 +150,18 @@ config BNX2X_VXLAN
-         Virtual eXtensible Local Area Network (VXLAN) in the driver.
- config BGMAC
--      tristate "BCMA bus GBit core support"
-+      tristate
-+      help
-+        This enables the integrated ethernet controller support for many
-+        Broadcom (mostly iProc) SoCs. An appropriate bus interface driver
-+        needs to be enabled to select this.
-+
-+config BGMAC_BCMA
-+      tristate "Broadcom iProc GBit BCMA support"
-       depends on BCMA && BCMA_HOST_SOC
-       depends on HAS_DMA
-       depends on BCM47XX || ARCH_BCM_5301X || COMPILE_TEST
-+      select BGMAC
-       select PHYLIB
-       select FIXED_PHY
-       ---help---
-@@ -162,6 +170,19 @@ config BGMAC
-         In case of using this driver on BCM4706 it's also requires to enable
-         BCMA_DRIVER_GMAC_CMN to make it work.
-+config BGMAC_PLATFORM
-+      tristate "Broadcom iProc GBit platform support"
-+      depends on HAS_DMA
-+      depends on ARCH_BCM_IPROC || COMPILE_TEST
-+      depends on OF
-+      select BGMAC
-+      select PHYLIB
-+      select FIXED_PHY
-+      default ARCH_BCM_IPROC
-+      ---help---
-+        Say Y here if you want to use the Broadcom iProc Gigabit Ethernet
-+        controller through the generic platform interface
-+
- config SYSTEMPORT
-       tristate "Broadcom SYSTEMPORT internal MAC support"
-       depends on OF
---- a/drivers/net/ethernet/broadcom/Makefile
-+++ b/drivers/net/ethernet/broadcom/Makefile
-@@ -10,6 +10,8 @@ obj-$(CONFIG_CNIC) += cnic.o
- obj-$(CONFIG_BNX2X) += bnx2x/
- obj-$(CONFIG_SB1250_MAC) += sb1250-mac.o
- obj-$(CONFIG_TIGON3) += tg3.o
--obj-$(CONFIG_BGMAC) += bgmac.o bgmac-bcma-mdio.o
-+obj-$(CONFIG_BGMAC) += bgmac.o
-+obj-$(CONFIG_BGMAC_BCMA) += bgmac-bcma.o bgmac-bcma-mdio.o
-+obj-$(CONFIG_BGMAC_PLATFORM) += bgmac-platform.o
- obj-$(CONFIG_SYSTEMPORT) += bcmsysport.o
- obj-$(CONFIG_BNXT) += bnxt/
---- a/drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma-mdio.c
-@@ -255,6 +255,7 @@ err:
-       kfree(bcma_mdio);
-       return ERR_PTR(err);
- }
-+EXPORT_SYMBOL_GPL(bcma_mdio_mii_register);
- void bcma_mdio_mii_unregister(struct mii_bus *mii_bus)
- {
-@@ -270,6 +271,7 @@ void bcma_mdio_mii_unregister(struct mii
-       mdiobus_free(mii_bus);
-       kfree(bcma_mdio);
- }
-+EXPORT_SYMBOL_GPL(bcma_mdio_mii_unregister);
- MODULE_AUTHOR("Rafał Miłecki");
- MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -0,0 +1,315 @@
-+/*
-+ * Driver for (BCM4706)? GBit MAC core on BCMA bus.
-+ *
-+ * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
-+
-+#include <linux/bcma/bcma.h>
-+#include <linux/brcmphy.h>
-+#include <linux/etherdevice.h>
-+#include "bgmac.h"
-+
-+static inline bool bgmac_is_bcm4707_family(struct bcma_device *core)
-+{
-+      switch (core->bus->chipinfo.id) {
-+      case BCMA_CHIP_ID_BCM4707:
-+      case BCMA_CHIP_ID_BCM47094:
-+      case BCMA_CHIP_ID_BCM53018:
-+              return true;
-+      default:
-+              return false;
-+      }
-+}
-+
-+/**************************************************
-+ * BCMA bus ops
-+ **************************************************/
-+
-+static u32 bcma_bgmac_read(struct bgmac *bgmac, u16 offset)
-+{
-+      return bcma_read32(bgmac->bcma.core, offset);
-+}
-+
-+static void bcma_bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
-+{
-+      bcma_write32(bgmac->bcma.core, offset, value);
-+}
-+
-+static u32 bcma_bgmac_idm_read(struct bgmac *bgmac, u16 offset)
-+{
-+      return bcma_aread32(bgmac->bcma.core, offset);
-+}
-+
-+static void bcma_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
-+{
-+      return bcma_awrite32(bgmac->bcma.core, offset, value);
-+}
-+
-+static bool bcma_bgmac_clk_enabled(struct bgmac *bgmac)
-+{
-+      return bcma_core_is_enabled(bgmac->bcma.core);
-+}
-+
-+static void bcma_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
-+{
-+      bcma_core_enable(bgmac->bcma.core, flags);
-+}
-+
-+static void bcma_bgmac_cco_ctl_maskset(struct bgmac *bgmac, u32 offset,
-+                                     u32 mask, u32 set)
-+{
-+      struct bcma_drv_cc *cc = &bgmac->bcma.core->bus->drv_cc;
-+
-+      bcma_chipco_chipctl_maskset(cc, offset, mask, set);
-+}
-+
-+static u32 bcma_bgmac_get_bus_clock(struct bgmac *bgmac)
-+{
-+      struct bcma_drv_cc *cc = &bgmac->bcma.core->bus->drv_cc;
-+
-+      return bcma_pmu_get_bus_clock(cc);
-+}
-+
-+static void bcma_bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset, u32 mask,
-+                                   u32 set)
-+{
-+      bcma_maskset32(bgmac->bcma.cmn, offset, mask, set);
-+}
-+
-+static const struct bcma_device_id bgmac_bcma_tbl[] = {
-+      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_4706_MAC_GBIT,
-+                BCMA_ANY_REV, BCMA_ANY_CLASS),
-+      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_MAC_GBIT, BCMA_ANY_REV,
-+                BCMA_ANY_CLASS),
-+      {},
-+};
-+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 ssb_sprom *sprom = &core->bus->sprom;
-+      struct mii_bus *mii_bus;
-+      struct bgmac *bgmac;
-+      u8 *mac;
-+      int err;
-+
-+      bgmac = kzalloc(sizeof(*bgmac), GFP_KERNEL);
-+      if (!bgmac)
-+              return -ENOMEM;
-+
-+      bgmac->bcma.core = core;
-+      bgmac->dev = &core->dev;
-+      bgmac->dma_dev = core->dma_dev;
-+      bgmac->irq = core->irq;
-+
-+      bcma_set_drvdata(core, bgmac);
-+
-+      switch (core->core_unit) {
-+      case 0:
-+              mac = sprom->et0mac;
-+              break;
-+      case 1:
-+              mac = sprom->et1mac;
-+              break;
-+      case 2:
-+              mac = sprom->et2mac;
-+              break;
-+      default:
-+              dev_err(bgmac->dev, "Unsupported core_unit %d\n",
-+                      core->core_unit);
-+              err = -ENOTSUPP;
-+              goto err;
-+      }
-+
-+      ether_addr_copy(bgmac->mac_addr, mac);
-+
-+      /* On BCM4706 we need common core to access PHY */
-+      if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
-+          !core->bus->drv_gmac_cmn.core) {
-+              dev_err(bgmac->dev, "GMAC CMN core not found (required for BCM4706)\n");
-+              err = -ENODEV;
-+              goto err;
-+      }
-+      bgmac->bcma.cmn = core->bus->drv_gmac_cmn.core;
-+
-+      switch (core->core_unit) {
-+      case 0:
-+              bgmac->phyaddr = sprom->et0phyaddr;
-+              break;
-+      case 1:
-+              bgmac->phyaddr = sprom->et1phyaddr;
-+              break;
-+      case 2:
-+              bgmac->phyaddr = sprom->et2phyaddr;
-+              break;
-+      }
-+      bgmac->phyaddr &= BGMAC_PHY_MASK;
-+      if (bgmac->phyaddr == BGMAC_PHY_MASK) {
-+              dev_err(bgmac->dev, "No PHY found\n");
-+              err = -ENODEV;
-+              goto err;
-+      }
-+      dev_info(bgmac->dev, "Found PHY addr: %d%s\n", bgmac->phyaddr,
-+               bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
-+
-+      if (!bgmac_is_bcm4707_family(core)) {
-+              mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
-+              if (!IS_ERR(mii_bus)) {
-+                      err = PTR_ERR(mii_bus);
-+                      goto err;
-+              }
-+
-+              bgmac->mii_bus = mii_bus;
-+      }
-+
-+      if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
-+              dev_err(bgmac->dev, "PCI setup not implemented\n");
-+              err = -ENOTSUPP;
-+              goto err1;
-+      }
-+
-+      bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
-+                             BGMAC_BFL_ENETROBO);
-+      if (bgmac->has_robosw)
-+              dev_warn(bgmac->dev, "Support for Roboswitch not implemented\n");
-+
-+      if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
-+              dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
-+
-+      /* Feature Flags */
-+      switch (core->bus->chipinfo.id) {
-+      case BCMA_CHIP_ID_BCM5357:
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
-+              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
-+              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
-+                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
-+              }
-+              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
-+              break;
-+      case BCMA_CHIP_ID_BCM53572:
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
-+              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
-+              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
-+                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
-+              }
-+              break;
-+      case BCMA_CHIP_ID_BCM4749:
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
-+              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
-+              if (core->bus->chipinfo.pkg == 10) {
-+                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
-+                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
-+              }
-+              break;
-+      case BCMA_CHIP_ID_BCM4716:
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              /* fallthrough */
-+      case BCMA_CHIP_ID_BCM47162:
-+              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+              break;
-+      /* bcm4707_family */
-+      case BCMA_CHIP_ID_BCM4707:
-+      case BCMA_CHIP_ID_BCM47094:
-+      case BCMA_CHIP_ID_BCM53018:
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
-+              bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
-+              break;
-+      default:
-+              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
-+              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
-+      }
-+
-+      if (!bgmac_is_bcm4707_family(core) && core->id.rev > 2)
-+              bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
-+
-+      if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
-+              bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
-+              bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
-+      }
-+
-+      if (core->id.rev >= 4) {
-+              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->read = bcma_bgmac_read;
-+      bgmac->write = bcma_bgmac_write;
-+      bgmac->idm_read = bcma_bgmac_idm_read;
-+      bgmac->idm_write = bcma_bgmac_idm_write;
-+      bgmac->clk_enabled = bcma_bgmac_clk_enabled;
-+      bgmac->clk_enable = bcma_bgmac_clk_enable;
-+      bgmac->cco_ctl_maskset = bcma_bgmac_cco_ctl_maskset;
-+      bgmac->get_bus_clock = bcma_bgmac_get_bus_clock;
-+      bgmac->cmn_maskset32 = bcma_bgmac_cmn_maskset32;
-+
-+      err = bgmac_enet_probe(bgmac);
-+      if (err)
-+              goto err1;
-+
-+      return 0;
-+
-+err1:
-+      bcma_mdio_mii_unregister(bgmac->mii_bus);
-+err:
-+      kfree(bgmac);
-+      bcma_set_drvdata(core, NULL);
-+
-+      return err;
-+}
-+
-+static void bgmac_remove(struct bcma_device *core)
-+{
-+      struct bgmac *bgmac = bcma_get_drvdata(core);
-+
-+      bcma_mdio_mii_unregister(bgmac->mii_bus);
-+      bgmac_enet_remove(bgmac);
-+      bcma_set_drvdata(core, NULL);
-+      kfree(bgmac);
-+}
-+
-+static struct bcma_driver bgmac_bcma_driver = {
-+      .name           = KBUILD_MODNAME,
-+      .id_table       = bgmac_bcma_tbl,
-+      .probe          = bgmac_probe,
-+      .remove         = bgmac_remove,
-+};
-+
-+static int __init bgmac_init(void)
-+{
-+      int err;
-+
-+      err = bcma_driver_register(&bgmac_bcma_driver);
-+      if (err)
-+              return err;
-+      pr_info("Broadcom 47xx GBit MAC driver loaded\n");
-+
-+      return 0;
-+}
-+
-+static void __exit bgmac_exit(void)
-+{
-+      bcma_driver_unregister(&bgmac_bcma_driver);
-+}
-+
-+module_init(bgmac_init)
-+module_exit(bgmac_exit)
-+
-+MODULE_AUTHOR("Rafał Miłecki");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
-@@ -0,0 +1,189 @@
-+/*
-+ * Copyright (C) 2016 Broadcom
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation version 2.
-+ *
-+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
-+ * kind, whether express or implied; without even the implied warranty
-+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
-+
-+#include <linux/bcma/bcma.h>
-+#include <linux/etherdevice.h>
-+#include <linux/of_address.h>
-+#include <linux/of_net.h>
-+#include "bgmac.h"
-+
-+static u32 platform_bgmac_read(struct bgmac *bgmac, u16 offset)
-+{
-+      return readl(bgmac->plat.base + offset);
-+}
-+
-+static void platform_bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
-+{
-+      writel(value, bgmac->plat.base + offset);
-+}
-+
-+static u32 platform_bgmac_idm_read(struct bgmac *bgmac, u16 offset)
-+{
-+      return readl(bgmac->plat.idm_base + offset);
-+}
-+
-+static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
-+{
-+      return writel(value, bgmac->plat.idm_base + offset);
-+}
-+
-+static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
-+{
-+      if ((bgmac_idm_read(bgmac, BCMA_IOCTL) &
-+           (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) != BCMA_IOCTL_CLK)
-+              return false;
-+      if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
-+              return false;
-+      return true;
-+}
-+
-+static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
-+{
-+      bgmac_idm_write(bgmac, BCMA_IOCTL,
-+                      (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
-+      bgmac_idm_read(bgmac, BCMA_IOCTL);
-+
-+      bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0);
-+      bgmac_idm_read(bgmac, BCMA_RESET_CTL);
-+      udelay(1);
-+
-+      bgmac_idm_write(bgmac, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
-+      bgmac_idm_read(bgmac, BCMA_IOCTL);
-+      udelay(1);
-+}
-+
-+static void platform_bgmac_cco_ctl_maskset(struct bgmac *bgmac, u32 offset,
-+                                         u32 mask, u32 set)
-+{
-+      /* This shouldn't be encountered */
-+      WARN_ON(1);
-+}
-+
-+static u32 platform_bgmac_get_bus_clock(struct bgmac *bgmac)
-+{
-+      /* This shouldn't be encountered */
-+      WARN_ON(1);
-+
-+      return 0;
-+}
-+
-+static void platform_bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset,
-+                                       u32 mask, u32 set)
-+{
-+      /* This shouldn't be encountered */
-+      WARN_ON(1);
-+}
-+
-+static int bgmac_probe(struct platform_device *pdev)
-+{
-+      struct device_node *np = pdev->dev.of_node;
-+      struct bgmac *bgmac;
-+      struct resource *regs;
-+      const u8 *mac_addr;
-+
-+      bgmac = devm_kzalloc(&pdev->dev, sizeof(*bgmac), GFP_KERNEL);
-+      if (!bgmac)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(pdev, bgmac);
-+
-+      /* Set the features of the 4707 family */
-+      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_CMDCFG_SR_REV4;
-+      bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
-+      bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
-+
-+      bgmac->dev = &pdev->dev;
-+      bgmac->dma_dev = &pdev->dev;
-+
-+      mac_addr = of_get_mac_address(np);
-+      if (mac_addr)
-+              ether_addr_copy(bgmac->mac_addr, mac_addr);
-+      else
-+              dev_warn(&pdev->dev, "MAC address not present in device tree\n");
-+
-+      bgmac->irq = platform_get_irq(pdev, 0);
-+      if (bgmac->irq < 0) {
-+              dev_err(&pdev->dev, "Unable to obtain IRQ\n");
-+              return bgmac->irq;
-+      }
-+
-+      regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "amac_base");
-+      if (!regs) {
-+              dev_err(&pdev->dev, "Unable to obtain base resource\n");
-+              return -EINVAL;
-+      }
-+
-+      bgmac->plat.base = devm_ioremap_resource(&pdev->dev, regs);
-+      if (IS_ERR(bgmac->plat.base)) {
-+              dev_err(&pdev->dev, "Unable to map base resource\n");
-+              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;
-+      }
-+
-+      bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
-+      if (!bgmac->plat.idm_base) {
-+              dev_err(&pdev->dev, "Unable to map idm resource\n");
-+              return PTR_ERR(bgmac->plat.idm_base);
-+      }
-+
-+      bgmac->read = platform_bgmac_read;
-+      bgmac->write = platform_bgmac_write;
-+      bgmac->idm_read = platform_bgmac_idm_read;
-+      bgmac->idm_write = platform_bgmac_idm_write;
-+      bgmac->clk_enabled = platform_bgmac_clk_enabled;
-+      bgmac->clk_enable = platform_bgmac_clk_enable;
-+      bgmac->cco_ctl_maskset = platform_bgmac_cco_ctl_maskset;
-+      bgmac->get_bus_clock = platform_bgmac_get_bus_clock;
-+      bgmac->cmn_maskset32 = platform_bgmac_cmn_maskset32;
-+
-+      return bgmac_enet_probe(bgmac);
-+}
-+
-+static int bgmac_remove(struct platform_device *pdev)
-+{
-+      struct bgmac *bgmac = platform_get_drvdata(pdev);
-+
-+      bgmac_enet_remove(bgmac);
-+
-+      return 0;
-+}
-+
-+static const struct of_device_id bgmac_of_enet_match[] = {
-+      {.compatible = "brcm,amac",},
-+      {.compatible = "brcm,nsp-amac",},
-+      {},
-+};
-+
-+MODULE_DEVICE_TABLE(of, bgmac_of_enet_match);
-+
-+static struct platform_driver bgmac_enet_driver = {
-+      .driver = {
-+              .name  = "bgmac-enet",
-+              .of_match_table = bgmac_of_enet_match,
-+      },
-+      .probe = bgmac_probe,
-+      .remove = bgmac_remove,
-+};
-+
-+module_platform_driver(bgmac_enet_driver);
-+MODULE_LICENSE("GPL");
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -6,51 +6,27 @@
-  * Licensed under the GNU/GPL. See COPYING for details.
-  */
--#include "bgmac.h"
--#include <linux/kernel.h>
--#include <linux/module.h>
--#include <linux/delay.h>
-+#define pr_fmt(fmt)           KBUILD_MODNAME ": " fmt
-+
-+#include <linux/bcma/bcma.h>
- #include <linux/etherdevice.h>
--#include <linux/mii.h>
--#include <linux/phy.h>
--#include <linux/phy_fixed.h>
--#include <linux/interrupt.h>
--#include <linux/dma-mapping.h>
- #include <linux/bcm47xx_nvram.h>
-+#include "bgmac.h"
--static const struct bcma_device_id bgmac_bcma_tbl[] = {
--      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_4706_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS),
--      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS),
--      {},
--};
--MODULE_DEVICE_TABLE(bcma, bgmac_bcma_tbl);
--
--static inline bool bgmac_is_bcm4707_family(struct bgmac *bgmac)
--{
--      switch (bgmac->core->bus->chipinfo.id) {
--      case BCMA_CHIP_ID_BCM4707:
--      case BCMA_CHIP_ID_BCM47094:
--      case BCMA_CHIP_ID_BCM53018:
--              return true;
--      default:
--              return false;
--      }
--}
--
--static bool bgmac_wait_value(struct bcma_device *core, u16 reg, u32 mask,
-+static bool bgmac_wait_value(struct bgmac *bgmac, u16 reg, u32 mask,
-                            u32 value, int timeout)
- {
-       u32 val;
-       int i;
-       for (i = 0; i < timeout / 10; i++) {
--              val = bcma_read32(core, reg);
-+              val = bgmac_read(bgmac, reg);
-               if ((val & mask) == value)
-                       return true;
-               udelay(10);
-       }
--      dev_err(&core->dev, "Timeout waiting for reg 0x%X\n", reg);
-+      dev_err(bgmac->dev, "Timeout waiting for reg 0x%X\n", reg);
-       return false;
- }
-@@ -89,7 +65,7 @@ static void bgmac_dma_tx_reset(struct bg
-       /* Remove SUSPEND bit */
-       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, 0);
--      if (!bgmac_wait_value(bgmac->core,
-+      if (!bgmac_wait_value(bgmac,
-                             ring->mmio_base + BGMAC_DMA_TX_STATUS,
-                             BGMAC_DMA_TX_STAT, BGMAC_DMA_TX_STAT_DISABLED,
-                             10000)) {
-@@ -317,7 +293,7 @@ static void bgmac_dma_rx_reset(struct bg
-               return;
-       bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, 0);
--      if (!bgmac_wait_value(bgmac->core,
-+      if (!bgmac_wait_value(bgmac,
-                             ring->mmio_base + BGMAC_DMA_RX_STATUS,
-                             BGMAC_DMA_RX_STAT, BGMAC_DMA_RX_STAT_DISABLED,
-                             10000))
-@@ -643,7 +619,7 @@ static int bgmac_dma_alloc(struct bgmac
-       BUILD_BUG_ON(BGMAC_MAX_TX_RINGS > ARRAY_SIZE(ring_base));
-       BUILD_BUG_ON(BGMAC_MAX_RX_RINGS > ARRAY_SIZE(ring_base));
--      if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) {
-+      if (!(bgmac_idm_read(bgmac, BCMA_IOST) & BCMA_IOST_DMA64)) {
-               dev_err(bgmac->dev, "Core does not report 64-bit DMA\n");
-               return -ENOTSUPP;
-       }
-@@ -875,12 +851,10 @@ static void bgmac_mac_speed(struct bgmac
- static void bgmac_miiconfig(struct bgmac *bgmac)
- {
--      struct bcma_device *core = bgmac->core;
--
-       if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
--              bcma_awrite32(core, BCMA_IOCTL,
--                            bcma_aread32(core, BCMA_IOCTL) | 0x40 |
--                            BGMAC_BCMA_IOCTL_SW_CLKEN);
-+              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);
-@@ -900,12 +874,11 @@ static void bgmac_miiconfig(struct bgmac
- /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipreset */
- static void bgmac_chip_reset(struct bgmac *bgmac)
- {
--      struct bcma_device *core = bgmac->core;
-       u32 cmdcfg_sr;
-       u32 iost;
-       int i;
--      if (bcma_core_is_enabled(core)) {
-+      if (bgmac_clk_enabled(bgmac)) {
-               if (!bgmac->stats_grabbed) {
-                       /* bgmac_chip_stats_update(bgmac); */
-                       bgmac->stats_grabbed = true;
-@@ -923,7 +896,7 @@ static void bgmac_chip_reset(struct bgma
-               /* TODO: Clear software multicast filter list */
-       }
--      iost = bcma_aread32(core, BCMA_IOST);
-+      iost = bgmac_idm_read(bgmac, BCMA_IOST);
-       if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
-               iost &= ~BGMAC_BCMA_IOST_ATTACHED;
-@@ -935,21 +908,20 @@ static void bgmac_chip_reset(struct bgma
-                       if (!bgmac->has_robosw)
-                               flags |= BGMAC_BCMA_IOCTL_SW_RESET;
-               }
--              bcma_core_enable(core, flags);
-+              bgmac_clk_enable(bgmac, flags);
-       }
-       /* Request Misc PLL for corerev > 2 */
-       if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
-               bgmac_set(bgmac, BCMA_CLKCTLST,
-                         BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
--              bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
-+              bgmac_wait_value(bgmac, BCMA_CLKCTLST,
-                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
-                                BGMAC_BCMA_CLKCTLST_MISC_PLL_ST,
-                                1000);
-       }
-       if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_PHY) {
--              struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
-               u8 et_swtype = 0;
-               u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
-                            BGMAC_CHIPCTL_1_IF_TYPE_MII;
-@@ -968,16 +940,15 @@ static void bgmac_chip_reset(struct bgma
-                       sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
-                                 BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
-               }
--              bcma_chipco_chipctl_maskset(cc, 1,
--                                          ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK |
--                                            BGMAC_CHIPCTL_1_SW_TYPE_MASK),
--                                          sw_type);
-+              bgmac_cco_ctl_maskset(bgmac, 1, ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK |
-+                                                BGMAC_CHIPCTL_1_SW_TYPE_MASK),
-+                                    sw_type);
-       }
-       if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
--              bcma_awrite32(core, BCMA_IOCTL,
--                            bcma_aread32(core, BCMA_IOCTL) &
--                            ~BGMAC_BCMA_IOCTL_SW_RESET);
-+              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
-@@ -1013,8 +984,8 @@ static void bgmac_chip_reset(struct bgma
-       bgmac_clear_mib(bgmac);
-       if (bgmac->feature_flags & BGMAC_FEAT_CMN_PHY_CTL)
--              bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0,
--                             BCMA_GMAC_CMN_PC_MTE);
-+              bgmac_cmn_maskset32(bgmac, BCMA_GMAC_CMN_PHY_CTL, ~0,
-+                                  BCMA_GMAC_CMN_PC_MTE);
-       else
-               bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE);
-       bgmac_miiconfig(bgmac);
-@@ -1059,8 +1030,8 @@ static void bgmac_enable(struct bgmac *b
-       if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
-               bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
-       if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
--              bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0,
--                                          BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
-+              bgmac_cco_ctl_maskset(bgmac, 1, ~0,
-+                                    BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
-       if (bgmac->feature_flags & (BGMAC_FEAT_FLW_CTRL1 |
-                                   BGMAC_FEAT_FLW_CTRL2)) {
-@@ -1082,8 +1053,7 @@ static void bgmac_enable(struct bgmac *b
-               rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
-               rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
--              bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
--                              1000000;
-+              bp_clk = bgmac_get_bus_clock(bgmac) / 1000000;
-               mdp = (bp_clk * 128 / 1000) - 3;
-               rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
-               bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
-@@ -1178,7 +1148,7 @@ static int bgmac_open(struct net_device
-       /* Specs say about reclaiming rings here, but we do that in DMA init */
-       bgmac_chip_init(bgmac);
--      err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED,
-+      err = request_irq(bgmac->irq, bgmac_interrupt, IRQF_SHARED,
-                         KBUILD_MODNAME, net_dev);
-       if (err < 0) {
-               dev_err(bgmac->dev, "IRQ request error: %d!\n", err);
-@@ -1204,7 +1174,7 @@ static int bgmac_stop(struct net_device
-       napi_disable(&bgmac->napi);
-       bgmac_chip_intrs_off(bgmac);
--      free_irq(bgmac->core->irq, net_dev);
-+      free_irq(bgmac->irq, net_dev);
-       bgmac_chip_reset(bgmac);
-       bgmac_dma_cleanup(bgmac);
-@@ -1399,7 +1369,7 @@ static void bgmac_get_drvinfo(struct net
-                             struct ethtool_drvinfo *info)
- {
-       strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
--      strlcpy(info->bus_info, "BCMA", sizeof(info->bus_info));
-+      strlcpy(info->bus_info, "AXI", sizeof(info->bus_info));
- }
- static const struct ethtool_ops bgmac_ethtool_ops = {
-@@ -1483,116 +1453,41 @@ static int bgmac_phy_connect(struct bgma
-       return 0;
- }
--static int bgmac_probe(struct bcma_device *core)
-+int bgmac_enet_probe(struct bgmac *info)
- {
-       struct net_device *net_dev;
-       struct bgmac *bgmac;
--      struct ssb_sprom *sprom = &core->bus->sprom;
--      u8 *mac;
-       int err;
--      switch (core->core_unit) {
--      case 0:
--              mac = sprom->et0mac;
--              break;
--      case 1:
--              mac = sprom->et1mac;
--              break;
--      case 2:
--              mac = sprom->et2mac;
--              break;
--      default:
--              dev_err(&core->dev, "Unsupported core_unit %d\n",
--                      core->core_unit);
--              return -ENOTSUPP;
--      }
--
--      if (!is_valid_ether_addr(mac)) {
--              dev_err(&core->dev, "Invalid MAC addr: %pM\n", mac);
--              eth_random_addr(mac);
--              dev_warn(&core->dev, "Using random MAC: %pM\n", mac);
--      }
--
--      /* This (reset &) enable is not preset in specs or reference driver but
--       * Broadcom does it in arch PCI code when enabling fake PCI device.
--       */
--      bcma_core_enable(core, 0);
--
-       /* Allocation and references */
-       net_dev = alloc_etherdev(sizeof(*bgmac));
-       if (!net_dev)
-               return -ENOMEM;
-+
-       net_dev->netdev_ops = &bgmac_netdev_ops;
--      net_dev->irq = core->irq;
-       net_dev->ethtool_ops = &bgmac_ethtool_ops;
-       bgmac = netdev_priv(net_dev);
--      bgmac->dev = &core->dev;
--      bgmac->dma_dev = core->dma_dev;
-+      memcpy(bgmac, info, sizeof(*bgmac));
-       bgmac->net_dev = net_dev;
--      bgmac->core = core;
--      bcma_set_drvdata(core, bgmac);
--      SET_NETDEV_DEV(net_dev, &core->dev);
--
--      /* Defaults */
--      memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN);
--
--      /* On BCM4706 we need common core to access PHY */
--      if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
--          !core->bus->drv_gmac_cmn.core) {
--              dev_err(bgmac->dev, "GMAC CMN core not found (required for BCM4706)\n");
--              err = -ENODEV;
--              goto err_netdev_free;
--      }
--      bgmac->cmn = core->bus->drv_gmac_cmn.core;
-+      net_dev->irq = bgmac->irq;
-+      SET_NETDEV_DEV(net_dev, bgmac->dev);
--      switch (core->core_unit) {
--      case 0:
--              bgmac->phyaddr = sprom->et0phyaddr;
--              break;
--      case 1:
--              bgmac->phyaddr = sprom->et1phyaddr;
--              break;
--      case 2:
--              bgmac->phyaddr = sprom->et2phyaddr;
--              break;
-+      if (!is_valid_ether_addr(bgmac->mac_addr)) {
-+              dev_err(bgmac->dev, "Invalid MAC addr: %pM\n",
-+                      bgmac->mac_addr);
-+              eth_random_addr(bgmac->mac_addr);
-+              dev_warn(bgmac->dev, "Using random MAC: %pM\n",
-+                       bgmac->mac_addr);
-       }
--      bgmac->phyaddr &= BGMAC_PHY_MASK;
--      if (bgmac->phyaddr == BGMAC_PHY_MASK) {
--              dev_err(bgmac->dev, "No PHY found\n");
--              err = -ENODEV;
--              goto err_netdev_free;
--      }
--      dev_info(bgmac->dev, "Found PHY addr: %d%s\n", bgmac->phyaddr,
--               bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : "");
-+      ether_addr_copy(net_dev->dev_addr, bgmac->mac_addr);
--      if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
--              dev_err(bgmac->dev, "PCI setup not implemented\n");
--              err = -ENOTSUPP;
--              goto err_netdev_free;
--      }
-+      /* This (reset &) enable is not preset in specs or reference driver but
-+       * Broadcom does it in arch PCI code when enabling fake PCI device.
-+       */
-+      bgmac_clk_enable(bgmac, 0);
-       bgmac_chip_reset(bgmac);
--      /* For Northstar, we have to take all GMAC core out of reset */
--      if (bgmac_is_bcm4707_family(bgmac)) {
--              struct bcma_device *ns_core;
--              int ns_gmac;
--
--              /* Northstar has 4 GMAC cores */
--              for (ns_gmac = 0; ns_gmac < 4; ns_gmac++) {
--                      /* As Northstar requirement, we have to reset all GMACs
--                       * before accessing one. bgmac_chip_reset() call
--                       * bcma_core_enable() for this core. Then the other
--                       * three GMACs didn't reset.  We do it here.
--                       */
--                      ns_core = bcma_find_core_unit(core->bus,
--                                                    BCMA_CORE_MAC_GBIT,
--                                                    ns_gmac);
--                      if (ns_core && !bcma_core_is_enabled(ns_core))
--                              bcma_core_enable(ns_core, 0);
--              }
--      }
--
-       err = bgmac_dma_alloc(bgmac);
-       if (err) {
-               dev_err(bgmac->dev, "Unable to alloc memory for DMA\n");
-@@ -1603,103 +1498,15 @@ static int bgmac_probe(struct bcma_devic
-       if (bcm47xx_nvram_getenv("et0_no_txint", NULL, 0) == 0)
-               bgmac->int_mask &= ~BGMAC_IS_TX_MASK;
--      bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo &
--                             BGMAC_BFL_ENETROBO);
--      if (bgmac->has_robosw)
--              dev_warn(bgmac->dev, "Support for Roboswitch not implemented\n");
--
--      if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
--              dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
--
--      /* Feature Flags */
--      switch (core->bus->chipinfo.id) {
--      case BCMA_CHIP_ID_BCM5357:
--              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
--              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
--              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
--              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
--              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
--                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
--                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
--              }
--              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
--                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
--              break;
--      case BCMA_CHIP_ID_BCM53572:
--              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
--              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
--              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
--              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
--              if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
--                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
--                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
--              }
--              break;
--      case BCMA_CHIP_ID_BCM4749:
--              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
--              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
--              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
--              bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
--              if (core->bus->chipinfo.pkg == 10) {
--                      bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
--                      bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
--              }
--              break;
--      case BCMA_CHIP_ID_BCM4716:
--              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
--              /* fallthrough */
--      case BCMA_CHIP_ID_BCM47162:
--              bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
--              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
--              break;
--      /* bcm4707_family */
--      case BCMA_CHIP_ID_BCM4707:
--      case BCMA_CHIP_ID_BCM47094:
--      case BCMA_CHIP_ID_BCM53018:
--              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
--              bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
--              bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
--              break;
--      default:
--              bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
--              bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
--      }
--
--      if (!bgmac_is_bcm4707_family(bgmac) && core->id.rev > 2)
--              bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
--
--      if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
--              bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
--              bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
--      }
--
--      if (core->id.rev >= 4) {
--              bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
--              bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
--              bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
--      }
--
-       netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
--      if (!bgmac_is_bcm4707_family(bgmac)) {
--              struct mii_bus *mii_bus;
--
--              mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
--              if (!IS_ERR(mii_bus)) {
--                      err = PTR_ERR(mii_bus);
--                      goto err_dma_free;
--              }
--
--              bgmac->mii_bus = mii_bus;
--      }
--
-       if (!bgmac->mii_bus)
-               err = bgmac_phy_connect_direct(bgmac);
-       else
-               err = bgmac_phy_connect(bgmac);
-       if (err) {
-               dev_err(bgmac->dev, "Cannot connect to phy\n");
--              goto err_mii_unregister;
-+              goto err_dma_free;
-       }
-       net_dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
-@@ -1718,56 +1525,24 @@ static int bgmac_probe(struct bcma_devic
- err_phy_disconnect:
-       phy_disconnect(net_dev->phydev);
--err_mii_unregister:
--      bcma_mdio_mii_unregister(bgmac->mii_bus);
- err_dma_free:
-       bgmac_dma_free(bgmac);
- err_netdev_free:
--      bcma_set_drvdata(core, NULL);
-       free_netdev(net_dev);
-       return err;
- }
-+EXPORT_SYMBOL_GPL(bgmac_enet_probe);
--static void bgmac_remove(struct bcma_device *core)
-+void bgmac_enet_remove(struct bgmac *bgmac)
- {
--      struct bgmac *bgmac = bcma_get_drvdata(core);
--
-       unregister_netdev(bgmac->net_dev);
-       phy_disconnect(bgmac->net_dev->phydev);
--      bcma_mdio_mii_unregister(bgmac->mii_bus);
-       netif_napi_del(&bgmac->napi);
-       bgmac_dma_free(bgmac);
--      bcma_set_drvdata(core, NULL);
-       free_netdev(bgmac->net_dev);
- }
--
--static struct bcma_driver bgmac_bcma_driver = {
--      .name           = KBUILD_MODNAME,
--      .id_table       = bgmac_bcma_tbl,
--      .probe          = bgmac_probe,
--      .remove         = bgmac_remove,
--};
--
--static int __init bgmac_init(void)
--{
--      int err;
--
--      err = bcma_driver_register(&bgmac_bcma_driver);
--      if (err)
--              return err;
--      pr_info("Broadcom 47xx GBit MAC driver loaded\n");
--
--      return 0;
--}
--
--static void __exit bgmac_exit(void)
--{
--      bcma_driver_unregister(&bgmac_bcma_driver);
--}
--
--module_init(bgmac_init)
--module_exit(bgmac_exit)
-+EXPORT_SYMBOL_GPL(bgmac_enet_remove);
- MODULE_AUTHOR("Rafał Miłecki");
- MODULE_LICENSE("GPL");
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -1,8 +1,6 @@
- #ifndef _BGMAC_H
- #define _BGMAC_H
--#include <linux/bcma/bcma.h>
--#include <linux/brcmphy.h>
- #include <linux/netdevice.h>
- #define BGMAC_DEV_CTL                         0x000
-@@ -442,11 +440,21 @@ struct bgmac_rx_header {
- };
- struct bgmac {
--      struct bcma_device *core;
--      struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
-+      union {
-+              struct {
-+                      void *base;
-+                      void *idm_base;
-+              } plat;
-+              struct {
-+                      struct bcma_device *core;
-+                      /* Reference to CMN core for BCM4706 */
-+                      struct bcma_device *cmn;
-+              } bcma;
-+      };
-       struct device *dev;
-       struct device *dma_dev;
-+      unsigned char mac_addr[ETH_ALEN];
-       u32 feature_flags;
-       struct net_device *net_dev;
-@@ -463,6 +471,7 @@ struct bgmac {
-       u32 mib_rx_regs[BGMAC_NUM_MIB_RX_REGS];
-       /* Int */
-+      int irq;
-       u32 int_mask;
-       /* Current MAC state */
-@@ -473,19 +482,71 @@ struct bgmac {
-       bool has_robosw;
-       bool loopback;
-+
-+      u32 (*read)(struct bgmac *bgmac, u16 offset);
-+      void (*write)(struct bgmac *bgmac, u16 offset, u32 value);
-+      u32 (*idm_read)(struct bgmac *bgmac, u16 offset);
-+      void (*idm_write)(struct bgmac *bgmac, u16 offset, u32 value);
-+      bool (*clk_enabled)(struct bgmac *bgmac);
-+      void (*clk_enable)(struct bgmac *bgmac, u32 flags);
-+      void (*cco_ctl_maskset)(struct bgmac *bgmac, u32 offset, u32 mask,
-+                              u32 set);
-+      u32 (*get_bus_clock)(struct bgmac *bgmac);
-+      void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
-+                            u32 set);
- };
-+int bgmac_enet_probe(struct bgmac *info);
-+void bgmac_enet_remove(struct bgmac *bgmac);
-+
- struct mii_bus *bcma_mdio_mii_register(struct bcma_device *core, u8 phyaddr);
- void bcma_mdio_mii_unregister(struct mii_bus *mii_bus);
- static inline u32 bgmac_read(struct bgmac *bgmac, u16 offset)
- {
--      return bcma_read32(bgmac->core, offset);
-+      return bgmac->read(bgmac, offset);
- }
- static inline void bgmac_write(struct bgmac *bgmac, u16 offset, u32 value)
- {
--      bcma_write32(bgmac->core, offset, value);
-+      bgmac->write(bgmac, offset, value);
-+}
-+
-+static inline u32 bgmac_idm_read(struct bgmac *bgmac, u16 offset)
-+{
-+      return bgmac->idm_read(bgmac, offset);
-+}
-+
-+static inline void bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
-+{
-+      bgmac->idm_write(bgmac, offset, value);
-+}
-+
-+static inline bool bgmac_clk_enabled(struct bgmac *bgmac)
-+{
-+      return bgmac->clk_enabled(bgmac);
-+}
-+
-+static inline void bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
-+{
-+      bgmac->clk_enable(bgmac, flags);
-+}
-+
-+static inline void bgmac_cco_ctl_maskset(struct bgmac *bgmac, u32 offset,
-+                                       u32 mask, u32 set)
-+{
-+      bgmac->cco_ctl_maskset(bgmac, offset, mask, set);
-+}
-+
-+static inline u32 bgmac_get_bus_clock(struct bgmac *bgmac)
-+{
-+      return bgmac->get_bus_clock(bgmac);
-+}
-+
-+static inline void bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset,
-+                                     u32 mask, u32 set)
-+{
-+      bgmac->cmn_maskset32(bgmac, offset, mask, set);
- }
- static inline void bgmac_maskset(struct bgmac *bgmac, u16 offset, u32 mask,
diff --git a/target/linux/generic/patches-4.4/076-0001-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch b/target/linux/generic/patches-4.4/076-0001-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch
deleted file mode 100644 (file)
index e0431c1..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From 12c2e32f14da857b58af281b029d4549d24c3292 Mon Sep 17 00:00:00 2001
-From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
-Date: Tue, 12 Jul 2016 00:17:28 +0000
-Subject: [PATCH] net: ethernet: bgmac: Fix return value check in bgmac_probe()
-
-In case of error, the function devm_ioremap_resource() returns ERR_PTR()
-and never returns NULL. The NULL test in the return value check should be
-replaced with IS_ERR().
-
-Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac-platform.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac-platform.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
-@@ -141,7 +141,7 @@ static int bgmac_probe(struct platform_d
-       }
-       bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
--      if (!bgmac->plat.idm_base) {
-+      if (IS_ERR(bgmac->plat.idm_base)) {
-               dev_err(&pdev->dev, "Unable to map idm resource\n");
-               return PTR_ERR(bgmac->plat.idm_base);
-       }
diff --git a/target/linux/generic/patches-4.4/076-0002-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch b/target/linux/generic/patches-4.4/076-0002-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch
deleted file mode 100644 (file)
index 4790948..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-From ce3a380dddd0cb16cb3d8d947b69657d7646c121 Mon Sep 17 00:00:00 2001
-From: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
-Date: Wed, 13 Jul 2016 12:46:57 +0000
-Subject: [PATCH] net: ethernet: bgmac: Remove redundant dev_err call in
- bgmac_probe()
-
-There is a error message within devm_ioremap_resource
-already, so remove the dev_err call to avoid redundant
-error message.
-
-Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac-platform.c | 8 ++------
- 1 file changed, 2 insertions(+), 6 deletions(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac-platform.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
-@@ -129,10 +129,8 @@ static int bgmac_probe(struct platform_d
-       }
-       bgmac->plat.base = devm_ioremap_resource(&pdev->dev, regs);
--      if (IS_ERR(bgmac->plat.base)) {
--              dev_err(&pdev->dev, "Unable to map base resource\n");
-+      if (IS_ERR(bgmac->plat.base))
-               return PTR_ERR(bgmac->plat.base);
--      }
-       regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "idm_base");
-       if (!regs) {
-@@ -141,10 +139,8 @@ static int bgmac_probe(struct platform_d
-       }
-       bgmac->plat.idm_base = devm_ioremap_resource(&pdev->dev, regs);
--      if (IS_ERR(bgmac->plat.idm_base)) {
--              dev_err(&pdev->dev, "Unable to map idm resource\n");
-+      if (IS_ERR(bgmac->plat.idm_base))
-               return PTR_ERR(bgmac->plat.idm_base);
--      }
-       bgmac->read = platform_bgmac_read;
-       bgmac->write = platform_bgmac_write;
diff --git a/target/linux/generic/patches-4.4/076-0004-net-bgmac-fix-reversed-check-for-MII-registration-er.patch b/target/linux/generic/patches-4.4/076-0004-net-bgmac-fix-reversed-check-for-MII-registration-er.patch
deleted file mode 100644 (file)
index 945546d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From b9f63ae7ba2de2ba19137c5757c0607ce40f3ed5 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 15:37:14 +0200
-Subject: [PATCH] net: bgmac: fix reversed check for MII registration error
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-It was failing on successful registration returning meaningless errors.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Fixes: 55954f3bfdac ("net: ethernet: bgmac: move BCMA MDIO Phy code into a separate file")
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/broadcom/bgmac-bcma.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -159,7 +159,7 @@ static int bgmac_probe(struct bcma_devic
-       if (!bgmac_is_bcm4707_family(core)) {
-               mii_bus = bcma_mdio_mii_register(core, bgmac->phyaddr);
--              if (!IS_ERR(mii_bus)) {
-+              if (IS_ERR(mii_bus)) {
-                       err = PTR_ERR(mii_bus);
-                       goto err;
-               }
diff --git a/target/linux/generic/patches-4.4/077-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch b/target/linux/generic/patches-4.4/077-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch
deleted file mode 100644 (file)
index 82d3fe4..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-From 1cb94db3d1bfe0075bde78fb2989f17e0a8a3936 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 23:00:30 +0200
-Subject: [PATCH] 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>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- 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
-@@ -943,6 +943,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)
-@@ -1486,6 +1507,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_TYP