diff mbox series

[1/2] ath79: add support for Mojo Networks AirTight C-75

Message ID 20201201173602.415324-1-tmn505@gmail.com
State Superseded
Headers show
Series [1/2] ath79: add support for Mojo Networks AirTight C-75 | expand

Commit Message

Tomasz Maciej Nowak Dec. 1, 2020, 5:36 p.m. UTC
Mojo Networks AirTight C-75 is a dual-band access point, also sold by
WatchGuard under name AP320.

Specification
SoC: Qualcomm Atheros QCA9550
RAM: 128 MiB DDR2
Flash: 2x 16 MiB SPI NOR
WIFI: 2.4 GHz 3T3R integrated
      5 GHz 3T3R QCA9890 oversized Mini PCIe card
Ethernet: 2x 10/100/1000 Mbps QCA8334
          port labeled LAN1 is PoE capable (802.3at)
USB: 1x 2.0
LEDs: 7x which two are GPIO controlled, four switch controlled, one
      controlled by wireless driver
Buttons: 1x GPIO controlled
Serial: RJ-45 port, Cisco pinout
        baud: 115200, parity: none, flow control: none
JTAG: Yes, pins marked J1 on PCB

Installation
1. Prepare TFTP server with OpenWrt initramfs-kernel image.
2. Connect to one of LAN ports.
3. Connect to serial port.
4. Power on the device and when prompted to stop autoboot, hit any key.
5. Adjust "ipaddr" and "serverip" addresses in U-Boot environment, use
   'setenv' to do that, then run following commands:
    tftpboot 0x81000000 <openwrt_initramfs-kernel_image_name>
    bootm 0x81000000
6. Wait about 1 minute for OpenWrt to boot.
7. Transfer OpenWrt sysupgrade image to /tmp directory and flash it
   with:
    sysupgrade -n /tmp/<openwrt_sysupgrade_image_name>
8. After flashing, the access point will reboot to OpenWrt. Wait few
   minutes, until the Power LED stops blinking, then it's ready for
   configuration.

Known issues
Green power LED does not work.

Additional information
The U-Boot fails to initialise ethernet ports correctly when a UART
adapter is attached to UART pins (marked J3 on PCB).

Cc: Vladimir Georgievsky <vladimir.georgievsky@yahoo.com>
Signed-of-by: Tomasz Maciej Nowak <tmn505@gmail.com>
---
 package/boot/uboot-envtools/files/ath79       |   1 +
 target/linux/ath79/dts/qca9550_mojo_c-75.dts  | 173 ++++++++++++++++++
 .../generic/base-files/etc/board.d/02_network |   4 +
 target/linux/ath79/image/generic.mk           |  11 ++
 4 files changed, 189 insertions(+)
 create mode 100644 target/linux/ath79/dts/qca9550_mojo_c-75.dts

Comments

Adrian Schmutzler Dec. 1, 2020, 7:47 p.m. UTC | #1
Hi,

> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
> On Behalf Of Tomasz Maciej Nowak
> Sent: Dienstag, 1. Dezember 2020 18:36
> To: openwrt-devel@lists.openwrt.org
> Cc: Vladimir Georgievsky <vladimir.georgievsky@yahoo.com>
> Subject: [PATCH 1/2] ath79: add support for Mojo Networks AirTight C-75
> 
> Mojo Networks AirTight C-75 is a dual-band access point, also sold by
> WatchGuard under name AP320.
> 
> Specification
> SoC: Qualcomm Atheros QCA9550
> RAM: 128 MiB DDR2
> Flash: 2x 16 MiB SPI NOR
> WIFI: 2.4 GHz 3T3R integrated
>       5 GHz 3T3R QCA9890 oversized Mini PCIe card
> Ethernet: 2x 10/100/1000 Mbps QCA8334
>           port labeled LAN1 is PoE capable (802.3at)
> USB: 1x 2.0
> LEDs: 7x which two are GPIO controlled, four switch controlled, one
>       controlled by wireless driver
> Buttons: 1x GPIO controlled
> Serial: RJ-45 port, Cisco pinout
>         baud: 115200, parity: none, flow control: none
> JTAG: Yes, pins marked J1 on PCB
> 
> Installation
> 1. Prepare TFTP server with OpenWrt initramfs-kernel image.
> 2. Connect to one of LAN ports.
> 3. Connect to serial port.
> 4. Power on the device and when prompted to stop autoboot, hit any key.
> 5. Adjust "ipaddr" and "serverip" addresses in U-Boot environment, use
>    'setenv' to do that, then run following commands:
>     tftpboot 0x81000000 <openwrt_initramfs-kernel_image_name>
>     bootm 0x81000000
> 6. Wait about 1 minute for OpenWrt to boot.
> 7. Transfer OpenWrt sysupgrade image to /tmp directory and flash it
>    with:
>     sysupgrade -n /tmp/<openwrt_sysupgrade_image_name>
> 8. After flashing, the access point will reboot to OpenWrt. Wait few
>    minutes, until the Power LED stops blinking, then it's ready for
>    configuration.
> 
> Known issues
> Green power LED does not work.
> 
> Additional information
> The U-Boot fails to initialise ethernet ports correctly when a UART adapter is
> attached to UART pins (marked J3 on PCB).
> 
> Cc: Vladimir Georgievsky <vladimir.georgievsky@yahoo.com>
> Signed-of-by: Tomasz Maciej Nowak <tmn505@gmail.com>
> ---
>  package/boot/uboot-envtools/files/ath79       |   1 +
>  target/linux/ath79/dts/qca9550_mojo_c-75.dts  | 173
> ++++++++++++++++++
>  .../generic/base-files/etc/board.d/02_network |   4 +
>  target/linux/ath79/image/generic.mk           |  11 ++
>  4 files changed, 189 insertions(+)
>  create mode 100644 target/linux/ath79/dts/qca9550_mojo_c-75.dts
> 
> diff --git a/package/boot/uboot-envtools/files/ath79
> b/package/boot/uboot-envtools/files/ath79
> index 259c52c77034..a6b52b370530 100644
> --- a/package/boot/uboot-envtools/files/ath79
> +++ b/package/boot/uboot-envtools/files/ath79
> @@ -20,6 +20,7 @@ alfa-network,n5q|\
>  alfa-network,pi-wifi4|\
>  alfa-network,r36a|\
>  allnet,all-wap02860ac|\
> +airtight,c-75|\

This is inconsistent with the other names. See more detailed comment below.

>  arduino,yun|\
>  buffalo,bhr-4grv2|\
>  devolo,magic-2-wifi|\
> diff --git a/target/linux/ath79/dts/qca9550_mojo_c-75.dts
> b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
> new file mode 100644
> index 000000000000..51046a740a02
> --- /dev/null
> +++ b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
> @@ -0,0 +1,173 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +
> +#include "qca955x.dtsi"

This include needs to be first (after the license).

> +
> +/ {
> +	model = "Mojo Networks AirTight C-75";
> +	compatible = "mojo,c-75", "qca,qca9550", "qca,qca9558";

Please decide for one name and then use that consistently. It appears to me that both Mojo Networks and Airtight Networks are different _vendor_ names (due to a rename)?

Then please decide for one and use that one consistently, i.e.
either
	model = "Mojo Networks C-75";
	compatible = "mojo,c-75", "qca,qca9550", "qca,qca9558";
or
	model = "Airtight Networks C-75";
	compatible = "airtight,c-75", "qca,qca9550", "qca,qca9558";

> +
> +	aliases {
> +		label-mac-device = &eth0;
> +		led-boot = &led_power;
> +		led-failsafe = &led_power;
> +		led-upgrade = &led_power;

No led-running?

> +	};
> +
> +	keys {
> +		compatible = "gpio-keys";
> +
> +		reset {
> +			linux,code = <KEY_RESTART>;
> +			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;

missing label?

> +		};
> +	};
> +
> +	leds {
> +		compatible = "gpio-leds";
> +
> +		led_power: power {
> +			label = "amber:power";
> +			gpios = <&gpio 14 GPIO_ACTIVE_HIGH>;
> +			default-state = "on";
> +		};
> +
> +		wlan2g {
> +			label = "green:wlan2g";
> +			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
> +			linux,default-trigger = "phy1tpt";
> +		};
> +	};
> +};
> +
> +&eth0 {
> +	status = "okay";
> +
> +	mtd-mac-address = <&art 0x0>;
> +	phy-handle = <&phy0>;
> +	phy-mode = "rgmii";
> +	pll-data = <0xa6000000 0x00000101 0x00001616>; };
> +
> +&eth1 {
> +	status = "okay";
> +
> +	mtd-mac-address = <&art 0x6>;
> +	phy-mode = "sgmii";
> +	pll-data = <0x03000101 0x00000101 0x00001616>;
> +
> +	fixed-link {
> +		speed = <1000>;
> +		full-duplex;
> +	};
> +};
> +
> +&mdio0 {
> +	status = "okay";
> +
> +	phy0: ethernet-phy@0 {
> +		reg = <0>;
> +		qca,ar8327-initvals = <
> +			0x0c 0x00080080
> +			0x04 0x07600000
> +			0x58 0xc935c935
> +			0x5c 0x03ffff00
> +			0x7c 0x0000007e
> +			0x94 0x0000007e
> +		>;
> +	};
> +};

Please move mdio0 up so it's either directly before or after eth0.

> +
> +&pcie0 {
> +	status = "okay";
> +
> +	wifi@0,0 {
> +		compatible = "qcom,ath10k";
> +		reg = <0x0000 0 0 0 0>;
> +	};
> +};
> +
> +&spi {
> +	status = "okay";
> +
> +	num-cs = <2>;

num-cs can be dropped for ath79.

> +
> +	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 = <0x000000 0x040000>;
> +				read-only;
> +			};
> +
> +			partition@40000 {
> +				label = "u-boot-env";
> +				reg = <0x040000 0x010000>;
> +			};
> +
> +			partition@50000 {
> +				label = "wlandrv";
> +				reg = <0x050000 0x010000>;
> +				read-only;
> +			};
> +
> +			partition@60000 {
> +				label = "firmware";
> +				reg = <0x060000 0xf90000>;
> +				compatible = "denx,uimage";
> +			};
> +
> +			art: partition@ff0000 {
> +				label = "art";
> +				reg = <0xff0000 0x010000>;
> +				read-only;
> +			};
> +		};
> +	};
> +
> +	flash@1 {
> +		compatible = "jedec,spi-nor";
> +		reg = <1>;
> +		spi-max-frequency = <25000000>;
> +
> +		partitions {
> +			compatible = "fixed-partitions";
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +
> +			partition@0 {
> +				label = "opt";
> +				reg = <0x0 0x1000000>;

read-only? or is that intended for user data?

> +			};
> +		};
> +	};
> +};
> +
> +&uart {
> +	status = "okay";
> +};
> +
> +&usb_phy0 {
> +	status = "okay";
> +};
> +
> +&usb0 {
> +	status = "okay";
> +};
> +
> +&wmac {
> +	status = "okay";
> +
> +	mtd-cal-data = <&art 0x1000>;
> +	mtd-mac-address = <&art 0x1002>;

mtd-mac-address can be dropped, this will get read from caldata automatically.

> +};
> 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 5c0195f6ffc9..02e4d6b78dd4 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
> @@ -248,6 +248,10 @@ ath79_setup_interfaces()
>  		ucidef_add_switch "switch0" \
>  			"0@eth0" "2:lan:1" "3:lan:2" "4:lan:3" "5:lan:4"
> "1:wan"
>  		;;
> +	mojo,c-75)
> +		ucidef_add_switch "switch0" \
> +			"0@eth0" "2:wan" "3:lan" "6@eth1"
> +		;;

Interesting setup. Is this necessary or can one use
		ucidef_set_interfaces_lan_wan "eth1" "eth0"
instead? (Have to think about that myself ...)

Best

Adrian

>  	nec,wg1200cr|\
>  	qxwlan,e1700ac-v2-8m|\
>  	qxwlan,e1700ac-v2-16m|\
> diff --git a/target/linux/ath79/image/generic.mk
> b/target/linux/ath79/image/generic.mk
> index a0d5e7ab0190..0f90c00b9c43 100644
> --- a/target/linux/ath79/image/generic.mk
> +++ b/target/linux/ath79/image/generic.mk
> @@ -1192,6 +1192,17 @@ define Device/mercury_mw4530r-v1  endef
> TARGET_DEVICES += mercury_mw4530r-v1
> 
> +define Device/mojo_c-75
> +  SOC := qca9550
> +  DEVICE_VENDOR := Mojo Networks
> +  DEVICE_MODEL := AirTight C-75
> +  DEVICE_ALT0_VENDOR := WatchGuard
> +  DEVICE_ALT0_MODEL := AP320
> +  DEVICE_PACKAGES := ath10k-firmware-qca988x kmod-ath10k-ct kmod-
> usb2
> +  IMAGE_SIZE := 15936k
> +endef
> +TARGET_DEVICES += mojo_c-75
> +
>  define Device/nec_wg1200cr
>    SOC := qca9563
>    DEVICE_VENDOR := NEC
> --
> 2.29.2
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Tomasz Maciej Nowak Dec. 8, 2020, 4:53 p.m. UTC | #2
Hi.

W dniu 01.12.2020 o 20:47, Adrian Schmutzler pisze:
> Hi,
> 
>> -----Original Message-----
>> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
>> On Behalf Of Tomasz Maciej Nowak
>> Sent: Dienstag, 1. Dezember 2020 18:36
>> To: openwrt-devel@lists.openwrt.org
>> Cc: Vladimir Georgievsky <vladimir.georgievsky@yahoo.com>
>> Subject: [PATCH 1/2] ath79: add support for Mojo Networks AirTight C-75
>>
>> Mojo Networks AirTight C-75 is a dual-band access point, also sold by
>> WatchGuard under name AP320.
>>
>> Specification
>> SoC: Qualcomm Atheros QCA9550
>> RAM: 128 MiB DDR2
>> Flash: 2x 16 MiB SPI NOR
>> WIFI: 2.4 GHz 3T3R integrated
>>       5 GHz 3T3R QCA9890 oversized Mini PCIe card
>> Ethernet: 2x 10/100/1000 Mbps QCA8334
>>           port labeled LAN1 is PoE capable (802.3at)
>> USB: 1x 2.0
>> LEDs: 7x which two are GPIO controlled, four switch controlled, one
>>       controlled by wireless driver
>> Buttons: 1x GPIO controlled
>> Serial: RJ-45 port, Cisco pinout
>>         baud: 115200, parity: none, flow control: none
>> JTAG: Yes, pins marked J1 on PCB
>>
>> Installation
>> 1. Prepare TFTP server with OpenWrt initramfs-kernel image.
>> 2. Connect to one of LAN ports.
>> 3. Connect to serial port.
>> 4. Power on the device and when prompted to stop autoboot, hit any key.
>> 5. Adjust "ipaddr" and "serverip" addresses in U-Boot environment, use
>>    'setenv' to do that, then run following commands:
>>     tftpboot 0x81000000 <openwrt_initramfs-kernel_image_name>
>>     bootm 0x81000000
>> 6. Wait about 1 minute for OpenWrt to boot.
>> 7. Transfer OpenWrt sysupgrade image to /tmp directory and flash it
>>    with:
>>     sysupgrade -n /tmp/<openwrt_sysupgrade_image_name>
>> 8. After flashing, the access point will reboot to OpenWrt. Wait few
>>    minutes, until the Power LED stops blinking, then it's ready for
>>    configuration.
>>
>> Known issues
>> Green power LED does not work.
>>
>> Additional information
>> The U-Boot fails to initialise ethernet ports correctly when a UART adapter is
>> attached to UART pins (marked J3 on PCB).
>>
>> Cc: Vladimir Georgievsky <vladimir.georgievsky@yahoo.com>
>> Signed-of-by: Tomasz Maciej Nowak <tmn505@gmail.com>
>> ---
>>  package/boot/uboot-envtools/files/ath79       |   1 +
>>  target/linux/ath79/dts/qca9550_mojo_c-75.dts  | 173
>> ++++++++++++++++++
>>  .../generic/base-files/etc/board.d/02_network |   4 +
>>  target/linux/ath79/image/generic.mk           |  11 ++
>>  4 files changed, 189 insertions(+)
>>  create mode 100644 target/linux/ath79/dts/qca9550_mojo_c-75.dts
>>
>> diff --git a/package/boot/uboot-envtools/files/ath79
>> b/package/boot/uboot-envtools/files/ath79
>> index 259c52c77034..a6b52b370530 100644
>> --- a/package/boot/uboot-envtools/files/ath79
>> +++ b/package/boot/uboot-envtools/files/ath79
>> @@ -20,6 +20,7 @@ alfa-network,n5q|\
>>  alfa-network,pi-wifi4|\
>>  alfa-network,r36a|\
>>  allnet,all-wap02860ac|\
>> +airtight,c-75|\
> 
> This is inconsistent with the other names. See more detailed comment below.

Oops, that chunk should have been removed. We don't alter U-Boot environment on OpenWrt installation, so users don't need access to that.

> 
>>  arduino,yun|\
>>  buffalo,bhr-4grv2|\
>>  devolo,magic-2-wifi|\
>> diff --git a/target/linux/ath79/dts/qca9550_mojo_c-75.dts
>> b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
>> new file mode 100644
>> index 000000000000..51046a740a02
>> --- /dev/null
>> +++ b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
>> @@ -0,0 +1,173 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
>> +
>> +#include <dt-bindings/gpio/gpio.h>
>> +#include <dt-bindings/input/input.h>
>> +
>> +#include "qca955x.dtsi"
> 
> This include needs to be first (after the license).

I followed Linux kernel style in which first we add global includes in alphabetical order then local includes. Will change that.

> 
>> +
>> +/ {
>> +	model = "Mojo Networks AirTight C-75";
>> +	compatible = "mojo,c-75", "qca,qca9550", "qca,qca9558";
> 
> Please decide for one name and then use that consistently. It appears to me that both Mojo Networks and Airtight Networks are different _vendor_ names (due to a rename)?

The FCC filling got me confused: Requested by: Mojo Networks, Inc.; For: AirTight Access Point C75. Which I thought would mean AirTight is an Access Point class from their portfolio. But yeah, the company just renamed itself.

> 
> Then please decide for one and use that one consistently, i.e.
> either
> 	model = "Mojo Networks C-75";
> 	compatible = "mojo,c-75", "qca,qca9550", "qca,qca9558";
> or
> 	model = "Airtight Networks C-75";
> 	compatible = "airtight,c-75", "qca,qca9550", "qca,qca9558";

Will change that to AirTight and add DEVICE_ALT variables.

> 
>> +
>> +	aliases {
>> +		label-mac-device = &eth0;
>> +		led-boot = &led_power;
>> +		led-failsafe = &led_power;
>> +		led-upgrade = &led_power;
> 
> No led-running?

The power LED is by default on, so it makes led-running redundant. Is there something else also using that alias?

> 
>> +	};
>> +
>> +	keys {
>> +		compatible = "gpio-keys";
>> +
>> +		reset {
>> +			linux,code = <KEY_RESTART>;
>> +			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
> 
> missing label?

The label is set from the node name by default.

> 
>> +		};
>> +	};
>> +
>> +	leds {
>> +		compatible = "gpio-leds";
>> +
>> +		led_power: power {
>> +			label = "amber:power";
>> +			gpios = <&gpio 14 GPIO_ACTIVE_HIGH>;
>> +			default-state = "on";
>> +		};
>> +
>> +		wlan2g {
>> +			label = "green:wlan2g";
>> +			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
>> +			linux,default-trigger = "phy1tpt";
>> +		};
>> +	};
>> +};
>> +
>> +&eth0 {
>> +	status = "okay";
>> +
>> +	mtd-mac-address = <&art 0x0>;
>> +	phy-handle = <&phy0>;
>> +	phy-mode = "rgmii";
>> +	pll-data = <0xa6000000 0x00000101 0x00001616>; };
>> +
>> +&eth1 {
>> +	status = "okay";
>> +
>> +	mtd-mac-address = <&art 0x6>;
>> +	phy-mode = "sgmii";
>> +	pll-data = <0x03000101 0x00000101 0x00001616>;
>> +
>> +	fixed-link {
>> +		speed = <1000>;
>> +		full-duplex;
>> +	};
>> +};
>> +
>> +&mdio0 {
>> +	status = "okay";
>> +
>> +	phy0: ethernet-phy@0 {
>> +		reg = <0>;
>> +		qca,ar8327-initvals = <
>> +			0x0c 0x00080080
>> +			0x04 0x07600000
>> +			0x58 0xc935c935
>> +			0x5c 0x03ffff00
>> +			0x7c 0x0000007e
>> +			0x94 0x0000007e
>> +		>;
>> +	};
>> +};
> 
> Please move mdio0 up so it's either directly before or after eth0.

The nodes are sorted alphabetically. There are no includes specified between nodes, which would make following applied sorting not possible. What are the criteria saying that this node should be above &eth nodes?

> 
>> +
>> +&pcie0 {
>> +	status = "okay";
>> +
>> +	wifi@0,0 {
>> +		compatible = "qcom,ath10k";
>> +		reg = <0x0000 0 0 0 0>;
>> +	};
>> +};
>> +
>> +&spi {
>> +	status = "okay";
>> +
>> +	num-cs = <2>;
> 
> num-cs can be dropped for ath79.

Ok.

> 
>> +
>> +	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 = <0x000000 0x040000>;
>> +				read-only;
>> +			};
>> +
>> +			partition@40000 {
>> +				label = "u-boot-env";
>> +				reg = <0x040000 0x010000>;
>> +			};
>> +
>> +			partition@50000 {
>> +				label = "wlandrv";
>> +				reg = <0x050000 0x010000>;
>> +				read-only;
>> +			};
>> +
>> +			partition@60000 {
>> +				label = "firmware";
>> +				reg = <0x060000 0xf90000>;
>> +				compatible = "denx,uimage";
>> +			};
>> +
>> +			art: partition@ff0000 {
>> +				label = "art";
>> +				reg = <0xff0000 0x010000>;
>> +				read-only;
>> +			};
>> +		};
>> +	};
>> +
>> +	flash@1 {
>> +		compatible = "jedec,spi-nor";
>> +		reg = <1>;
>> +		spi-max-frequency = <25000000>;
>> +
>> +		partitions {
>> +			compatible = "fixed-partitions";
>> +			#address-cells = <1>;
>> +			#size-cells = <1>;
>> +
>> +			partition@0 {
>> +				label = "opt";
>> +				reg = <0x0 0x1000000>;
> 
> read-only? or is that intended for user data?

This stores the applications from OEM and their settings which are mounted as /opt. There is little value in keeping this if the OEM firmware on first flash is overwritten, so users are free to re-purpose it. Also originally this partition won't be mountable since it uses JFFS2 with ZLIB compression, so only full overwrite can take place.

> 
>> +			};
>> +		};
>> +	};
>> +};
>> +
>> +&uart {
>> +	status = "okay";
>> +};
>> +
>> +&usb_phy0 {
>> +	status = "okay";
>> +};
>> +
>> +&usb0 {
>> +	status = "okay";
>> +};
>> +
>> +&wmac {
>> +	status = "okay";
>> +
>> +	mtd-cal-data = <&art 0x1000>;
>> +	mtd-mac-address = <&art 0x1002>;
> 
> mtd-mac-address can be dropped, this will get read from caldata automatically.

Ok.

> 
>> +};
>> 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 5c0195f6ffc9..02e4d6b78dd4 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
>> @@ -248,6 +248,10 @@ ath79_setup_interfaces()
>>  		ucidef_add_switch "switch0" \
>>  			"0@eth0" "2:lan:1" "3:lan:2" "4:lan:3" "5:lan:4"
>> "1:wan"
>>  		;;
>> +	mojo,c-75)
>> +		ucidef_add_switch "switch0" \
>> +			"0@eth0" "2:wan" "3:lan" "6@eth1"
>> +		;;
> 
> Interesting setup. Is this necessary or can one use
> 		ucidef_set_interfaces_lan_wan "eth1" "eth0"
> instead? (Have to think about that myself ...)

Traffic needs to be properly tagged inside the switch, otherwise it will go between eth0 and eth1, and won't go to proper ports (2 and 3).

> 
> Best
> 
> Adrian

Regards.
Adrian Schmutzler Dec. 14, 2020, 4:28 p.m. UTC | #3
Hi,

only have time for a quick subset of answers:

> -----Original Message-----
> From: Tomasz Maciej Nowak [mailto:tmn505@gmail.com]
> Sent: Dienstag, 8. Dezember 2020 17:53
> To: Adrian Schmutzler <mail@adrianschmutzler.de>; openwrt-
> devel@lists.openwrt.org
> Cc: 'Vladimir Georgievsky' <vladimir.georgievsky@yahoo.com>
> Subject: Re: [PATCH 1/2] ath79: add support for Mojo Networks AirTight C-75
> 
> Hi.
> 
> W dniu 01.12.2020 o 20:47, Adrian Schmutzler pisze:
> > Hi,
> >
> >> -----Original Message-----
> >> From: openwrt-devel [mailto:openwrt-devel-
> bounces@lists.openwrt.org]
> >> On Behalf Of Tomasz Maciej Nowak
> >> Sent: Dienstag, 1. Dezember 2020 18:36
> >> To: openwrt-devel@lists.openwrt.org
> >> Cc: Vladimir Georgievsky <vladimir.georgievsky@yahoo.com>
> >> Subject: [PATCH 1/2] ath79: add support for Mojo Networks AirTight
> >> C-75
> >>
> >> Mojo Networks AirTight C-75 is a dual-band access point, also sold by
> >> WatchGuard under name AP320.
> >>
> >> Specification
> >> SoC: Qualcomm Atheros QCA9550
> >> RAM: 128 MiB DDR2
> >> Flash: 2x 16 MiB SPI NOR
> >> WIFI: 2.4 GHz 3T3R integrated
> >>       5 GHz 3T3R QCA9890 oversized Mini PCIe card
> >> Ethernet: 2x 10/100/1000 Mbps QCA8334
> >>           port labeled LAN1 is PoE capable (802.3at)
> >> USB: 1x 2.0
> >> LEDs: 7x which two are GPIO controlled, four switch controlled, one
> >>       controlled by wireless driver
> >> Buttons: 1x GPIO controlled
> >> Serial: RJ-45 port, Cisco pinout
> >>         baud: 115200, parity: none, flow control: none
> >> JTAG: Yes, pins marked J1 on PCB
> >>
> >> Installation
> >> 1. Prepare TFTP server with OpenWrt initramfs-kernel image.
> >> 2. Connect to one of LAN ports.
> >> 3. Connect to serial port.
> >> 4. Power on the device and when prompted to stop autoboot, hit any
> key.
> >> 5. Adjust "ipaddr" and "serverip" addresses in U-Boot environment, use
> >>    'setenv' to do that, then run following commands:
> >>     tftpboot 0x81000000 <openwrt_initramfs-kernel_image_name>
> >>     bootm 0x81000000
> >> 6. Wait about 1 minute for OpenWrt to boot.
> >> 7. Transfer OpenWrt sysupgrade image to /tmp directory and flash it
> >>    with:
> >>     sysupgrade -n /tmp/<openwrt_sysupgrade_image_name>
> >> 8. After flashing, the access point will reboot to OpenWrt. Wait few
> >>    minutes, until the Power LED stops blinking, then it's ready for
> >>    configuration.
> >>
> >> Known issues
> >> Green power LED does not work.
> >>
> >> Additional information
> >> The U-Boot fails to initialise ethernet ports correctly when a UART
> >> adapter is attached to UART pins (marked J3 on PCB).
> >>
> >> Cc: Vladimir Georgievsky <vladimir.georgievsky@yahoo.com>
> >> Signed-of-by: Tomasz Maciej Nowak <tmn505@gmail.com>
> >> ---
> >>  package/boot/uboot-envtools/files/ath79       |   1 +
> >>  target/linux/ath79/dts/qca9550_mojo_c-75.dts  | 173
> >> ++++++++++++++++++
> >>  .../generic/base-files/etc/board.d/02_network |   4 +
> >>  target/linux/ath79/image/generic.mk           |  11 ++
> >>  4 files changed, 189 insertions(+)
> >>  create mode 100644 target/linux/ath79/dts/qca9550_mojo_c-75.dts
> >>
> >> diff --git a/package/boot/uboot-envtools/files/ath79
> >> b/package/boot/uboot-envtools/files/ath79
> >> index 259c52c77034..a6b52b370530 100644
> >> --- a/package/boot/uboot-envtools/files/ath79
> >> +++ b/package/boot/uboot-envtools/files/ath79
> >> @@ -20,6 +20,7 @@ alfa-network,n5q|\
> >>  alfa-network,pi-wifi4|\
> >>  alfa-network,r36a|\
> >>  allnet,all-wap02860ac|\
> >> +airtight,c-75|\
> >
> > This is inconsistent with the other names. See more detailed comment
> below.
> 
> Oops, that chunk should have been removed. We don't alter U-Boot
> environment on OpenWrt installation, so users don't need access to that.
> 
> >
> >>  arduino,yun|\
> >>  buffalo,bhr-4grv2|\
> >>  devolo,magic-2-wifi|\
> >> diff --git a/target/linux/ath79/dts/qca9550_mojo_c-75.dts
> >> b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
> >> new file mode 100644
> >> index 000000000000..51046a740a02
> >> --- /dev/null
> >> +++ b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
> >> @@ -0,0 +1,173 @@
> >> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> >> +
> >> +#include <dt-bindings/gpio/gpio.h>
> >> +#include <dt-bindings/input/input.h>
> >> +
> >> +#include "qca955x.dtsi"
> >
> > This include needs to be first (after the license).
> 
> I followed Linux kernel style in which first we add global includes in
> alphabetical order then local includes. Will change that.

This is just because dts-v1 is introduced from ath79.dtsi via qca955x.dtsi and dts-v1 has to be before anything else. This is also done like this in kernel (but not consistently), e.g. ipq4019/ipq806x.

> 
> >
> >> +
> >> +/ {
> >> +	model = "Mojo Networks AirTight C-75";
> >> +	compatible = "mojo,c-75", "qca,qca9550", "qca,qca9558";
> >
> > Please decide for one name and then use that consistently. It appears to
> me that both Mojo Networks and Airtight Networks are different _vendor_
> names (due to a rename)?
> 
> The FCC filling got me confused: Requested by: Mojo Networks, Inc.; For:
> AirTight Access Point C75. Which I thought would mean AirTight is an Access
> Point class from their portfolio. But yeah, the company just renamed itself.
> 
> >
> > Then please decide for one and use that one consistently, i.e.
> > either
> > 	model = "Mojo Networks C-75";
> > 	compatible = "mojo,c-75", "qca,qca9550", "qca,qca9558"; or
> > 	model = "Airtight Networks C-75";
> > 	compatible = "airtight,c-75", "qca,qca9550", "qca,qca9558";
> 
> Will change that to AirTight and add DEVICE_ALT variables.
> 
> >
> >> +
> >> +	aliases {
> >> +		label-mac-device = &eth0;
> >> +		led-boot = &led_power;
> >> +		led-failsafe = &led_power;
> >> +		led-upgrade = &led_power;
> >
> > No led-running?
> 
> The power LED is by default on, so it makes led-running redundant. Is there
> something else also using that alias?

default-on is first, then diag.sh starts doing stuff due to led-boot, i.e. will have the LED blinking. I'm not sure what happens after that without led-running, i.e. is the LED turned off or on. Anyway, that will be the job of diag.sh then, not of default-on anymore.

> 
> >
> >> +	};
> >> +
> >> +	keys {
> >> +		compatible = "gpio-keys";
> >> +
> >> +		reset {
> >> +			linux,code = <KEY_RESTART>;
> >> +			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
> >
> > missing label?
> 
> The label is set from the node name by default.

Hmm, so essentially we could drop label for about 50 % of our keys (in contrast to the more complex situation with LEDs)?

> 
> >
> >> +		};
> >> +	};
> >> +
> >> +	leds {
> >> +		compatible = "gpio-leds";
> >> +
> >> +		led_power: power {
> >> +			label = "amber:power";
> >> +			gpios = <&gpio 14 GPIO_ACTIVE_HIGH>;
> >> +			default-state = "on";
> >> +		};
> >> +
> >> +		wlan2g {
> >> +			label = "green:wlan2g";
> >> +			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
> >> +			linux,default-trigger = "phy1tpt";
> >> +		};
> >> +	};
> >> +};
> >> +
> >> +&eth0 {
> >> +	status = "okay";
> >> +
> >> +	mtd-mac-address = <&art 0x0>;
> >> +	phy-handle = <&phy0>;
> >> +	phy-mode = "rgmii";
> >> +	pll-data = <0xa6000000 0x00000101 0x00001616>; };
> >> +
> >> +&eth1 {
> >> +	status = "okay";
> >> +
> >> +	mtd-mac-address = <&art 0x6>;
> >> +	phy-mode = "sgmii";
> >> +	pll-data = <0x03000101 0x00000101 0x00001616>;
> >> +
> >> +	fixed-link {
> >> +		speed = <1000>;
> >> +		full-duplex;
> >> +	};
> >> +};
> >> +
> >> +&mdio0 {
> >> +	status = "okay";
> >> +
> >> +	phy0: ethernet-phy@0 {
> >> +		reg = <0>;
> >> +		qca,ar8327-initvals = <
> >> +			0x0c 0x00080080
> >> +			0x04 0x07600000
> >> +			0x58 0xc935c935
> >> +			0x5c 0x03ffff00
> >> +			0x7c 0x0000007e
> >> +			0x94 0x0000007e
> >> +		>;
> >> +	};
> >> +};
> >
> > Please move mdio0 up so it's either directly before or after eth0.
> 
> The nodes are sorted alphabetically. There are no includes specified
> between nodes, which would make following applied sorting not possible.
> What are the criteria saying that this node should be above &eth nodes?

Well, mdioX is a subnode of ethX. Thus, I tend to see them as related, and that's probably also the reason why they are typically grouped together in the ar****/qca**** DTSI files.
It just makes reading the config easier for me when they are grouped this way. I won't force you to change that if you think alphabetic sorting is superior.

> 
> >
> >> +
> >> +&pcie0 {
> >> +	status = "okay";
> >> +
> >> +	wifi@0,0 {
> >> +		compatible = "qcom,ath10k";
> >> +		reg = <0x0000 0 0 0 0>;
> >> +	};
> >> +};
> >> +
> >> +&spi {
> >> +	status = "okay";
> >> +
> >> +	num-cs = <2>;
> >
> > num-cs can be dropped for ath79.
> 
> Ok.
> 
> >
> >> +
> >> +	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 = <0x000000 0x040000>;
> >> +				read-only;
> >> +			};
> >> +
> >> +			partition@40000 {
> >> +				label = "u-boot-env";
> >> +				reg = <0x040000 0x010000>;
> >> +			};
> >> +
> >> +			partition@50000 {
> >> +				label = "wlandrv";
> >> +				reg = <0x050000 0x010000>;
> >> +				read-only;
> >> +			};
> >> +
> >> +			partition@60000 {
> >> +				label = "firmware";
> >> +				reg = <0x060000 0xf90000>;
> >> +				compatible = "denx,uimage";
> >> +			};
> >> +
> >> +			art: partition@ff0000 {
> >> +				label = "art";
> >> +				reg = <0xff0000 0x010000>;
> >> +				read-only;
> >> +			};
> >> +		};
> >> +	};
> >> +
> >> +	flash@1 {
> >> +		compatible = "jedec,spi-nor";
> >> +		reg = <1>;
> >> +		spi-max-frequency = <25000000>;
> >> +
> >> +		partitions {
> >> +			compatible = "fixed-partitions";
> >> +			#address-cells = <1>;
> >> +			#size-cells = <1>;
> >> +
> >> +			partition@0 {
> >> +				label = "opt";
> >> +				reg = <0x0 0x1000000>;
> >
> > read-only? or is that intended for user data?
> 
> This stores the applications from OEM and their settings which are mounted
> as /opt. There is little value in keeping this if the OEM firmware on first flash
> is overwritten, so users are free to re-purpose it. Also originally this partition
> won't be mountable since it uses JFFS2 with ZLIB compression, so only full
> overwrite can take place.
> 
> >
> >> +			};
> >> +		};
> >> +	};
> >> +};
> >> +
> >> +&uart {
> >> +	status = "okay";
> >> +};
> >> +
> >> +&usb_phy0 {
> >> +	status = "okay";
> >> +};
> >> +
> >> +&usb0 {
> >> +	status = "okay";
> >> +};
> >> +
> >> +&wmac {
> >> +	status = "okay";
> >> +
> >> +	mtd-cal-data = <&art 0x1000>;
> >> +	mtd-mac-address = <&art 0x1002>;
> >
> > mtd-mac-address can be dropped, this will get read from caldata
> automatically.
> 
> Ok.
> 
> >
> >> +};
> >> 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 5c0195f6ffc9..02e4d6b78dd4 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
> >> @@ -248,6 +248,10 @@ ath79_setup_interfaces()
> >>  		ucidef_add_switch "switch0" \
> >>  			"0@eth0" "2:lan:1" "3:lan:2" "4:lan:3" "5:lan:4"
> >> "1:wan"
> >>  		;;
> >> +	mojo,c-75)
> >> +		ucidef_add_switch "switch0" \
> >> +			"0@eth0" "2:wan" "3:lan" "6@eth1"
> >> +		;;
> >
> > Interesting setup. Is this necessary or can one use
> > 		ucidef_set_interfaces_lan_wan "eth1" "eth0"
> > instead? (Have to think about that myself ...)
> 
> Traffic needs to be properly tagged inside the switch, otherwise it will go
> between eth0 and eth1, and won't go to proper ports (2 and 3).

Okay, accepted.

Best

Adrian

> 
> >
> > Best
> >
> > Adrian
> 
> Regards.
> 
> --
> TMN
Tomasz Maciej Nowak Dec. 15, 2020, 4:25 p.m. UTC | #4
W dniu 14.12.2020 o 17:28, Adrian Schmutzler pisze:
> Hi,
> 
> only have time for a quick subset of answers:
> 

[...]

>>>>  arduino,yun|\
>>>>  buffalo,bhr-4grv2|\
>>>>  devolo,magic-2-wifi|\
>>>> diff --git a/target/linux/ath79/dts/qca9550_mojo_c-75.dts
>>>> b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
>>>> new file mode 100644
>>>> index 000000000000..51046a740a02
>>>> --- /dev/null
>>>> +++ b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
>>>> @@ -0,0 +1,173 @@
>>>> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
>>>> +
>>>> +#include <dt-bindings/gpio/gpio.h>
>>>> +#include <dt-bindings/input/input.h>
>>>> +
>>>> +#include "qca955x.dtsi"
>>>
>>> This include needs to be first (after the license).
>>
>> I followed Linux kernel style in which first we add global includes in
>> alphabetical order then local includes. Will change that.
> 
> This is just because dts-v1 is introduced from ath79.dtsi via qca955x.dtsi and dts-v1 has to be before anything else. This is also done like this in kernel (but not consistently), e.g. ipq4019/ipq806x.

Ok.

[...]

>>>> +
>>>> +	aliases {
>>>> +		label-mac-device = &eth0;
>>>> +		led-boot = &led_power;
>>>> +		led-failsafe = &led_power;
>>>> +		led-upgrade = &led_power;
>>>
>>> No led-running?
>>
>> The power LED is by default on, so it makes led-running redundant. Is there
>> something else also using that alias?
> 
> default-on is first, then diag.sh starts doing stuff due to led-boot, i.e. will have the LED blinking. I'm not sure what happens after that without led-running, i.e. is the LED turned off or on. Anyway, that will be the job of diag.sh then, not of default-on anymore.

The power led behaves as intended with every led-* state and stays on after, so I don't think there's a need to duplicate that in userspace and will keep the current aliases. If I'll come across any issues with that, I'll send a patch.

> 
>>
>>>
>>>> +	};
>>>> +
>>>> +	keys {
>>>> +		compatible = "gpio-keys";
>>>> +
>>>> +		reset {
>>>> +			linux,code = <KEY_RESTART>;
>>>> +			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
>>>
>>> missing label?
>>
>> The label is set from the node name by default.
> 
> Hmm, so essentially we could drop label for about 50 % of our keys (in contrast to the more complex situation with LEDs)?

Sorry, got confused with LEDs and thought that's the same with gpio input, I'll add label to this node.

> 
>>
>>>
>>>> +		};
>>>> +	};
>>>> +
>>>> +	leds {
>>>> +		compatible = "gpio-leds";
>>>> +
>>>> +		led_power: power {
>>>> +			label = "amber:power";
>>>> +			gpios = <&gpio 14 GPIO_ACTIVE_HIGH>;
>>>> +			default-state = "on";
>>>> +		};
>>>> +
>>>> +		wlan2g {
>>>> +			label = "green:wlan2g";
>>>> +			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
>>>> +			linux,default-trigger = "phy1tpt";
>>>> +		};
>>>> +	};
>>>> +};
>>>> +
>>>> +&eth0 {
>>>> +	status = "okay";
>>>> +
>>>> +	mtd-mac-address = <&art 0x0>;
>>>> +	phy-handle = <&phy0>;
>>>> +	phy-mode = "rgmii";
>>>> +	pll-data = <0xa6000000 0x00000101 0x00001616>; };
>>>> +
>>>> +&eth1 {
>>>> +	status = "okay";
>>>> +
>>>> +	mtd-mac-address = <&art 0x6>;
>>>> +	phy-mode = "sgmii";
>>>> +	pll-data = <0x03000101 0x00000101 0x00001616>;
>>>> +
>>>> +	fixed-link {
>>>> +		speed = <1000>;
>>>> +		full-duplex;
>>>> +	};
>>>> +};
>>>> +
>>>> +&mdio0 {
>>>> +	status = "okay";
>>>> +
>>>> +	phy0: ethernet-phy@0 {
>>>> +		reg = <0>;
>>>> +		qca,ar8327-initvals = <
>>>> +			0x0c 0x00080080
>>>> +			0x04 0x07600000
>>>> +			0x58 0xc935c935
>>>> +			0x5c 0x03ffff00
>>>> +			0x7c 0x0000007e
>>>> +			0x94 0x0000007e
>>>> +		>;
>>>> +	};
>>>> +};
>>>
>>> Please move mdio0 up so it's either directly before or after eth0.
>>
>> The nodes are sorted alphabetically. There are no includes specified
>> between nodes, which would make following applied sorting not possible.
>> What are the criteria saying that this node should be above &eth nodes?
> 
> Well, mdioX is a subnode of ethX. Thus, I tend to see them as related, and that's probably also the reason why they are typically grouped together in the ar****/qca**** DTSI files.
> It just makes reading the config easier for me when they are grouped this way. I won't force you to change that if you think alphabetic sorting is superior.

Ok, that's sensible I'll move it after eth0.

[...]

> 
> Best
> 
> Adrian
> 

Regards.
diff mbox series

Patch

diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79
index 259c52c77034..a6b52b370530 100644
--- a/package/boot/uboot-envtools/files/ath79
+++ b/package/boot/uboot-envtools/files/ath79
@@ -20,6 +20,7 @@  alfa-network,n5q|\
 alfa-network,pi-wifi4|\
 alfa-network,r36a|\
 allnet,all-wap02860ac|\
+airtight,c-75|\
 arduino,yun|\
 buffalo,bhr-4grv2|\
 devolo,magic-2-wifi|\
diff --git a/target/linux/ath79/dts/qca9550_mojo_c-75.dts b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
new file mode 100644
index 000000000000..51046a740a02
--- /dev/null
+++ b/target/linux/ath79/dts/qca9550_mojo_c-75.dts
@@ -0,0 +1,173 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "qca955x.dtsi"
+
+/ {
+	model = "Mojo Networks AirTight C-75";
+	compatible = "mojo,c-75", "qca,qca9550", "qca,qca9558";
+
+	aliases {
+		label-mac-device = &eth0;
+		led-boot = &led_power;
+		led-failsafe = &led_power;
+		led-upgrade = &led_power;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		reset {
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		led_power: power {
+			label = "amber:power";
+			gpios = <&gpio 14 GPIO_ACTIVE_HIGH>;
+			default-state = "on";
+		};
+
+		wlan2g {
+			label = "green:wlan2g";
+			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy1tpt";
+		};
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	mtd-mac-address = <&art 0x0>;
+	phy-handle = <&phy0>;
+	phy-mode = "rgmii";
+	pll-data = <0xa6000000 0x00000101 0x00001616>;
+};
+
+&eth1 {
+	status = "okay";
+
+	mtd-mac-address = <&art 0x6>;
+	phy-mode = "sgmii";
+	pll-data = <0x03000101 0x00000101 0x00001616>;
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+&mdio0 {
+	status = "okay";
+
+	phy0: ethernet-phy@0 {
+		reg = <0>;
+		qca,ar8327-initvals = <
+			0x0c 0x00080080
+			0x04 0x07600000
+			0x58 0xc935c935
+			0x5c 0x03ffff00
+			0x7c 0x0000007e
+			0x94 0x0000007e
+		>;
+	};
+};
+
+&pcie0 {
+	status = "okay";
+
+	wifi@0,0 {
+		compatible = "qcom,ath10k";
+		reg = <0x0000 0 0 0 0>;
+	};
+};
+
+&spi {
+	status = "okay";
+
+	num-cs = <2>;
+
+	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 = <0x000000 0x040000>;
+				read-only;
+			};
+
+			partition@40000 {
+				label = "u-boot-env";
+				reg = <0x040000 0x010000>;
+			};
+
+			partition@50000 {
+				label = "wlandrv";
+				reg = <0x050000 0x010000>;
+				read-only;
+			};
+
+			partition@60000 {
+				label = "firmware";
+				reg = <0x060000 0xf90000>;
+				compatible = "denx,uimage";
+			};
+
+			art: partition@ff0000 {
+				label = "art";
+				reg = <0xff0000 0x010000>;
+				read-only;
+			};
+		};
+	};
+
+	flash@1 {
+		compatible = "jedec,spi-nor";
+		reg = <1>;
+		spi-max-frequency = <25000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				label = "opt";
+				reg = <0x0 0x1000000>;
+			};
+		};
+	};
+};
+
+&uart {
+	status = "okay";
+};
+
+&usb_phy0 {
+	status = "okay";
+};
+
+&usb0 {
+	status = "okay";
+};
+
+&wmac {
+	status = "okay";
+
+	mtd-cal-data = <&art 0x1000>;
+	mtd-mac-address = <&art 0x1002>;
+};
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 5c0195f6ffc9..02e4d6b78dd4 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
@@ -248,6 +248,10 @@  ath79_setup_interfaces()
 		ucidef_add_switch "switch0" \
 			"0@eth0" "2:lan:1" "3:lan:2" "4:lan:3" "5:lan:4" "1:wan"
 		;;
+	mojo,c-75)
+		ucidef_add_switch "switch0" \
+			"0@eth0" "2:wan" "3:lan" "6@eth1"
+		;;
 	nec,wg1200cr|\
 	qxwlan,e1700ac-v2-8m|\
 	qxwlan,e1700ac-v2-16m|\
diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk
index a0d5e7ab0190..0f90c00b9c43 100644
--- a/target/linux/ath79/image/generic.mk
+++ b/target/linux/ath79/image/generic.mk
@@ -1192,6 +1192,17 @@  define Device/mercury_mw4530r-v1
 endef
 TARGET_DEVICES += mercury_mw4530r-v1
 
+define Device/mojo_c-75
+  SOC := qca9550
+  DEVICE_VENDOR := Mojo Networks
+  DEVICE_MODEL := AirTight C-75
+  DEVICE_ALT0_VENDOR := WatchGuard
+  DEVICE_ALT0_MODEL := AP320
+  DEVICE_PACKAGES := ath10k-firmware-qca988x kmod-ath10k-ct kmod-usb2
+  IMAGE_SIZE := 15936k
+endef
+TARGET_DEVICES += mojo_c-75
+
 define Device/nec_wg1200cr
   SOC := qca9563
   DEVICE_VENDOR := NEC