From ae35ff576764fb68b84fcac070e5d2b1ccb4966d Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sat, 8 Feb 2020 23:36:12 +0100 Subject: [PATCH 1/3] ath79: backport phy reset-controller patches The Siemens WS-AP3610 asserts reset to the ethernet PHY with the reset-register. Backport the necessary patches to de-assert reset when probing the PHY. These patches can be dropped when using kernel 5.4. Signed-off-by: David Bauer --- ...net-phy-add-reset-controller-support.patch | 107 ++++++++++++++++++ ...us-dont-use-managed-reset-controller.patch | 44 +++++++ 2 files changed, 151 insertions(+) create mode 100644 target/linux/ath79/patches-4.19/700-net-phy-add-reset-controller-support.patch create mode 100644 target/linux/ath79/patches-4.19/701-mdio-bus-dont-use-managed-reset-controller.patch diff --git a/target/linux/ath79/patches-4.19/700-net-phy-add-reset-controller-support.patch b/target/linux/ath79/patches-4.19/700-net-phy-add-reset-controller-support.patch new file mode 100644 index 0000000000..9f96390911 --- /dev/null +++ b/target/linux/ath79/patches-4.19/700-net-phy-add-reset-controller-support.patch @@ -0,0 +1,107 @@ +From 71dd6c0dff51b5f1fef2e9dfa6f6a948aac975f3 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Wed, 17 Apr 2019 23:59:21 +0200 +Subject: [PATCH] net: phy: add support for reset-controller + +This commit adds support for PHY reset pins handled by a reset controller. + +Signed-off-by: David Bauer +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/mdio_bus.c | 27 +++++++++++++++++++++++++-- + drivers/net/phy/mdio_device.c | 13 +++++++++++-- + include/linux/mdio.h | 1 + + 3 files changed, 37 insertions(+), 4 deletions(-) + +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -65,8 +66,23 @@ static int mdiobus_register_gpiod(struct + + mdiodev->reset = gpiod; + +- /* Assert the reset signal again */ +- mdio_device_reset(mdiodev, 1); ++ return 0; ++} ++ ++static int mdiobus_register_reset(struct mdio_device *mdiodev) ++{ ++ struct reset_control *reset = NULL; ++ ++ if (mdiodev->dev.of_node) ++ reset = devm_reset_control_get_exclusive(&mdiodev->dev, ++ "phy"); ++ if (PTR_ERR(reset) == -ENOENT || ++ PTR_ERR(reset) == -ENOTSUPP) ++ reset = NULL; ++ else if (IS_ERR(reset)) ++ return PTR_ERR(reset); ++ ++ mdiodev->reset_ctrl = reset; + + return 0; + } +@@ -82,6 +98,13 @@ int mdiobus_register_device(struct mdio_ + err = mdiobus_register_gpiod(mdiodev); + if (err) + return err; ++ ++ err = mdiobus_register_reset(mdiodev); ++ if (err) ++ return err; ++ ++ /* Assert the reset signal */ ++ mdio_device_reset(mdiodev, 1); + } + + mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev; +--- a/drivers/net/phy/mdio_device.c ++++ b/drivers/net/phy/mdio_device.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -121,10 +122,18 @@ void mdio_device_reset(struct mdio_devic + { + unsigned int d; + +- if (!mdiodev->reset) ++ if (!mdiodev->reset && !mdiodev->reset_ctrl) + return; + +- gpiod_set_value(mdiodev->reset, value); ++ if (mdiodev->reset) ++ gpiod_set_value(mdiodev->reset, value); ++ ++ if (mdiodev->reset_ctrl) { ++ if (value) ++ reset_control_assert(mdiodev->reset_ctrl); ++ else ++ reset_control_deassert(mdiodev->reset_ctrl); ++ } + + d = value ? mdiodev->reset_assert_delay : mdiodev->reset_deassert_delay; + if (d) +--- a/include/linux/mdio.h ++++ b/include/linux/mdio.h +@@ -40,6 +40,7 @@ struct mdio_device { + int addr; + int flags; + struct gpio_desc *reset; ++ struct reset_control *reset_ctrl; + unsigned int reset_assert_delay; + unsigned int reset_deassert_delay; + }; diff --git a/target/linux/ath79/patches-4.19/701-mdio-bus-dont-use-managed-reset-controller.patch b/target/linux/ath79/patches-4.19/701-mdio-bus-dont-use-managed-reset-controller.patch new file mode 100644 index 0000000000..16e7f20370 --- /dev/null +++ b/target/linux/ath79/patches-4.19/701-mdio-bus-dont-use-managed-reset-controller.patch @@ -0,0 +1,44 @@ +From 32085f25d7b68404055f3525c780142fc72e543f Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 22 Nov 2019 22:44:51 +0100 +Subject: [PATCH] mdio_bus: don't use managed reset-controller + +Geert Uytterhoeven reported that using devm_reset_controller_get leads +to a WARNING when probing a reset-controlled PHY. This is because the +device devm_reset_controller_get gets supplied is not actually the +one being probed. + +Acquire an unmanaged reset-control as well as free the reset_control on +unregister to fix this. + +Reported-by: Geert Uytterhoeven +CC: Andrew Lunn +Signed-off-by: David Bauer +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/phy/mdio_bus.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -74,8 +74,8 @@ static int mdiobus_register_reset(struct + struct reset_control *reset = NULL; + + if (mdiodev->dev.of_node) +- reset = devm_reset_control_get_exclusive(&mdiodev->dev, +- "phy"); ++ reset = of_reset_control_get_exclusive(mdiodev->dev.of_node, ++ "phy"); + if (PTR_ERR(reset) == -ENOENT || + PTR_ERR(reset) == -ENOTSUPP) + reset = NULL; +@@ -118,6 +118,8 @@ int mdiobus_unregister_device(struct mdi + if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev) + return -EINVAL; + ++ reset_control_put(mdiodev->reset_ctrl); ++ + mdiodev->bus->mdio_map[mdiodev->addr] = NULL; + + return 0; From d2b8ccb1c04def81224da6f42f644c7d239b9986 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sat, 8 Feb 2020 12:58:25 +0100 Subject: [PATCH 2/3] ath79: add support for Siemens WS-AP3610 Hardware -------- SoC: Atheros AR7161 RAM: Samsung K4H511638D-UCCC 2x 64M DDR1 SPI: Micron M25P128 (16M) WiFi: Atheros AR9160 bgn Atheros AR9160 an ETH: Broadcom BCM5481 LED: Power (Green/Red) ETH (Green / Blue / Yellow) (PHY-controlled) WiFi 5 (Green / Blue) WiFi 2 (Green / Blue) BTN: Reset Serial: Cisco-Style RJ45 - 115200 8N1 Installation ------------ 1. Download the OpenWrt initramfs-image. Place it into a TFTP server root directory and rename it to 1401A8C0.img. Configure the TFTP server to listen at 192.168.1.66/24. 2. Connect the TFTP server to the access point. 3. Connect to the serial console of the access point. Attach power and interrupt the boot procedure when prompted (bootdelay is 1 second). 4. Configure the U-Boot environment for booting OpenWrt from Ram and flash: $ setenv boot_openwrt 'setenv bootargs; bootm 0xbf080000' $ setenv ramboot_openwrt 'setenv serverip 192.168.1.66; tftpboot; bootm' $ saveenv 5. Load OpenWrt into memory: $ run ramboot_openwrt Wait for the image to boot. 6. Transfer the OpenWrt sysupgrade image to the device. Write the image to flash using sysupgrade: $ sysupgrade -n /path/to/openwrt-sysuograde.bin Signed-off-by: David Bauer --- .../ath79/dts/ar7161_siemens_ws-ap3610.dts | 186 ++++++++++++++++++ .../generic/base-files/etc/board.d/02_network | 1 + .../etc/hotplug.d/ieee80211/10_fix_wifi_mac | 3 + .../base-files/lib/preinit/10_fix_eth_mac.sh | 13 ++ target/linux/ath79/generic/config-default | 1 + target/linux/ath79/image/generic.mk | 14 ++ 6 files changed, 218 insertions(+) create mode 100644 target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts create mode 100644 target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh diff --git a/target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts b/target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts new file mode 100644 index 0000000000..8e0a80cb32 --- /dev/null +++ b/target/linux/ath79/dts/ar7161_siemens_ws-ap3610.dts @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/dts-v1/; + +#include +#include + +#include "ar7100.dtsi" + +/ { + compatible = "siemens,ws-ap3610", "qca,ar7161"; + model = "Siemens WS-AP3610"; + + chosen { + bootargs = "console=ttyS0,115200"; + }; + + aliases { + led-boot = &led_power_green; + led-failsafe = &led_power_red; + led-running = &led_power_green; + led-upgrade = &led_power_red; + label-mac-device = ð0; + }; + + extosc: ref { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "ref"; + clock-frequency = <40000000>; + }; + + leds { + compatible = "gpio-leds"; + + led_power_green: led_power_green { + label = "ws-ap3610:green:power"; + gpios = <&gpio 7 GPIO_ACTIVE_LOW>; + }; + + led_power_red: led_power_red { + label = "ws-ap3610:red:power"; + gpios = <&gpio 8 GPIO_ACTIVE_LOW>; + }; + + led_wlan5_blue { + label = "ws-ap3610:blue:wlan5"; + gpios = <&gpio 2 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + led_wlan5_green { + label = "ws-ap3610:green:wlan5"; + gpios = <&gpio 3 GPIO_ACTIVE_LOW>; + }; + + led_wlan2_blue { + label = "ws-ap3610:blue:wlan2"; + gpios = <&gpio 4 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + + led_wlan2_green { + label = "ws-ap3610:green:wlan2"; + gpios = <&gpio 5 GPIO_ACTIVE_LOW>; + }; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&gpio 11 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&pcie0 { + status = "okay"; +}; + +&uart { + status = "okay"; +}; + +&mdio0 { + status = "okay"; + + phy0: ethernet-phy@0 { + /* + * When the compatible-is missing, PHY autodetection + * is performed, but the PHY-ID reads all 0xff. + * + * Linux does not create the device in this case, + * and the reset is never even de-asserted. + */ + compatible = "ethernet-phy-id0143.bca2", + "ethernet-phy-ieee802.3-c22"; + reg = <0>; + + resets = <&rst 8>; + reset-names = "phy"; + reset-assert-us = <10000>; + reset-deassert-us = <10000>; + }; +}; + +ð0 { + status = "okay"; + + phy-mode = "rgmii-id"; + phy-handle = <&phy0>; +}; + +&spi { + status = "okay"; + + num-cs = <1>; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x0 0x40000>; + read-only; + }; + + partition@40000 { + label = "u-boot-bak"; + reg = <0x40000 0x40000>; + read-only; + }; + + partition@80000 { + compatible = "denx,uimage"; + label = "firmware"; + reg = <0x80000 0xe00000>; + }; + + partition@e80000 { + label = "cfg1"; + reg = <0xe80000 0x40000>; + read-only; + }; + + partition@ec0000 { + label = "cfg2"; + reg = <0xec0000 0x40000>; + read-only; + }; + + partition@f00000 { + label = "nvram1"; + reg = <0xf00000 0x40000>; + read-only; + }; + + partition@f40000 { + label = "nvram2"; + reg = <0xf40000 0x40000>; + read-only; + }; + + partition@f80000 { + label = "rsvd1"; + reg = <0xf80000 0x40000>; + read-only; + }; + + partition@fc0000 { + label = "rsvd2"; + reg = <0xfc0000 0x40000>; + read-only; + }; + }; + }; +}; diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network index a3fcf35715..69c19358e2 100755 --- a/target/linux/ath79/generic/base-files/etc/board.d/02_network +++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network @@ -30,6 +30,7 @@ ath79_setup_interfaces() pisen,ts-d084|\ pisen,wmb001n|\ pisen,wmm003n|\ + siemens,ws-ap3610|\ tplink,cpe210-v2|\ tplink,cpe210-v3|\ tplink,cpe510-v2|\ diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac b/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac index 8c8b7932bc..f814bd46ad 100644 --- a/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac +++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac @@ -34,6 +34,9 @@ case "$board" in [ "$PHYNBR" -eq 1 ] && \ k2t_get_mac "lan_mac" > /sys${DEVPATH}/macaddress ;; + siemens,ws-ap3610) + mtd_get_mac_ascii cfg1 RADIOADDR${PHYNBR} > /sys${DEVPATH}/macaddress + ;; trendnet,tew-823dru) # set the 2.4G interface mac address to LAN MAC [ "$PHYNBR" -eq 1 ] && \ diff --git a/target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh b/target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh new file mode 100644 index 0000000000..a0fb9fc717 --- /dev/null +++ b/target/linux/ath79/generic/base-files/lib/preinit/10_fix_eth_mac.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +. /lib/functions.sh + +preinit_set_mac_address() { + case $(board_name) in + siemens,ws-ap3610) + ip link set dev eth0 address $(mtd_get_mac_ascii cfg1 ethaddr) + ;; + esac +} + +boot_hook_add preinit_main preinit_set_mac_address diff --git a/target/linux/ath79/generic/config-default b/target/linux/ath79/generic/config-default index 2d8f7f20c2..6cd1518e3a 100644 --- a/target/linux/ath79/generic/config-default +++ b/target/linux/ath79/generic/config-default @@ -1,4 +1,5 @@ CONFIG_AT803X_PHY=y +CONFIG_BROADCOM_PHY=y CONFIG_GPIO_WATCHDOG=y CONFIG_GPIO_WATCHDOG_ARCH_INITCALL=y CONFIG_INTEL_XWAY_PHY=y diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk index 05d2ba6a75..d4693cea68 100644 --- a/target/linux/ath79/image/generic.mk +++ b/target/linux/ath79/image/generic.mk @@ -1041,6 +1041,20 @@ define Device/rosinson_wr818 endef TARGET_DEVICES += rosinson_wr818 +define Device/siemens_ws-ap3610 + SOC := ar7161 + DEVICE_VENDOR := Siemens + DEVICE_MODEL := WS-AP3610 + IMAGE_SIZE := 14336k + LOADER_TYPE := bin + LOADER_FLASH_OFFS := 0x82000 + COMPILE := loader-$(1).bin + COMPILE/loader-$(1).bin := loader-okli-compile + KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) 8128 | uImage none + KERNEL_INITRAMFS := kernel-bin | append-dtb | uImage none +endef +TARGET_DEVICES += siemens_ws-ap3610 + define Device/sitecom_wlr-7100 SOC := ar1022 DEVICE_VENDOR := Sitecom From dc145de4be7b737bd7e37f4a79fc6e36833691b9 Mon Sep 17 00:00:00 2001 From: Adrian Schmutzler Date: Mon, 17 Feb 2020 20:16:17 +0100 Subject: [PATCH 3/3] ath79: move mikrotik-caldata.sh to target base-files Mikrotik devices will be found in both generic and nand subtargets. The file mikrotik-caldata.sh, currently used in generic, contains a few lines of code that would need to be duplicated for nand support. Instead of duplicating it, move it to target base-files, as size impact is small and the maintenance gain should outweigh it. This is changed separately to make life easier for the people currently working on Mikrotik NAND support. Signed-off-by: Adrian Schmutzler --- .../{generic => }/base-files/lib/functions/mikrotik-caldata.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename target/linux/ath79/{generic => }/base-files/lib/functions/mikrotik-caldata.sh (100%) diff --git a/target/linux/ath79/generic/base-files/lib/functions/mikrotik-caldata.sh b/target/linux/ath79/base-files/lib/functions/mikrotik-caldata.sh similarity index 100% rename from target/linux/ath79/generic/base-files/lib/functions/mikrotik-caldata.sh rename to target/linux/ath79/base-files/lib/functions/mikrotik-caldata.sh