diff mbox series

[OpenWrt-Devel,4/4] ath79: add support for D-Link DAP-2695-A1

Message ID 20200608093631.1196081-5-stijn@linux-ipv6.be
State Changes Requested
Headers show
Series ath79: add support for D-Link DAP-2695-A1 | expand

Commit Message

Stijn Tintel June 8, 2020, 9:36 a.m. UTC
Hardware:
* SoC: Qualcomm Atheros QCA9558
* RAM: 256MB
* Flash: 16MB SPI NOR
* Ethernet: 2x 10/100/1000 (1x 802.3at PoE-PD)
* WiFi 2.4GHz: Qualcomm Atheros QCA9558
* WiFi 5GHz: Qualcomm Ahteros QCA9880-2R4E
* LEDS: 1x 5GHz, 1x 2.4GHz, 1x LAN1(POE), 1x LAN2, 1x POWER
* Buttons: 1x RESET
* UART: 1x RJ45 RS-232 Console port

Installation via stock firmware:
* Install the factory image via the stock firmware web interface

Installation via bootloader Emergency Web Server:
* Connect your PC to the LAN1(PoE) port
* Configure your PC with IP address 192.168.0.90
* Open a serial console to the Console port (115200,8n1)
* Press "q" within 2s when "press 'q' to stop autoboot" appears
* Open http://192.168.0.50 in a browser
* Upload either the factory or the sysupgrade image
* Once you see "write image into flash...OK,dest addr=0x9f070000" you
  can power-cycle the device. Ignore "checksum bad" messages.

Setting the MAC addresses for the ethernet interfaces via
/etc/board.d/02_network adds the following snippets to
/etc/config/network:

config device 'lan_eth0_1_dev'
        option name 'eth0.1'
        option macaddr 'xx:xx:xx:xx:xx:xx'

config device 'wan_eth1_2_dev'
        option name 'eth1.2'
        option macaddr 'xx:xx:xx:xx:xx:xx'

This would result in the proper MAC addresses being set for the VLAN
subinterfaces, but the parent interfaces would still have a random MAC
address. Using untagged VLANs could solve this, but would still leave
those extra snippets in /etc/config/network, and then the device VLAN
setup would differ from the one used in ar71xx. Therefore, the MAC
addresses of the ethernet interfaces are being set via preinit instead.

The bdcfg partition contains 4 MAC address labels:
- lanmac
- wanmac
- wlanmac
- wlanmac_a

The first 3 all contain the same MAC address, which is also the one on
the label. This MAC address is used for the 2.4GHz interface, eth0 uses
this MAC+1, eth1 uses this MAC+2, as is done in ar71xx.

Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
---
 .../ath79/dts/qca9558_dlink_dap-2695-a1.dts   | 172 ++++++++++++++++++
 .../generic/base-files/etc/board.d/01_leds    |   5 +
 .../generic/base-files/etc/board.d/02_network |   6 +
 .../etc/hotplug.d/firmware/10-ath9k-eeprom    |   4 +
 .../etc/hotplug.d/firmware/11-ath10k-caldata  |   4 +
 .../etc/uci-defaults/09_fix-checksum          |   8 +
 .../base-files/lib/preinit/10_fix_eth_mac.sh  |   5 +
 target/linux/ath79/image/generic-dlink.mk     |  33 ++++
 8 files changed, 237 insertions(+)
 create mode 100644 target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts

Comments

Adrian Schmutzler June 8, 2020, 12:51 p.m. UTC | #1
Hi Stijn,

find my comments inline.

> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
> On Behalf Of Stijn Tintel
> Sent: Montag, 8. Juni 2020 11:37
> To: openwrt-devel@lists.openwrt.org
> Subject: [OpenWrt-Devel] [PATCH 4/4] ath79: add support for D-Link DAP-
> 2695-A1
> 
> Hardware:
> * SoC: Qualcomm Atheros QCA9558
> * RAM: 256MB
> * Flash: 16MB SPI NOR
> * Ethernet: 2x 10/100/1000 (1x 802.3at PoE-PD)
> * WiFi 2.4GHz: Qualcomm Atheros QCA9558
> * WiFi 5GHz: Qualcomm Ahteros QCA9880-2R4E
> * LEDS: 1x 5GHz, 1x 2.4GHz, 1x LAN1(POE), 1x LAN2, 1x POWER
> * Buttons: 1x RESET
> * UART: 1x RJ45 RS-232 Console port
> 
> Installation via stock firmware:
> * Install the factory image via the stock firmware web interface
> 
> Installation via bootloader Emergency Web Server:
> * Connect your PC to the LAN1(PoE) port
> * Configure your PC with IP address 192.168.0.90
> * Open a serial console to the Console port (115200,8n1)
> * Press "q" within 2s when "press 'q' to stop autoboot" appears
> * Open http://192.168.0.50 in a browser
> * Upload either the factory or the sysupgrade image
> * Once you see "write image into flash...OK,dest addr=0x9f070000" you
>   can power-cycle the device. Ignore "checksum bad" messages.
> 
> Setting the MAC addresses for the ethernet interfaces via
> /etc/board.d/02_network adds the following snippets to
> /etc/config/network:
> 
> config device 'lan_eth0_1_dev'
>         option name 'eth0.1'
>         option macaddr 'xx:xx:xx:xx:xx:xx'
> 
> config device 'wan_eth1_2_dev'
>         option name 'eth1.2'
>         option macaddr 'xx:xx:xx:xx:xx:xx'
> 
> This would result in the proper MAC addresses being set for the VLAN
> subinterfaces, but the parent interfaces would still have a random MAC
> address. Using untagged VLANs could solve this, but would still leave those
> extra snippets in /etc/config/network, and then the device VLAN setup
> would differ from the one used in ar71xx. Therefore, the MAC addresses of
> the ethernet interfaces are being set via preinit instead.
> 
> The bdcfg partition contains 4 MAC address labels:
> - lanmac
> - wanmac
> - wlanmac
> - wlanmac_a
> 
> The first 3 all contain the same MAC address, which is also the one on the
> label. This MAC address is used for the 2.4GHz interface, eth0 uses this
> MAC+1, eth1 uses this MAC+2, as is done in ar71xx.
> 
> Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
> ---
>  .../ath79/dts/qca9558_dlink_dap-2695-a1.dts   | 172 ++++++++++++++++++
>  .../generic/base-files/etc/board.d/01_leds    |   5 +
>  .../generic/base-files/etc/board.d/02_network |   6 +
>  .../etc/hotplug.d/firmware/10-ath9k-eeprom    |   4 +
>  .../etc/hotplug.d/firmware/11-ath10k-caldata  |   4 +
>  .../etc/uci-defaults/09_fix-checksum          |   8 +
>  .../base-files/lib/preinit/10_fix_eth_mac.sh  |   5 +
>  target/linux/ath79/image/generic-dlink.mk     |  33 ++++
>  8 files changed, 237 insertions(+)
>  create mode 100644 target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts
> 
> diff --git a/target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts
> b/target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts
> new file mode 100644
> index 0000000000..fdabbcb84a
> --- /dev/null
> +++ b/target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts
> @@ -0,0 +1,172 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT /dts-v1/;
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +
> +#include "qca955x.dtsi"
> +
> +/ {
> +	compatible = "dlink,dap-2695-a1", "qca,qca9557";
> +	model = "D-link DAP-2695-A1";
> +
> +	chosen {
> +		bootargs = "console=ttyS0,115200n8";
> +	};
> +
> +	leds {
> +		compatible = "gpio-leds";
> +
> +		power_green {
> +			label = "d-link:green:power";
> +			gpios = <&gpio 23 GPIO_ACTIVE_LOW>;
> +			default-state = "off";

default-state = "off" is default and can be dropped for all leds.

Consider using default-state = "on" for power_green and adding an aliases section with power_green and/or power_red for indicating boot/failsafe etc.

> +		};
> +
> +		power_red {
> +			label = "d-link:red:power";
> +			gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
> +			default-state = "off";
> +		};
> +
> +		wifi_2g {

I'd be consistent with the label here and use wifi2g for the node name.

> +			label = "d-link:green:wifi2g";
> +			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
> +			default-state = "off";
> +		};
> +	};
> +
> +	keys {
> +		compatible = "gpio-keys-polled";
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		poll-interval = <20>;

Can you try with gpio-keys for the compatible, and drop the poll-interval?
Despite, I think the two cells lines are not needed and can be dropped as well.

> +
> +		button@0 {

I'd use "reset" for the node name here.

> +			label = "reset";
> +			linux,code = <KEY_RESTART>;
> +			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
> +		};
> +	};
> +};
> +
> +&spi {
> +	status = "okay";
> +	num-cs = <1>;
> +
> +	flash@0 {
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		compatible = "mx25l12805d";
> +		reg = <0>;
> +		spi-max-frequency = <25000000>;

I'd have added an empty line here (before partitions).

> +		partitions {
> +			compatible = "fixed-partitions";
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +
> +			uboot:  partition@0 {

Don't think the "uboot:" is used anywhere, so consider to drop it.

> +				label = "u-boot";
> +				reg = <0x000000 0x040000>;
> +				read-only;
> +			};
> +
> +			partition@40000 {
> +				label = "bdcfg";
> +				reg = <0x040000 0x010000>;
> +				read-only;
> +			};
> +
> +			partition@50000 {
> +				label = "rgdb";
> +				reg = <0x050000 0x010000>;
> +				read-only;
> +			};
> +
> +			partition@60000 {
> +				label = "langpack";
> +				reg = <0x060000 0x010000>;
> +				read-only;
> +			};
> +
> +			partition@70000 {
> +				compatible = "wrg";
> +				label = "firmware";
> +				reg = <0x070000 0xf00000>;
> +			};
> +
> +			partition@f70000 {
> +				label = "captival";
> +				reg = <0xf70000 0x070000>;
> +				read-only;
> +			};
> +
> +			partition@fe0000 {
> +				label = "certificate";
> +				reg = <0xfe0000 0x010000>;
> +				read-only;
> +			};
> +
> +			art: partition@ff0000 {
> +				label = "art";
> +				reg = <0xff0000 0x010000>;
> +				read-only;
> +			};
> +		};
> +	};
> +};
> +
> +&mdio0 {
> +	status = "okay";
> +
> +	phy0: ethernet-phy@0 {
> +		reg = <0>;
> +
> +		qca,ar8327-initvals = <
> +			0x04 0x07600000 /* PORT0_PAD_CTRL */
> +			0x0c 0x00080080 /* PORT6_PAD_CTRL */
> +			0x7c 0x0000007e /* PORT0_STATUS */
> +			0x94 0x0000007e /* PORT6_STATUS */
> +		>;
> +	};
> +};
> +
> +&eth0 {
> +	status = "okay";
> +
> +	phy-handle = <&phy0>;
> +	phy-mode = "rgmii";
> +	pll-data = <0x56000000 0x00000101 0x00001616>;
> +
> +	fixed-link {
> +		speed = <1000>;
> +		full-duplex;
> +	};
> +};
> +
> +&eth1 {
> +	status = "okay";
> +
> +	phy-mask = <0>;
> +	phy-mode = "sgmii";
> +	pll-data = <0x03000101 0x00000101 0x00001616>;
> +
> +	fixed-link {
> +		speed = <1000>;
> +		full-duplex;
> +	};
> +};
> +
> +&pcie0 {
> +	status = "okay";
> +};
> +
> +&uart {
> +	status = "okay";
> +};
> +
> +&wmac {
> +	status = "okay";
> +
> +	qca,no-eeprom;
> +};
> diff --git a/target/linux/ath79/generic/base-files/etc/board.d/01_leds
> b/target/linux/ath79/generic/base-files/etc/board.d/01_leds
> index 5521379cea..f31a21088e 100755
> --- a/target/linux/ath79/generic/base-files/etc/board.d/01_leds
> +++ b/target/linux/ath79/generic/base-files/etc/board.d/01_leds
> @@ -110,6 +110,11 @@ enterasys,ws-ap3705i)
>  devolo,magic-2-wifi)
>  	ucidef_set_led_netdev "plcw" "dLAN" "devolo:white:dlan" "eth0.1"
> "rx"
>  	;;
> +dlink,dap-2695-a1)
> +	ucidef_set_led_default "power" "POWER" "d-link:green:power" "1"

This can be implemented by setting default-state = "on" in DTS as suggested above.

Despite, have a look at the led-* aliases in DTS, e.g. just grep for "led-boot" or "led-failsafe" in target/linux/ath79/dts

> +	ucidef_set_led_default "diag" "DIAG" "d-link:red:power" "0"

I don't think that will have any effect, I'd just drop it.

> +	ucidef_set_led_wlan "wlan2g" "WLAN 2.4 GHz" "d-
> link:green:wlan2g" "phy1tpt"

This can be implemented via a trigger in DTS, just grep for "phy0tpt" or "phy1tpt" in the dts folder given above.
So, eventually, you won't need any entry in 01_leds for this device at all.

> +	;;
>  dlink,dir-859-a1)
>  	ucidef_set_led_switch "internet" "WAN"
> "$boardname:green:internet" "switch0" "0x20"
>  	;;
> 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 1672f093a7..d5964e9a0f 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
> @@ -136,6 +136,9 @@ ath79_setup_interfaces()
>  		ucidef_add_switch "switch0" \
>  			"0@eth0" "2:wan" "3:lan" "4:lan"
>  		;;
> +	dlink,dap-2695-a1)
> +		ucidef_add_switch "switch0" "0@eth0" "2:lan" "3:wan"
> "6@eth1"
> +		;;

I'd just have chosen the default case with
ucidef_set_interfaces_lan_wan "eth0" "eth1"
here, unless you specifically aim for the switch to be set up already in uci config to be altered later. Matter of taste, though.

>  	dlink,dir-825-b1)
>  		ucidef_set_interface_wan "eth1"
>  		ucidef_add_switch "switch0" \
> @@ -359,6 +362,9 @@ ath79_setup_macs()
>  	devolo,magic-2-wifi)
>  		label_mac=$(macaddr_add "$(mtd_get_mac_binary art
> 0x1002)" 3)
>  		;;
> +	dlink,dap-2695-a1)
> +		label_mac=$(mtd_get_mac_ascii bdcfg "wlanmac")
> +		;;
>  	dlink,dir-825-b1)
>  		lan_mac=$(mtd_get_mac_text "caldata" 0xffa0)
>  		wan_mac=$(mtd_get_mac_text "caldata" 0xffb4) diff --git
> a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-
> eeprom b/target/linux/ath79/generic/base-
> files/etc/hotplug.d/firmware/10-ath9k-eeprom
> index e0fa5ff354..972157604d 100644
> --- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-
> ath9k-eeprom
> +++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-at
> +++ h9k-eeprom
> @@ -14,6 +14,10 @@ case "$FIRMWARE" in
>  	avm,fritz450e)
>  		caldata_extract_reverse "urlader" 0x1541 0x440
>  		;;
> +	dlink,dap-2695-a1)
> +		caldata_extract "art" 0x1000 0x440
> +		ath9k_patch_mac $(mtd_get_mac_ascii bdcfg "wlanmac")

Does that really work as replacement for
ath79_register_wmac(art + DAP2695_WMAC_CALDATA_OFFSET, wmac0);
?

> +		;;
>  	dlink,dir-505|\
>  	dlink,dir-825-c1|\
>  	dlink,dir-835-a1)
> diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-
> ath10k-caldata b/target/linux/ath79/generic/base-
> files/etc/hotplug.d/firmware/11-ath10k-caldata
> index 29815a1ada..603557d6c2 100644
> --- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-
> ath10k-caldata
> +++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-at
> +++ h10k-caldata
> @@ -40,6 +40,10 @@ case "$FIRMWARE" in
>  		caldata_extract "art" 0x5000 0x844
>  		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary
> art 0x0) -1)
>  		;;
> +	dlink,dap-2695-a1)
> +		caldata_extract "art" 0x5000 0x844
> +		ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac_a)
> +		;;
>  	dlink,dir-859-a1)
>  		caldata_extract "art" 0x5000 0x844
>  		ath10k_patch_mac $(mtd_get_mac_ascii devdata
> "wlan5mac") diff --git a/target/linux/ath79/generic/base-files/etc/uci-
> defaults/09_fix-checksum b/target/linux/ath79/generic/base-files/etc/uci-
> defaults/09_fix-checksum
> index 22c9483e74..085ad2e925 100644
> --- a/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-
> checksum
> +++ b/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-chec
> +++ ksum
> @@ -6,9 +6,17 @@ fix_seama_header() {
>  	[ "$kernel_size" ] && mtd -c 0x$kernel_size fixseama firmware  }
> 
> +fixwrgg() {
> +	local kernel_size=$(sed -n 's/mtd[0-9]*: \([0-9a-
> f]*\).*"kernel".*/\1/p' /proc/mtd)
> +	[ "$kernel_size" ] && mtd -c 0x$kernel_size fixwrgg firmware }
> +
>  board=$(board_name)
> 
>  case "$board" in
> +dlink,dap-2695-a1)
> +	fixwrgg
> +	;;
>  qihoo,c301)
>  	fix_seama_header
>  	;;
> 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
> index da1583a825..5b1aea7bb0 100644
> --- 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.s
> +++ h
> @@ -8,6 +8,11 @@ preinit_set_mac_address() {
>  	avm,fritz450e)
>  		ip link set dev eth0 address $(fritz_tffs -n maca -i
> $(find_mtd_part "tffs (1)"))
>  		;;
> +	dlink,dap-2695-a1)
> +		label_mac=$(mtd_get_mac_ascii bdcfg "lanmac")
> +		ip link set dev eth0 address $(macaddr_add "$label_mac" 1)
> +		ip link set dev eth1 address $(macaddr_add "$label_mac" 2)

From ar71xx, and to use the available addresses, I think it should be:
		ip link set dev eth0 address $(macaddr_add "$(mtd_get_mac_ascii bdcfg "lanmac")" 1)
		ip link set dev eth1 address $(macaddr_add "$(mtd_get_mac_ascii bdcfg "wanmac")" 2)

Not that it would make any difference based on your comment that addresses are the same anyway.
Do you have any idea why they provide distinct addresses for lan and wan and increment them then anyway?

> +		;;
>  	enterasys,ws-ap3705i)
>  		ip link set dev eth0 address $(mtd_get_mac_ascii u-boot-
> env0 ethaddr)
>  		;;
> diff --git a/target/linux/ath79/image/generic-dlink.mk
> b/target/linux/ath79/image/generic-dlink.mk
> index 96cb015a09..4d59af1645 100644
> --- a/target/linux/ath79/image/generic-dlink.mk
> +++ b/target/linux/ath79/image/generic-dlink.mk
> @@ -1,3 +1,36 @@
> +DEVICE_VARS += DAP_SIGNATURE
> +
> +define Build/mkwrggimg
> +	$(STAGING_DIR_HOST)/bin/mkwrggimg -b \
> +		-i $@ -o $@.imghdr -d /dev/mtdblock/1 \
> +		-m $(DEVICE_MODEL)-$(DEVICE_VARIANT) -s
> $(DAP_SIGNATURE) \
> +		-v $(VERSION_DIST) -B $(REVISION)
> +	mv $@.imghdr $@
> +endef
> +
> +define Build/wrgg-pad-rootfs
> +	$(STAGING_DIR_HOST)/bin/padjffs2 $(IMAGE_ROOTFS) -c 64 >>$@
> endef

Ah, that's what I meant by putting the relevant recipes in dlink.mk when commenting on the earlier patch. Maybe just check that for the existing recipes ...

> +
> +define Device/dlink_dap-2695-a1
> +  SOC := qca9558
> +  DEVICE_VENDOR := D-Link
> +  DEVICE_MODEL := DAP-2965
> +  DEVICE_VARIANT := A1
> +  IMAGES := factory.img sysupgrade.bin
> +  IMAGE_SIZE := 15360k
> +  IMAGE/default := append-kernel | pad-offset 65536 160
> +  IMAGE/factory.img := $$(IMAGE/default) | append-rootfs | wrgg-pad-
> rootfs | \
> +	mkwrggimg | check-size $$$$(IMAGE_SIZE)

IMAGE_SIZE argument can be omitted for check-size now.

> +  IMAGE/sysupgrade.bin := $$(IMAGE/default) | mkwrggimg | append-
> rootfs | \
> +	wrgg-pad-rootfs | append-metadata |  check-size $$$$(IMAGE_SIZE)

IMAGE_SIZE argument can be omitted for check-size now.

> +  KERNEL := kernel-bin | append-dtb | relocate-kernel | lzma
> +  KERNEL_INITRAMFS := $$(KERNEL) | mkwrggimg
> +  DAP_SIGNATURE := wapac02_dkbs_dap2695
> +  SUPPORTED_DEVICES += dlink,dap-2695-a1 dap-2695-a1 endef

The first string will be created automatically from the node name, so you just need

SUPPORTED_DEVICES += dap-2695-a1

Despite, DEVICE_PACKAGES seem to be missing here.

Best

Adrian

> +TARGET_DEVICES += dlink_dap-2695-a1
> +
>  define Device/dlink_dir-505
>    SOC := ar9330
>    DEVICE_VENDOR := D-Link
> --
> 2.26.2
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
diff mbox series

Patch

diff --git a/target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts b/target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts
new file mode 100644
index 0000000000..fdabbcb84a
--- /dev/null
+++ b/target/linux/ath79/dts/qca9558_dlink_dap-2695-a1.dts
@@ -0,0 +1,172 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "qca955x.dtsi"
+
+/ {
+	compatible = "dlink,dap-2695-a1", "qca,qca9557";
+	model = "D-link DAP-2695-A1";
+
+	chosen {
+		bootargs = "console=ttyS0,115200n8";
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		power_green {
+			label = "d-link:green:power";
+			gpios = <&gpio 23 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+		};
+
+		power_red {
+			label = "d-link:red:power";
+			gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+		};
+
+		wifi_2g {
+			label = "d-link:green:wifi2g";
+			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+		};
+	};
+
+	keys {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		button@0 {
+			label = "reset";
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+		};
+	};
+};
+
+&spi {
+	status = "okay";
+	num-cs = <1>;
+
+	flash@0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "mx25l12805d";
+		reg = <0>;
+		spi-max-frequency = <25000000>;
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			uboot:  partition@0 {
+				label = "u-boot";
+				reg = <0x000000 0x040000>;
+				read-only;
+			};
+
+			partition@40000 {
+				label = "bdcfg";
+				reg = <0x040000 0x010000>;
+				read-only;
+			};
+
+			partition@50000 {
+				label = "rgdb";
+				reg = <0x050000 0x010000>;
+				read-only;
+			};
+
+			partition@60000 {
+				label = "langpack";
+				reg = <0x060000 0x010000>;
+				read-only;
+			};
+
+			partition@70000 {
+				compatible = "wrg";
+				label = "firmware";
+				reg = <0x070000 0xf00000>;
+			};
+
+			partition@f70000 {
+				label = "captival";
+				reg = <0xf70000 0x070000>;
+				read-only;
+			};
+
+			partition@fe0000 {
+				label = "certificate";
+				reg = <0xfe0000 0x010000>;
+				read-only;
+			};
+
+			art: partition@ff0000 {
+				label = "art";
+				reg = <0xff0000 0x010000>;
+				read-only;
+			};
+		};
+	};
+};
+
+&mdio0 {
+	status = "okay";
+
+	phy0: ethernet-phy@0 {
+		reg = <0>;
+
+		qca,ar8327-initvals = <
+			0x04 0x07600000 /* PORT0_PAD_CTRL */
+			0x0c 0x00080080 /* PORT6_PAD_CTRL */
+			0x7c 0x0000007e /* PORT0_STATUS */
+			0x94 0x0000007e /* PORT6_STATUS */
+		>;
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	phy-handle = <&phy0>;
+	phy-mode = "rgmii";
+	pll-data = <0x56000000 0x00000101 0x00001616>;
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+&eth1 {
+	status = "okay";
+
+	phy-mask = <0>;
+	phy-mode = "sgmii";
+	pll-data = <0x03000101 0x00000101 0x00001616>;
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+&pcie0 {
+	status = "okay";
+};
+
+&uart {
+	status = "okay";
+};
+
+&wmac {
+	status = "okay";
+
+	qca,no-eeprom;
+};
diff --git a/target/linux/ath79/generic/base-files/etc/board.d/01_leds b/target/linux/ath79/generic/base-files/etc/board.d/01_leds
index 5521379cea..f31a21088e 100755
--- a/target/linux/ath79/generic/base-files/etc/board.d/01_leds
+++ b/target/linux/ath79/generic/base-files/etc/board.d/01_leds
@@ -110,6 +110,11 @@  enterasys,ws-ap3705i)
 devolo,magic-2-wifi)
 	ucidef_set_led_netdev "plcw" "dLAN" "devolo:white:dlan" "eth0.1" "rx"
 	;;
+dlink,dap-2695-a1)
+	ucidef_set_led_default "power" "POWER" "d-link:green:power" "1"
+	ucidef_set_led_default "diag" "DIAG" "d-link:red:power" "0"
+	ucidef_set_led_wlan "wlan2g" "WLAN 2.4 GHz" "d-link:green:wlan2g" "phy1tpt"
+	;;
 dlink,dir-859-a1)
 	ucidef_set_led_switch "internet" "WAN" "$boardname:green:internet" "switch0" "0x20"
 	;;
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 1672f093a7..d5964e9a0f 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
@@ -136,6 +136,9 @@  ath79_setup_interfaces()
 		ucidef_add_switch "switch0" \
 			"0@eth0" "2:wan" "3:lan" "4:lan"
 		;;
+	dlink,dap-2695-a1)
+		ucidef_add_switch "switch0" "0@eth0" "2:lan" "3:wan" "6@eth1"
+		;;
 	dlink,dir-825-b1)
 		ucidef_set_interface_wan "eth1"
 		ucidef_add_switch "switch0" \
@@ -359,6 +362,9 @@  ath79_setup_macs()
 	devolo,magic-2-wifi)
 		label_mac=$(macaddr_add "$(mtd_get_mac_binary art 0x1002)" 3)
 		;;
+	dlink,dap-2695-a1)
+		label_mac=$(mtd_get_mac_ascii bdcfg "wlanmac")
+		;;
 	dlink,dir-825-b1)
 		lan_mac=$(mtd_get_mac_text "caldata" 0xffa0)
 		wan_mac=$(mtd_get_mac_text "caldata" 0xffb4)
diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
index e0fa5ff354..972157604d 100644
--- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
+++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
@@ -14,6 +14,10 @@  case "$FIRMWARE" in
 	avm,fritz450e)
 		caldata_extract_reverse "urlader" 0x1541 0x440
 		;;
+	dlink,dap-2695-a1)
+		caldata_extract "art" 0x1000 0x440
+		ath9k_patch_mac $(mtd_get_mac_ascii bdcfg "wlanmac")
+		;;
 	dlink,dir-505|\
 	dlink,dir-825-c1|\
 	dlink,dir-835-a1)
diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index 29815a1ada..603557d6c2 100644
--- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -40,6 +40,10 @@  case "$FIRMWARE" in
 		caldata_extract "art" 0x5000 0x844
 		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x0) -1)
 		;;
+	dlink,dap-2695-a1)
+		caldata_extract "art" 0x5000 0x844
+		ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac_a)
+		;;
 	dlink,dir-859-a1)
 		caldata_extract "art" 0x5000 0x844
 		ath10k_patch_mac $(mtd_get_mac_ascii devdata "wlan5mac")
diff --git a/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum b/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum
index 22c9483e74..085ad2e925 100644
--- a/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum
+++ b/target/linux/ath79/generic/base-files/etc/uci-defaults/09_fix-checksum
@@ -6,9 +6,17 @@  fix_seama_header() {
 	[ "$kernel_size" ] && mtd -c 0x$kernel_size fixseama firmware
 }
 
+fixwrgg() {
+	local kernel_size=$(sed -n 's/mtd[0-9]*: \([0-9a-f]*\).*"kernel".*/\1/p' /proc/mtd)
+	[ "$kernel_size" ] && mtd -c 0x$kernel_size fixwrgg firmware
+}
+
 board=$(board_name)
 
 case "$board" in
+dlink,dap-2695-a1)
+	fixwrgg
+	;;
 qihoo,c301)
 	fix_seama_header
 	;;
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
index da1583a825..5b1aea7bb0 100644
--- 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
@@ -8,6 +8,11 @@  preinit_set_mac_address() {
 	avm,fritz450e)
 		ip link set dev eth0 address $(fritz_tffs -n maca -i $(find_mtd_part "tffs (1)"))
 		;;
+	dlink,dap-2695-a1)
+		label_mac=$(mtd_get_mac_ascii bdcfg "lanmac")
+		ip link set dev eth0 address $(macaddr_add "$label_mac" 1)
+		ip link set dev eth1 address $(macaddr_add "$label_mac" 2)
+		;;
 	enterasys,ws-ap3705i)
 		ip link set dev eth0 address $(mtd_get_mac_ascii u-boot-env0 ethaddr)
 		;;
diff --git a/target/linux/ath79/image/generic-dlink.mk b/target/linux/ath79/image/generic-dlink.mk
index 96cb015a09..4d59af1645 100644
--- a/target/linux/ath79/image/generic-dlink.mk
+++ b/target/linux/ath79/image/generic-dlink.mk
@@ -1,3 +1,36 @@ 
+DEVICE_VARS += DAP_SIGNATURE
+
+define Build/mkwrggimg
+	$(STAGING_DIR_HOST)/bin/mkwrggimg -b \
+		-i $@ -o $@.imghdr -d /dev/mtdblock/1 \
+		-m $(DEVICE_MODEL)-$(DEVICE_VARIANT) -s $(DAP_SIGNATURE) \
+		-v $(VERSION_DIST) -B $(REVISION)
+	mv $@.imghdr $@
+endef
+
+define Build/wrgg-pad-rootfs
+	$(STAGING_DIR_HOST)/bin/padjffs2 $(IMAGE_ROOTFS) -c 64 >>$@
+endef
+
+define Device/dlink_dap-2695-a1
+  SOC := qca9558
+  DEVICE_VENDOR := D-Link
+  DEVICE_MODEL := DAP-2965
+  DEVICE_VARIANT := A1
+  IMAGES := factory.img sysupgrade.bin
+  IMAGE_SIZE := 15360k
+  IMAGE/default := append-kernel | pad-offset 65536 160
+  IMAGE/factory.img := $$(IMAGE/default) | append-rootfs | wrgg-pad-rootfs | \
+	mkwrggimg | check-size $$$$(IMAGE_SIZE)
+  IMAGE/sysupgrade.bin := $$(IMAGE/default) | mkwrggimg | append-rootfs | \
+	wrgg-pad-rootfs | append-metadata |  check-size $$$$(IMAGE_SIZE)
+  KERNEL := kernel-bin | append-dtb | relocate-kernel | lzma
+  KERNEL_INITRAMFS := $$(KERNEL) | mkwrggimg
+  DAP_SIGNATURE := wapac02_dkbs_dap2695
+  SUPPORTED_DEVICES += dlink,dap-2695-a1 dap-2695-a1
+endef
+TARGET_DEVICES += dlink_dap-2695-a1
+
 define Device/dlink_dir-505
   SOC := ar9330
   DEVICE_VENDOR := D-Link