From f61044a9b0f37cfee8b2ce0d205403115b7e0107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Tue, 31 Jan 2017 21:00:51 +0100 Subject: kernel: rename bgmac patches to squeeze them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- ...1-bgmac-fix-a-missing-check-for-build_skb.patch | 28 - ...x-reversed-test-of-build_skb-return-value.patch | 22 - ...1-bgmac-fix-a-missing-check-for-build_skb.patch | 28 + ...x-reversed-test-of-build_skb-return-value.patch | 22 + ...-net-bgmac-clarify-CONFIG_BCMA-dependency.patch | 46 + ...elper-checking-for-BCM4707-BCM53018-chip-.patch | 106 ++ ...c-support-Ethernet-device-on-BCM47094-SoC.patch | 39 + ...eset-enable-Ethernet-core-before-using-it.patch | 31 + ...gmac-fix-MAC-soft-reset-bit-for-corerev-4.patch | 34 + ...-net_device-with-backing-device-structure.patch | 25 + ...-bgmac-Add-support-for-ethtool-statistics.patch | 175 +++ ...003-bgmac-Maintain-some-netdev-statistics.patch | 68 ++ ...t-bgmac-use-phydev-from-struct-net_device.patch | 105 ++ ...-net-bgmac-clarify-CONFIG_BCMA-dependency.patch | 46 - ...elper-checking-for-BCM4707-BCM53018-chip-.patch | 106 -- ...c-support-Ethernet-device-on-BCM47094-SoC.patch | 39 - ...eset-enable-Ethernet-core-before-using-it.patch | 31 - ...gmac-fix-MAC-soft-reset-bit-for-corerev-4.patch | 34 - ...-v4.7-0001-net-bgmac-Fix-SOF-bit-checking.patch | 37 + ...-bgmac-Start-transmit-queue-in-bgmac_open.patch | 28 + ...-bgmac-Remove-superflous-netif_carrier_on.patch | 28 + ...t-bgmac-change-bgmac_-prints-to-dev_-prin.patch | 407 +++++++ ...02-net-ethernet-bgmac-add-dma_dev-pointer.patch | 112 ++ ...t-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch | 676 +++++++++++ ...t-ethernet-bgmac-convert-to-feature-flags.patch | 384 ++++++ ...thernet-bgmac-Add-platform-device-support.patch | 1260 ++++++++++++++++++++ ...t-bgmac-Fix-return-value-check-in-bgmac_p.patch | 26 + ...t-bgmac-Remove-redundant-dev_err-call-in-.patch | 42 + ...ix-reversed-check-for-MII-registration-er.patch | 28 + ...ac-support-Ethernet-core-on-BCM53573-SoCs.patch | 161 +++ ...ake-it-clear-when-setting-interface-type-.patch | 31 + ...3-net-bgmac-Fix-errant-feature-flag-check.patch | 33 + ...fix-spelling-mistake-connecton-connection.patch | 25 + ...-net_device-with-backing-device-structure.patch | 25 - ...-bgmac-Add-support-for-ethtool-statistics.patch | 175 --- ...003-bgmac-Maintain-some-netdev-statistics.patch | 68 -- ...t-bgmac-use-phydev-from-struct-net_device.patch | 105 -- .../074-0001-net-bgmac-Fix-SOF-bit-checking.patch | 37 - ...-bgmac-Start-transmit-queue-in-bgmac_open.patch | 28 - ...-bgmac-Remove-superflous-netif_carrier_on.patch | 28 - ...t-bgmac-change-bgmac_-prints-to-dev_-prin.patch | 407 ------- ...02-net-ethernet-bgmac-add-dma_dev-pointer.patch | 112 -- ...t-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch | 676 ----------- ...t-ethernet-bgmac-convert-to-feature-flags.patch | 384 ------ ...thernet-bgmac-Add-platform-device-support.patch | 1260 -------------------- ...t-bgmac-Fix-return-value-check-in-bgmac_p.patch | 26 - ...t-bgmac-Remove-redundant-dev_err-call-in-.patch | 42 - ...ix-reversed-check-for-MII-registration-er.patch | 28 - ...ac-support-Ethernet-core-on-BCM53573-SoCs.patch | 161 --- ...ake-it-clear-when-setting-interface-type-.patch | 31 - ...3-net-bgmac-Fix-errant-feature-flag-check.patch | 33 - ...fix-spelling-mistake-connecton-connection.patch | 25 - 52 files changed, 3957 insertions(+), 3957 deletions(-) delete mode 100644 target/linux/generic/patches-4.4/070-0001-bgmac-fix-a-missing-check-for-build_skb.patch delete mode 100644 target/linux/generic/patches-4.4/070-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.5-0001-bgmac-fix-a-missing-check-for-build_skb.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.5-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.5-0003-net-bgmac-clarify-CONFIG_BCMA-dependency.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.6-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.6-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.6-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.6-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.8-0001-bgmac-Bind-net_device-with-backing-device-structure.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.8-0002-bgmac-Add-support-for-ethtool-statistics.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.8-0003-bgmac-Maintain-some-netdev-statistics.patch create mode 100644 target/linux/generic/patches-4.4/070-v4.8-0004-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch delete mode 100644 target/linux/generic/patches-4.4/071-0000-net-bgmac-clarify-CONFIG_BCMA-dependency.patch delete mode 100644 target/linux/generic/patches-4.4/071-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch delete mode 100644 target/linux/generic/patches-4.4/071-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch delete mode 100644 target/linux/generic/patches-4.4/071-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch delete mode 100644 target/linux/generic/patches-4.4/071-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.7-0001-net-bgmac-Fix-SOF-bit-checking.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.7-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.7-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0004-net-ethernet-bgmac-convert-to-feature-flags.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0005-net-ethernet-bgmac-Add-platform-device-support.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0006-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0007-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.8-0009-net-bgmac-fix-reversed-check-for-MII-registration-er.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.9-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.9-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.9-0003-net-bgmac-Fix-errant-feature-flag-check.patch create mode 100644 target/linux/generic/patches-4.4/071-v4.9-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch delete mode 100644 target/linux/generic/patches-4.4/072-0001-bgmac-Bind-net_device-with-backing-device-structure.patch delete mode 100644 target/linux/generic/patches-4.4/072-0002-bgmac-Add-support-for-ethtool-statistics.patch delete mode 100644 target/linux/generic/patches-4.4/072-0003-bgmac-Maintain-some-netdev-statistics.patch delete mode 100644 target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch delete mode 100644 target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch delete mode 100644 target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch delete mode 100644 target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch delete mode 100644 target/linux/generic/patches-4.4/075-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch delete mode 100644 target/linux/generic/patches-4.4/075-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch delete mode 100644 target/linux/generic/patches-4.4/075-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch delete mode 100644 target/linux/generic/patches-4.4/075-0004-net-ethernet-bgmac-convert-to-feature-flags.patch delete mode 100644 target/linux/generic/patches-4.4/075-0005-net-ethernet-bgmac-Add-platform-device-support.patch delete mode 100644 target/linux/generic/patches-4.4/076-0001-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch delete mode 100644 target/linux/generic/patches-4.4/076-0002-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch delete mode 100644 target/linux/generic/patches-4.4/076-0004-net-bgmac-fix-reversed-check-for-MII-registration-er.patch delete mode 100644 target/linux/generic/patches-4.4/077-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch delete mode 100644 target/linux/generic/patches-4.4/077-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch delete mode 100644 target/linux/generic/patches-4.4/077-0003-net-bgmac-Fix-errant-feature-flag-check.patch delete mode 100644 target/linux/generic/patches-4.4/077-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch (limited to 'target') 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 index 99f9de65a7..0000000000 --- a/target/linux/generic/patches-4.4/070-0001-bgmac-fix-a-missing-check-for-build_skb.patch +++ /dev/null @@ -1,28 +0,0 @@ -From f1640c3ddeec12804bc9a21feee85fc15aca95f6 Mon Sep 17 00:00:00 2001 -From: wangweidong -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 -Signed-off-by: David S. Miller ---- - 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 index eebcded6fa..0000000000 --- a/target/linux/generic/patches-4.4/070-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 750afbf8ee9c6a1c74a1fe5fc9852146b1d72687 Mon Sep 17 00:00:00 2001 -From: "David S. Miller" -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 ---- - 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 index 0000000000..99f9de65a7 --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.5-0001-bgmac-fix-a-missing-check-for-build_skb.patch @@ -0,0 +1,28 @@ +From f1640c3ddeec12804bc9a21feee85fc15aca95f6 Mon Sep 17 00:00:00 2001 +From: wangweidong +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..eebcded6fa --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.5-0002-bgmac-Fix-reversed-test-of-build_skb-return-value.patch @@ -0,0 +1,22 @@ +From 750afbf8ee9c6a1c74a1fe5fc9852146b1d72687 Mon Sep 17 00:00:00 2001 +From: "David S. Miller" +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 +--- + 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 index 0000000000..cd0d09887f --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.5-0003-net-bgmac-clarify-CONFIG_BCMA-dependency.patch @@ -0,0 +1,46 @@ +From 1f820f538f7396db7fd40684b9c3620816acc5a3 Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..0c007569fb --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.6-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch @@ -0,0 +1,106 @@ +From 387b75f8b31437792e8334390fdf5cf060d1e3da Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..d00c2bd551 --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.6-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch @@ -0,0 +1,39 @@ +From 9e4e6206c67ae11d68fc96882256f37c237087d4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..021a5913aa --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.6-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch @@ -0,0 +1,31 @@ +From b4dfd8e92956b396d3438212bc9a0be6267b8b34 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Signed-off-by: Rafał Miłecki +Signed-off-by: David S. Miller +--- + +--- 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 index 0000000000..a5fcaab51c --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.6-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch @@ -0,0 +1,34 @@ +From c02bc350f9dbce7d637c394a6e1c4d29dc5b28b2 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau +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 +Signed-off-by: Rafał Miłecki +Signed-off-by: David S. Miller +--- + +--- 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 index 0000000000..4d00094aa8 --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.8-0001-bgmac-Bind-net_device-with-backing-device-structure.patch @@ -0,0 +1,25 @@ +From 2022e9d50798aa592887ccb5a7d045e537f3855f Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..cff70802d2 --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.8-0002-bgmac-Add-support-for-ethtool-statistics.patch @@ -0,0 +1,175 @@ +From f6613d4fa937fa8388f2c1cb4e69ccc25e9e2336 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..322851d026 --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.8-0003-bgmac-Maintain-some-netdev-statistics.patch @@ -0,0 +1,68 @@ +From 6d490f62a4c7f11c552591bdd08eda3636aa0db9 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..8c97b09970 --- /dev/null +++ b/target/linux/generic/patches-4.4/070-v4.8-0004-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch @@ -0,0 +1,105 @@ +From b21fcb259313bcf7d4f73ecd5e44948995c8957c Mon Sep 17 00:00:00 2001 +From: Philippe Reynes +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 +Signed-off-by: David S. Miller +--- + 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 index cd0d09887f..0000000000 --- a/target/linux/generic/patches-4.4/071-0000-net-bgmac-clarify-CONFIG_BCMA-dependency.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 1f820f538f7396db7fd40684b9c3620816acc5a3 Mon Sep 17 00:00:00 2001 -From: Arnd Bergmann -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 -Signed-off-by: David S. Miller ---- - 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 index 0c007569fb..0000000000 --- a/target/linux/generic/patches-4.4/071-0001-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch +++ /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?= -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 -Signed-off-by: David S. Miller ---- - 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 index d00c2bd551..0000000000 --- a/target/linux/generic/patches-4.4/071-0002-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch +++ /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?= -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 -Signed-off-by: David S. Miller ---- - 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 index 021a5913aa..0000000000 --- a/target/linux/generic/patches-4.4/071-0003-bgmac-reset-enable-Ethernet-core-before-using-it.patch +++ /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?= -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 -Signed-off-by: Rafał Miłecki -Signed-off-by: David S. Miller ---- - ---- 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 index a5fcaab51c..0000000000 --- a/target/linux/generic/patches-4.4/071-0004-bgmac-fix-MAC-soft-reset-bit-for-corerev-4.patch +++ /dev/null @@ -1,34 +0,0 @@ -From c02bc350f9dbce7d637c394a6e1c4d29dc5b28b2 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -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 -Signed-off-by: Rafał Miłecki -Signed-off-by: David S. Miller ---- - ---- 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 index 0000000000..ea73fda6ff --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.7-0001-net-bgmac-Fix-SOF-bit-checking.patch @@ -0,0 +1,37 @@ +From d2b13233879ca1268a1c027d4573109e5a777811 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..6a866bccdb --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.7-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch @@ -0,0 +1,28 @@ +From c3897f2a69e54dd113fc9abd2daf872e5b495798 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..0edf9ee9fa --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.7-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch @@ -0,0 +1,28 @@ +From 3894396e64994f31c3ef5c7e6f63dded0593e567 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..3837b60943 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch @@ -0,0 +1,407 @@ +From d00a8281bcc962027dfe409c2f3e3f0546be9200 Mon Sep 17 00:00:00 2001 +From: Jon Mason +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 +Acked-by: Arnd Bergmann +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + 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 + #include + #include +@@ -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 index 0000000000..dd5b8772e3 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch @@ -0,0 +1,112 @@ +From a0b68486f6f680c7c0352a47c60042d7d95ffd87 Mon Sep 17 00:00:00 2001 +From: Jon Mason +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 +Acked-by: Arnd Bergmann +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + 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 index 0000000000..bc7b246cc1 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch @@ -0,0 +1,676 @@ +From 55954f3bfdacc5908515b0c306cea23e77fab740 Mon Sep 17 00:00:00 2001 +From: Jon Mason +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 +Acked-by: Arnd Bergmann +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + 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 ++ * ++ * Licensed under the GNU/GPL. See COPYING for details. ++ */ ++ ++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ++ ++#include ++#include ++#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 index 0000000000..0f627919d0 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0004-net-ethernet-bgmac-convert-to-feature-flags.patch @@ -0,0 +1,384 @@ +From db791eb2970bad193b1dc95a4461b222dd22cb64 Mon Sep 17 00:00:00 2001 +From: Jon Mason +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 +Acked-by: Arnd Bergmann +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + 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 index 0000000000..5755184949 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0005-net-ethernet-bgmac-Add-platform-device-support.patch @@ -0,0 +1,1260 @@ +From f6a95a24957aec5bb488c3f978c4ed508177998f Mon Sep 17 00:00:00 2001 +From: Jon Mason +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 +Acked-by: Arnd Bergmann +Reviewed-by: Florian Fainelli +Tested-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + 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 ++ * ++ * Licensed under the GNU/GPL. See COPYING for details. ++ */ ++ ++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ++ ++#include ++#include ++#include ++#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 ++#include ++#include ++#include ++#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 +-#include +-#include ++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ++ ++#include + #include +-#include +-#include +-#include +-#include +-#include + #include ++#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 +-#include + #include + + #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 index 0000000000..e0431c1235 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0006-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch @@ -0,0 +1,26 @@ +From 12c2e32f14da857b58af281b029d4549d24c3292 Mon Sep 17 00:00:00 2001 +From: Wei Yongjun +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..479094830e --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0007-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch @@ -0,0 +1,42 @@ +From ce3a380dddd0cb16cb3d8d947b69657d7646c121 Mon Sep 17 00:00:00 2001 +From: Wei Yongjun +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..945546d6df --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.8-0009-net-bgmac-fix-reversed-check-for-MII-registration-er.patch @@ -0,0 +1,28 @@ +From b9f63ae7ba2de2ba19137c5757c0607ce40f3ed5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Fixes: 55954f3bfdac ("net: ethernet: bgmac: move BCMA MDIO Phy code into a separate file") +Signed-off-by: David S. Miller +--- + 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 index 0000000000..82d3fe4d6d --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.9-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch @@ -0,0 +1,161 @@ +From 1cb94db3d1bfe0075bde78fb2989f17e0a8a3936 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..272ec5c3f3 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.9-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch @@ -0,0 +1,31 @@ +From e2d8f646c79f26e094bfaf9b21be614d1e148a67 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +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 +Signed-off-by: David S. Miller +--- + 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 index 0000000000..830d8ccde4 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.9-0003-net-bgmac-Fix-errant-feature-flag-check.patch @@ -0,0 +1,33 @@ +From 4af1474e6198b10fee7bb20e81f7e033ad1b586c Mon Sep 17 00:00:00 2001 +From: Jon Mason +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 +Signed-off-by: Jon Mason +Signed-off-by: David S. Miller +--- + 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 index 0000000000..5721abcf95 --- /dev/null +++ b/target/linux/generic/patches-4.4/071-v4.9-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch @@ -0,0 +1,25 @@ +From c121f72a66c5f92fbe2fc53baa274eef39875cec Mon Sep 17 00:00:00 2001 +From: Colin Ian King +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 +Acked-by: Jon Mason +Signed-off-by: David S. Miller +--- + 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 index 4d00094aa8..0000000000 --- a/target/linux/generic/patches-4.4/072-0001-bgmac-Bind-net_device-with-backing-device-structure.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 2022e9d50798aa592887ccb5a7d045e537f3855f Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -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 -Signed-off-by: David S. Miller ---- - 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 index cff70802d2..0000000000 --- a/target/linux/generic/patches-4.4/072-0002-bgmac-Add-support-for-ethtool-statistics.patch +++ /dev/null @@ -1,175 +0,0 @@ -From f6613d4fa937fa8388f2c1cb4e69ccc25e9e2336 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -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 -Signed-off-by: David S. Miller ---- - 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 index 322851d026..0000000000 --- a/target/linux/generic/patches-4.4/072-0003-bgmac-Maintain-some-netdev-statistics.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 6d490f62a4c7f11c552591bdd08eda3636aa0db9 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -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 -Signed-off-by: David S. Miller ---- - 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 index 8c97b09970..0000000000 --- a/target/linux/generic/patches-4.4/073-0001-net-ethernet-bgmac-use-phydev-from-struct-net_device.patch +++ /dev/null @@ -1,105 +0,0 @@ -From b21fcb259313bcf7d4f73ecd5e44948995c8957c Mon Sep 17 00:00:00 2001 -From: Philippe Reynes -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 -Signed-off-by: David S. Miller ---- - 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 index ea73fda6ff..0000000000 --- a/target/linux/generic/patches-4.4/074-0001-net-bgmac-Fix-SOF-bit-checking.patch +++ /dev/null @@ -1,37 +0,0 @@ -From d2b13233879ca1268a1c027d4573109e5a777811 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -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 -Signed-off-by: David S. Miller ---- - 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 index 6a866bccdb..0000000000 --- a/target/linux/generic/patches-4.4/074-0002-net-bgmac-Start-transmit-queue-in-bgmac_open.patch +++ /dev/null @@ -1,28 +0,0 @@ -From c3897f2a69e54dd113fc9abd2daf872e5b495798 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -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 -Signed-off-by: David S. Miller ---- - 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 index 0edf9ee9fa..0000000000 --- a/target/linux/generic/patches-4.4/074-0003-net-bgmac-Remove-superflous-netif_carrier_on.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 3894396e64994f31c3ef5c7e6f63dded0593e567 Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -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 -Signed-off-by: David S. Miller ---- - 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 index 3837b60943..0000000000 --- a/target/linux/generic/patches-4.4/075-0001-net-ethernet-bgmac-change-bgmac_-prints-to-dev_-prin.patch +++ /dev/null @@ -1,407 +0,0 @@ -From d00a8281bcc962027dfe409c2f3e3f0546be9200 Mon Sep 17 00:00:00 2001 -From: Jon Mason -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 -Acked-by: Arnd Bergmann -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - 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 - #include - #include -@@ -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 index dd5b8772e3..0000000000 --- a/target/linux/generic/patches-4.4/075-0002-net-ethernet-bgmac-add-dma_dev-pointer.patch +++ /dev/null @@ -1,112 +0,0 @@ -From a0b68486f6f680c7c0352a47c60042d7d95ffd87 Mon Sep 17 00:00:00 2001 -From: Jon Mason -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 -Acked-by: Arnd Bergmann -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - 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 index bc7b246cc1..0000000000 --- a/target/linux/generic/patches-4.4/075-0003-net-ethernet-bgmac-move-BCMA-MDIO-Phy-code-into-a-se.patch +++ /dev/null @@ -1,676 +0,0 @@ -From 55954f3bfdacc5908515b0c306cea23e77fab740 Mon Sep 17 00:00:00 2001 -From: Jon Mason -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 -Acked-by: Arnd Bergmann -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - 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 -+ * -+ * Licensed under the GNU/GPL. See COPYING for details. -+ */ -+ -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ -+#include -+#include -+#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 index 0f627919d0..0000000000 --- a/target/linux/generic/patches-4.4/075-0004-net-ethernet-bgmac-convert-to-feature-flags.patch +++ /dev/null @@ -1,384 +0,0 @@ -From db791eb2970bad193b1dc95a4461b222dd22cb64 Mon Sep 17 00:00:00 2001 -From: Jon Mason -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 -Acked-by: Arnd Bergmann -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - 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 index 5755184949..0000000000 --- a/target/linux/generic/patches-4.4/075-0005-net-ethernet-bgmac-Add-platform-device-support.patch +++ /dev/null @@ -1,1260 +0,0 @@ -From f6a95a24957aec5bb488c3f978c4ed508177998f Mon Sep 17 00:00:00 2001 -From: Jon Mason -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 -Acked-by: Arnd Bergmann -Reviewed-by: Florian Fainelli -Tested-by: Florian Fainelli -Signed-off-by: David S. Miller ---- - 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 -+ * -+ * Licensed under the GNU/GPL. See COPYING for details. -+ */ -+ -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ -+#include -+#include -+#include -+#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 -+#include -+#include -+#include -+#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 --#include --#include -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ -+#include - #include --#include --#include --#include --#include --#include - #include -+#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 --#include - #include - - #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 index e0431c1235..0000000000 --- a/target/linux/generic/patches-4.4/076-0001-net-ethernet-bgmac-Fix-return-value-check-in-bgmac_p.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 12c2e32f14da857b58af281b029d4549d24c3292 Mon Sep 17 00:00:00 2001 -From: Wei Yongjun -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 -Signed-off-by: David S. Miller ---- - 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 index 479094830e..0000000000 --- a/target/linux/generic/patches-4.4/076-0002-net-ethernet-bgmac-Remove-redundant-dev_err-call-in-.patch +++ /dev/null @@ -1,42 +0,0 @@ -From ce3a380dddd0cb16cb3d8d947b69657d7646c121 Mon Sep 17 00:00:00 2001 -From: Wei Yongjun -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 -Signed-off-by: David S. Miller ---- - 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 index 945546d6df..0000000000 --- a/target/linux/generic/patches-4.4/076-0004-net-bgmac-fix-reversed-check-for-MII-registration-er.patch +++ /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?= -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 -Fixes: 55954f3bfdac ("net: ethernet: bgmac: move BCMA MDIO Phy code into a separate file") -Signed-off-by: David S. Miller ---- - 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 index 82d3fe4d6d..0000000000 --- a/target/linux/generic/patches-4.4/077-0001-net-bgmac-support-Ethernet-core-on-BCM53573-SoCs.patch +++ /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?= -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 -Signed-off-by: David S. Miller ---- - 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/077-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch b/target/linux/generic/patches-4.4/077-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch deleted file mode 100644 index 272ec5c3f3..0000000000 --- a/target/linux/generic/patches-4.4/077-0002-net-bgmac-make-it-clear-when-setting-interface-type-.patch +++ /dev/null @@ -1,31 +0,0 @@ -From e2d8f646c79f26e094bfaf9b21be614d1e148a67 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -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 -Signed-off-by: David S. Miller ---- - 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/077-0003-net-bgmac-Fix-errant-feature-flag-check.patch b/target/linux/generic/patches-4.4/077-0003-net-bgmac-Fix-errant-feature-flag-check.patch deleted file mode 100644 index 830d8ccde4..0000000000 --- a/target/linux/generic/patches-4.4/077-0003-net-bgmac-Fix-errant-feature-flag-check.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 4af1474e6198b10fee7bb20e81f7e033ad1b586c Mon Sep 17 00:00:00 2001 -From: Jon Mason -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 -Signed-off-by: Jon Mason -Signed-off-by: David S. Miller ---- - 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/077-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch b/target/linux/generic/patches-4.4/077-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch deleted file mode 100644 index 5721abcf95..0000000000 --- a/target/linux/generic/patches-4.4/077-0004-net-bgmac-fix-spelling-mistake-connecton-connection.patch +++ /dev/null @@ -1,25 +0,0 @@ -From c121f72a66c5f92fbe2fc53baa274eef39875cec Mon Sep 17 00:00:00 2001 -From: Colin Ian King -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 -Acked-by: Jon Mason -Signed-off-by: David S. Miller ---- - 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); - } - -- cgit v1.2.3