From: Jonas Gorski Date: Wed, 6 Dec 2017 13:12:06 +0000 (+0100) Subject: brcm63xx: backport mdio-bus reset gpio support X-Git-Tag: v18.06.0-rc1~1555 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=054c0d4e31932abeee6d92904642ebb9fd186638;p=oweals%2Fopenwrt.git brcm63xx: backport mdio-bus reset gpio support Backport the mdio-bus reset gpio support from 4.12 and use it instead of toggling the reset ourself. Signed-off-by: Jonas Gorski --- diff --git a/target/linux/brcm63xx/patches-4.4/001-4.12-07-mdio_bus-Issue-GPIO-RESET-to-PHYs.patch b/target/linux/brcm63xx/patches-4.4/001-4.12-07-mdio_bus-Issue-GPIO-RESET-to-PHYs.patch new file mode 100644 index 0000000000..2deeb7b816 --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/001-4.12-07-mdio_bus-Issue-GPIO-RESET-to-PHYs.patch @@ -0,0 +1,192 @@ +From 69226896ad636b94f6d2e55d75ff21a29c4de83b Mon Sep 17 00:00:00 2001 +From: Roger Quadros +Date: Fri, 21 Apr 2017 16:15:38 +0300 +Subject: [PATCH] mdio_bus: Issue GPIO RESET to PHYs. + +Some boards [1] leave the PHYs at an invalid state +during system power-up or reset thus causing unreliability +issues with the PHY which manifests as PHY not being detected +or link not functional. To fix this, these PHYs need to be RESET +via a GPIO connected to the PHY's RESET pin. + +Some boards have a single GPIO controlling the PHY RESET pin of all +PHYs on the bus whereas some others have separate GPIOs controlling +individual PHY RESETs. + +In both cases, the RESET de-assertion cannot be done in the PHY driver +as the PHY will not probe till its reset is de-asserted. +So do the RESET de-assertion in the MDIO bus driver. + +[1] - am572x-idk, am571x-idk, a437x-idk + +Signed-off-by: Roger Quadros +Signed-off-by: David S. Miller +--- + Documentation/devicetree/bindings/net/mdio.txt | 33 ++++++++++++++++++ + drivers/net/phy/mdio_bus.c | 47 ++++++++++++++++++++++++++ + drivers/of/of_mdio.c | 7 ++++ + include/linux/phy.h | 7 ++++ + 4 files changed, 94 insertions(+) + create mode 100644 Documentation/devicetree/bindings/net/mdio.txt + +--- /dev/null ++++ b/Documentation/devicetree/bindings/net/mdio.txt +@@ -0,0 +1,33 @@ ++Common MDIO bus properties. ++ ++These are generic properties that can apply to any MDIO bus. ++ ++Optional properties: ++- reset-gpios: List of one or more GPIOs that control the RESET lines ++ of the PHYs on that MDIO bus. ++- reset-delay-us: RESET pulse width in microseconds as per PHY datasheet. ++ ++A list of child nodes, one per device on the bus is expected. These ++should follow the generic phy.txt, or a device specific binding document. ++ ++Example : ++This example shows these optional properties, plus other properties ++required for the TI Davinci MDIO driver. ++ ++ davinci_mdio: ethernet@0x5c030000 { ++ compatible = "ti,davinci_mdio"; ++ reg = <0x5c030000 0x1000>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ reset-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; ++ reset-delay-us = <2>; /* PHY datasheet states 1us min */ ++ ++ ethphy0: ethernet-phy@1 { ++ reg = <1>; ++ }; ++ ++ ethphy1: ethernet-phy@3 { ++ reg = <3>; ++ }; ++ }; +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -22,8 +22,11 @@ + #include + #include + #include ++#include ++#include + #include + #include ++#include + #include + #include + #include +@@ -252,6 +255,7 @@ static inline void of_mdiobus_link_phyde + int __mdiobus_register(struct mii_bus *bus, struct module *owner) + { + int i, err; ++ struct gpio_desc *gpiod; + + if (NULL == bus || NULL == bus->name || + NULL == bus->read || NULL == bus->write) +@@ -278,6 +282,35 @@ int __mdiobus_register(struct mii_bus *b + if (bus->reset) + bus->reset(bus); + ++ /* de-assert bus level PHY GPIO resets */ ++ if (bus->num_reset_gpios > 0) { ++ bus->reset_gpiod = devm_kcalloc(&bus->dev, ++ bus->num_reset_gpios, ++ sizeof(struct gpio_desc *), ++ GFP_KERNEL); ++ if (!bus->reset_gpiod) ++ return -ENOMEM; ++ } ++ ++ for (i = 0; i < bus->num_reset_gpios; i++) { ++ gpiod = devm_gpiod_get_index(&bus->dev, "reset", i, ++ GPIOD_OUT_LOW); ++ if (IS_ERR(gpiod)) { ++ err = PTR_ERR(gpiod); ++ if (err != -ENOENT) { ++ dev_err(&bus->dev, ++ "mii_bus %s couldn't get reset GPIO\n", ++ bus->id); ++ return err; ++ } ++ } else { ++ bus->reset_gpiod[i] = gpiod; ++ gpiod_set_value_cansleep(gpiod, 1); ++ udelay(bus->reset_delay_us); ++ gpiod_set_value_cansleep(gpiod, 0); ++ } ++ } ++ + for (i = 0; i < PHY_MAX_ADDR; i++) { + if ((bus->phy_mask & (1 << i)) == 0) { + struct phy_device *phydev; +@@ -302,6 +335,13 @@ error: + phy_device_free(phydev); + } + } ++ ++ /* Put PHYs in RESET to save power */ ++ for (i = 0; i < bus->num_reset_gpios; i++) { ++ if (bus->reset_gpiod[i]) ++ gpiod_set_value_cansleep(bus->reset_gpiod[i], 1); ++ } ++ + device_del(&bus->dev); + return err; + } +@@ -321,6 +361,13 @@ void mdiobus_unregister(struct mii_bus * + phy_device_free(phydev); + } + } ++ ++ /* Put PHYs in RESET to save power */ ++ for (i = 0; i < bus->num_reset_gpios; i++) { ++ if (bus->reset_gpiod[i]) ++ gpiod_set_value_cansleep(bus->reset_gpiod[i], 1); ++ } ++ + device_del(&bus->dev); + } + EXPORT_SYMBOL(mdiobus_unregister); +--- a/drivers/of/of_mdio.c ++++ b/drivers/of/of_mdio.c +@@ -21,6 +21,8 @@ + #include + #include + ++#define DEFAULT_GPIO_RESET_DELAY 10 /* in microseconds */ ++ + MODULE_AUTHOR("Grant Likely "); + MODULE_LICENSE("GPL"); + +@@ -140,6 +142,11 @@ int of_mdiobus_register(struct mii_bus * + + mdio->dev.of_node = np; + ++ /* Get bus level PHY reset GPIO details */ ++ mdio->reset_delay_us = DEFAULT_GPIO_RESET_DELAY; ++ of_property_read_u32(np, "reset-delay-us", &mdio->reset_delay_us); ++ mdio->num_reset_gpios = of_gpio_named_count(np, "reset-gpios"); ++ + /* Register the MDIO bus */ + rc = mdiobus_register(mdio); + if (rc) +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -191,6 +191,13 @@ struct mii_bus { + * interrupt at the index matching its address + */ + int *irq; ++ ++ /* GPIO reset pulse width in microseconds */ ++ int reset_delay_us; ++ /* Number of reset GPIOs */ ++ int num_reset_gpios; ++ /* Array of RESET GPIO descriptors */ ++ struct gpio_desc **reset_gpiod; + }; + #define to_mii_bus(d) container_of(d, struct mii_bus, dev) + diff --git a/target/linux/brcm63xx/patches-4.4/001-4.12-08-net-phy-Call-bus-reset-after-releasing-PHYs-from-res.patch b/target/linux/brcm63xx/patches-4.4/001-4.12-08-net-phy-Call-bus-reset-after-releasing-PHYs-from-res.patch new file mode 100644 index 0000000000..5788a37de6 --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/001-4.12-08-net-phy-Call-bus-reset-after-releasing-PHYs-from-res.patch @@ -0,0 +1,43 @@ +From df0c8d911abf6ba97b2c2fc3c5a12769e0b081a3 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +Date: Thu, 11 May 2017 11:24:16 -0700 +Subject: [PATCH] net: phy: Call bus->reset() after releasing PHYs from reset + +The API convention makes it that a given MDIO bus reset should be able +to access PHY devices in its reset() callback and perform additional +MDIO accesses in order to bring the bus and PHYs in a working state. + +Commit 69226896ad63 ("mdio_bus: Issue GPIO RESET to PHYs.") broke that +contract by first calling bus->reset() and then release all PHYs from +reset using their shared GPIO line, so restore the expected +functionality here. + +Fixes: 69226896ad63 ("mdio_bus: Issue GPIO RESET to PHYs.") +Signed-off-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/phy/mdio_bus.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -279,9 +279,6 @@ int __mdiobus_register(struct mii_bus *b + + mutex_init(&bus->mdio_lock); + +- if (bus->reset) +- bus->reset(bus); +- + /* de-assert bus level PHY GPIO resets */ + if (bus->num_reset_gpios > 0) { + bus->reset_gpiod = devm_kcalloc(&bus->dev, +@@ -311,6 +308,9 @@ int __mdiobus_register(struct mii_bus *b + } + } + ++ if (bus->reset) ++ bus->reset(bus); ++ + for (i = 0; i < PHY_MAX_ADDR; i++) { + if ((bus->phy_mask & (1 << i)) == 0) { + struct phy_device *phydev; diff --git a/target/linux/brcm63xx/patches-4.4/001-4.13-02-mdio_bus-handle-only-single-PHY-reset-GPIO.patch b/target/linux/brcm63xx/patches-4.4/001-4.13-02-mdio_bus-handle-only-single-PHY-reset-GPIO.patch new file mode 100644 index 0000000000..7a097c1b67 --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/001-4.13-02-mdio_bus-handle-only-single-PHY-reset-GPIO.patch @@ -0,0 +1,120 @@ +From d396e84c56047b303cac378dde4b2e5cc430b336 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Mon, 12 Jun 2017 23:55:38 +0300 +Subject: [PATCH] mdio_bus: handle only single PHY reset GPIO + +Commit 4c5e7a2c0501 ("dt-bindings: mdio: Clarify binding document") +declared that a MDIO reset GPIO property should have only a single GPIO +reference/specifier, however the supporting code was left intact, still +burdening the kernel with now apparently useless loops -- get rid of them. + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David S. Miller +--- + drivers/net/phy/mdio_bus.c | 53 +++++++++++++++++----------------------------- + drivers/of/of_mdio.c | 1 - + include/linux/phy.h | 6 ++---- + 3 files changed, 21 insertions(+), 39 deletions(-) + +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -279,33 +279,22 @@ int __mdiobus_register(struct mii_bus *b + + mutex_init(&bus->mdio_lock); + +- /* de-assert bus level PHY GPIO resets */ +- if (bus->num_reset_gpios > 0) { +- bus->reset_gpiod = devm_kcalloc(&bus->dev, +- bus->num_reset_gpios, +- sizeof(struct gpio_desc *), +- GFP_KERNEL); +- if (!bus->reset_gpiod) +- return -ENOMEM; +- } +- +- for (i = 0; i < bus->num_reset_gpios; i++) { +- gpiod = devm_gpiod_get_index(&bus->dev, "reset", i, +- GPIOD_OUT_LOW); +- if (IS_ERR(gpiod)) { +- err = PTR_ERR(gpiod); +- if (err != -ENOENT) { +- dev_err(&bus->dev, +- "mii_bus %s couldn't get reset GPIO\n", +- bus->id); +- return err; +- } +- } else { +- bus->reset_gpiod[i] = gpiod; +- gpiod_set_value_cansleep(gpiod, 1); +- udelay(bus->reset_delay_us); +- gpiod_set_value_cansleep(gpiod, 0); ++ /* de-assert bus level PHY GPIO reset */ ++ gpiod = devm_gpiod_get(&bus->dev, "reset", GPIOD_OUT_LOW); ++ if (IS_ERR(gpiod)) { ++ err = PTR_ERR(gpiod); ++ if (err != -ENOENT) { ++ dev_err(&bus->dev, ++ "mii_bus %s couldn't get reset GPIO\n", ++ bus->id); ++ return err; + } ++ } else { ++ bus->reset_gpiod = gpiod; ++ ++ gpiod_set_value_cansleep(gpiod, 1); ++ udelay(bus->reset_delay_us); ++ gpiod_set_value_cansleep(gpiod, 0); + } + + if (bus->reset) +@@ -337,10 +326,8 @@ error: + } + + /* Put PHYs in RESET to save power */ +- for (i = 0; i < bus->num_reset_gpios; i++) { +- if (bus->reset_gpiod[i]) +- gpiod_set_value_cansleep(bus->reset_gpiod[i], 1); +- } ++ if (bus->reset_gpiod) ++ gpiod_set_value_cansleep(bus->reset_gpiod, 1); + + device_del(&bus->dev); + return err; +@@ -363,10 +350,8 @@ void mdiobus_unregister(struct mii_bus * + } + + /* Put PHYs in RESET to save power */ +- for (i = 0; i < bus->num_reset_gpios; i++) { +- if (bus->reset_gpiod[i]) +- gpiod_set_value_cansleep(bus->reset_gpiod[i], 1); +- } ++ if (bus->reset_gpiod) ++ gpiod_set_value_cansleep(bus->reset_gpiod, 1); + + device_del(&bus->dev); + } +--- a/drivers/of/of_mdio.c ++++ b/drivers/of/of_mdio.c +@@ -145,7 +145,6 @@ int of_mdiobus_register(struct mii_bus * + /* Get bus level PHY reset GPIO details */ + mdio->reset_delay_us = DEFAULT_GPIO_RESET_DELAY; + of_property_read_u32(np, "reset-delay-us", &mdio->reset_delay_us); +- mdio->num_reset_gpios = of_gpio_named_count(np, "reset-gpios"); + + /* Register the MDIO bus */ + rc = mdiobus_register(mdio); +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -194,10 +194,8 @@ struct mii_bus { + + /* GPIO reset pulse width in microseconds */ + int reset_delay_us; +- /* Number of reset GPIOs */ +- int num_reset_gpios; +- /* Array of RESET GPIO descriptors */ +- struct gpio_desc **reset_gpiod; ++ /* RESET GPIO descriptor pointer */ ++ struct gpio_desc *reset_gpiod; + }; + #define to_mii_bus(d) container_of(d, struct mii_bus, dev) + diff --git a/target/linux/brcm63xx/patches-4.4/001-4.13-03-mdio_bus-use-devm_gpiod_get_optional.patch b/target/linux/brcm63xx/patches-4.4/001-4.13-03-mdio_bus-use-devm_gpiod_get_optional.patch new file mode 100644 index 0000000000..d7ac6234cf --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/001-4.13-03-mdio_bus-use-devm_gpiod_get_optional.patch @@ -0,0 +1,39 @@ +From fe0e4052fb11d5c713961ab7e136520be40052a3 Mon Sep 17 00:00:00 2001 +From: Sergei Shtylyov +Date: Mon, 12 Jun 2017 23:55:39 +0300 +Subject: [PATCH] mdio_bus: use devm_gpiod_get_optional() + +The MDIO reset GPIO is really a classical optional GPIO property case, +so devm_gpiod_get_optional() should have been used, not devm_gpiod_get(). +Doing this saves several LoCs... + +Signed-off-by: Sergei Shtylyov +Signed-off-by: David S. Miller +--- + drivers/net/phy/mdio_bus.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -280,16 +280,12 @@ int __mdiobus_register(struct mii_bus *b + mutex_init(&bus->mdio_lock); + + /* de-assert bus level PHY GPIO reset */ +- gpiod = devm_gpiod_get(&bus->dev, "reset", GPIOD_OUT_LOW); ++ gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(gpiod)) { +- err = PTR_ERR(gpiod); +- if (err != -ENOENT) { +- dev_err(&bus->dev, +- "mii_bus %s couldn't get reset GPIO\n", +- bus->id); +- return err; +- } +- } else { ++ dev_err(&bus->dev, "mii_bus %s couldn't get reset GPIO\n", ++ bus->id); ++ return PTR_ERR(gpiod); ++ } else if (gpiod) { + bus->reset_gpiod = gpiod; + + gpiod_set_value_cansleep(gpiod, 1); diff --git a/target/linux/brcm63xx/patches-4.4/376-net-bcm63xx_enet-use-named-gpio-for-ephy-reset-gpio.patch b/target/linux/brcm63xx/patches-4.4/376-net-bcm63xx_enet-use-named-gpio-for-ephy-reset-gpio.patch deleted file mode 100644 index ca72bbf495..0000000000 --- a/target/linux/brcm63xx/patches-4.4/376-net-bcm63xx_enet-use-named-gpio-for-ephy-reset-gpio.patch +++ /dev/null @@ -1,46 +0,0 @@ -From ec905f2ea78ec40602a685ede31c5e4f9893d196 Mon Sep 17 00:00:00 2001 -From: Jonas Gorski -Date: Sat, 21 Feb 2015 16:35:07 +0100 -Subject: [PATCH 3/6] net: bcm63xx_enet: use named gpio for ephy reset gpio - -Allow using a named optional gpio for ephy reset gpio registration. ---- - drivers/net/ethernet/broadcom/bcm63xx_enet.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - ---- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c -+++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - - #include - #include "bcm63xx_enet.h" -@@ -2829,10 +2830,15 @@ static int bcm_enet_shared_probe(struct - { - struct resource *res; - void __iomem *p[3]; -+ struct gpio_desc *ephy_reset; - unsigned int i; - - memset(bcm_enet_shared_base, 0, sizeof(bcm_enet_shared_base)); - -+ ephy_reset = devm_gpiod_get_optional(&pdev->dev, "ephy-reset", GPIOD_ASIS); -+ if (IS_ERR(ephy_reset)) -+ return PTR_ERR(ephy_reset); -+ - for (i = 0; i < 3; i++) { - res = platform_get_resource(pdev, IORESOURCE_MEM, i); - p[i] = devm_ioremap_resource(&pdev->dev, res); -@@ -2842,6 +2848,9 @@ static int bcm_enet_shared_probe(struct - - memcpy(bcm_enet_shared_base, p, sizeof(bcm_enet_shared_base)); - -+ if (ephy_reset) -+ gpiod_direction_output(ephy_reset, 0); -+ - return 0; - } - diff --git a/target/linux/brcm63xx/patches-4.4/377-MIPS-BCM63XX-register-lookup-for-ephy-reset-gpio.patch b/target/linux/brcm63xx/patches-4.4/377-MIPS-BCM63XX-register-lookup-for-ephy-reset-gpio.patch index e71791fc66..2259b024ab 100644 --- a/target/linux/brcm63xx/patches-4.4/377-MIPS-BCM63XX-register-lookup-for-ephy-reset-gpio.patch +++ b/target/linux/brcm63xx/patches-4.4/377-MIPS-BCM63XX-register-lookup-for-ephy-reset-gpio.patch @@ -72,7 +72,7 @@ Signed-off-by: Jonas Gorski } + +static struct gpiod_lookup_table ephy_reset = { -+ .dev_id = "bcm63xx_enet_shared.0", ++ .dev_id = "bcm63xx_enet-0", + .table = { + { /* filled at runtime */ }, + { }, diff --git a/target/linux/brcm63xx/patches-4.4/381-net-bcm63xx_enet-fully-reset-ephy.patch b/target/linux/brcm63xx/patches-4.4/381-net-bcm63xx_enet-fully-reset-ephy.patch deleted file mode 100644 index c591243799..0000000000 --- a/target/linux/brcm63xx/patches-4.4/381-net-bcm63xx_enet-fully-reset-ephy.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Jonas Gorski -Subject: [PATCH] net: bcm63xx_enet: fully reset ephy - -Signed-off-by: Jonas Gorski ---- - drivers/net/ethernet/broadcom/bcm63xx_enet.c | 4 ++-- - 1 file changed, 2 insertions(+), , 1 deletions(-) - ---- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c -+++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -2835,7 +2835,7 @@ static int bcm_enet_shared_probe(struct - - memset(bcm_enet_shared_base, 0, sizeof(bcm_enet_shared_base)); - -- ephy_reset = devm_gpiod_get_optional(&pdev->dev, "ephy-reset", GPIOD_ASIS); -+ ephy_reset = devm_gpiod_get_optional(&pdev->dev, "ephy-reset", GPIOD_OUT_HIGH); - if (IS_ERR(ephy_reset)) - return PTR_ERR(ephy_reset); - -@@ -2849,7 +2849,7 @@ static int bcm_enet_shared_probe(struct - memcpy(bcm_enet_shared_base, p, sizeof(bcm_enet_shared_base)); - - if (ephy_reset) -- gpiod_direction_output(ephy_reset, 0); -+ gpiod_set_value(ephy_reset, 0); - - return 0; - } diff --git a/target/linux/brcm63xx/patches-4.4/402_bcm63xx_enet_vlan_incoming_fixed.patch b/target/linux/brcm63xx/patches-4.4/402_bcm63xx_enet_vlan_incoming_fixed.patch index fc2e8ab7a7..8cb8099e97 100644 --- a/target/linux/brcm63xx/patches-4.4/402_bcm63xx_enet_vlan_incoming_fixed.patch +++ b/target/linux/brcm63xx/patches-4.4/402_bcm63xx_enet_vlan_incoming_fixed.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -1633,7 +1633,7 @@ static int compute_hw_mtu(struct bcm_ene +@@ -1632,7 +1632,7 @@ static int compute_hw_mtu(struct bcm_ene actual_mtu = mtu; /* add ethernet header + vlan tag size */ diff --git a/target/linux/brcm63xx/patches-4.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch b/target/linux/brcm63xx/patches-4.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch index 6bc62a0386..7c2b686a98 100644 --- a/target/linux/brcm63xx/patches-4.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch +++ b/target/linux/brcm63xx/patches-4.4/404-NET-bcm63xx_enet-move-phy_-dis-connect-into-probe-re.patch @@ -15,7 +15,7 @@ Signed-off-by: Jonas Gorski --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -871,10 +871,8 @@ static int bcm_enet_open(struct net_devi +@@ -870,10 +870,8 @@ static int bcm_enet_open(struct net_devi struct bcm_enet_priv *priv; struct sockaddr addr; struct device *kdev; @@ -26,7 +26,7 @@ Signed-off-by: Jonas Gorski void *p; u32 val; -@@ -882,40 +880,10 @@ static int bcm_enet_open(struct net_devi +@@ -881,40 +879,10 @@ static int bcm_enet_open(struct net_devi kdev = &priv->pdev->dev; if (priv->has_phy) { @@ -68,7 +68,7 @@ Signed-off-by: Jonas Gorski } /* mask all interrupts and request them */ -@@ -925,7 +893,7 @@ static int bcm_enet_open(struct net_devi +@@ -924,7 +892,7 @@ static int bcm_enet_open(struct net_devi ret = request_irq(dev->irq, bcm_enet_isr_mac, 0, dev->name, dev); if (ret) @@ -77,7 +77,7 @@ Signed-off-by: Jonas Gorski ret = request_irq(priv->irq_rx, bcm_enet_isr_dma, 0, dev->name, dev); -@@ -1129,9 +1097,6 @@ out_freeirq_rx: +@@ -1128,9 +1096,6 @@ out_freeirq_rx: out_freeirq: free_irq(dev->irq, dev); @@ -87,7 +87,7 @@ Signed-off-by: Jonas Gorski return ret; } -@@ -1236,12 +1201,6 @@ static int bcm_enet_stop(struct net_devi +@@ -1235,12 +1200,6 @@ static int bcm_enet_stop(struct net_devi free_irq(priv->irq_rx, dev); free_irq(dev->irq, dev); @@ -100,7 +100,7 @@ Signed-off-by: Jonas Gorski return 0; } -@@ -1833,6 +1792,8 @@ static int bcm_enet_probe(struct platfor +@@ -1832,6 +1791,8 @@ static int bcm_enet_probe(struct platfor /* MII bus registration */ if (priv->has_phy) { @@ -109,7 +109,7 @@ Signed-off-by: Jonas Gorski priv->mii_bus = mdiobus_alloc(); if (!priv->mii_bus) { -@@ -1870,6 +1831,38 @@ static int bcm_enet_probe(struct platfor +@@ -1869,6 +1830,38 @@ static int bcm_enet_probe(struct platfor dev_err(&pdev->dev, "unable to register mdio bus\n"); goto out_free_mdio; } @@ -148,7 +148,7 @@ Signed-off-by: Jonas Gorski } else { /* run platform code to initialize PHY device */ -@@ -1915,6 +1908,9 @@ static int bcm_enet_probe(struct platfor +@@ -1914,6 +1907,9 @@ static int bcm_enet_probe(struct platfor return 0; out_unregister_mdio: @@ -158,7 +158,7 @@ Signed-off-by: Jonas Gorski if (priv->mii_bus) mdiobus_unregister(priv->mii_bus); -@@ -1952,6 +1948,8 @@ static int bcm_enet_remove(struct platfo +@@ -1951,6 +1947,8 @@ static int bcm_enet_remove(struct platfo enet_writel(priv, 0, ENET_MIISC_REG); if (priv->has_phy) { diff --git a/target/linux/brcm63xx/patches-4.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch b/target/linux/brcm63xx/patches-4.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch index 0a97b25bcd..cf3715e4fe 100644 --- a/target/linux/brcm63xx/patches-4.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch +++ b/target/linux/brcm63xx/patches-4.4/408-bcm63xx_enet-enable-rgmii-clock-on-external-ports.patch @@ -32,7 +32,7 @@ Subject: [PATCH 54/81] bcm63xx_enet: enable rgmii clock on external ports #define ENETSW_MDIOC_EXT_MASK (1 << 16) --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -2224,6 +2224,18 @@ static int bcm_enetsw_open(struct net_de +@@ -2223,6 +2223,18 @@ static int bcm_enetsw_open(struct net_de priv->sw_port_link[i] = 0; } diff --git a/target/linux/brcm63xx/patches-4.4/423-bcm63xx_enet_add_b53_support.patch b/target/linux/brcm63xx/patches-4.4/423-bcm63xx_enet_add_b53_support.patch index b498edf028..c905cb2d44 100644 --- a/target/linux/brcm63xx/patches-4.4/423-bcm63xx_enet_add_b53_support.patch +++ b/target/linux/brcm63xx/patches-4.4/423-bcm63xx_enet_add_b53_support.patch @@ -12,15 +12,15 @@ spinlock_t enetsw_mdio_lock; --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -31,6 +31,7 @@ +@@ -30,6 +30,7 @@ + #include #include #include - #include +#include #include #include "bcm63xx_enet.h" -@@ -1969,7 +1970,8 @@ static int bcm_enet_remove(struct platfo +@@ -1968,7 +1969,8 @@ static int bcm_enet_remove(struct platfo return 0; } @@ -30,7 +30,7 @@ .probe = bcm_enet_probe, .remove = bcm_enet_remove, .driver = { -@@ -1978,6 +1980,42 @@ struct platform_driver bcm63xx_enet_driv +@@ -1977,6 +1979,42 @@ struct platform_driver bcm63xx_enet_driv }, }; @@ -73,7 +73,7 @@ /* * switch mii access callbacks */ -@@ -2236,29 +2274,6 @@ static int bcm_enetsw_open(struct net_de +@@ -2235,29 +2273,6 @@ static int bcm_enetsw_open(struct net_de enetsw_writeb(priv, rgmii_ctrl, ENETSW_RGMII_CTRL_REG(i)); } @@ -103,7 +103,7 @@ /* initialize flow control buffer allocation */ enet_dma_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0, ENETDMA_BUFALLOC_REG(priv->rx_chan)); -@@ -2717,6 +2732,9 @@ static int bcm_enetsw_probe(struct platf +@@ -2716,6 +2731,9 @@ static int bcm_enetsw_probe(struct platf struct bcm63xx_enetsw_platform_data *pd; struct resource *res_mem; int ret, irq_rx, irq_tx; @@ -113,7 +113,7 @@ if (!bcm_enet_shared_base[0]) return -EPROBE_DEFER; -@@ -2799,6 +2817,43 @@ static int bcm_enetsw_probe(struct platf +@@ -2798,6 +2816,43 @@ static int bcm_enetsw_probe(struct platf priv->pdev = pdev; priv->net_dev = dev; @@ -157,7 +157,7 @@ return 0; out_disable_clk: -@@ -2820,6 +2875,9 @@ static int bcm_enetsw_remove(struct plat +@@ -2819,6 +2874,9 @@ static int bcm_enetsw_remove(struct plat priv = netdev_priv(dev); unregister_netdev(dev); diff --git a/target/linux/brcm63xx/patches-4.4/424-bcm63xx_enet_no_request_mem_region.patch b/target/linux/brcm63xx/patches-4.4/424-bcm63xx_enet_no_request_mem_region.patch index 5762ae7513..f1c7589c4f 100644 --- a/target/linux/brcm63xx/patches-4.4/424-bcm63xx_enet_no_request_mem_region.patch +++ b/target/linux/brcm63xx/patches-4.4/424-bcm63xx_enet_no_request_mem_region.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -2776,9 +2776,9 @@ static int bcm_enetsw_probe(struct platf +@@ -2775,9 +2775,9 @@ static int bcm_enetsw_probe(struct platf if (ret) goto out; diff --git a/target/linux/brcm63xx/patches-4.4/804-bcm63xx_enet_63268_rgmii_ports.patch b/target/linux/brcm63xx/patches-4.4/804-bcm63xx_enet_63268_rgmii_ports.patch index 0ea35186c3..a573d2166b 100644 --- a/target/linux/brcm63xx/patches-4.4/804-bcm63xx_enet_63268_rgmii_ports.patch +++ b/target/linux/brcm63xx/patches-4.4/804-bcm63xx_enet_63268_rgmii_ports.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c -@@ -2271,6 +2271,10 @@ static int bcm_enetsw_open(struct net_de +@@ -2270,6 +2270,10 @@ static int bcm_enetsw_open(struct net_de rgmii_ctrl = enetsw_readb(priv, ENETSW_RGMII_CTRL_REG(i)); rgmii_ctrl |= ENETSW_RGMII_CTRL_GMII_CLK_EN;