[OpenWrt-Devel] ar71xx: add support for GL.iNet GL-X1200
diff mbox series

Message ID 1535372810-64026-1-git-send-email-guilin.wang@gl-inet.com
State Accepted
Delegated to: John Crispin
Headers show
Series
  • [OpenWrt-Devel] ar71xx: add support for GL.iNet GL-X1200
Related show

Commit Message

wellnw Aug. 27, 2018, 12:26 p.m. UTC
This patch adds supports for GL-X1200.

Specification:
- SOC: QCA9563 (775MHz)
- Flash: 16 MiB (W25Q128FVSG)
- RAM: 128 MiB DDR2
- Ethernet: 4x 1Gbps LAN + 1x 1Gbps WAN
- Wireless: 2.4GHz (bgn) and 5GHz (ac)
- USB: 1x USB 2.0 port
- Button: 1x reset button
- LED: 8x LEDS (green)

Signed-off-by: wellnw <guilin.wang@gl-inet.com>
---
 target/linux/ar71xx/base-files/etc/board.d/01_leds |   4 +
 .../linux/ar71xx/base-files/etc/board.d/02_network |   4 +
 .../etc/hotplug.d/firmware/11-ath10k-caldata       |   6 +
 target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
 .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
 target/linux/ar71xx/config-4.14                    |   1 +
 target/linux/ar71xx/config-4.9                     |   1 +
 .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  11 ++
 target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
 .../ar71xx/files/arch/mips/ath79/mach-gl-x1200.c   | 154 +++++++++++++++++++++
 .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
 target/linux/ar71xx/generic/config-default         |   1 +
 target/linux/ar71xx/image/generic.mk               |  13 ++
 13 files changed, 201 insertions(+)
 create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c

Comments

John Crispin Aug. 28, 2018, 7:38 a.m. UTC | #1
On 27/08/18 14:26, wellnw wrote:
> This patch adds supports for GL-X1200.
>
> Specification:
> - SOC: QCA9563 (775MHz)
> - Flash: 16 MiB (W25Q128FVSG)
> - RAM: 128 MiB DDR2
> - Ethernet: 4x 1Gbps LAN + 1x 1Gbps WAN
> - Wireless: 2.4GHz (bgn) and 5GHz (ac)
> - USB: 1x USB 2.0 port
> - Button: 1x reset button
> - LED: 8x LEDS (green)
>
> Signed-off-by: wellnw <guilin.wang@gl-inet.com>
> ---
>   target/linux/ar71xx/base-files/etc/board.d/01_leds |   4 +
>   .../linux/ar71xx/base-files/etc/board.d/02_network |   4 +
>   .../etc/hotplug.d/firmware/11-ath10k-caldata       |   6 +
>   target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
>   .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
>   target/linux/ar71xx/config-4.14                    |   1 +
>   target/linux/ar71xx/config-4.9                     |   1 +
>   .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  11 ++
>   target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
>   .../ar71xx/files/arch/mips/ath79/mach-gl-x1200.c   | 154 +++++++++++++++++++++
>   .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
>   target/linux/ar71xx/generic/config-default         |   1 +
>   target/linux/ar71xx/image/generic.mk               |  13 ++
>   13 files changed, 201 insertions(+)
>   create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c
>
> diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> index af480cb..03e8157 100755
> --- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> @@ -408,6 +408,10 @@ gl-ar750s)
>   	ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:green:wlan2g" "phy1tpt"
>   	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
>   	;;
> +gl-x1200)
> +	ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:green:wlan2g" "phy1tpt"
> +	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
> +	;;

this section aswell as several other places in this patch is not 
alphabetically ordered. please fix all occurrences
      John

>   gl-mifi)
>   	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
>   	ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
> diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network
> index 7f209fb..6cbd39d 100755
> --- a/target/linux/ar71xx/base-files/etc/board.d/02_network
> +++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
> @@ -455,6 +455,10 @@ ar71xx_setup_interfaces()
>   		ucidef_add_switch "switch0" \
>    			"0@eth0" "2:lan:2" "3:lan:1" "1:wan"
>   		;;
> +	gl-x1200)
> +		ucidef_add_switch "switch0" \
> + 			"0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5:wan"
> +		;;
>   	jwap230)
>   		ucidef_set_interfaces_lan_wan "eth0.1" "eth1.2"
>   		ucidef_add_switch "switch0" \
> diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> index e08df23..bee531a 100644
> --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> @@ -106,6 +106,12 @@ case "$FIRMWARE" in
>   		ath10kcal_extract "art" 20480 2116
>   		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
>   		;;
> +	gl-x1200)
> +		ath10kcal_extract "art" 20480 12064
> +		ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
> +			/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
> +		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
> +		;;
>   	koala)
>   		ath10kcal_extract "art" 20480 2116
>   		ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_binary art 12) +0)
> diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> index 05f497f..383de2d 100755
> --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> @@ -767,6 +767,9 @@ ar71xx_board_detect() {
>   	*"GL-AR750S")
>   		name="gl-ar750s"
>   		;;
> +	*"GL-X1200")
> +		name="gl-x1200"
> +		;;
>   	*"GL-CONNECT INET v1")
>   		name="gl-inet"
>   
> diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> index 3068aa4..312c371 100755
> --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> @@ -269,6 +269,7 @@ platform_check_image() {
>   	gl-ar300|\
>   	gl-ar750|\
>   	gl-ar750s|\
> +	gl-x1200|\
>   	gl-domino|\
>   	gl-mifi|\
>   	gl-usb150|\
> diff --git a/target/linux/ar71xx/config-4.14 b/target/linux/ar71xx/config-4.14
> index 535b519..3e11925 100644
> --- a/target/linux/ar71xx/config-4.14
> +++ b/target/linux/ar71xx/config-4.14
> @@ -126,6 +126,7 @@ CONFIG_ATH79=y
>   # CONFIG_ATH79_MACH_GL_AR300M is not set
>   # CONFIG_ATH79_MACH_GL_AR750 is not set
>   # CONFIG_ATH79_MACH_GL_AR750S is not set
> +# CONFIG_ATH79_MACH_GL_X1200 is not set
>   # CONFIG_ATH79_MACH_GL_DOMINO is not set
>   # CONFIG_ATH79_MACH_GL_INET is not set
>   # CONFIG_ATH79_MACH_GL_MIFI is not set
> diff --git a/target/linux/ar71xx/config-4.9 b/target/linux/ar71xx/config-4.9
> index 8d25692..c06ec42 100644
> --- a/target/linux/ar71xx/config-4.9
> +++ b/target/linux/ar71xx/config-4.9
> @@ -126,6 +126,7 @@ CONFIG_ATH79=y
>   # CONFIG_ATH79_MACH_GL_AR300M is not set
>   # CONFIG_ATH79_MACH_GL_AR750 is not set
>   # CONFIG_ATH79_MACH_GL_AR750S is not set
> +# CONFIG_ATH79_MACH_GL_X1200 is not set
>   # CONFIG_ATH79_MACH_GL_DOMINO is not set
>   # CONFIG_ATH79_MACH_GL_INET is not set
>   # CONFIG_ATH79_MACH_GL_MIFI is not set
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> index f60825a..74f7c91 100644
> --- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> @@ -858,6 +858,17 @@ config ATH79_MACH_GL_AR750S
>   	select ATH79_DEV_USB
>   	select ATH79_DEV_WMAC
>   
> +config ATH79_MACH_GL_X1200
> +	bool "GL.iNet GL-X1200 support"
> +	select SOC_QCA956X
> +	select ATH79_DEV_AP9X_PCI if PCI
> +	select ATH79_DEV_ETH
> +	select ATH79_DEV_GPIO_BUTTONS
> +	select ATH79_DEV_LEDS_GPIO
> +	select ATH79_DEV_M25P80
> +	select ATH79_DEV_USB
> +	select ATH79_DEV_WMAC
> +
>   config ATH79_MACH_GL_DOMINO
>   	bool "DOMINO support"
>   	select SOC_AR933X
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> index 0a2fc9c..2d23bf4 100644
> --- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> @@ -136,6 +136,7 @@ obj-$(CONFIG_ATH79_MACH_GL_AR300)		+= mach-gl-ar300.o
>   obj-$(CONFIG_ATH79_MACH_GL_AR300M)		+= mach-gl-ar300m.o
>   obj-$(CONFIG_ATH79_MACH_GL_AR750)		+= mach-gl-ar750.o
>   obj-$(CONFIG_ATH79_MACH_GL_AR750S)		+= mach-gl-ar750s.o
> +obj-$(CONFIG_ATH79_MACH_GL_X1200)		+= mach-gl-x1200.o
>   obj-$(CONFIG_ATH79_MACH_GL_DOMINO)		+= mach-gl-domino.o
>   obj-$(CONFIG_ATH79_MACH_GL_INET)		+= mach-gl-inet.o
>   obj-$(CONFIG_ATH79_MACH_GL_MIFI)		+= mach-gl-mifi.o
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c
> new file mode 100644
> index 0000000..f7d1fbc
> --- /dev/null
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c
> @@ -0,0 +1,154 @@
> +/*
> + * GL.iNet GL-X1200 board support
> + *
> + * Copyright (C) 2018 wellnw <guilin.wang@gl-inet.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published
> + * by the Free Software Foundation.
> + */
> +#include <linux/init.h>
> +#include <linux/pci.h>
> +#include <linux/platform_device.h>
> +#include <linux/ath9k_platform.h>
> +#include <linux/etherdevice.h>
> +
> +#include <asm/mach-ath79/ath79.h>
> +#include <asm/mach-ath79/irq.h>
> +#include <asm/mach-ath79/ar71xx_regs.h>
> +
> +#include <linux/platform_data/phy-at803x.h>
> +#include <linux/ar8216_platform.h>
> +
> +#include "common.h"
> +#include "dev-ap9x-pci.h"
> +#include "dev-eth.h"
> +#include "dev-gpio-buttons.h"
> +#include "dev-leds-gpio.h"
> +#include "dev-spi.h"
> +#include "dev-m25p80.h"
> +#include "dev-wmac.h"
> +#include "dev-usb.h"
> +#include "machtypes.h"
> +
> +#define GL_X1200_KEYS_POLL_INTERVAL	20
> +#define GL_X1200_KEYS_DEBOUNCE_INTERVAL	(3 * GL_X1200_KEYS_POLL_INTERVAL)
> +
> +#define GL_X1200_GPIO_LED_WLAN2G       19
> +#define GL_X1200_GPIO_LED_WLAN5G       20
> +#define GL_X1200_GPIO_LED_POWER	1
> +#define GL_X1200_GPIO_USB_POWER	5
> +
> +#define GL_X1200_GPIO_BTN_RESET	2
> +
> +#define GL_X1200_MAC0_OFFSET             0x0000
> +#define GL_X1200_WMAC_CALDATA_OFFSET     0x1000
> +#define GL_X1200_PCI_CALDATA_OFFSET      0x5000
> +
> +static struct spi_board_info gl_x1200_spi_info[] = {
> +	{
> +		.bus_num		= 0,
> +		.chip_select    = 0,
> +		.max_speed_hz   = 25000000,
> +		.modalias		= "m25p80",
> +		.platform_data  = NULL,
> +	},
> +};
> +
> +static struct ath79_spi_platform_data gl_x1200_spi_data = {
> +	.bus_num			= 0,
> +	.num_chipselect     = 2,
> +};
> +
> +static struct gpio_led gl_x1200_leds_gpio[] __initdata = {
> +	{
> +		.name			= "gl-x1200:green:power",
> +		.gpio			= GL_X1200_GPIO_LED_POWER,
> +		.default_state	= LEDS_GPIO_DEFSTATE_KEEP,
> +		.active_low		= 1,
> +	},{
> +		.name		= "gl-x1200:green:usbpower",
> +		.gpio		= GL_X1200_GPIO_USB_POWER,
> +		.active_low	= 1,
> +	},{
> +		.name		= "gl-x1200:green:wlan2g",
> +		.gpio		= GL_X1200_GPIO_LED_WLAN2G,
> +		.active_low	= 1,
> +	},{
> +		.name		= "gl-x1200:green:wlan5g",
> +		.gpio		= GL_X1200_GPIO_LED_WLAN5G,
> +		.active_low	= 0,
> +	}
> +};
> +
> +static struct gpio_keys_button gl_x1200_gpio_keys[] __initdata = {
> +	{
> +		.desc                   = "reset",
> +		.type                   = EV_KEY,
> +		.code                   = KEY_RESTART,
> +		.debounce_interval      = GL_X1200_KEYS_DEBOUNCE_INTERVAL,
> +		.gpio                   = GL_X1200_GPIO_BTN_RESET,
> +		.active_low             = 1,
> +	},
> +};
> +
> +static struct ar8327_pad_cfg gl_x1200_ar8327_pad0_cfg = {
> +	.mode = AR8327_PAD_MAC_SGMII,
> +	.sgmii_delay_en = true,
> +};
> +
> +static struct ar8327_platform_data gl_x1200_ar8327_data = {
> +	.pad0_cfg = &gl_x1200_ar8327_pad0_cfg,
> +	.port0_cfg = {
> +		.force_link = 1,
> +		.speed = AR8327_PORT_SPEED_1000,
> +		.duplex = 1,
> +		.txpause = 1,
> +		.rxpause = 1,
> +	},
> +};
> +
> +
> +static struct mdio_board_info gl_x1200_mdio0_info[] = {
> +	{
> +		.bus_id = "ag71xx-mdio.0",
> +		.mdio_addr = 0,
> +		.platform_data = &gl_x1200_ar8327_data,
> +	},
> +};
> +
> +static void __init gl_x1200_setup(void)
> +{
> +	u8 *eeprom = (u8 *) KSEG1ADDR(0x1f050000);
> +
> +	ath79_register_spi(&gl_x1200_spi_data, gl_x1200_spi_info, 1);
> +
> +	ath79_init_mac(ath79_eth0_data.mac_addr,
> +			eeprom + GL_X1200_MAC0_OFFSET, 0);
> +
> +	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII;
> +	ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
> +	ath79_eth0_data.phy_mask = BIT(0);
> +
> +	mdiobus_register_board_info(gl_x1200_mdio0_info,
> +			ARRAY_SIZE(gl_x1200_mdio0_info));
> +
> +	ath79_register_mdio(0, 0x00);
> +	ath79_register_eth(0);
> +
> +	ath79_register_usb();
> +
> +	ath79_register_wmac(eeprom + GL_X1200_WMAC_CALDATA_OFFSET, NULL);
> +
> +	ap91_pci_init(eeprom + GL_X1200_PCI_CALDATA_OFFSET, NULL);
> +
> +	ath79_register_leds_gpio(-1, ARRAY_SIZE(gl_x1200_leds_gpio),
> +			gl_x1200_leds_gpio);
> +
> +	ath79_register_gpio_keys_polled(-1, GL_X1200_KEYS_POLL_INTERVAL,
> +			ARRAY_SIZE(gl_x1200_gpio_keys),
> +			gl_x1200_gpio_keys);
> +}
> +
> +MIPS_MACHINE(ATH79_MACH_GL_X1200, "GL-X1200", "GL-X1200",
> +		gl_x1200_setup);
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> index 987e80b..0919b8a 100644
> --- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> @@ -133,6 +133,7 @@ enum ath79_mach_type {
>   	ATH79_MACH_GL_AR300M,			/* GL-AR300M */
>   	ATH79_MACH_GL_AR750,			/* GL.iNet GL-AR750 */
>   	ATH79_MACH_GL_AR750S,			/* GL.iNet GL-AR750S */
> +	ATH79_MACH_GL_X1200,			/* GL.iNet GL-X1200 */
>   	ATH79_MACH_GL_DOMINO,			/* Domino */
>   	ATH79_MACH_GL_INET,			/* GL-CONNECT GL-INET */
>   	ATH79_MACH_GL_MIFI,			/* GL-MIFI support */
> diff --git a/target/linux/ar71xx/generic/config-default b/target/linux/ar71xx/generic/config-default
> index 89024c1..31c4ddd 100644
> --- a/target/linux/ar71xx/generic/config-default
> +++ b/target/linux/ar71xx/generic/config-default
> @@ -96,6 +96,7 @@ CONFIG_ATH79_MACH_GL_AR300=y
>   CONFIG_ATH79_MACH_GL_AR300M=y
>   CONFIG_ATH79_MACH_GL_AR750=y
>   CONFIG_ATH79_MACH_GL_AR750S=y
> +CONFIG_ATH79_MACH_GL_X1200=y
>   CONFIG_ATH79_MACH_GL_DOMINO=y
>   CONFIG_ATH79_MACH_GL_INET=y
>   CONFIG_ATH79_MACH_GL_MIFI=y
> diff --git a/target/linux/ar71xx/image/generic.mk b/target/linux/ar71xx/image/generic.mk
> index 3b32081..03a761a 100644
> --- a/target/linux/ar71xx/image/generic.mk
> +++ b/target/linux/ar71xx/image/generic.mk
> @@ -523,6 +523,19 @@ define Device/gl-ar750s
>   endef
>   TARGET_DEVICES += gl-ar750s
>   
> +define Device/gl-x1200
> +  DEVICE_TITLE := GL.iNet GL-X1200
> +  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887 kmod-usb-core \
> +	kmod-usb2 kmod-usb-storage
> +  BOARDNAME := GL-X1200
> +  SUPPORTED_DEVICES := gl-x1200
> +  IMAGE_SIZE := 16000k
> +  MTDPARTS := spi0.0:256k(u-boot)ro,64k(u-boot-env),64k(art)ro,-(firmware)
> +  IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \
> +	append-rootfs | pad-rootfs | append-metadata | check-size $$$$(IMAGE_SIZE)
> +endef
> +TARGET_DEVICES += gl-x1200
> +
>   define Device/gl-domino
>     DEVICE_TITLE := GL.iNet Domino Pi
>     DEVICE_PACKAGES := kmod-usb-core kmod-usb2
Sven Eckelmann Aug. 28, 2018, 8:04 a.m. UTC | #2
On Dienstag, 28. August 2018 09:38:39 CEST John Crispin wrote:
> > +gl-x1200)
> > +       ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:green:wlan2g" "phy1tpt"
> > +       ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
> > +       ;;
> 
> this section aswell as several other places in this patch is not 
> alphabetically ordered. please fix all occurrences

And this section could also be merged together with the gl-ar750s section.

> > +       gl-x1200)
> > +               ath10kcal_extract "art" 20480 12064
> > +               ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
> > +                       /lib/firmware/ath10k/QCA9888/hw2.0/board.bin
> > +               ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
> > +               ;;
[...]
> > +  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887 kmod-usb-core \
> > +       kmod-usb2 kmod-usb-storage

Is the 5GHz now a QCA9888 or a QCA9887? And why are you linking the pre-cal 
data to board.bin? QCA9888 has its BDF stored in the board-2.bin [1] (selected by 
the bmi from the OTP and the variant string from DT/SMBIOS) and per device 
pre-cal data is stored in /lib/firmware/ath10k/pre-cal-*.bin. The OTP is then
merging both and applying extra modifications on top of it. The result is then
automatically given to the actual QCA9888 firmware.

See for example the OpenMesh A62 for an device with an QCA9888. As you may 
notice, it is using device tree - something which ar71xx is not using. But the 
new target ath79 does.

Kind regards,
	Sven

[1] https://github.com/openwrt/openwrt/pull/713#issuecomment-369511149
Mathias Kresin Aug. 28, 2018, 8:05 a.m. UTC | #3
27.08.2018 14:26, wellnw:
> This patch adds supports for GL-X1200.
> 
> Specification:
> - SOC: QCA9563 (775MHz)
> - Flash: 16 MiB (W25Q128FVSG)
> - RAM: 128 MiB DDR2
> - Ethernet: 4x 1Gbps LAN + 1x 1Gbps WAN
> - Wireless: 2.4GHz (bgn) and 5GHz (ac)
> - USB: 1x USB 2.0 port
> - Button: 1x reset button
> - LED: 8x LEDS (green)
> 
> Signed-off-by: wellnw <guilin.wang@gl-inet.com>

Please provide your full name in the Signed-off-by.

 From our submitting patches guideline [0]: If you add support for new 
hardware: Include in your commit message ... and how to install OpenWrt 
on it.

Mathias

[0] https://openwrt.org/submitting-patches
wellnw Aug. 28, 2018, 9:26 a.m. UTC | #4
Hi,Sven
     I am using the QCA9886 chip for the first time. I saw the example you gave.
     I think the following code should be deleted.
         ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin  /lib/firmware/ath10k/QCA9888/hw2.0/board.bin
 
Thank you
 
------------------ Original ------------------
From:  "Sven Eckelmann"<sven.eckelmann@openmesh.com>;
Date:  Tue, Aug 28, 2018 04:04 PM
To:  "John Crispin"<john@phrozen.org>; 
Cc:  "wellnw"<guilin.wang@gl-inet.com>; "openwrt-devel"<openwrt-devel@lists.openwrt.org>; 
Subject:  Re: [OpenWrt-Devel] [PATCH] ar71xx: add support for GL.iNet GL-X1200

 
On Dienstag, 28. August 2018 09:38:39 CEST John Crispin wrote:
> > +gl-x1200)
> > +       ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:green:wlan2g" "phy1tpt"
> > +       ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
> > +       ;;
> 
> this section aswell as several other places in this patch is not 
> alphabetically ordered. please fix all occurrences

And this section could also be merged together with the gl-ar750s section.

> > +       gl-x1200)
> > +               ath10kcal_extract "art" 20480 12064
> > +               ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
> > +                       /lib/firmware/ath10k/QCA9888/hw2.0/board.bin
> > +               ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
> > +               ;;
[...]
> > +  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887 kmod-usb-core \
> > +       kmod-usb2 kmod-usb-storage

Is the 5GHz now a QCA9888 or a QCA9887? And why are you linking the pre-cal 
data to board.bin? QCA9888 has its BDF stored in the board-2.bin [1] (selected by 
the bmi from the OTP and the variant string from DT/SMBIOS) and per device 
pre-cal data is stored in /lib/firmware/ath10k/pre-cal-*.bin. The OTP is then
merging both and applying extra modifications on top of it. The result is then
automatically given to the actual QCA9888 firmware.

See for example the OpenMesh A62 for an device with an QCA9888. As you may 
notice, it is using device tree - something which ar71xx is not using. But the 
new target ath79 does.

Kind regards,
	Sven

[1] https://github.com/openwrt/openwrt/pull/713#issuecomment-369511149
<div>Hi,Sven</div><div>&nbsp; &nbsp; &nbsp;I am using the QCA9886 chip for the first time. I saw the example you gave.</div><div>&nbsp; &nbsp; &nbsp;I think the following code should be deleted.</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin &nbsp;/lib/firmware/ath10k/QCA9888/hw2.0/board.bin</div><div><includetail><div>&nbsp;</div><div>Thank you</div><div>&nbsp;</div><div style="font:Verdana normal 14px;color:#000;"><div style="FONT-SIZE: 12px;FONT-FAMILY: Arial Narrow;padding:2px 0 2px 0;">------------------&nbsp;Original&nbsp;------------------</div><div style="FONT-SIZE: 12px;background:#efefef;padding:8px;"><div id="menu_sender"><b>From: </b>&nbsp;"Sven Eckelmann"&lt;sven.eckelmann@openmesh.com&gt;;</div><div><b>Date: </b>&nbsp;Tue, Aug 28, 2018 04:04 PM</div><div><b>To: </b>&nbsp;"John Crispin"&lt;john@phrozen.org&gt;; <wbr></div><div><b>Cc: </b>&nbsp;"wellnw"&lt;guilin.wang@gl-inet.com&gt;; "openwrt-devel"&lt;openwrt-devel@lists.openwrt.org&gt;; <wbr></div><div><b>Subject: </b>&nbsp;Re: [OpenWrt-Devel] [PATCH] ar71xx: add support for GL.iNet GL-X1200</div></div><div>&nbsp;</div><div style="position:relative;">On Dienstag, 28. August 2018 09:38:39 CEST John Crispin wrote:<br>&gt; &gt; +gl-x1200)<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:green:wlan2g" "phy1tpt"<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;<br>&gt; <br>&gt; this section aswell as several other places in this patch is not <br>&gt; alphabetically ordered. please fix all occurrences<br><br>And this section could also be merged together with the gl-ar750s section.<br><br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gl-x1200)<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ath10kcal_extract "art" 20480 12064<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib/firmware/ath10k/QCA9888/hw2.0/board.bin<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;<br>[...]<br>&gt; &gt; +&nbsp; DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887 kmod-usb-core \<br>&gt; &gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kmod-usb2 kmod-usb-storage<br><br>Is the 5GHz now a QCA9888 or a QCA9887? And why are you linking the pre-cal <br>data to board.bin? QCA9888 has its BDF stored in the board-2.bin [1] (selected by <br>the bmi from the OTP and the variant string from DT/SMBIOS) and per device <br>pre-cal data is stored in /lib/firmware/ath10k/pre-cal-*.bin. The OTP is then<br>merging both and applying extra modifications on top of it. The result is then<br>automatically given to the actual QCA9888 firmware.<br><br>See for example the OpenMesh A62 for an device with an QCA9888. As you may <br>notice, it is using device tree - something which ar71xx is not using. But the <br>new target ath79 does.<br><br>Kind regards,<br>	Sven<br><br>[1] https://github.com/openwrt/openwrt/pull/713#issuecomment-369511149<br></div></div><!--<![endif]--></includetail></div>
Sven Eckelmann Aug. 28, 2018, 9:39 a.m. UTC | #5
On Dienstag, 28. August 2018 17:26:36 CEST Wang guilin wrote:
> Hi,Sven
>      I am using the QCA9886 chip for the first time. I saw the example you gave.
>      I think the following code should be deleted.
>          ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin  /lib/firmware/ath10k/QCA9888/hw2.0/board.bin

But you also have to submit the correct BDF to Kalle Valo when it is not the 
same as the default one. Right now the board-2.bin provides:

* bus=pci,bmi-chip-id=0,bmi-board-id=16.bin created size: 12064
* bus=pci,bmi-chip-id=0,bmi-board-id=17.bin created size: 12064
* bus=pci,bmi-chip-id=0,bmi-board-id=18.bin created size: 12064
* bus=pci,bmi-chip-id=0,bmi-board-id=23.bin created size: 12064
* bus=pci,bmi-chip-id=0,bmi-board-id=24.bin created size: 12064
* bus=pci,bmi-chip-id=0,bmi-board-id=25.bin created size: 12064
* bus=pci,bmi-chip-id=0,bmi-board-id=16,variant=OM-A62.bin created size: 12064

As you can see, the OpenMesh A62 used the reference board with the 
bmi-board-id=16 but required some changes in the BDF. Thus I had to 
submit the modified bus=pci,bmi-chip-id=0,bmi-board-id=16,variant=OM-A62.bin 
to Kalle for integration in QCA9888/hw2.0/board-2.bin of 
https://github.com/kvalo/ath10k-firmware.

And then you have to tell ath10k to load the BDF with the variant=
string and not the one without it.


Of course, I don't know whether you had to change anything in the BDF or not. 
So I cannot say whether it is enough for you to just delete this symlink.

Kind regards,
	Sven

Patch
diff mbox series

diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds b/target/linux/ar71xx/base-files/etc/board.d/01_leds
index af480cb..03e8157 100755
--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
+++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
@@ -408,6 +408,10 @@  gl-ar750s)
 	ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:green:wlan2g" "phy1tpt"
 	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
 	;;
+gl-x1200)
+	ucidef_set_led_wlan "wlan2g" "WLAN2G" "$board:green:wlan2g" "phy1tpt"
+	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
+	;;
 gl-mifi)
 	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
 	ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network
index 7f209fb..6cbd39d 100755
--- a/target/linux/ar71xx/base-files/etc/board.d/02_network
+++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
@@ -455,6 +455,10 @@  ar71xx_setup_interfaces()
 		ucidef_add_switch "switch0" \
  			"0@eth0" "2:lan:2" "3:lan:1" "1:wan"
 		;;
+	gl-x1200)
+		ucidef_add_switch "switch0" \
+ 			"0@eth0" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5:wan"
+		;;
 	jwap230)
 		ucidef_set_interfaces_lan_wan "eth0.1" "eth1.2"
 		ucidef_add_switch "switch0" \
diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index e08df23..bee531a 100644
--- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -106,6 +106,12 @@  case "$FIRMWARE" in
 		ath10kcal_extract "art" 20480 2116
 		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
 		;;
+	gl-x1200)
+		ath10kcal_extract "art" 20480 12064
+		ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
+			/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
+		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
+		;;
 	koala)
 		ath10kcal_extract "art" 20480 2116
 		ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_binary art 12) +0)
diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
index 05f497f..383de2d 100755
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
@@ -767,6 +767,9 @@  ar71xx_board_detect() {
 	*"GL-AR750S")
 		name="gl-ar750s"
 		;;
+	*"GL-X1200")
+		name="gl-x1200"
+		;;
 	*"GL-CONNECT INET v1")
 		name="gl-inet"
 
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
index 3068aa4..312c371 100755
--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
@@ -269,6 +269,7 @@  platform_check_image() {
 	gl-ar300|\
 	gl-ar750|\
 	gl-ar750s|\
+	gl-x1200|\
 	gl-domino|\
 	gl-mifi|\
 	gl-usb150|\
diff --git a/target/linux/ar71xx/config-4.14 b/target/linux/ar71xx/config-4.14
index 535b519..3e11925 100644
--- a/target/linux/ar71xx/config-4.14
+++ b/target/linux/ar71xx/config-4.14
@@ -126,6 +126,7 @@  CONFIG_ATH79=y
 # CONFIG_ATH79_MACH_GL_AR300M is not set
 # CONFIG_ATH79_MACH_GL_AR750 is not set
 # CONFIG_ATH79_MACH_GL_AR750S is not set
+# CONFIG_ATH79_MACH_GL_X1200 is not set
 # CONFIG_ATH79_MACH_GL_DOMINO is not set
 # CONFIG_ATH79_MACH_GL_INET is not set
 # CONFIG_ATH79_MACH_GL_MIFI is not set
diff --git a/target/linux/ar71xx/config-4.9 b/target/linux/ar71xx/config-4.9
index 8d25692..c06ec42 100644
--- a/target/linux/ar71xx/config-4.9
+++ b/target/linux/ar71xx/config-4.9
@@ -126,6 +126,7 @@  CONFIG_ATH79=y
 # CONFIG_ATH79_MACH_GL_AR300M is not set
 # CONFIG_ATH79_MACH_GL_AR750 is not set
 # CONFIG_ATH79_MACH_GL_AR750S is not set
+# CONFIG_ATH79_MACH_GL_X1200 is not set
 # CONFIG_ATH79_MACH_GL_DOMINO is not set
 # CONFIG_ATH79_MACH_GL_INET is not set
 # CONFIG_ATH79_MACH_GL_MIFI is not set
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
index f60825a..74f7c91 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
+++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
@@ -858,6 +858,17 @@  config ATH79_MACH_GL_AR750S
 	select ATH79_DEV_USB
 	select ATH79_DEV_WMAC
 
+config ATH79_MACH_GL_X1200
+	bool "GL.iNet GL-X1200 support"
+	select SOC_QCA956X
+	select ATH79_DEV_AP9X_PCI if PCI
+	select ATH79_DEV_ETH
+	select ATH79_DEV_GPIO_BUTTONS
+	select ATH79_DEV_LEDS_GPIO
+	select ATH79_DEV_M25P80
+	select ATH79_DEV_USB
+	select ATH79_DEV_WMAC
+
 config ATH79_MACH_GL_DOMINO
 	bool "DOMINO support"
 	select SOC_AR933X
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
index 0a2fc9c..2d23bf4 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
+++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
@@ -136,6 +136,7 @@  obj-$(CONFIG_ATH79_MACH_GL_AR300)		+= mach-gl-ar300.o
 obj-$(CONFIG_ATH79_MACH_GL_AR300M)		+= mach-gl-ar300m.o
 obj-$(CONFIG_ATH79_MACH_GL_AR750)		+= mach-gl-ar750.o
 obj-$(CONFIG_ATH79_MACH_GL_AR750S)		+= mach-gl-ar750s.o
+obj-$(CONFIG_ATH79_MACH_GL_X1200)		+= mach-gl-x1200.o
 obj-$(CONFIG_ATH79_MACH_GL_DOMINO)		+= mach-gl-domino.o
 obj-$(CONFIG_ATH79_MACH_GL_INET)		+= mach-gl-inet.o
 obj-$(CONFIG_ATH79_MACH_GL_MIFI)		+= mach-gl-mifi.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c
new file mode 100644
index 0000000..f7d1fbc
--- /dev/null
+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-x1200.c
@@ -0,0 +1,154 @@ 
+/*
+ * GL.iNet GL-X1200 board support
+ *
+ * Copyright (C) 2018 wellnw <guilin.wang@gl-inet.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/platform_device.h>
+#include <linux/ath9k_platform.h>
+#include <linux/etherdevice.h>
+
+#include <asm/mach-ath79/ath79.h>
+#include <asm/mach-ath79/irq.h>
+#include <asm/mach-ath79/ar71xx_regs.h>
+
+#include <linux/platform_data/phy-at803x.h>
+#include <linux/ar8216_platform.h>
+
+#include "common.h"
+#include "dev-ap9x-pci.h"
+#include "dev-eth.h"
+#include "dev-gpio-buttons.h"
+#include "dev-leds-gpio.h"
+#include "dev-spi.h"
+#include "dev-m25p80.h"
+#include "dev-wmac.h"
+#include "dev-usb.h"
+#include "machtypes.h"
+
+#define GL_X1200_KEYS_POLL_INTERVAL	20
+#define GL_X1200_KEYS_DEBOUNCE_INTERVAL	(3 * GL_X1200_KEYS_POLL_INTERVAL)
+
+#define GL_X1200_GPIO_LED_WLAN2G       19
+#define GL_X1200_GPIO_LED_WLAN5G       20
+#define GL_X1200_GPIO_LED_POWER	1
+#define GL_X1200_GPIO_USB_POWER	5
+
+#define GL_X1200_GPIO_BTN_RESET	2
+
+#define GL_X1200_MAC0_OFFSET             0x0000
+#define GL_X1200_WMAC_CALDATA_OFFSET     0x1000
+#define GL_X1200_PCI_CALDATA_OFFSET      0x5000
+
+static struct spi_board_info gl_x1200_spi_info[] = {
+	{
+		.bus_num		= 0,
+		.chip_select    = 0,
+		.max_speed_hz   = 25000000,
+		.modalias		= "m25p80",
+		.platform_data  = NULL,
+	},
+};
+
+static struct ath79_spi_platform_data gl_x1200_spi_data = {
+	.bus_num			= 0,
+	.num_chipselect     = 2,
+};
+
+static struct gpio_led gl_x1200_leds_gpio[] __initdata = {
+	{
+		.name			= "gl-x1200:green:power",
+		.gpio			= GL_X1200_GPIO_LED_POWER,
+		.default_state	= LEDS_GPIO_DEFSTATE_KEEP,
+		.active_low		= 1,
+	},{
+		.name		= "gl-x1200:green:usbpower",
+		.gpio		= GL_X1200_GPIO_USB_POWER,
+		.active_low	= 1,
+	},{
+		.name		= "gl-x1200:green:wlan2g",
+		.gpio		= GL_X1200_GPIO_LED_WLAN2G,
+		.active_low	= 1,
+	},{
+		.name		= "gl-x1200:green:wlan5g",
+		.gpio		= GL_X1200_GPIO_LED_WLAN5G,
+		.active_low	= 0,
+	}
+};
+
+static struct gpio_keys_button gl_x1200_gpio_keys[] __initdata = {
+	{
+		.desc                   = "reset",
+		.type                   = EV_KEY,
+		.code                   = KEY_RESTART,
+		.debounce_interval      = GL_X1200_KEYS_DEBOUNCE_INTERVAL,
+		.gpio                   = GL_X1200_GPIO_BTN_RESET,
+		.active_low             = 1,
+	},
+};
+
+static struct ar8327_pad_cfg gl_x1200_ar8327_pad0_cfg = {
+	.mode = AR8327_PAD_MAC_SGMII,
+	.sgmii_delay_en = true,
+};
+
+static struct ar8327_platform_data gl_x1200_ar8327_data = {
+	.pad0_cfg = &gl_x1200_ar8327_pad0_cfg,
+	.port0_cfg = {
+		.force_link = 1,
+		.speed = AR8327_PORT_SPEED_1000,
+		.duplex = 1,
+		.txpause = 1,
+		.rxpause = 1,
+	},
+};
+
+
+static struct mdio_board_info gl_x1200_mdio0_info[] = {
+	{
+		.bus_id = "ag71xx-mdio.0",
+		.mdio_addr = 0,
+		.platform_data = &gl_x1200_ar8327_data,
+	},
+};
+
+static void __init gl_x1200_setup(void)
+{
+	u8 *eeprom = (u8 *) KSEG1ADDR(0x1f050000);
+
+	ath79_register_spi(&gl_x1200_spi_data, gl_x1200_spi_info, 1);
+
+	ath79_init_mac(ath79_eth0_data.mac_addr,
+			eeprom + GL_X1200_MAC0_OFFSET, 0);
+
+	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII;
+	ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
+	ath79_eth0_data.phy_mask = BIT(0);
+
+	mdiobus_register_board_info(gl_x1200_mdio0_info,
+			ARRAY_SIZE(gl_x1200_mdio0_info));
+
+	ath79_register_mdio(0, 0x00);
+	ath79_register_eth(0);
+
+	ath79_register_usb();
+
+	ath79_register_wmac(eeprom + GL_X1200_WMAC_CALDATA_OFFSET, NULL);
+
+	ap91_pci_init(eeprom + GL_X1200_PCI_CALDATA_OFFSET, NULL);
+
+	ath79_register_leds_gpio(-1, ARRAY_SIZE(gl_x1200_leds_gpio),
+			gl_x1200_leds_gpio);
+
+	ath79_register_gpio_keys_polled(-1, GL_X1200_KEYS_POLL_INTERVAL,
+			ARRAY_SIZE(gl_x1200_gpio_keys),
+			gl_x1200_gpio_keys);
+}
+
+MIPS_MACHINE(ATH79_MACH_GL_X1200, "GL-X1200", "GL-X1200",
+		gl_x1200_setup);
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
index 987e80b..0919b8a 100644
--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
+++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
@@ -133,6 +133,7 @@  enum ath79_mach_type {
 	ATH79_MACH_GL_AR300M,			/* GL-AR300M */
 	ATH79_MACH_GL_AR750,			/* GL.iNet GL-AR750 */
 	ATH79_MACH_GL_AR750S,			/* GL.iNet GL-AR750S */
+	ATH79_MACH_GL_X1200,			/* GL.iNet GL-X1200 */
 	ATH79_MACH_GL_DOMINO,			/* Domino */
 	ATH79_MACH_GL_INET,			/* GL-CONNECT GL-INET */
 	ATH79_MACH_GL_MIFI,			/* GL-MIFI support */
diff --git a/target/linux/ar71xx/generic/config-default b/target/linux/ar71xx/generic/config-default
index 89024c1..31c4ddd 100644
--- a/target/linux/ar71xx/generic/config-default
+++ b/target/linux/ar71xx/generic/config-default
@@ -96,6 +96,7 @@  CONFIG_ATH79_MACH_GL_AR300=y
 CONFIG_ATH79_MACH_GL_AR300M=y
 CONFIG_ATH79_MACH_GL_AR750=y
 CONFIG_ATH79_MACH_GL_AR750S=y
+CONFIG_ATH79_MACH_GL_X1200=y
 CONFIG_ATH79_MACH_GL_DOMINO=y
 CONFIG_ATH79_MACH_GL_INET=y
 CONFIG_ATH79_MACH_GL_MIFI=y
diff --git a/target/linux/ar71xx/image/generic.mk b/target/linux/ar71xx/image/generic.mk
index 3b32081..03a761a 100644
--- a/target/linux/ar71xx/image/generic.mk
+++ b/target/linux/ar71xx/image/generic.mk
@@ -523,6 +523,19 @@  define Device/gl-ar750s
 endef
 TARGET_DEVICES += gl-ar750s
 
+define Device/gl-x1200
+  DEVICE_TITLE := GL.iNet GL-X1200
+  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887 kmod-usb-core \
+	kmod-usb2 kmod-usb-storage
+  BOARDNAME := GL-X1200
+  SUPPORTED_DEVICES := gl-x1200
+  IMAGE_SIZE := 16000k
+  MTDPARTS := spi0.0:256k(u-boot)ro,64k(u-boot-env),64k(art)ro,-(firmware)
+  IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \
+	append-rootfs | pad-rootfs | append-metadata | check-size $$$$(IMAGE_SIZE)
+endef
+TARGET_DEVICES += gl-x1200
+
 define Device/gl-domino
   DEVICE_TITLE := GL.iNet Domino Pi
   DEVICE_PACKAGES := kmod-usb-core kmod-usb2