Fix orion-mdio resource/interrupt issues indentified while reviewing mvpp2
Subsystems (3)
cover Fix orion-mdio resource/interrupt issues indentified while reviewing mvpp2
This patch series fixes some issues identified while reviewing the mvpp2 driver changes recently posted by Thomas. I've left the clock issue, and the question over whether this should be separate out of this series, concentrating on the resource size / interrupt issue.
This series updates the binding to reflect reality, and ensures that the driver will not try to access registers outside its binding. It also ensures that it doesn't leave the interrupt enabled in hardware on probe failure.
.../devicetree/bindings/net/marvell-orion-mdio.txt | 17 +++++++++++++++-- drivers/net/ethernet/marvell/mvmdio.c | 11 ++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-)
Signature · 3 lines
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net.
RFC PATCH 1/4 net: mvmdio: disable interrupts in driver failure path
When the mvmdio driver has an interrupt, it enables the "done" interrupt after requesting its interrupt handler. However, probe failure results in the interrupt being left enabled. Disable it on the failure path.
--- drivers/net/ethernet/marvell/mvmdio.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/marvell/mvmdio.c +2 -0
@@ -251,6 +251,8 @@ static int orion_mdio_probe(struct platform_device *pdev)return 0 ; out_mdio: +if (dev->err_interrupt >0 ) +writel (0 , dev->regs +MVMDIO_ERR_INT_MASK );if (!IS_ERR (dev->clk))clk_disable_unprepare (dev->clk);return ret;
Signature · 1 line
2.7.4
RFC PATCH 2/4 net: mvmdio: fix interrupt disable in remove path
In reply to Russell King - ARM LinuxThe pre-existing write to disable interrupts on the remove path happens whether we have an interrupt or not. While this may seem to be a good idea, this driver is re-used in many different implementations, some where the binding only specifies four bytes of register space. This access causes us to access registers outside of the binding.
Make it conditional on the interrupt being present, which is the same condition used when enabling the interrupt in the first place.
--- drivers/net/ethernet/marvell/mvmdio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/mvmdio.c +2 -1
@@ -263,7 +263,8 @@ static int orion_mdio_remove(struct platform_device *pdev)struct mii_bus *bus =platform_get_drvdata (pdev);struct orion_mdio_dev *dev = bus->priv; -writel (0 , dev->regs +MVMDIO_ERR_INT_MASK ); +if (dev->err_interrupt >0 ) +writel (0 , dev->regs +MVMDIO_ERR_INT_MASK );mdiobus_unregister (bus);if (!IS_ERR (dev->clk))clk_disable_unprepare (dev->clk);
Signature · 1 line
2.7.4
A message that is not in the archive (sent off-list or not yet received): 20170107112656.GL14217-l+eeeJia6m9URfEZ8mYm6t73F7V6hmMc@public.gmane.org
RFC PATCH 3/4 dt-bindings: correct marvell orion MDIO binding document
Correct the Marvell Orion MDIO binding document to properly reflect the cases where an interrupt is present. Augment the examples to show this.
--- .../devicetree/bindings/net/marvell-orion-mdio.txt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/net/marvell-orion-mdio.txt +15 -2
@@ -7,7 +7,10 @@ interface. Required properties: - compatible: "marvell,orion-mdio" -- reg: address and length of the SMI register +- reg: address and length of the MDIO registers. When an interrupt is + not present, the length is the size of the SMI register (4 bytes) + otherwise it must be 0x84 bytes to cover the interrupt control + registers. Optional properties: - interrupts: interrupt line number for the SMI error/done interrupt
@@ -17,7 +20,7 @@ The child nodes of the MDIO driver are the individual PHY devices connected to this MDIO bus. They must have a "reg" property given the PHY address on the MDIO bus. -Example at the SoC level: +Example at the SoC level without an interrupt property: mdio { #address-cells = <1>;
@@ -26,6 +29,16 @@ mdio { reg = <0xd0072004 0x4>; }; +Example with an interrupt property: + +mdio { + #address-cells = <1>; + #size-cells = <0>; + compatible = "marvell,orion-mdio"; + reg = <0xd0072004 0x84>; + interrupts = <30>; +}; + And at the board level: mdio {
Signature · 1 line
2.7.4
Re: [PATCH RFC 3/4] dt-bindings: correct marvell orion MDIO binding document
Quoted 4 lines · Russell King
Correct the Marvell Orion MDIO binding document to properly reflect the cases where an interrupt is present. Augment the examples to show this.
Signed-off-by Russell King <[email protected]>
This looks fine to me.
Mark.
Quoted 49 lines
--- .../devicetree/bindings/net/marvell-orion-mdio.txt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)Documentation/devicetree/bindings/net/marvell-orion-mdio.txt +15
-2@@ -7,7 +7,10 @@ interface. Required properties: - compatible: "marvell,orion-mdio" -- reg: address and length of the SMI register +- reg: address and length of the MDIO registers. When an interrupt is + not present, the length is the size of the SMI register (4 bytes) + otherwise it must be 0x84 bytes to cover the interrupt control + registers. Optional properties: - interrupts: interrupt line number for the SMI error/done interrupt@@ -17,7 +20,7 @@ The child nodes of the MDIO driver are the individual PHY devices connected to this MDIO bus. They must have a "reg" property given the PHY address on the MDIO bus. -Example at the SoC level: +Example at the SoC level without an interrupt property: mdio { #address-cells = <1>;@@ -26,6 +29,16 @@ mdio { reg = <0xd0072004 0x4>; }; +Example with an interrupt property: + +mdio { + #address-cells = <1>; + #size-cells = <0>; + compatible = "marvell,orion-mdio"; + reg = <0xd0072004 0x84>; + interrupts = <30>; +}; + And at the board level: mdio {Signature · 1 line
2.7.4
A message that is not in the archive (sent off-list or not yet received): E1cPpAk-0005uJ-TM-eh5Bv4kxaXIk46pC+1QYvQNdhmdF6hFW@public.gmane.org
Rob Herring
Acked-byRe: [PATCH RFC 3/4] dt-bindings: correct marvell orion MDIO binding document
Quoted 7 lines · Russell King
Correct the Marvell Orion MDIO binding document to properly reflect the cases where an interrupt is present. Augment the examples to show this.
Signed-off-by Russell King <[email protected]>--- .../devicetree/bindings/net/marvell-orion-mdio.txt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
RFC PATCH 4/4 net: mvmdio: disable interrupt if resource size is too small
In reply to Russell King - ARM LinuxDisable the MDIO interrupt, falling back to polled mode, if the resource size does not allow us to access the interrupt registers. All current DT bindings use a size of 0x84, which allows access, but verifying it is good practice.
--- drivers/net/ethernet/marvell/mvmdio.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/marvell/mvmdio.c +6 -0
@@ -221,6 +221,12 @@ static int orion_mdio_probe(struct platform_device *pdev)clk_prepare_enable (dev->clk); dev->err_interrupt =platform_get_irq (pdev,0 ); +if (dev->err_interrupt >0 && +resource_size (r) <MVMDIO_ERR_INT_MASK +4 ) { +dev_err (&pdev->dev, +"disabling interrupt, resource size is too small\n" ); + dev->err_interrupt =0 ; + }if (dev->err_interrupt >0 ) { ret = devm_request_irq(&pdev->dev, dev->err_interrupt, orion_mdio_err_irq,
Signature · 1 line
2.7.4