From 779d0cc62f83f4bb3a2e426ce771248f6941063a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Fri, 26 Feb 2016 07:10:16 +0000 Subject: [PATCH] kernel: support bgmac on BCM47094 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafał Miłecki Backport of r48564 and r48756 SVN-Revision: 48790 --- ...-support-for-the-3rd-bus-core-device.patch | 4 +- ...-checking-for-BCM4707-BCM53018-chip-.patch | 106 ++++++++++++++++++ ...port-Ethernet-device-on-BCM47094-SoC.patch | 39 +++++++ .../773-bgmac-add-srab-switch.patch | 10 +- 4 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 target/linux/generic/patches-3.18/078-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch create mode 100644 target/linux/generic/patches-3.18/079-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch diff --git a/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch b/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch index 6be75bb806..36894fec24 100644 --- a/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch +++ b/target/linux/bcm53xx/patches-3.18/700-bgmac-add-support-for-the-3rd-bus-core-device.patch @@ -17,7 +17,7 @@ Signed-off-by: Rafał Miłecki --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -1561,11 +1561,20 @@ static int bgmac_probe(struct bcma_devic +@@ -1566,11 +1566,20 @@ static int bgmac_probe(struct bcma_devic struct net_device *net_dev; struct bgmac *bgmac; struct ssb_sprom *sprom = &core->bus->sprom; @@ -41,7 +41,7 @@ Signed-off-by: Rafał Miłecki pr_err("Unsupported core_unit %d\n", core->core_unit); return -ENOTSUPP; } -@@ -1600,8 +1609,17 @@ static int bgmac_probe(struct bcma_devic +@@ -1605,8 +1614,17 @@ static int bgmac_probe(struct bcma_devic } bgmac->cmn = core->bus->drv_gmac_cmn.core; diff --git a/target/linux/generic/patches-3.18/078-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch b/target/linux/generic/patches-3.18/078-bgmac-add-helper-checking-for-BCM4707-BCM53018-chip-.patch new file mode 100644 index 0000000000..8e794180ac --- /dev/null +++ b/target/linux/generic/patches-3.18/078-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) + { +@@ -982,11 +993,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); +@@ -1050,9 +1059,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, +@@ -1188,8 +1195,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) / +@@ -1467,14 +1473,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(); +@@ -1545,7 +1549,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; +@@ -1608,8 +1611,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-3.18/079-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch b/target/linux/generic/patches-3.18/079-bgmac-support-Ethernet-device-on-BCM47094-SoC.patch new file mode 100644 index 0000000000..88db7b2fff --- /dev/null +++ b/target/linux/generic/patches-3.18/079-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: +@@ -1047,8 +1048,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-3.18/773-bgmac-add-srab-switch.patch b/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch index b883d73af3..559731300b 100644 --- a/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch +++ b/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch @@ -12,7 +12,7 @@ Signed-off-by: Hauke Mehrtens #include static const struct bcma_device_id bgmac_bcma_tbl[] = { -@@ -1538,6 +1539,17 @@ static void bgmac_mii_unregister(struct +@@ -1544,6 +1545,17 @@ static void bgmac_mii_unregister(struct mdiobus_free(mii_bus); } @@ -30,13 +30,11 @@ Signed-off-by: Hauke Mehrtens /************************************************** * BCMA bus ops **************************************************/ -@@ -1664,6 +1676,16 @@ static int bgmac_probe(struct bcma_devic +@@ -1668,6 +1680,14 @@ static int bgmac_probe(struct bcma_devic net_dev->hw_features = net_dev->features; net_dev->vlan_features = net_dev->features; -+ if ((ci->id == BCMA_CHIP_ID_BCM4707 || -+ ci->id == BCMA_CHIP_ID_BCM53018) && -+ !bgmac_b53_pdata.regs) { ++ if (bgmac_is_bcm4707_family(bgmac) && !bgmac_b53_pdata.regs) { + bgmac_b53_pdata.regs = ioremap_nocache(0x18007000, 0x1000); + + err = platform_device_register(&bgmac_b53_dev); @@ -47,7 +45,7 @@ Signed-off-by: Hauke Mehrtens err = register_netdev(bgmac->net_dev); if (err) { bgmac_err(bgmac, "Cannot register net device\n"); -@@ -1690,6 +1712,10 @@ static void bgmac_remove(struct bcma_dev +@@ -1694,6 +1714,10 @@ static void bgmac_remove(struct bcma_dev { struct bgmac *bgmac = bcma_get_drvdata(core); -- 2.30.2