Module Name:    src
Committed By:   ryo
Date:           Wed Oct  5 15:54:58 UTC 2016

Modified Files:
        src/sys/arch/evbmips/conf: files.rasoc
        src/sys/arch/evbmips/rasoc: autoconf.c console.c machdep.c
        src/sys/arch/mips/ralink: ralink_com.c ralink_eth.c ralink_gpio.c
            ralink_gpio.h ralink_intr.c ralink_mainbus.c ralink_reg.h
            ralink_var.h
Added Files:
        src/sys/arch/evbmips/conf: LINKITSMART7688

Log Message:
add support MT7628/MediaTek LinkIt Smart 7688
by @hiroshi and me.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/sys/arch/evbmips/conf/LINKITSMART7688
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbmips/conf/files.rasoc
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/evbmips/rasoc/autoconf.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbmips/rasoc/console.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbmips/rasoc/machdep.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/mips/ralink/ralink_com.c \
    src/sys/arch/mips/ralink/ralink_intr.c \
    src/sys/arch/mips/ralink/ralink_mainbus.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/mips/ralink/ralink_eth.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/mips/ralink/ralink_gpio.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/mips/ralink/ralink_gpio.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/mips/ralink/ralink_reg.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/mips/ralink/ralink_var.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/evbmips/conf/files.rasoc
diff -u src/sys/arch/evbmips/conf/files.rasoc:1.4 src/sys/arch/evbmips/conf/files.rasoc:1.5
--- src/sys/arch/evbmips/conf/files.rasoc:1.4	Sun Jul 20 10:22:54 2014
+++ src/sys/arch/evbmips/conf/files.rasoc	Wed Oct  5 15:54:58 2016
@@ -1,6 +1,6 @@
-#	$NetBSD: files.rasoc,v 1.4 2014/07/20 10:22:54 alnsn Exp $
+#	$NetBSD: files.rasoc,v 1.5 2016/10/05 15:54:58 ryo Exp $
 
-defflag opt_rasoc.h				RT3050 RT3052 RT3883 MT7620
+defflag opt_rasoc.h				RT3050 RT3052 RT3883 MT7620 MT7628
 
 file	arch/mips/mips/bus_dma.c
 file	arch/mips/mips/mips3_clock.c
@@ -15,7 +15,7 @@ file	arch/evbmips/rasoc/machdep.c
 file	arch/evbmips/rasoc/console.c
 
 # System bus
-device	mainbus { }
+device	mainbus { [addr = -1] }
 attach	mainbus at root
 file	arch/mips/ralink/ralink_mainbus.c	mainbus
 
@@ -41,6 +41,9 @@ include "dev/scsipi/files.scsipi"
 # Machine-independent USB device support
 include "dev/usb/files.usb"
 
+# Machine-independent Bluetooth device support
+include "dev/bluetooth/files.bluetooth"
+
 # Memory Disk
 file	dev/md_root.c				memory_disk_hooks
 

Index: src/sys/arch/evbmips/rasoc/autoconf.c
diff -u src/sys/arch/evbmips/rasoc/autoconf.c:1.5 src/sys/arch/evbmips/rasoc/autoconf.c:1.6
--- src/sys/arch/evbmips/rasoc/autoconf.c:1.5	Wed Apr 30 01:02:40 2014
+++ src/sys/arch/evbmips/rasoc/autoconf.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.5 2014/04/30 01:02:40 matt Exp $	*/
+/*	$NetBSD: autoconf.c,v 1.6 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.5 2014/04/30 01:02:40 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.6 2016/10/05 15:54:58 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -69,6 +69,15 @@ static const struct cfg_info {
 	uint32_t map_rst;
 	uint32_t map_clkcfg1;
 } map_info[] = {
+#if defined(MT7628)
+	{ "rpci", RST_PCIE0_7620, SYSCTL_CLKCFG1_PCIE_CLK_EN_7620 },
+	{ "ohci", RST_UHST0_7620|RST_UHST,
+	    SYSCTL_CLKCFG1_UPHY0_CLK_EN_7620|SYSCTL_CLKCFG1_UPHY0_CLK_EN_7628 },
+	{ "ehci", RST_UHST0_7620|RST_UHST,
+	    SYSCTL_CLKCFG1_UPHY0_CLK_EN_7620|SYSCTL_CLKCFG1_UPHY0_CLK_EN_7628 },
+	{ "sdhc", RST_SDHC_7620, SYSCTL_CLKCFG1_SDHC_CLK_EN },
+	{ "rsw", RST_ESW_7620, SYSCTL_CLKCFG1_ESW_CLK_EN },
+#endif
 #if defined(MT7620)
 	{ "rpci", RST_PCIE0_7620, SYSCTL_CLKCFG1_PCIE_CLK_EN_7620 },
 	{ "ohci", RST_UHST0_7620|RST_UHST, SYSCTL_CLKCFG1_UPHY0_CLK_EN_7620 },

Index: src/sys/arch/evbmips/rasoc/console.c
diff -u src/sys/arch/evbmips/rasoc/console.c:1.2 src/sys/arch/evbmips/rasoc/console.c:1.3
--- src/sys/arch/evbmips/rasoc/console.c:1.2	Thu Jul 28 15:50:13 2011
+++ src/sys/arch/evbmips/rasoc/console.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: console.c,v 1.2 2011/07/28 15:50:13 matt Exp $	*/
+/*	$NetBSD: console.c,v 1.3 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: console.c,v 1.2 2011/07/28 15:50:13 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: console.c,v 1.3 2016/10/05 15:54:58 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -38,6 +38,9 @@ __KERNEL_RCSID(0, "$NetBSD: console.c,v 
 #include <mips/ralink/ralink_reg.h>
 #include <mips/ralink/ralink_var.h>
 
+#ifndef RALINK_CONADDR
+#define RALINK_CONADDR	RA_UART_LITE_BASE	/* default console is UART_LITE */
+#endif
 
 static inline uint32_t
 sysctl_read(const u_int offset)
@@ -54,13 +57,13 @@ sysctl_write(const u_int offset, uint32_
 static inline uint32_t
 uart_read(const u_int offset)
 {
-	return *RA_IOREG_VADDR(RA_UART_LITE_BASE, offset);
+	return *RA_IOREG_VADDR(RALINK_CONADDR, offset);
 }
 
 static inline void
 uart_write(const u_int offset, const uint32_t val)
 {
-	*RA_IOREG_VADDR(RA_UART_LITE_BASE, offset) = val;
+	*RA_IOREG_VADDR(RALINK_CONADDR, offset) = val;
 }
 
 #ifdef RA_CONSOLE_EARLY 

Index: src/sys/arch/evbmips/rasoc/machdep.c
diff -u src/sys/arch/evbmips/rasoc/machdep.c:1.11 src/sys/arch/evbmips/rasoc/machdep.c:1.12
--- src/sys/arch/evbmips/rasoc/machdep.c:1.11	Fri Jun 26 22:14:01 2015
+++ src/sys/arch/evbmips/rasoc/machdep.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.11 2015/06/26 22:14:01 matt Exp $	*/
+/*	$NetBSD: machdep.c,v 1.12 2016/10/05 15:54:58 ryo Exp $	*/
 
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.11 2015/06/26 22:14:01 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.12 2016/10/05 15:54:58 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/boot_flag.h>
@@ -162,7 +162,7 @@ mach_init(void)
 	/*
 	 * Determine the memory size.
 	 */
-#if defined(MT7620)
+#if defined(MT7620) || defined(MT7628)
 	memsize = 128 << 20;
 #else
 	memsize = *(volatile uint32_t *)

Index: src/sys/arch/mips/ralink/ralink_com.c
diff -u src/sys/arch/mips/ralink/ralink_com.c:1.4 src/sys/arch/mips/ralink/ralink_com.c:1.5
--- src/sys/arch/mips/ralink/ralink_com.c:1.4	Wed Apr 30 00:51:26 2014
+++ src/sys/arch/mips/ralink/ralink_com.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_com.c,v 1.4 2014/04/30 00:51:26 matt Exp $	*/
+/*	$NetBSD: ralink_com.c,v 1.5 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -130,8 +130,9 @@
 /* ralink_com.c -- Ralink 3052 uart console driver */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ralink_com.c,v 1.4 2014/04/30 00:51:26 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ralink_com.c,v 1.5 2016/10/05 15:54:58 ryo Exp $");
 
+#include "locators.h"
 #include <sys/param.h>
 #include <sys/bus.h>
 #include <sys/device.h>
@@ -153,8 +154,10 @@ __KERNEL_RCSID(0, "$NetBSD: ralink_com.c
 #include "opt_com.h"
 
 struct ralink_com_softc {
-    struct com_softc sc_com;
-    void *           sc_ih;
+	struct com_softc sc_com;
+	void *sc_ih;
+	bus_addr_t sc_addr;
+	int sc_irq;
 };
 
 static int ralink_com_match(device_t, cfdata_t , void *);
@@ -171,6 +174,57 @@ CFATTACH_DECL_NEW(ralink_com, sizeof(str
 #error  COM_REGMAP not defined!
 #endif
 
+#ifndef RALINK_CONADDR
+#define RALINK_CONADDR	RA_UART_LITE_BASE	/* default console is UART_LITE */
+#endif
+
+/* address/irq/rst/gpiomode mappings */
+static struct {
+	bus_addr_t addr;
+	int irq;
+	uint32_t rst;
+	uint32_t gpiomode;
+} ralink_uart_maps[] = {
+#ifdef MT7628
+	{ RA_UART_LITE_BASE, RA_IRQ_UARTL, RST_UART0_7628, GPIO1MODE_UART0 },
+	{ RA_UART1_BASE,     RA_IRQ_UART1, RST_UART1_7628, GPIO1MODE_UART1 },
+	{ RA_UART2_BASE,     RA_IRQ_UART2, RST_UART2_7628, GPIO1MODE_UART2 },
+#else
+	{ RA_UART_BASE,      RA_IRQ_UARTF, RST_UART,  GPIOMODE_UARTF0 },
+	{ RA_UART_LITE_BASE, RA_IRQ_UARTL, RST_UARTL, GPIOMODE_UARTL }
+#endif
+};
+
+static inline int
+ra_uart2irq(bus_addr_t addr)
+{
+	int i;
+	for (i = 0; __arraycount(ralink_uart_maps); i++)
+		if (ralink_uart_maps[i].addr == addr)
+			return ralink_uart_maps[i].irq;
+	return -1;
+}
+
+static inline uint32_t
+ra_uart2rst(bus_addr_t addr)
+{
+	int i;
+	for (i = 0; __arraycount(ralink_uart_maps); i++)
+		if (ralink_uart_maps[i].addr == addr)
+			return ralink_uart_maps[i].rst;
+	return 0;
+}
+
+static inline uint32_t
+ra_uart2gpiomode(bus_addr_t addr)
+{
+	int i;
+	for (i = 0; __arraycount(ralink_uart_maps); i++)
+		if (ralink_uart_maps[i].addr == addr)
+			return ralink_uart_maps[i].gpiomode;
+	return 0;
+}
+
 static inline uint32_t
 sysctl_read(const u_int offset)
 {
@@ -186,20 +240,20 @@ sysctl_write(const u_int offset, uint32_
 static inline uint32_t
 uart_read(const u_int offset)
 {
-	return *RA_IOREG_VADDR(RA_UART_LITE_BASE, offset);
+	return *RA_IOREG_VADDR(RALINK_CONADDR, offset);
 }
 
 static inline void
 uart_write(const u_int offset, const uint32_t val)
 {
-	*RA_IOREG_VADDR(RA_UART_LITE_BASE, offset) = val;
+	*RA_IOREG_VADDR(RALINK_CONADDR, offset) = val;
 }
 
 #ifdef RALINK_CONSOLE_EARLY
 static int
 ralink_cngetc(dev_t dv)
 {
-        if ((uart_read(RA_UART_LSR) & LSR_RXRDY) == 0)
+	if ((uart_read(RA_UART_LSR) & LSR_RXRDY) == 0)
 		return -1;
 
 	return uart_read(RA_UART_RBR) & 0xff;
@@ -210,14 +264,14 @@ ralink_cnputc(dev_t dv, int c)
 {
 	int timo = 150000;
 
-        while ((uart_read(RA_UART_LSR) & LSR_TXRDY) == 0 && --timo > 0)
+	while ((uart_read(RA_UART_LSR) & LSR_TXRDY) == 0 && --timo > 0)
 		;
 
 	uart_write(RA_UART_TBR, c);
 	__asm __volatile("sync");
 
 	timo = 150000;
-        while ((uart_read(RA_UART_LSR) & LSR_TSRE) == 0 && --timo > 0)
+	while ((uart_read(RA_UART_LSR) & LSR_TSRE) == 0 && --timo > 0)
 		;
 }
 
@@ -238,15 +292,26 @@ ralink_console_early(void)
 int
 ralink_com_match(device_t parent, cfdata_t cf, void *aux)
 {
+	const struct mainbus_attach_args *ma;
+	bus_addr_t addr;
+
+	ma = aux;
+	addr = ma->ma_addr;
+	if (addr == MAINBUSCF_ADDR_DEFAULT)
+		addr = RA_UART_LITE_BASE;
+
+	if (ra_uart2irq(addr) < 0)
+		return 0;
+
 	if (cn_tab == NULL || cn_tab->cn_pri < CN_NORMAL) {
 		printf("NULL console set, don't install ourselves "
-			"(of course this shouldn't print)");
+		    "(of course this shouldn't print)");
 		return 0;
 	}
 
 	/*
 	 * If we got this far, assume we want to install it as the console.
-	 * No need to probe. Future possibilities include checking to see if it 
+	 * No need to probe. Future possibilities include checking to see if it
 	 * is console or KGDB but now it is our only console method if we aren't
 	 * forcing a null console
 	 */
@@ -262,23 +327,50 @@ ralink_com_attach(device_t parent, devic
 	bus_space_handle_t ioh;
 	int error;
 
-	if ((error = bus_space_map(ma->ma_memt, RA_UART_LITE_BASE,
-	    0x1000, 0, &ioh)) != 0) {
+	/* opt addr and irq */
+	rtsc->sc_addr = ma->ma_addr;
+	if (rtsc->sc_addr == MAINBUSCF_ADDR_DEFAULT)
+		rtsc->sc_addr = RA_UART_LITE_BASE;
+	rtsc->sc_irq = ra_uart2irq(rtsc->sc_addr);
+
+	if ((error = bus_space_map(ma->ma_memt, rtsc->sc_addr,
+	    RA_UART_SIZE, 0, &ioh)) != 0) {
 		aprint_error(": can't map registers, error=%d\n", error);
 		return;
 	}
 
-	COM_INIT_REGS(sc->sc_regs, ma->ma_memt, ioh, RA_UART_LITE_BASE);
 	sc->sc_dev = self;
 	sc->sc_frequency = RA_UART_FREQ;
-	sc->sc_regs.cr_nports = 0x1000;
+	sc->sc_regs.cr_nports = 32;
+#if defined(MT7628)
+	sc->sc_type = COM_TYPE_NORMAL;
+#else
 	sc->sc_type = COM_TYPE_AU1x00;
+#endif
 	sc->enabled = 1;
 
-	ralink_com_initmap(&sc->sc_regs);
+	/* reset hardware if not a console */
+	if (rtsc->sc_addr != RALINK_CONADDR) {
+		uint32_t r;
+
+		/* reset */
+		r = sysctl_read(RA_SYSCTL_RST);
+		r |= ra_uart2rst(rtsc->sc_addr);
+		sysctl_write(RA_SYSCTL_RST, r);
+		r ^= ra_uart2rst(rtsc->sc_addr);
+		sysctl_write(RA_SYSCTL_RST, r);
 
-	rtsc->sc_ih = ra_intr_establish(RA_IRQ_UARTL, comintr, sc, 1);
+		/* make sure we are in UART mode */
+		r = sysctl_read(RA_SYSCTL_GPIOMODE);
+		r &= ra_uart2gpiomode(rtsc->sc_addr);
+		r |= __SHIFTIN(0, ra_uart2gpiomode(rtsc->sc_addr));
+		sysctl_write(RA_SYSCTL_GPIOMODE, r);
+	}
+
+	COM_INIT_REGS(sc->sc_regs, ma->ma_memt, ioh, rtsc->sc_addr);
+	ralink_com_initmap(&sc->sc_regs);
 
+	rtsc->sc_ih = ra_intr_establish(rtsc->sc_irq, comintr, sc, 1);
 	com_attach_subr(sc);
 }
 
@@ -288,6 +380,9 @@ ralink_com_initmap(struct com_regs *regs
 	regsp->cr_map[COM_REG_RXDATA] = RA_UART_RBR;
 	regsp->cr_map[COM_REG_TXDATA] = RA_UART_TBR;
 	regsp->cr_map[COM_REG_DLBL]   = RA_UART_DLL;
+#if defined(MT7628)
+	regsp->cr_map[COM_REG_DLBH]   = RA_UART_DLM;
+#endif
 	regsp->cr_map[COM_REG_IER]    = RA_UART_IER;
 	regsp->cr_map[COM_REG_IIR]    = RA_UART_IIR;
 	regsp->cr_map[COM_REG_FIFO]   = RA_UART_FCR;
@@ -298,7 +393,7 @@ ralink_com_initmap(struct com_regs *regs
 }
 
 void
-ralink_com_early(int silent) 
+ralink_com_early(int silent)
 {
 	struct com_regs regs;
 	uint32_t r;
@@ -306,9 +401,9 @@ ralink_com_early(int silent) 
 
 	/* reset */
 	r = sysctl_read(RA_SYSCTL_RST);
-	r |= RST_UARTL;
+	r |= ra_uart2rst(RALINK_CONADDR);
 	sysctl_write(RA_SYSCTL_RST, r);
-	r ^= RST_UARTL;
+	r ^= ra_uart2rst(RALINK_CONADDR);
 	sysctl_write(RA_SYSCTL_RST, r);
 
 	if (silent) {
@@ -317,12 +412,14 @@ ralink_com_early(int silent) 
 		 * effectively tri-stating the UARTL block
 		 */
 		r = sysctl_read(RA_SYSCTL_GPIOMODE);
-		r |= GPIOMODE_UARTL;
+		r &= ra_uart2gpiomode(RALINK_CONADDR);
+		r |= __SHIFTIN(1, ra_uart2gpiomode(RALINK_CONADDR));
 		sysctl_write(RA_SYSCTL_GPIOMODE, r);
 	} else {
 		/* make sure we are in UART mode */
 		r = sysctl_read(RA_SYSCTL_GPIOMODE);
-		r &= ~GPIOMODE_UARTL;
+		r &= ra_uart2gpiomode(RALINK_CONADDR);
+		r |= __SHIFTIN(0, ra_uart2gpiomode(RALINK_CONADDR));
 		sysctl_write(RA_SYSCTL_GPIOMODE, r);
 	}
 
@@ -331,16 +428,18 @@ ralink_com_early(int silent) 
 
 	/* set baud rate */
 	uart_write(RA_UART_LCR,
-		UART_LCR_WLS0 | UART_LCR_WLS1 | UART_LCR_DLAB);
+	    UART_LCR_WLS0 | UART_LCR_WLS1 | UART_LCR_DLAB);
 	uart_write(RA_UART_DLL,
-		(RA_UART_FREQ / RA_SERIAL_CLKDIV / RA_BAUDRATE)
-			& 0xffff);
-	uart_write(RA_UART_LCR,
-		UART_LCR_WLS0 | UART_LCR_WLS1);
+	    (RA_UART_FREQ / RA_SERIAL_CLKDIV / RA_BAUDRATE) & 0xffff);
+#if defined(MT7628)
+	uart_write(RA_UART_DLM,
+	    ((RA_UART_FREQ / RA_SERIAL_CLKDIV / RA_BAUDRATE) & 0xffff) >> 8);
+#endif
+	uart_write(RA_UART_LCR, UART_LCR_WLS0 | UART_LCR_WLS1);
 
 	regs.cr_iot = &ra_bus_memt;
-	regs.cr_iobase = RA_UART_LITE_BASE;
-	regs.cr_nports = 0x1000;
+	regs.cr_iobase = RALINK_CONADDR;
+	regs.cr_nports = 32;
 	ralink_com_initmap(&regs);
 
 	if ((error = bus_space_map(regs.cr_iot, regs.cr_iobase, regs.cr_nports,
@@ -348,7 +447,12 @@ ralink_com_early(int silent) 
 		return;
 	}
 
+#if defined(MT7628)
+	comcnattach1(&regs, RA_BAUDRATE, RA_UART_FREQ,
+	    COM_TYPE_NORMAL, CONMODE);
+#else
 	/* Ralink UART has a 16-bit rate latch (like the AU1x00) */
 	comcnattach1(&regs, RA_BAUDRATE, RA_UART_FREQ,
-		COM_TYPE_AU1x00, CONMODE);
+	    COM_TYPE_AU1x00, CONMODE);
+#endif
 }
Index: src/sys/arch/mips/ralink/ralink_intr.c
diff -u src/sys/arch/mips/ralink/ralink_intr.c:1.4 src/sys/arch/mips/ralink/ralink_intr.c:1.5
--- src/sys/arch/mips/ralink/ralink_intr.c:1.4	Fri Aug 26 15:45:48 2016
+++ src/sys/arch/mips/ralink/ralink_intr.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_intr.c,v 1.4 2016/08/26 15:45:48 skrll Exp $	*/
+/*	$NetBSD: ralink_intr.c,v 1.5 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -29,7 +29,7 @@
 #define __INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ralink_intr.c,v 1.4 2016/08/26 15:45:48 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ralink_intr.c,v 1.5 2016/10/05 15:54:58 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -96,13 +96,6 @@ static const struct ipl_sr_map ralink_ip
  * USB
  */
 
-
-/*
- * we use 5 MIPS cpu interrupts: 
- *	MIPS INT0 .. INT4
- */
-#define NCPUINTRS	5
-
 struct ra_intr {
 	LIST_HEAD(, evbmips_intrhand) intr_list;
 	struct evcnt intr_evcnt;
@@ -115,26 +108,36 @@ struct ra_intr {
  */
 static struct ra_intr ra_intrtab[RA_IRQ_MAX];
 static const char * const ra_intr_names[RA_IRQ_MAX] = {
-        "intr 0 (lowpri)",
-        "intr 1 (highpri)",
-        "intr 2 (pci)",
-        "intr 3 (frame)",
-        "intr 4 (wlan)",
-        "intr 5 (timer)",
-	"intr 0 (sysctl)",
-	"intr 1 (timer0)",
-	"intr 2 (watchdog)",
-	"intr 3 (illacc)",
-	"intr 4 (pcm)",
-	"intr 5 (uartf)",
-	"intr 6 (gpio)",
-	"intr 7 (dma)",
-	"intr 8 (nand)",
-	"intr 9 (perf)",
-	"intr 10 (i2s)",
-	"intr 12 (uartl)",
-	"intr 17 (ethsw)",
-	"intr 18 (usb)"
+	/* CPU interrupts */
+	[RA_IRQ_LOW]	= "intr 0 (lowpri)",
+	[RA_IRQ_HIGH]	= "intr 1 (highpri)",
+	[RA_IRQ_PCI]	= "intr 2 (pci)",
+	[RA_IRQ_FENGINE]= "intr 3 (frame)",
+	[RA_IRQ_WLAN]	= "intr 4 (wlan)",
+	[RA_IRQ_TIMER]	= "intr 5 (timer)",
+
+	/* Interrupt controller */
+	[RA_IRQ_SYSCTL]	= "intc sysctl",
+	[RA_IRQ_TIMER0]	= "intc timer0",
+	[RA_IRQ_WDOG]	= "intc wdog",
+	[RA_IRQ_ILLACC]	= "intc illacc",
+	[RA_IRQ_PCM]	= "intc pcm",
+	[RA_IRQ_UARTF]	= "intc uartf",
+	[RA_IRQ_PIO]	= "intc gpio",
+	[RA_IRQ_DMA]	= "intc dma",
+	[RA_IRQ_NAND]	= "intc nand",
+	[RA_IRQ_PERF]	= "intc pef",
+	[RA_IRQ_I2S]	= "intc i2s",
+	[RA_IRQ_SPI]	= "intc spi",
+	[RA_IRQ_UARTL]	= "intc uartl",
+	[RA_IRQ_CRYPTO]	= "intc crypto",
+	[RA_IRQ_SDHC]	= "intc sdhc",
+	[RA_IRQ_R2P]	= "intc r2p",
+	[RA_IRQ_ETHSW]	= "intc ethsw",
+	[RA_IRQ_USB]	= "intc usb",
+	[RA_IRQ_UDEV]	= "intc udev",
+	[RA_IRQ_UART1]	= "intc uart1",
+	[RA_IRQ_UART2]	= "intc uart2",
 };
 
 /* determine if irq belongs to the PIC */
@@ -142,12 +145,69 @@ static const char * const ra_intr_names[
 
 /* map the IRQ num to PIC reg bits */
 static const uint8_t irq2bit[RA_IRQ_MAX] = {
-    -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 17, 18
+	/* CPU interrupts */
+	[RA_IRQ_LOW]	= -1,
+	[RA_IRQ_HIGH]	= -1,
+	[RA_IRQ_PCI]	= -1,
+	[RA_IRQ_FENGINE]= -1,
+	[RA_IRQ_WLAN]	= -1,
+	[RA_IRQ_TIMER]	= -1,
+
+	/* Interrupt controller */
+	[RA_IRQ_SYSCTL]	= INT_SYSCTL,
+	[RA_IRQ_TIMER0]	= INT_TIMER0,
+	[RA_IRQ_WDOG]	= INT_WDOG,
+	[RA_IRQ_ILLACC]	= INT_ILLACC,
+	[RA_IRQ_PCM]	= INT_PCM,
+	[RA_IRQ_UARTF]	= INT_UARTF,
+	[RA_IRQ_PIO]	= INT_PIO,
+	[RA_IRQ_DMA]	= INT_DMA,
+	[RA_IRQ_NAND]	= INT_NAND,
+	[RA_IRQ_PERF]	= INT_PERF,
+	[RA_IRQ_I2S]	= INT_I2S,
+	[RA_IRQ_SPI]	= INT_SPI,
+	[RA_IRQ_UARTL]	= INT_UARTL,
+#ifdef INT_UART1
+	[RA_IRQ_UART1]	= INT_UART1,
+#endif
+#ifdef INT_UART2
+	[RA_IRQ_UART2]	= INT_UART2,
+#endif
+	[RA_IRQ_CRYPTO]	= INT_CRYPTO,
+	[RA_IRQ_SDHC]	= INT_SDHC,
+	[RA_IRQ_R2P]	= INT_R2P,
+	[RA_IRQ_ETHSW]	= INT_ETHSW,
+	[RA_IRQ_USB]	= INT_USB,
+	[RA_IRQ_UDEV]	= INT_UDEV
 };
 
 /* map the PIC reg bits to IRQ num */
-static const uint8_t bit2irq[19] = {
-    6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 255, 17, 255, 255, 255, 255, 18, 19
+static const uint8_t bit2irq[32] = {
+	[INT_SYSCTL]	= RA_IRQ_SYSCTL,
+	[INT_TIMER0]	= RA_IRQ_TIMER0,
+	[INT_WDOG]	= RA_IRQ_WDOG,
+	[INT_ILLACC]	= RA_IRQ_ILLACC,
+	[INT_PCM]	= RA_IRQ_PCM,
+	[INT_UARTF]	= RA_IRQ_UARTF,
+	[INT_PIO]	= RA_IRQ_PIO,
+	[INT_DMA]	= RA_IRQ_DMA,
+	[INT_NAND]	= RA_IRQ_NAND,
+	[INT_PERF]	= RA_IRQ_PERF,
+	[INT_I2S]	= RA_IRQ_I2S,
+	[INT_SPI]	= RA_IRQ_SPI,
+	[INT_UARTL]	= RA_IRQ_UARTL,
+#ifdef INT_UART1
+	[INT_UART1]	= RA_IRQ_UART1,
+#endif
+#ifdef INT_UART2
+	[INT_UART2]	= RA_IRQ_UART2,
+#endif
+	[INT_CRYPTO]	= RA_IRQ_CRYPTO,
+	[INT_SDHC]	= RA_IRQ_SDHC,
+	[INT_R2P]	= RA_IRQ_R2P,
+	[INT_ETHSW]	= RA_IRQ_ETHSW,
+	[INT_USB]	= RA_IRQ_USB,
+	[INT_UDEV]	= RA_IRQ_UDEV
 };
 
 
@@ -174,12 +234,12 @@ evbmips_intr_init(void)
 		LIST_INIT(&ra_intrtab[irq].intr_list);
 		if (PIC_IRQ_P(irq)) {
 			evcnt_attach_dynamic(&ra_intrtab[irq].intr_evcnt,
-				EVCNT_TYPE_INTR, NULL, "pic",
-				ra_intr_names[irq]);
+			    EVCNT_TYPE_INTR, NULL, "pic",
+			    ra_intr_names[irq]);
 		} else {
 			evcnt_attach_dynamic(&ra_intrtab[irq].intr_evcnt,
-				EVCNT_TYPE_INTR, NULL, "cpu0",
-				ra_intr_names[irq]);
+			    EVCNT_TYPE_INTR, NULL, "cpu0",
+			    ra_intr_names[irq]);
 		}
 	}
 
@@ -188,9 +248,9 @@ evbmips_intr_init(void)
 	 * but the block enabled
 	 */
 	intctl_write(RA_INTCTL_DISABLE, ~0);
-	intctl_write(RA_INTCTL_ENABLE, INT_GLOBAL);
+	intctl_write(RA_INTCTL_ENABLE, INT_GLOBAL_EN);
 
-	/* 
+	/*
 	 * establish the low/high priority cpu interrupts.
 	 * note here we pass the value of the priority as the argument
 	 * so it is passed to ra_pic_intr() correctly.
@@ -267,7 +327,7 @@ ra_pic_intr(void *arg)
 {
 	const int priority = (intptr_t)arg;
 	const u_int off = (priority == 0) ?
-		RA_INTCTL_IRQ0STAT : RA_INTCTL_IRQ1STAT;
+	    RA_INTCTL_IRQ0STAT : RA_INTCTL_IRQ1STAT;
 	uint32_t pending = intctl_read(off);
 
 	while (pending != 0) {
Index: src/sys/arch/mips/ralink/ralink_mainbus.c
diff -u src/sys/arch/mips/ralink/ralink_mainbus.c:1.4 src/sys/arch/mips/ralink/ralink_mainbus.c:1.5
--- src/sys/arch/mips/ralink/ralink_mainbus.c:1.4	Wed Apr 30 00:52:49 2014
+++ src/sys/arch/mips/ralink/ralink_mainbus.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_mainbus.c,v 1.4 2014/04/30 00:52:49 matt Exp $	*/
+/*	$NetBSD: ralink_mainbus.c,v 1.5 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -27,8 +27,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ralink_mainbus.c,v 1.4 2014/04/30 00:52:49 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ralink_mainbus.c,v 1.5 2016/10/05 15:54:58 ryo Exp $");
 
+#include "locators.h"
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
@@ -124,6 +125,11 @@ mainbus_attach(device_t parent, device_t
 static int
 mainbus_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
 {
+	struct mainbus_attach_args *ma;
+
+	ma = aux;
+	ma->ma_addr = cf->cf_loc[MAINBUSCF_ADDR];
+
 	if (config_match(parent, cf, aux) > 0)
 		config_attach(parent, cf, aux, mainbus_print);
 	else
@@ -134,9 +140,15 @@ mainbus_search(device_t parent, cfdata_t
 int
 mainbus_print(void *aux, const char *pnp)
 {
+	struct mainbus_attach_args *ma;
+
 	if (pnp)
 		aprint_normal("%s unconfigured\n", pnp);
 
+	ma = aux;
+	if (ma->ma_addr != MAINBUSCF_ADDR_DEFAULT)
+		aprint_normal(" addr 0x%llx", ma->ma_addr);
+
 	return UNCONF;
 }
 
@@ -168,8 +180,9 @@ mainbus_attach_critical(struct mainbus_s
 		cf = config_search_ia(mainbus_find, sc->sc_dev, "mainbus", &ma);
 		if (cf == NULL && critical_devs[i].required)
 			panic("%s: failed to find %s",
-				__func__, critical_devs[i].name);
+			    __func__, critical_devs[i].name);
 
+		ma.ma_addr = cf->cf_loc[MAINBUSCF_ADDR];
 		config_attach(sc->sc_dev, cf, &ma, mainbus_print);
 	}
 }

Index: src/sys/arch/mips/ralink/ralink_eth.c
diff -u src/sys/arch/mips/ralink/ralink_eth.c:1.10 src/sys/arch/mips/ralink/ralink_eth.c:1.11
--- src/sys/arch/mips/ralink/ralink_eth.c:1.10	Wed Oct  5 15:39:31 2016
+++ src/sys/arch/mips/ralink/ralink_eth.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_eth.c,v 1.10 2016/10/05 15:39:31 ryo Exp $	*/
+/*	$NetBSD: ralink_eth.c,v 1.11 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -29,7 +29,7 @@
 /* ralink_eth.c -- Ralink Ethernet Driver */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ralink_eth.c,v 1.10 2016/10/05 15:39:31 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ralink_eth.c,v 1.11 2016/10/05 15:54:58 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -95,7 +95,7 @@ struct ralink_rx_desc {
 #define RXD_IP_VLD	(1 << 31)
 };
 
-/* PDMA RX Descriptor Format */
+/* PDMA TX Descriptor Format */
 struct ralink_tx_desc {
 	uint32_t data_ptr0;
 	uint32_t txd_info1;
@@ -362,7 +362,12 @@ ralink_eth_attach(device_t parent, devic
 	 * do some randomisation using the current uptime.  It's not meant
 	 * for anything but avoiding hard-coding an address.
 	 */
+#ifdef RALINK_ETH_MACADDR
+	uint8_t enaddr[ETHER_ADDR_LEN];
+	ether_aton_r(enaddr, sizeof(enaddr), ___STRING(RALINK_ETH_MACADDR));
+#else
 	uint8_t enaddr[ETHER_ADDR_LEN] = { 0x00, 0x30, 0x44, 0x00, 0x00, 0x00 };
+#endif
 
 	sc->sc_dev = self;
 	sc->sc_dmat = ma->ma_dmat;
@@ -480,7 +485,7 @@ ralink_eth_attach(device_t parent, devic
 	sc->sc_ethercom.ec_mii = &sc->sc_mii;
 	ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
 	    ether_mediastatus);
-	mii_attach(sc->sc_dev, &sc->sc_mii, ~0, i, MII_OFFSET_ANY,
+	mii_attach(sc->sc_dev, &sc->sc_mii, ~0, MII_PHY_ANY, MII_OFFSET_ANY,
 	    MIIF_FORCEANEG|MIIF_DOPAUSE|MIIF_NOISOLATE);
 
 	if (LIST_EMPTY(&sc->sc_mii.mii_phys)) {
@@ -703,7 +708,7 @@ ralink_eth_reset(ralink_eth_softc_t *sc)
 	r ^= RST_FE;
 	sy_write(sc, RA_SYSCTL_RST, r);
 
-	/* Wait until the PDMA is quiscent */
+	/* Wait until the PDMA is quiescent */
 	for (;;) {
 		r = fe_read(sc, RA_FE_PDMA_GLOBAL_CFG);
 		if (r & FE_PDMA_GLOBAL_CFG_RX_DMA_BUSY) {
@@ -732,7 +737,7 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	/* reset to a known good state */
 	ralink_eth_reset(sc);
 
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 	/* Bring the switch to a sane default state (from linux driver) */
 	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_SGC2,
 	    0x00000000);
@@ -746,6 +751,16 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	    0x00001001);
 	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_PVIDC2,
 	    0x00001001);
+#if defined(MT7628)
+	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_VMSC0,
+	    0xffffffff);
+	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_POC0,
+	    0x10007f7f);
+	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_POC2,
+	    0x00007f7f);
+	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_FTC2,
+	    0x0002500c);
+#else
 	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_VMSC0,
 	    0xffff417e);
 	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_POC0,
@@ -754,6 +769,7 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	    0x00007f3f);
 	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_FTC2,
 	    0x00d6500c);
+#endif
 	bus_space_write_4(sc->sc_memt, sc->sc_sw_memh, RA_ETH_SW_SWGC,
 	    0x0008a301);	/* hashing algorithm=XOR48 */
 				/*  aging interval=300sec  */
@@ -870,6 +886,7 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	fe_write(sc, RA_FE_PDMA_GLOBAL_CFG, r);
 	(void) fe_read(sc, RA_FE_PDMA_GLOBAL_CFG);
 
+#if !defined(MT7628)
 	/* Setup the PDMA VLAN ID's */
 	fe_write(sc, RA_FE_VLAN_ID_0001, 0x00010000);
 	fe_write(sc, RA_FE_VLAN_ID_0203, 0x00030002);
@@ -879,20 +896,25 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	fe_write(sc, RA_FE_VLAN_ID_1011, 0x000b000a);
 	fe_write(sc, RA_FE_VLAN_ID_1213, 0x000d000c);
 	fe_write(sc, RA_FE_VLAN_ID_1415, 0x000f000e);
+#endif
 
 	/* Give the TX and TX rings to the chip. */
 	fe_write(sc, RA_FE_PDMA_TX0_PTR,
 	    htole32(MIPS_KSEG0_TO_PHYS(&sc->sc_txdesc)));
 	fe_write(sc, RA_FE_PDMA_TX0_COUNT, htole32(RALINK_ETH_NUM_TX_DESC));
 	fe_write(sc, RA_FE_PDMA_TX0_CPU_IDX, 0);
+#if !defined(MT7628)
 	fe_write(sc, RA_FE_PDMA_RESET_IDX, PDMA_RST_TX0);
+#endif
 
 	fe_write(sc, RA_FE_PDMA_RX0_PTR,
 	    htole32(MIPS_KSEG0_TO_PHYS(&sc->sc_rxdesc)));
 	fe_write(sc, RA_FE_PDMA_RX0_COUNT, htole32(RALINK_ETH_NUM_RX_DESC));
 	fe_write(sc, RA_FE_PDMA_RX0_CPU_IDX,
 	    htole32(RALINK_ETH_NUM_RX_DESC - 1));
+#if !defined(MT7628)
 	fe_write(sc, RA_FE_PDMA_RESET_IDX, PDMA_RST_RX0);
+#endif
 	fe_write(sc, RA_FE_PDMA_RX0_CPU_IDX,
 	    htole32(RALINK_ETH_NUM_RX_DESC - 1));
 
@@ -904,14 +926,28 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	    FE_PDMA_GLOBAL_CFG_BURST_SZ_4);
 
 	/* Setup the clock for the Frame Engine */
+#if defined(MT7628)
+	fe_write(sc, RA_FE_SDM_CON, 0x8100);
+#else
 	fe_write(sc, RA_FE_GLOBAL_CFG,
 	    FE_GLOBAL_CFG_EXT_VLAN(0x8100) |
 	    FE_GLOBAL_CFG_US_CLK(RA_BUS_FREQ / 1000000) |
 	    FE_GLOBAL_CFG_L2_SPACE(0x8));
+#endif
 
 	/* Turn on all interrupts */
+#if defined(MT7628)
+	fe_write(sc, RA_FE_INT_MASK,
+	    RA_FE_INT_RX_DONE_INT1 |
+	    RA_FE_INT_RX_DONE_INT0 |
+	    RA_FE_INT_TX_DONE_INT3 |
+	    RA_FE_INT_TX_DONE_INT2 |
+	    RA_FE_INT_TX_DONE_INT1 |
+	    RA_FE_INT_TX_DONE_INT0);
+#else
 	fe_write(sc, RA_FE_INT_ENABLE,
 	    FE_INT_RX | FE_INT_TX3 | FE_INT_TX2 | FE_INT_TX1 | FE_INT_TX0);
+#endif
 
 	/*
 	 * Configure GDMA forwarding
@@ -922,21 +958,34 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	fe_write(sc, RA_FE_GDMA1_FWD_CFG,
 	    (FE_GDMA_FWD_CFG_DIS_TX_CRC | FE_GDMA_FWD_CFG_DIS_TX_PAD));
 #endif
+
+#if !defined(MT7628)
 	fe_write(sc, RA_FE_GDMA1_FWD_CFG,
 	    FE_GDMA_FWD_CFG_JUMBO_LEN(MCLBYTES/1024) |
 	    FE_GDMA_FWD_CFG_STRIP_RX_CRC |
 	    FE_GDMA_FWD_CFG_IP4_CRC_EN |
 	    FE_GDMA_FWD_CFG_TCP_CRC_EN |
 	    FE_GDMA_FWD_CFG_UDP_CRC_EN);
+#endif
 
 	/* CDMA also needs CRCs turned on */
+#if !defined(MT7628)
 	r = fe_read(sc, RA_FE_CDMA_CSG_CFG);
 	r |= (FE_CDMA_CSG_CFG_IP4_CRC_EN | FE_CDMA_CSG_CFG_UDP_CRC_EN |
 	    FE_CDMA_CSG_CFG_TCP_CRC_EN);
 	fe_write(sc, RA_FE_CDMA_CSG_CFG, r);
+#endif
 
 	/* Configure Flow Control Thresholds */
-#ifdef RT3883
+#if defined(MT7628)
+	sw_write(sc, RA_ETH_SW_FCT0,
+	    RA_ETH_SW_FCT0_FC_RLS_TH(0xc8) |
+	    RA_ETH_SW_FCT0_FC_SET_TH(0xa0) |
+	    RA_ETH_SW_FCT0_DROP_RLS_TH(0x78) |
+	    RA_ETH_SW_FCT0_DROP_SET_TH(0x50));
+	sw_write(sc, RA_ETH_SW_FCT1,
+	    RA_ETH_SW_FCT1_PORT_TH(0x14));
+#elif defined(RT3883)
 	fe_write(sc, RA_FE_PSE_FQ_CFG,
 	    FE_PSE_FQ_MAX_COUNT(0xff) |
 	    FE_PSE_FQ_FC_RELEASE(0x90) |
@@ -949,8 +998,12 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 #endif
 
 #ifdef RALINK_ETH_DEBUG
+#ifdef RA_FE_MDIO_CFG1
 	printf("FE_MDIO_CFG1: 0x%08x\n", fe_read(sc, RA_FE_MDIO_CFG1));
+#endif
+#ifdef RA_FE_MDIO_CFG2
 	printf("FE_MDIO_CFG2: 0x%08x\n", fe_read(sc, RA_FE_MDIO_CFG2));
+#endif
 	printf("FE_PDMA_TX0_PTR: %08x\n", fe_read(sc, RA_FE_PDMA_TX0_PTR));
 	printf("FE_PDMA_TX0_COUNT: %08x\n",
 	    fe_read(sc, RA_FE_PDMA_TX0_COUNT));
@@ -967,16 +1020,27 @@ ralink_eth_hw_init(ralink_eth_softc_t *s
 	    fe_read(sc, RA_FE_PDMA_RX0_DMA_IDX));
 	printf("FE_PDMA_GLOBAL_CFG: %08x\n",
 	    fe_read(sc, RA_FE_PDMA_GLOBAL_CFG));
+#ifdef RA_FE_GLOBAL_CFG
 	printf("FE_GLOBAL_CFG: %08x\n", fe_read(sc, RA_FE_GLOBAL_CFG));
+#endif
+#ifdef RA_FE_GDMA1_FWD_CFG
 	printf("FE_GDMA1_FWD_CFG: %08x\n",
 	    fe_read(sc, RA_FE_GDMA1_FWD_CFG));
+#endif
+#ifdef RA_FE_CDMA_CSG_CFG
 	printf("FE_CDMA_CSG_CFG: %08x\n", fe_read(sc, RA_FE_CDMA_CSG_CFG));
+#endif
+#ifdef RA_FE_PSE_FQ_CFG
 	printf("FE_PSE_FQ_CFG: %08x\n", fe_read(sc, RA_FE_PSE_FQ_CFG));
 #endif
+#endif
 
 	/* Force PSE Reset to get everything finalized */
+#if defined(MT7628)
+#else
 	fe_write(sc, RA_FE_GLOBAL_RESET, FE_GLOBAL_RESET_PSE);
 	fe_write(sc, RA_FE_GLOBAL_RESET, 0);
+#endif
 }
 
 /*
@@ -1351,7 +1415,22 @@ ralink_eth_intr(void *arg)
 		fe_write(sc, RA_FE_INT_STATUS, ~0);
 		RALINK_DEBUG(RALINK_DEBUG_REG,"%s() status: 0x%08x\n",
 		    __func__, status);
+#if defined(MT7628)
+		if ((status & (RA_FE_INT_RX_DONE_INT1 | RA_FE_INT_RX_DONE_INT0 |
+		    RA_FE_INT_TX_DONE_INT3 | RA_FE_INT_TX_DONE_INT2 |
+		    RA_FE_INT_TX_DONE_INT1 | RA_FE_INT_TX_DONE_INT0)) == 0) {
+			if (n == 0)
+				sc->sc_evcnt_spurious_intr.ev_count++;
+			return (n != 0);
+		}
+
+		if (status & (RA_FE_INT_RX_DONE_INT1|RA_FE_INT_RX_DONE_INT0))
+			ralink_eth_rxintr(sc);
 
+		if (status & (RA_FE_INT_TX_DONE_INT3 | RA_FE_INT_TX_DONE_INT2 |
+		    RA_FE_INT_TX_DONE_INT1 | RA_FE_INT_TX_DONE_INT0))
+			ralink_eth_txintr(sc);
+#else
 		if ((status & (FE_INT_RX | FE_INT_TX0)) == 0) {
 			if (n == 0)
 				sc->sc_evcnt_spurious_intr.ev_count++;
@@ -1363,6 +1442,7 @@ ralink_eth_intr(void *arg)
 
 		if (status & FE_INT_TX0)
 			ralink_eth_txintr(sc);
+#endif
 	}
 
 	/* Try to get more packets going. */
@@ -1539,7 +1619,7 @@ ralink_eth_txintr(ralink_eth_softc_t *sc
 			break;
 
 		RALINK_DEBUG(RALINK_DEBUG_REG,"-tx(%d) transmitted\n",
-		    txs->txs_idx);
+		   txs->txs_idx);
 
 		SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q);
 
@@ -1564,7 +1644,7 @@ ralink_eth_txintr(ralink_eth_softc_t *sc
 /*
  * ralink_eth_mdio_enable
  */
-#if defined (RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052)
 static void
 ralink_eth_mdio_enable(ralink_eth_softc_t *sc, bool enable)
 {
@@ -1621,7 +1701,7 @@ ralink_eth_mii_read(device_t self, int p
 #if 0
 	printf("%s() phy_addr: %d  phy_reg: %d\n", __func__, phy_addr, phy_reg);
 #endif
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 	if (phy_addr > 5)
 		return 0;
 #endif
@@ -1635,7 +1715,7 @@ ralink_eth_mii_read(device_t self, int p
 	 */
 	for (;;) {
 		/* rd_rdy: read operation is complete */
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 		if ((sw_read(sc, RA_ETH_SW_PCTL1) & PCTL1_RD_DONE) == 0)
 			break;
 #else
@@ -1644,7 +1724,7 @@ ralink_eth_mii_read(device_t self, int p
 #endif
 	}
 
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 	sw_write(sc, RA_ETH_SW_PCTL0,
 	    PCTL0_RD_CMD | PCTL0_REG(phy_reg) | PCTL0_ADDR(phy_addr));
 #else
@@ -1660,7 +1740,7 @@ ralink_eth_mii_read(device_t self, int p
 	 * TODO: timeout (linux uses jiffies to measure 5 seconds)
 	 */
 	for (;;) {
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 		if ((sw_read(sc, RA_ETH_SW_PCTL1) & PCTL1_RD_DONE) != 0) {
 			int data = PCTL1_RD_VAL(
 			    sw_read(sc, RA_ETH_SW_PCTL1));
@@ -1697,7 +1777,7 @@ ralink_eth_mii_write(device_t self, int 
 	 * TODO: timeout (linux uses jiffies to measure 5 seconds)
 	 */
 	for (;;) {
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 		if ((sw_read(sc, RA_ETH_SW_PCTL1) & PCTL1_RD_DONE) == 0)
 			break;
 #else
@@ -1706,7 +1786,7 @@ ralink_eth_mii_write(device_t self, int 
 #endif
 	}
 
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 	sw_write(sc, RA_ETH_SW_PCTL0,
 	    PCTL0_WR_CMD | PCTL0_WR_VAL(val) | PCTL0_REG(phy_reg) |
 	    PCTL0_ADDR(phy_addr));
@@ -1723,7 +1803,7 @@ ralink_eth_mii_write(device_t self, int 
 
 	/* make sure write operation is complete */
 	for (;;) {
-#if defined(RT3050) || defined(RT3052)
+#if defined(RT3050) || defined(RT3052) || defined(MT7628)
 		if ((sw_read(sc, RA_ETH_SW_PCTL1) & PCTL1_WR_DONE) != 0) {
 			ralink_eth_mdio_enable(sc, false);
 			return;

Index: src/sys/arch/mips/ralink/ralink_gpio.c
diff -u src/sys/arch/mips/ralink/ralink_gpio.c:1.5 src/sys/arch/mips/ralink/ralink_gpio.c:1.6
--- src/sys/arch/mips/ralink/ralink_gpio.c:1.5	Wed Mar 12 22:21:07 2014
+++ src/sys/arch/mips/ralink/ralink_gpio.c	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_gpio.c,v 1.5 2014/03/12 22:21:07 mrg Exp $	*/
+/*	$NetBSD: ralink_gpio.c,v 1.6 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -29,7 +29,7 @@
 /* ra_gpio.c -- Ralink 3052 gpio driver */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ralink_gpio.c,v 1.5 2014/03/12 22:21:07 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ralink_gpio.c,v 1.6 2016/10/05 15:54:58 ryo Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -46,10 +46,12 @@ __KERNEL_RCSID(0, "$NetBSD: ralink_gpio.
 #include <sys/gpio.h>
 #include <dev/gpio/gpiovar.h>
 
-#define SLICKROCK
-
 #include <mips/ralink/ralink_reg.h>
 #include <mips/ralink/ralink_var.h>
+
+#if !defined(MT7628)
+#define SLICKROCK
+#endif
 #include <mips/ralink/ralink_gpio.h>
 
 #if 0
@@ -88,6 +90,10 @@ __KERNEL_RCSID(0, "$NetBSD: ralink_gpio.
  *	1  -  2 I2C    (I2C_SCLK/I2C_SD pins)
  */
 
+#ifdef MT7628
+#define GPIO_PINS 96
+#define SPECIAL_COMMANDS	0
+#else
 #if defined(SLICKROCK)
 #define GPIO_PINS 96
 #else
@@ -100,19 +106,59 @@ __KERNEL_RCSID(0, "$NetBSD: ralink_gpio.
 #define BOOT_COUNT		GPIO_PINS
 #define UPGRADE			(BOOT_COUNT + 1)
 #define SPECIAL_COMMANDS	(UPGRADE + 1 - GPIO_PINS)
+#endif
+
 
 /*
  * The pin_share array maps to the highest pin used for each of the 10
  * GPIO mode bit settings.
  */
+#if defined(MT7628)
+const static struct {
+	int pin_start;
+	int pin_end;
+	uint32_t sysreg;
+	uint32_t regmask;
+	uint32_t mode;
+} gpio_mux_map[] = {
+	{ 0,	3,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_I2S,		1 },
+	{ 4,	5,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_I2C,		1 },
+	{ 6,	6,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_SPI_CS1,	1 },
+	{ 7,	10,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_SPI,		1 },
+	{ 11,	11,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_GPIO,		1 },
+	{ 12,	13,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_UART0,	1 },
+	{ 14,	17,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_SPIS,		1 },
+	{ 18,	18,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_PWM0,		1 },
+	{ 19,	19,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_PWM1,		1 },
+	{ 20,	21,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_UART2,	1 },
+	{ 22,	29,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_SD,		1 },
+	{ 30,	30,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P4_LED_KN,	1 },
+	{ 31,	31,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P3_LED_KN,	1 },
+	{ 32,	32,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P2_LED_KN,	1 },
+	{ 33,	33,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P1_LED_KN,	1 },
+	{ 34,	34,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P0_LED_KN,	1 },
+	{ 35,	35,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_WLED_KN,	1 },
+	{ 36,	36,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_PERST,	1 },
+	{ 37,	37,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_REFCLK,	1 },
+	{ 38,	38,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_WDT,		1 },
+	{ 39,	39,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P4_LED_AN,	1 },
+	{ 40,	40,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P3_LED_AN,	1 },
+	{ 41,	41,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P2_LED_AN,	1 },
+	{ 42,	42,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P1_LED_AN,	1 },
+	{ 43,	43,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_P0_LED_AN,	1 },
+	{ 44,	44,	RA_SYSCTL_GPIO2MODE,	GPIO2MODE_WLED_AN,	1 },
+	{ 45,	45,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_UART1,	1 },
+	{ 46,	46,	RA_SYSCTL_GPIO1MODE,	GPIO1MODE_UART1,	1 },
+};
+#else
 #if defined(SLICKROCK)
 #define SR_GPIO_MODE 0xc1c1f
 #else
-#define GPIO_MODE_SETTINGS 10
-const static u_int8_t pin_share[GPIO_MODE_SETTINGS] = {
+const static u_int8_t pin_share[] = {
 	2, 6, 9, 14, 14, 16, 21, 23, 39, 51
 };
 #endif
+#endif /* MT7628 */
 
 #define DEBOUNCE_TIME 150  /* Milliseconds */
 
@@ -264,13 +310,19 @@ typedef struct ra_gpio_softc {
 
 	struct callout sc_tick_callout;	/* For debouncing inputs */
 
- 	/* 
+	/*
 	 * These track gpio pins that have interrupted
 	 */
+#if defined(MT7628)
+	uint32_t sc_intr_status00_31;
+	uint32_t sc_intr_status32_63;
+	uint32_t sc_intr_status64_95;
+#else
 	uint32_t sc_intr_status00_23;
 	uint32_t sc_intr_status24_39;
 	uint32_t sc_intr_status40_51;
 	uint32_t sc_intr_status72_95;
+#endif
 
 } ra_gpio_softc_t;
 
@@ -321,6 +373,38 @@ typedef struct pin_tab {
  * instead of lots of if/then/else test & branching
  */
 static const pin_tab_t pin_tab[] = {
+#if defined(MT7628)
+    {
+	0, 31, 0, 0xffffffff,
+	RA_PIO_00_31_DATA,
+	RA_PIO_00_31_CLR_BIT,
+	RA_PIO_00_31_SET_BIT,
+	{ 0xffffffff,		RA_PIO_00_31_DIR		},
+	{ 0xffffffff,		RA_PIO_00_31_INT_RISE_EN	},
+	{ 0xffffffff,		RA_PIO_00_31_INT_FALL_EN	},
+	{ 0xffffffff,		RA_PIO_00_31_POLARITY		}
+    },
+    {
+	32, 63, 32, 0xffffffff,
+	RA_PIO_32_63_DATA,
+	RA_PIO_32_63_CLR_BIT,
+	RA_PIO_32_63_SET_BIT,
+	{ 0xffffffff,		RA_PIO_32_63_DIR		},
+	{ 0xffffffff,		RA_PIO_32_63_INT_RISE_EN	},
+	{ 0xffffffff,		RA_PIO_32_63_INT_FALL_EN	},
+	{ 0xffffffff,		RA_PIO_32_63_POLARITY		}
+    },
+    {
+	64, 95, 64, 0xffffffff,
+	RA_PIO_64_95_DATA,
+	RA_PIO_64_95_CLR_BIT,
+	RA_PIO_64_95_SET_BIT,
+	{ 0xffffffff,		RA_PIO_64_95_DIR		},
+	{ 0xffffffff,		RA_PIO_64_95_INT_RISE_EN	},
+	{ 0xffffffff,		RA_PIO_64_95_INT_FALL_EN	},
+	{ 0xffffffff,		RA_PIO_64_95_POLARITY		}
+    }
+#else
     {
 	0, 24, 0, GPIO_PIN_MASK,
 	RA_PIO_00_23_DATA,
@@ -363,6 +447,7 @@ static const pin_tab_t pin_tab[] = {
 	{ GPIO_POL_MASK_72_95,           RA_PIO_72_95_POLARITY,    },
     },
 #endif
+#endif
 };
 
 /*
@@ -370,6 +455,15 @@ static const pin_tab_t pin_tab[] = {
  * for a given pin.  -1 means there is no pin there.
  */
 static const int pin_tab_index[GPIO_PINS] = {
+#if defined(MT7628)
+/*		 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 */
+/*  0 */	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 16 */	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* 32 */	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* 48 */	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+/* 64 */	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+/* 80 */	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+#else /* !MT7628 */
 /*		 0   1   2   3   4   5   6   7   8   9	*/
 /*  0 */	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 /* 10 */	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -385,6 +479,7 @@ static const int pin_tab_index[GPIO_PINS
 /* 80 */	 3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
 /* 90 */	 3,  3,  3,  3,  3,  3
 #endif
+#endif /* !MT7628 */
 };
 
 CFATTACH_DECL_NEW(rgpio, sizeof(struct ra_gpio_softc), ra_gpio_match,
@@ -412,7 +507,7 @@ static inline uint32_t
 sy_read(ra_gpio_softc_t *sc, bus_size_t off)
 {
 	KASSERTMSG((off & 3) == 0, "%s: unaligned off=%#" PRIxBUSSIZE "\n",
-		__func__, off);
+	    __func__, off);
 	return bus_space_read_4(sc->sc_memt, sc->sc_sy_memh, off);
 }
 
@@ -420,7 +515,7 @@ static inline void
 sy_write(ra_gpio_softc_t *sc, bus_size_t off, uint32_t val)
 {
 	KASSERTMSG((off & 3) == 0, "%s: unaligned off=%#" PRIxBUSSIZE "\n",
-		__func__, off);
+	    __func__, off);
 	bus_space_write_4(sc->sc_memt, sc->sc_sy_memh, off, val);
 }
 
@@ -428,7 +523,7 @@ static inline uint32_t
 gp_read(ra_gpio_softc_t *sc, bus_size_t off)
 {
 	KASSERTMSG((off & 3) == 0, "%s: unaligned off=%#" PRIxBUSSIZE "\n",
-		__func__, off);
+	    __func__, off);
 	return bus_space_read_4(sc->sc_memt, sc->sc_gp_memh, off);
 }
 
@@ -436,7 +531,7 @@ static inline void
 gp_write(ra_gpio_softc_t *sc, bus_size_t off, uint32_t val)
 {
 	KASSERTMSG((off & 3) == 0, "%s: unaligned off=%#" PRIxBUSSIZE "\n",
-		__func__, off);
+	    __func__, off);
 	bus_space_write_4(sc->sc_memt, sc->sc_gp_memh, off, val);
 }
 
@@ -511,6 +606,27 @@ ra_gpio_attach(device_t parent, device_t
 	}
 
 	/* Reset some registers */
+#if defined(MT7628)
+	gp_write(sc, RA_PIO_00_31_INT_RISE_EN, 0xffffffff);
+	gp_write(sc, RA_PIO_00_31_INT_FALL_EN, 0xffffffff);
+	gp_write(sc, RA_PIO_00_31_INT_HIGH_EN, 0);
+	gp_write(sc, RA_PIO_00_31_INT_LOW_EN, 0);
+
+	gp_write(sc, RA_PIO_32_63_INT_RISE_EN, 0xffffffff);
+	gp_write(sc, RA_PIO_32_63_INT_FALL_EN, 0xffffffff);
+	gp_write(sc, RA_PIO_32_63_INT_HIGH_EN, 0);
+	gp_write(sc, RA_PIO_32_63_INT_LOW_EN, 0);
+
+	gp_write(sc, RA_PIO_64_95_INT_RISE_EN, 0xffffffff);
+	gp_write(sc, RA_PIO_64_95_INT_FALL_EN, 0xffffffff);
+	gp_write(sc, RA_PIO_64_95_INT_HIGH_EN, 0);
+	gp_write(sc, RA_PIO_64_95_INT_LOW_EN, 0);
+
+	gp_write(sc, RA_PIO_00_31_POLARITY, 0);
+	gp_write(sc, RA_PIO_32_63_POLARITY, 0);
+	gp_write(sc, RA_PIO_64_95_POLARITY, 0);
+
+#else
 	gp_write(sc, RA_PIO_00_23_INT, 0xffffff);
 	gp_write(sc, RA_PIO_00_23_EDGE_INT, 0xffffff);
 	gp_write(sc, RA_PIO_24_39_INT, 0xffff);
@@ -522,6 +638,7 @@ ra_gpio_attach(device_t parent, device_t
 	gp_write(sc, RA_PIO_72_95_INT, 0xffffff);
 	gp_write(sc, RA_PIO_72_95_EDGE_INT, 0xffffff);
 #endif
+#endif
 
 	/* Set up for interrupt handling, low priority interrupt queue */
 	sc->sc_ih = ra_intr_establish(RA_IRQ_PIO,
@@ -562,7 +679,7 @@ ra_gpio_attach(device_t parent, device_t
 	gpio_reset_registers(sc);
 
 	/* Initialize the GPIO pins */
-	for (int pin=0; pin < GPIO_PINS; pin++)
+	for (int pin = 0; pin < GPIO_PINS; pin++)
 		ra_gpio_pin_init(sc, pin);
 
 #if 0
@@ -621,10 +738,14 @@ ra_gpio_attach(device_t parent, device_t
 	gp_write(sc, RA_PIO_72_95_EDGE_INT, 0xffffff);
 #endif
 
+#ifdef BOOT_COUNT
 	sc->sc_pins[BOOT_COUNT].pin_flags = GPIO_PIN_OUTPUT;
 	sc->sc_pins[BOOT_COUNT].pin_mapped = 0;
+#endif
+#ifdef UPGRADE
 	sc->sc_pins[UPGRADE].pin_flags = GPIO_PIN_OUTPUT;
 	sc->sc_pins[UPGRADE].pin_mapped = 0;
+#endif
 	gba.gba_gc = &sc->sc_gc;
 	gba.gba_pins = sc->sc_pins;
 
@@ -692,6 +813,23 @@ ra_gpio_pin_init(ra_gpio_softc_t *sc, in
 	    GPIO_PIN_INVIN | GPIO_PIN_INVOUT;
 	sc->sc_pins[pin].pin_state = GPIO_PIN_INPUT;
 
+#if defined(MT7628)
+	/*
+	 * Set the SYSCTL_GPIO{1,2}MODE register
+	 * for the PIO block of any mapped GPIO
+	 */
+	for (int i = 0; i < __arraycount(gpio_mux_map); i++) {
+		if ((pin >= gpio_mux_map[i].pin_start) &&
+		    (pin >= gpio_mux_map[i].pin_end)) {
+			r = sy_read(sc, gpio_mux_map[i].sysreg);
+			r &= ~gpio_mux_map[i].regmask;
+			r |= __SHIFTIN(gpio_mux_map[i].mode,
+			    gpio_mux_map[i].regmask);
+			sy_write(sc, gpio_mux_map[i].sysreg, r);
+			break;
+		}
+	}
+#else
 #if defined(SLICKROCK)
 	r = sy_read(sc, RA_SYSCTL_GPIOMODE);
 	r |= SR_GPIO_MODE;
@@ -704,9 +842,10 @@ ra_gpio_pin_init(ra_gpio_softc_t *sc, in
 	 * GPIO0 doesn't have an associated MODE register.
 	 */
 	if (pin != 0) {
-		u_int gpio_mode = 0;
+		u_int gpio_mode;
 
-		for (gpio_mode; gpio_mode < GPIO_MODE_SETTINGS; gpio_mode++) {
+		for (gpio_mode = 0; gpio_mode < __arraycount(pin_share);
+		    gpio_mode++) {
 			if (pin <= pin_share[gpio_mode]) {
 				r = sy_read(sc, RA_SYSCTL_GPIOMODE);
 				if (10 == pin) {
@@ -724,7 +863,8 @@ ra_gpio_pin_init(ra_gpio_softc_t *sc, in
 			}
 		}
 	}
-#endif
+#endif /* SLICKROCK */
+#endif /* !MT7628 */
 
 	/* set direction */
 	RA_GPIO_PIN_INIT_DIR(sc, r, pin, ptp);
@@ -778,11 +918,13 @@ ra_gpio_pin_read(void *arg, int pin)
 		 * Special hack: a pseudo-pin used for signaling
 		 */
 		rv = 0;
-		switch(pin) {
+		switch (pin) {
+#ifdef BOOT_COUNT
 		case BOOT_COUNT:
 			if (1 == ra_check_memo_reg(NO_SECURITY))
 				rv = 1;
 			break;
+#endif
 		default:
 #ifdef DIAGNOSTIC
 			aprint_normal_dev(sc->sc_dev, "%s: bad pin=%d\n",
@@ -817,7 +959,9 @@ ra_gpio_pin_write(void *arg, int pin, in
 {
 	RALINK_DEBUG_FUNC_ENTRY();
 	ra_gpio_softc_t * const sc = arg;
+#if defined(BOOT_COUNT) || defined(UPGRADE)
 	uint32_t r;
+#endif
 
 	KASSERT(sc != NULL);
 	RALINK_DEBUG(RALINK_DEBUG_INFO, "pin %d, val %d\n", pin, value);
@@ -827,17 +971,21 @@ ra_gpio_pin_write(void *arg, int pin, in
 		 * Special hack: a pseudo-pin used for signaling
 		 */
 		switch(pin) {
+#ifdef BOOT_COUNT
 		case BOOT_COUNT:
 			/* Reset boot count */
 			r = sy_read(sc, RA_SYSCTL_MEMO0);
 			if (r == MAGIC)
 				sy_write(sc, RA_SYSCTL_MEMO1, 0);
 			break;
+#endif
+#ifdef UPGRADE
 		case UPGRADE:
 			/* Set upgrade flag */
 			sy_write(sc, RA_SYSCTL_MEMO0, UPGRADE_MAGIC);
 			sy_write(sc, RA_SYSCTL_MEMO1, UPGRADE_MAGIC);
 			break;
+#endif
 		default:
 #ifdef DIAGNOSTIC
 			aprint_normal_dev(sc->sc_dev, "%s: bad pin=%d\n",
@@ -846,7 +994,7 @@ ra_gpio_pin_write(void *arg, int pin, in
 		}
 		return;
 	}
-	
+
 	/*
 	 * normal case: a regular GPIO pin
 	 * if pin number is in a gap in the range,
@@ -901,26 +1049,47 @@ ra_gpio_intr(void *arg)
 
 #if 0
 	/* Read the 3 interrupt registers */
+#if defined(MT7628)
+	if (sc->sc_intr_status00_31 || sc->sc_intr_status32_63 ||
+	    sc->sc_intr_status64_95) {
+		printf("\n0-31 %x, 32-63 %x, 64_95 %x\n",
+		    sc->sc_intr_status00_31,
+		    sc->sc_intr_status32_63,
+		    sc->sc_intr_status64_95);
+	}
+#else
 	if (sc->sc_intr_status00_23 || sc->sc_intr_status24_39 ||
 	    sc->sc_intr_status40_51) {
 		printf("\n0-23 %x, 24-39 %x, 40_51 %x\n",
-			sc->sc_intr_status00_23,
-			sc->sc_ntr_status24_39, 
-			sc->sc_ntr_status40_51);
+		    sc->sc_intr_status00_23,
+		    sc->sc_intr_status24_39,
+		    sc->sc_intr_status40_51);
 	}
 #endif
+#endif
 
+#if defined(MT7628)
+	sc->sc_intr_status00_31 |= gp_read(sc, RA_PIO_00_31_INT_STAT);
+	sc->sc_intr_status32_63 |= gp_read(sc, RA_PIO_32_63_INT_STAT);
+	sc->sc_intr_status64_95 |= gp_read(sc, RA_PIO_64_95_INT_STAT);
+#else
 	sc->sc_intr_status00_23 |= gp_read(sc, RA_PIO_00_23_INT);
 	sc->sc_intr_status24_39 |= gp_read(sc, RA_PIO_24_39_INT);
 	sc->sc_intr_status40_51 |= gp_read(sc, RA_PIO_40_51_INT);
 #if defined(SLICKROCK)
 	sc->sc_intr_status72_95 |= gp_read(sc, RA_PIO_72_95_INT);
 #endif
+#endif
 
 #if 0
 	/* Trivial error checking, some interrupt had to have fired */
+#if defined(MT7628)
+	KASSERT((sc->sc_intr_status00_31 | sc->sc_intr_status32_64 |
+	    sc->sc_intr_status64_95) != 0);
+#else
 	KASSERT((sc->sc_intr_status00_23 | sc->sc_intr_status24_39 |
-		sc->sc_intr_status40_51) != 0);
+	    sc->sc_intr_status40_51) != 0);
+#endif
 #endif
 
 	/* Debounce interrupt */
@@ -933,6 +1102,19 @@ ra_gpio_intr(void *arg)
 	 *  I don't know if resetting the EDGE register is
 	 *  necessary, but the Ralink Linux driver does it.
 	 */
+#if defined(MT7628)
+	gp_write(sc, RA_PIO_00_31_INT_STAT, sc->sc_intr_status00_31);
+	gp_write(sc, RA_PIO_00_31_INT_STAT_EDGE, sc->sc_intr_status00_31);
+	gp_write(sc, RA_PIO_32_63_INT_STAT, sc->sc_intr_status32_63);
+	gp_write(sc, RA_PIO_32_63_INT_STAT_EDGE, sc->sc_intr_status32_63);
+	gp_write(sc, RA_PIO_64_95_INT_STAT, sc->sc_intr_status64_95);
+	gp_write(sc, RA_PIO_64_95_INT_STAT_EDGE, sc->sc_intr_status64_95);
+
+	/* Reset until next time */
+	sc->sc_intr_status00_31 = 0;
+	sc->sc_intr_status32_63 = 0;
+	sc->sc_intr_status64_95 = 0;
+#else
 	gp_write(sc, RA_PIO_00_23_INT, sc->sc_intr_status00_23);
 	gp_write(sc, RA_PIO_00_23_EDGE_INT, sc->sc_intr_status00_23);
 	gp_write(sc, RA_PIO_24_39_INT, sc->sc_intr_status24_39);
@@ -949,6 +1131,7 @@ ra_gpio_intr(void *arg)
 	sc->sc_intr_status24_39 = 0;
 	sc->sc_intr_status40_51 = 0;
 	sc->sc_intr_status72_95 = 0;
+#endif /* MT7628 */
 
 	return 1;
 }
@@ -980,19 +1163,19 @@ ra_gpio_debounce_pin(ra_gpio_softc_t *sc
 		case SOFT_RST_IN_BUTTON:
 			KNOTE(&knotes, RESET_BUTTON_EVT);
 			break;
-			
+
 		case SS_BUTTON:
 			KNOTE(&knotes, SS_BUTTON_EVT);
 			break;
-			
+
 		case WPS_BUTTON:
 			KNOTE(&knotes, WPS_BUTTON_EVT);
 			break;
-			
+
 		case WIFI_ENABLE:
 			KNOTE(&knotes, WIFI_ENABLE_EVT);
 			break;
-			
+
 		/*
 		 * These events are in case of overcurrent
 		 * on USB/ExpressCard devices.
@@ -1047,7 +1230,7 @@ ra_gpio_debounce_pin(ra_gpio_softc_t *sc
 
 		default:
 			printf("\nUnknown debounce pin %d received.\n",
-				debounce_pin[pin]);
+			    debounce_pin[pin]);
 		}
 #endif/* SLICKROCK */
 #if defined(PEBBLES500) || defined(PEBBLES35)
@@ -1055,15 +1238,15 @@ ra_gpio_debounce_pin(ra_gpio_softc_t *sc
 		case SOFT_RST_IN_BUTTON:
 			KNOTE(&knotes, RESET_BUTTON_EVT);
 			break;
-			
+
 		case WPS_BUTTON:
 			KNOTE(&knotes, WPS_BUTTON_EVT);
 			break;
-			
+
 		case EXCARD_ATTACH:
 			KNOTE(&knotes, EXCARD_ATTACH_EVT);
 			break;
-			
+
 		/*
 		 * These events are in case of overcurrent
 		 * on USB/ExpressCard devices.
@@ -1085,7 +1268,7 @@ ra_gpio_debounce_pin(ra_gpio_softc_t *sc
 		case CURRENT_LIMIT_FLAG1_3_3v:
 		case CURRENT_LIMIT_FLAG1_1_5v:
 			ra_gpio_pin_write(sc, POWER_EN_EXCARD1_3_3v, 0);
-			ra_gpio_pin_write(sc, POWER_EN_EXCARD1_1_5v, 0);				
+			ra_gpio_pin_write(sc, POWER_EN_EXCARD1_1_5v, 0);
 			KNOTE(&knotes, CURRENT_LIMIT_EVT);
 			cpusb_overcurrent_occurred(debounce_pin[pin]);
 			printf("\nExpressCard current limit received!\n");
@@ -1167,9 +1350,21 @@ ra_gpio_debounce_setup(ra_gpio_softc_t *
 	 *  interrupt sources across all three interrupt
 	 *  registers.
 	 */
-	for (int i=0; i < __arraycount(debounce_pin); i++) {
+	for (int i = 0; i < __arraycount(debounce_pin); i++) {
 		u_int32_t *intr_status;
 		int offset;
+#if defined(MT7628)
+		if (debounce_pin[i] < 32) {
+			intr_status = &sc->sc_intr_status00_31;
+			offset = 0;
+		} else if (debounce_pin[i] < 64) {
+			intr_status = &sc->sc_intr_status32_63;
+			offset = 32;
+		} else {
+			intr_status = &sc->sc_intr_status64_95;
+			offset = 64;
+		}
+#else /* !MT7628 */
 		if (debounce_pin[i] < 24) {
 			intr_status = &sc->sc_intr_status00_23;
 			offset = 0;
@@ -1183,18 +1378,19 @@ ra_gpio_debounce_setup(ra_gpio_softc_t *
 			intr_status = &sc->sc_intr_status72_95;
 			offset = 72;
 		}
+#endif /* !MT7628 */
 		if (*intr_status & (1 << (debounce_pin[i] - offset))) {
 			pin = debounce_pin[i];
 
 #ifdef ENABLE_RALINK_DEBUG_INFO
 			if (ra_gpio_pin_read(sc, pin)) {
 				RALINK_DEBUG(RALINK_DEBUG_INFO,
-					"%s() button 0x%x, pin %d released\n",
-					__func__, *intr_status, pin);
+				    "%s() button 0x%x, pin %d released\n",
+				    __func__, *intr_status, pin);
 			} else {
 				RALINK_DEBUG(RALINK_DEBUG_INFO,
-					"%s() button 0x%x, pin %d pressed\n",
-					__func__, *intr_status, pin);
+				    "%s() button 0x%x, pin %d pressed\n",
+				    __func__, *intr_status, pin);
 			}
 #endif
 
@@ -1265,8 +1461,8 @@ enable_gpio_interrupt(ra_gpio_softc_t *s
 		return;
 
 	const pin_tab_t * const ptp = &pin_tab[index];
-        const uint32_t mask_bit = 1 << (pin - ptp->pin_mask_base);
-        const uint32_t reg_bit = 1 << (pin - ptp->pin_reg_base);
+	const uint32_t mask_bit = 1 << (pin - ptp->pin_mask_base);
+	const uint32_t reg_bit = 1 << (pin - ptp->pin_reg_base);
 	uint32_t r;
 
 	if (ptp->pin_rise.mask & mask_bit) {
@@ -1291,10 +1487,17 @@ enable_gpio_interrupt(ra_gpio_softc_t *s
 static void
 ra_gpio_softintr(void *arg)
 {
+#if defined(MT7628)
 	RALINK_DEBUG(RALINK_DEBUG_INFO,
-		"gpio softintr called with 0x%x, 0x%x, 0x%x, 0x%x\n",
-		sc->sc_intr_status00_23, sc->sc_intr_status24_39,
-		sc->sc_intr_status40_51, sc->sc_intr_status72_95);
+	    "gpio softintr called with 0x%x, 0x%x, 0x%x\n",
+	    sc->sc_intr_status00_31, sc->sc_intr_status32_63,
+	    sc->sc_intr_status64_95);
+#else
+	RALINK_DEBUG(RALINK_DEBUG_INFO,
+	    "gpio softintr called with 0x%x, 0x%x, 0x%x, 0x%x\n",
+	    sc->sc_intr_status00_23, sc->sc_intr_status24_39,
+	    sc->sc_intr_status40_51, sc->sc_intr_status72_95);
+#endif
 }
 
 /*
@@ -1310,7 +1513,7 @@ gpio_event_app_user_attach(struct knote 
 		return 0;
 	}
 
-	kn->kn_flags |= EV_CLEAR;       /* automatically set */
+	kn->kn_flags |= EV_CLEAR;	/* automatically set */
 	SLIST_INSERT_HEAD(&knotes, kn, kn_selnext);
 
 	return 0;
@@ -1336,7 +1539,8 @@ gpio_event_app_user_detach(struct knote 
 static int
 gpio_event_app_user_event(struct knote *kn, long hint)
 {
-	RALINK_DEBUG_0(RALINK_DEBUG_INFO, "%s() %p hint: %ld\n", __func__, kn, hint);
+	RALINK_DEBUG_0(RALINK_DEBUG_INFO, "%s() %p hint: %ld\n",
+	    __func__, kn, hint);
 
 	if (NULL == kn) {
 		RALINK_DEBUG(RALINK_DEBUG_ERROR, "Null kn found\n");
@@ -1373,12 +1577,12 @@ ra_gpio_toggle_LED(void *arg)
 #if 0
 	/* Disable lit LED */
 	gp_write(sc, SET_SS_LED_REG,
-		(1 << (led_array1[led_index++] - SS_OFFSET)));
+	    (1 << (led_array1[led_index++] - SS_OFFSET)));
 #endif
 
 	if (led_index == (sizeof(led_array1))) {
 		led_index = 0;
-		for (int i=0; i < sizeof(led_array1); i++) {
+		for (int i = 0; i < sizeof(led_array1); i++) {
 			ra_gpio_pin_write(sc, led_array1[i], 1);
 		}
 	}
@@ -1398,7 +1602,7 @@ ra_gpio_toggle_LED(void *arg)
 		(led_timing_hack < 6)) {
 		led_timing_hack++;
 		callout_reset(&led_tick_callout, MS_TO_HZ(BOOT_LED_TIMING),
-			ra_gpio_toggle_LED, sc);
+		    ra_gpio_toggle_LED, sc);
 	}
 #endif
 }

Index: src/sys/arch/mips/ralink/ralink_gpio.h
diff -u src/sys/arch/mips/ralink/ralink_gpio.h:1.2 src/sys/arch/mips/ralink/ralink_gpio.h:1.3
--- src/sys/arch/mips/ralink/ralink_gpio.h:1.2	Thu Jul 28 15:38:49 2011
+++ src/sys/arch/mips/ralink/ralink_gpio.h	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_gpio.h,v 1.2 2011/07/28 15:38:49 matt Exp $	*/
+/*	$NetBSD: ralink_gpio.h,v 1.3 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -43,7 +43,7 @@
 #define GPIO_TR_PIN_MASK            0x017f81
 #define GPIO_TR_OUTPUT_PIN_MASK     0x003b80
 #define GPIO_TR_INT_PIN_MASK        0x014401
-#define GPIO_TR_INT_FEDGE_PIN_MASK  0x014401 
+#define GPIO_TR_INT_FEDGE_PIN_MASK  0x014401
 #define GPIO_TR_POL_MASK            0x000000
 
 /*
@@ -148,10 +148,10 @@
 #define P3_HARDWARE
 #if defined(P3_HARDWARE)
 #define GPIO_PB500_PIN_MASK_24_51            0x03cafe00
-#define GPIO_PB500_OUTPUT_PIN_MASK_24_51     0x03c8fe00   
+#define GPIO_PB500_OUTPUT_PIN_MASK_24_51     0x03c8fe00
 #else
 #define GPIO_PB500_PIN_MASK_24_51            0x0fff0000
-#define GPIO_PB500_OUTPUT_PIN_MASK_24_51     0x0ffd0000   
+#define GPIO_PB500_OUTPUT_PIN_MASK_24_51     0x0ffd0000
 #endif
 #define GPIO_PB500_INT_PIN_MASK_24_51        0x00020000   /* rising edge ints */
 #define GPIO_PB500_INT_FEDGE_PIN_MASK_24_51  0x00020000
@@ -242,14 +242,14 @@
 #define GPIO_SR_POL_MASK            0x000002
 
 /* Enable RGMII */
-#define GPIO_SR_PIN_MASK_24_51        0x0000387f   
-#define GPIO_SR_OUTPUT_PIN_MASK_24_51 0x0000387b   
+#define GPIO_SR_PIN_MASK_24_51        0x0000387f
+#define GPIO_SR_OUTPUT_PIN_MASK_24_51 0x0000387b
 #define GPIO_SR_INT_PIN_MASK_24_51        0x0004
 #define GPIO_SR_INT_FEDGE_PIN_MASK_24_51  0x0004
 #define GPIO_SR_POL_MASK_24_51            0x00000000
 
-#define GPIO_SR_PIN_MASK_72_95        0x00000fff   
-#define GPIO_SR_OUTPUT_PIN_MASK_72_95 0x00000ff7   
+#define GPIO_SR_PIN_MASK_72_95        0x00000fff
+#define GPIO_SR_OUTPUT_PIN_MASK_72_95 0x00000ff7
 #define GPIO_SR_INT_PIN_MASK_72_95        0x0008
 #define GPIO_SR_INT_FEDGE_PIN_MASK_72_95  0x0008
 #define GPIO_SR_POL_MASK_72_95            0x00000000
@@ -306,7 +306,7 @@
 
 /* Debounced Pins:
  *	WPS_BUTTON, SOFT_RST_IN_BUTTON, SS_BUTTON
- *	CURRENT_LIMIT_FLAG USB * 3 + EXP * 2  
+ *	CURRENT_LIMIT_FLAG USB * 3 + EXP * 2
  */
 #define DEBOUNCED_PINS 9
 

Index: src/sys/arch/mips/ralink/ralink_reg.h
diff -u src/sys/arch/mips/ralink/ralink_reg.h:1.8 src/sys/arch/mips/ralink/ralink_reg.h:1.9
--- src/sys/arch/mips/ralink/ralink_reg.h:1.8	Wed Oct  5 15:39:31 2016
+++ src/sys/arch/mips/ralink/ralink_reg.h	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_reg.h,v 1.8 2016/10/05 15:39:31 ryo Exp $	*/
+/*	$NetBSD: ralink_reg.h,v 1.9 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -55,7 +55,7 @@
 #endif
 #define RA_BUS_FREQ		166000000 /* DDR speed */
 #define RA_UART_FREQ		40000000
-#elif defined(MT7620)
+#elif defined(MT7620) || defined(MT7628)
 #define RA_CLOCK_RATE		580000000
 #define RA_BUS_FREQ		(RA_CLOCK_RATE / 3)
 #define RA_UART_FREQ		40000000
@@ -78,7 +78,9 @@
 #if defined(RT3052) || defined(RT3050)
 #define RA_PCM_BASE		0x10000400
 #endif
+#if !defined(MT7628)
 #define RA_UART_BASE		0x10000500
+#endif
 #define RA_PIO_BASE		0x10000600
 #if defined(RT3052) || defined(RT3050)
 #define RA_GDMA_BASE		0x10000700
@@ -90,6 +92,11 @@
 #define RA_I2S_BASE		0x10000A00
 #define RA_SPI_BASE		0x10000B00
 #define RA_UART_LITE_BASE	0x10000C00
+#if defined(MT7628)
+#define RA_UART1_BASE		0x10000D00
+#define RA_UART2_BASE		0x10000E00
+#endif
+#define RA_UART_SIZE		0x00000100
 #if defined(RT3883)
 #define RA_PCM_BASE		0x10002000
 #define RA_GDMA_BASE		0x10002800
@@ -99,9 +106,9 @@
 #define RA_FRAME_ENGINE_BASE	0x10100000
 #define RA_ETH_SW_BASE		0x10110000
 #define RA_ROM_BASE		0x10118000
-#if defined(RT3883) || defined(MT7620)
+#if defined(RT3883) || defined(MT7620) || defined(MT7628)
 #define RA_USB_DEVICE_BASE	0x10120000
-#if defined(MT7620)
+#if defined(MT7620) || defined(MT7628)
 #define RA_SDHC_BASE		0x10130000
 #endif
 #define RA_PCI_BASE		0x10140000
@@ -109,7 +116,7 @@
 #endif
 #define RA_11N_MAC_BASE		0x10180000
 #define RA_USB_OTG_BASE		0x101C0000
-#if defined(RT3883) || defined(MT7620)
+#if defined(RT3883) || defined(MT7620) || defined(MT7628)
 #define RA_USB_HOST_BASE	0x101C0000
 #define RA_USB_BLOCK_SIZE	0x1000
 #define RA_USB_EHCI_BASE	(RA_USB_HOST_BASE + 0x0000)
@@ -118,7 +125,7 @@
 #if defined(RT3052) || defined(RT3050)
 #define RA_FLASH_BASE		0x1F000000
 #define RA_FLASH_END		0x1F7FFFFF
-#elif defined(RT3883) || defined(MT7620)
+#elif defined(RT3883) || defined(MT7620) || defined(MT7628)
 #define RA_FLASH_BASE		0x1C000000
 #define RA_FLASH_END		0x1DFFFFFF
 #endif
@@ -141,7 +148,14 @@
 #define RA_SYSCTL_CLKCFG1		0x30
 #define RA_SYSCTL_RST			0x34
 #define RA_SYSCTL_RSTSTAT		0x38
+
+#if defined(MT7628)
+#define RA_SYSCTL_GPIO1MODE		0x60
+#define RA_SYSCTL_GPIOMODE		RA_SYSCTL_GPIO1MODE
+#define RA_SYSCTL_GPIO2MODE		0x64
+#else
 #define RA_SYSCTL_GPIOMODE		0x60
+#endif
 
 #if defined(RT3050) || defined(RT3052)
 #define	SYSCTL_CFG0_INIC_EE_SDRAM	__BIT(29)
@@ -172,6 +186,16 @@
 #define	SYSCTL_CFG0_XTAL_FREQ_SEL	__BIT(6)
 #define	SYSCTL_CFG0_DRAM_TYPE		__BITS(5,4)
 #define	SYSCTL_CFG0_CHIP_MODE		__BITS(3,0)
+#elif defined(MT7628)
+#define	SYSCTL_CFG0_TEST_CODE		__BITS(31,24)
+#define	SYSCTL_CFG0_BS_SHADOW		__BITS(20,12)
+#define	SYSCTL_CFG0_DBG_JTAG_MODE	__BIT(8)
+#define	SYSCTL_CFG0_TEST_MODE_1		__BIT(7)
+#define	SYSCTL_CFG0_XTAL_FREQ_SEL	__BIT(6)
+#define	SYSCTL_CFG0_EXT_BG		__BIT(5)
+#define	SYSCTL_CFG0_TEST_MODE_0		__BIT(4)
+#define	SYSCTL_CFG0_CHIP_MODE		__BITS(3,1)
+#define	SYSCTL_CFG0_DRAM_TYPE		__BIT(0)
 #endif
 
 #if defined(RT3883) || defined(MT7620)
@@ -188,7 +212,7 @@
 #define SYSCTL_CFG1_PCI_66M_MODE	__BIT(6)
 #endif
 
-#if defined(RT3883) || defined(MT7620)
+#if defined(RT3883) || defined(MT7620) || defined(MT7628)
 #define SYSCTL_CLKCFG0_REFCLK0_RATE	__BITS(11,9)
 #endif
 #if defined(RT3883)
@@ -197,46 +221,61 @@
 #define SYSCTL_CLKCFG0_REFCLK0_IS_OUT	__BIT(8)
 #define SYSCTL_CLKCFG0_CPU_FREQ_ADJ	__BITS(3,0)
 #endif
-#if defined(MT7620)
+#if defined(MT7620) || defined(MT7628)
 #define SYSCTL_CLKCFG0_OSC_1US_DIV_7620	__BITS(29,24)
 #define SYSCTL_CLKCFG0_INT_CLK_FDIV	__BITS(22,18)
 #define SYSCTL_CLKCFG0_INT_CLK_FFRAC	__BITS(16,12)
 #define SYSCTL_CLKCFG0_PERI_CLK_SEL	__BIT(4)
+#endif
+#if defined(MT7620)
 #define SYSCTL_CLKCFG0_EPHY_USE_25M	__BIT(3)
 #endif
 
 #if defined(RT3883)
-#define SYSCTL_CLKCFG1_PBUS_DIV2	__BIT(30)
-#define SYSCTL_CLKCFG1_SYS_TCK_EN	__BIT(29)
-#define SYSCTL_CLKCFG1_FE_GDMA_PCLK_EN	__BIT(22)
-#define SYSCTL_CLKCFG1_PCIE_CLK_EN_3883	__BIT(21)
-#define SYSCTL_CLKCFG1_UPHY1_CLK_EN	__BIT(20)
-#define SYSCTL_CLKCFG1_PCI_CLK_EN	__BIT(19)
-#define SYSCTL_CLKCFG1_UPHY0_CLK_EN_3883 __BIT(18)
-#define SYSCTL_CLKCFG1_GE2_CLK_EN_3883	__BIT(17)
-#define SYSCTL_CLKCFG1_GE1_CLK_EN_3883	__BIT(16)
+#define SYSCTL_CLKCFG1_PBUS_DIV2		__BIT(30)
+#define SYSCTL_CLKCFG1_SYS_TCK_EN		__BIT(29)
+#define SYSCTL_CLKCFG1_FE_GDMA_PCLK_EN		__BIT(22)
+#define SYSCTL_CLKCFG1_PCIE_CLK_EN_3883		__BIT(21)
+#define SYSCTL_CLKCFG1_UPHY1_CLK_EN		__BIT(20)
+#define SYSCTL_CLKCFG1_PCI_CLK_EN		__BIT(19)
+#define SYSCTL_CLKCFG1_UPHY0_CLK_EN_3883	__BIT(18)
+#define SYSCTL_CLKCFG1_GE2_CLK_EN_3883		__BIT(17)
+#define SYSCTL_CLKCFG1_GE1_CLK_EN_3883		__BIT(16)
+#endif
+#if defined(MT7628)
+#define SYSCTL_CLKCFG1_PWM_CLK_EN_7628		__BIT(31)
+#define SYSCTL_CLKCFG1_AUX_SYS_TCK_EN_7628	__BIT(29)
+#define SYSCTL_CLKCFG1_MIPSC_CLK_EN_7628	__BIT(28)
+#define SYSCTL_CLKCFG1_UPHY0_CLK_EN_7628	__BIT(22)
+#define SYSCTL_CLKCFG1_UART2_CLK_EN_7628	__BIT(20)
+#define SYSCTL_CLKCFG1_UART1_CLK_EN_7628	__BIT(19)
+#define SYSCTL_CLKCFG1_UART0_CLK_EN_7628	__BIT(12)
 #endif
 #if defined(MT7620)
-#define SYSCTL_CLKCFG1_SDHC_CLK_EN	__BIT(30)
-#define SYSCTL_CLKCFG1_AUX_SYS_TCK_EN	__BIT(28)
-#define SYSCTL_CLKCFG1_PCIE_CLK_EN_7620 __BIT(26)
-#define SYSCTL_CLKCFG1_UPHY0_CLK_EN_7620 __BIT(25)
-#define SYSCTL_CLKCFG1_ESW_CLK_EN	__BIT(23)
-#define SYSCTL_CLKCFG1_FE_CLK_EN	__BIT(21)
-#define SYSCTL_CLKCFG1_UARTL_CLK_EN	__BIT(19)
-#define SYSCTL_CLKCFG1_SPI_CLK_EN	__BIT(18)
-#define SYSCTL_CLKCFG1_I2S_CLK_EN	__BIT(17)
-#define SYSCTL_CLKCFG1_I2C_CLK_EN	__BIT(16)
-#define SYSCTL_CLKCFG1_NAND_CLK_EN	__BIT(15)
-#define SYSCTL_CLKCFG1_GDMA_CLK_EN	__BIT(14)
-#define SYSCTL_CLKCFG1_GPIO_CLK_EN	__BIT(13)
-#define SYSCTL_CLKCFG1_UART_CLK_EN	__BIT(12)
-#define SYSCTL_CLKCFG1_PCM_CLK_EN	__BIT(11)
-#define SYSCTL_CLKCFG1_MC_CLK_EN	__BIT(10)
-#define SYSCTL_CLKCFG1_INTC_CLK_EN	__BIT(9)
-#define SYSCTL_CLKCFG1_TIMER_CLK_EN	__BIT(8)
-#define SYSCTL_CLKCFG1_GE2_CLK_EN_7620	__BIT(7)
-#define SYSCTL_CLKCFG1_GE1_CLK_EN_7620	__BIT(6)
+#define SYSCTL_CLKCFG1_AUX_SYS_TCK_EN		__BIT(28)
+#define SYSCTL_CLKCFG1_FE_CLK_EN		__BIT(21)
+#define SYSCTL_CLKCFG1_UARTL_CLK_EN		__BIT(19)
+#define SYSCTL_CLKCFG1_GE2_CLK_EN_7620		__BIT(7)
+#define SYSCTL_CLKCFG1_GE1_CLK_EN_7620		__BIT(6)
+#define SYSCTL_CLKCFG1_GE2_CLK_EN_7620		__BIT(7)
+#define SYSCTL_CLKCFG1_GE1_CLK_EN_7620		__BIT(6)
+#endif
+#if defined(MT7620) || defined(MT7628)
+#define SYSCTL_CLKCFG1_SDHC_CLK_EN		__BIT(30)
+#define SYSCTL_CLKCFG1_PCIE_CLK_EN_7620		__BIT(26)
+#define SYSCTL_CLKCFG1_UPHY0_CLK_EN_7620	__BIT(25)
+#define SYSCTL_CLKCFG1_ESW_CLK_EN		__BIT(23)
+#define SYSCTL_CLKCFG1_SPI_CLK_EN		__BIT(18)
+#define SYSCTL_CLKCFG1_I2S_CLK_EN		__BIT(17)
+#define SYSCTL_CLKCFG1_I2C_CLK_EN		__BIT(16)
+#define SYSCTL_CLKCFG1_NAND_CLK_EN		__BIT(15)
+#define SYSCTL_CLKCFG1_GDMA_CLK_EN		__BIT(14)
+#define SYSCTL_CLKCFG1_GPIO_CLK_EN		__BIT(13)
+#define SYSCTL_CLKCFG1_UART_CLK_EN		__BIT(12)
+#define SYSCTL_CLKCFG1_PCM_CLK_EN		__BIT(11)
+#define SYSCTL_CLKCFG1_MC_CLK_EN		__BIT(10)
+#define SYSCTL_CLKCFG1_INTC_CLK_EN		__BIT(9)
+#define SYSCTL_CLKCFG1_TIMER_CLK_EN		__BIT(8)
 #endif
 
 #if defined(RT3883) || defined(MT7620)
@@ -248,73 +287,113 @@
 #define RA_SYSCTL_MEMO1	0x6C
 #endif
 
-#define  RST_PPE_7620		__BIT(31)
-#define  RST_SDHC_7620		__BIT(30)
-#define  RST_MIPS_CNT_7620	__BIT(28)
-#define  RST_PCIPCIE_3883	__BIT(27)
-#define  RST_FLASH_3883		__BIT(26)
-#define  RST_PCIE0_7620		__BIT(26)
-#define  RST_UDEV_3883		__BIT(25)
-#define  RST_UHST0_7620		__BIT(25)
-#define  RST_PCI_3883		__BIT(24)
-#define  RST_EPHY_7620		__BIT(24)
-#define  RST_PCIE_3883		__BIT(23)
-#define  RST_ESW_7620		__BIT(23)
-#define  RST_UHST		__BIT(22)
-#define  RST_FE			__BIT(21)
-#define  RST_WLAN		__BIT(20)
-#define  RST_UARTL		__BIT(19)
-#define  RST_SPI		__BIT(18)
-#define  RST_I2S		__BIT(17)
-#define  RST_I2C		__BIT(16)
-#define  RST_NAND		__BIT(15)
-#define  RST_DMA		__BIT(14)
-#define  RST_PIO		__BIT(13)
-#define  RST_UART		__BIT(12)
-#define  RST_PCM		__BIT(11)
-#define  RST_MC			__BIT(10)
-#define  RST_INTC		__BIT(9)
-#define  RST_TIMER		__BIT(8)
-#define  RST_GE2		__BIT(7)
-#define  RST_GE1		__BIT(6)
-#define  RST_SYS		__BIT(0)
-
-#define  GPIOMODE_RGMII		__BIT(9)
-#define  GPIOMODE_SDRAM		__BIT(8)
-#define  GPIOMODE_MDIO		__BIT(7)
-#define  GPIOMODE_JTAG		__BIT(6)
-#define  GPIOMODE_UARTL		__BIT(5)
-#define  GPIOMODE_UARTF2	__BIT(4)
-#define  GPIOMODE_UARTF1	__BIT(3)
-#define  GPIOMODE_UARTF0	__BIT(2)
+#define  RST_PPE_7620			__BIT(31)
+#define  RST_PWM_7628			__BIT(31)
+#define  RST_SDHC_7620			__BIT(30)
+#define  RST_CRYPTO_7628		__BIT(29)
+#define  RST_MIPS_CNT_7620		__BIT(28)
+#define  RST_PCIPCIE_3883		__BIT(27)
+#define  RST_FLASH_3883			__BIT(26)
+#define  RST_PCIE0_7620			__BIT(26)
+#define  RST_UDEV_3883			__BIT(25)
+#define  RST_UHST0_7620			__BIT(25)
+#define  RST_PCI_3883			__BIT(24)
+#define  RST_EPHY_7620			__BIT(24)
+#define  RST_PCIE_3883			__BIT(23)
+#define  RST_ESW_7620			__BIT(23)
+#define  RST_UHST			__BIT(22)
+#define  RST_FE				__BIT(21)
+#define  RST_WLAN			__BIT(20)
+#define  RST_UART2_7628			__BIT(20)
+#define  RST_UARTL			__BIT(19)
+#define  RST_UART1_7628			__BIT(19)
+#define  RST_SPI			__BIT(18)
+#define  RST_I2S			__BIT(17)
+#define  RST_I2C			__BIT(16)
+#define  RST_NAND			__BIT(15)
+#define  RST_DMA			__BIT(14)
+#define  RST_PIO			__BIT(13)
+#define  RST_UART			__BIT(12)
+#define  RST_UART0_7628			__BIT(12)
+#define  RST_PCM			__BIT(11)
+#define  RST_MC				__BIT(10)
+#define  RST_INTC			__BIT(9)
+#define  RST_TIMER			__BIT(8)
+#define  RST_GE2			__BIT(7)
+#define  RST_GE1			__BIT(6)
+#define  RST_HIF_7628			__BIT(5)
+#define  RST_WIFI_7628			__BIT(4)
+#define  RST_SPIS_7628			__BIT(3)
+#define  RST_SYS			__BIT(0)
+
+#if defined(MT7628)
+#define  GPIO1MODE_PWM1			__BITS(31,30)
+#define  GPIO1MODE_PWM0			__BITS(29,18)
+#define  GPIO1MODE_UART2		__BITS(27,26)
+#define  GPIO1MODE_UART1		__BITS(25,24)
+#define  GPIO1MODE_I2C			__BITS(21,20)
+#define  GPIOMODE_I2C			GPIO1MODE_I2C
+#define  GPIO1MODE_REFCLK		__BIT(18)
+#define  GPIO1MODE_PERST		__BIT(16)
+#define  GPIO1MODE_ESD			__BIT(15)
+#define  GPIO1MODE_WDT			__BIT(14)
+#define  GPIO1MODE_SPI			__BIT(12)
+#define  GPIO1MODE_SD			__BITS(11,10)
+#define  GPIO1MODE_UART0		__BITS(9,8)
+#define  GPIO1MODE_I2S			__BITS(7,6)
+#define  GPIO1MODE_SPI_CS1		__BITS(5,4)
+#define  GPIO1MODE_SPIS			__BITS(3,2)
+#define  GPIO1MODE_GPIO			__BITS(1,0)
+#define  GPIO2MODE_P4_LED_KN		__BITS(27,26)
+#define  GPIO2MODE_P3_LED_KN		__BITS(25,24)
+#define  GPIO2MODE_P2_LED_KN		__BITS(23,22)
+#define  GPIO2MODE_P1_LED_KN		__BITS(21,10)
+#define  GPIO2MODE_P0_LED_KN		__BITS(19,18)
+#define  GPIO2MODE_WLED_KN		__BITS(17,16)
+#define  GPIO2MODE_P4_LED_AN		__BITS(11,10)
+#define  GPIO2MODE_P3_LED_AN		__BITS(9,8)
+#define  GPIO2MODE_P2_LED_AN		__BITS(7,6)
+#define  GPIO2MODE_P1_LED_AN		__BITS(5,4)
+#define  GPIO2MODE_P0_LED_AN		__BITS(3,2)
+#define  GPIO2MODE_WLED_AN		__BITS(1,0)
+#else
+#define  GPIOMODE_RGMII			__BIT(9)
+#define  GPIOMODE_SDRAM			__BIT(8)
+#define  GPIOMODE_MDIO			__BIT(7)
+#define  GPIOMODE_JTAG			__BIT(6)
+#define  GPIOMODE_UARTL			__BIT(5)
+#define  GPIOMODE_UARTF2		__BIT(4)
+#define  GPIOMODE_UARTF1		__BIT(3)
+#define  GPIOMODE_UARTF0		__BIT(2)
 #define  GPIOMODE_UARTF_0_2	\
 		(GPIOMODE_UARTF0|GPIOMODE_UARTF1|GPIOMODE_UARTF2)
-#define  GPIOMODE_SPI		__BIT(1)
-#define  GPIOMODE_I2C		__BIT(0)
+#define  GPIOMODE_SPI			__BIT(1)
+#define  GPIOMODE_I2C			__BIT(0)
+#endif
 
 /*
  * Timer Registers
  */
-#define RA_TIMER_STAT		0x00
-#define RA_TIMER_0_LOAD		0x10
-#define RA_TIMER_0_VALUE	0x14
-#define RA_TIMER_0_CNTRL	0x18
-#define RA_TIMER_1_LOAD		0x20
-#define RA_TIMER_1_VALUE	0x24
-#define RA_TIMER_1_CNTRL	0x28
-
-#define  TIMER_1_RESET		__BIT(5)
-#define  TIMER_0_RESET		__BIT(4)
-#define  TIMER_1_INT_STATUS	__BIT(1)
-#define  TIMER_0_INT_STATUS	__BIT(0)
-#define  TIMER_TEST_EN		__BIT(15)
-#define  TIMER_EN		__BIT(7)
-#define  TIMER_MODE(x)		(((x) & 0x3) << 4)
-#define   TIMER_MODE_FREE	0
-#define   TIMER_MODE_PERIODIC	1
-#define   TIMER_MODE_TIMEOUT	2
-#define   TIMER_MODE_WDOG	3	/* only valid for TIMER_1 */
-#define  TIMER_PRESCALE(x)	(((x) & 0xf) << 0)
+#define RA_TIMER_STAT			0x00
+#define RA_TIMER_0_LOAD			0x10
+#define RA_TIMER_0_VALUE		0x14
+#define RA_TIMER_0_CNTRL		0x18
+#define RA_TIMER_1_LOAD			0x20
+#define RA_TIMER_1_VALUE		0x24
+#define RA_TIMER_1_CNTRL		0x28
+
+#define  TIMER_1_RESET			__BIT(5)
+#define  TIMER_0_RESET			__BIT(4)
+#define  TIMER_1_INT_STATUS		__BIT(1)
+#define  TIMER_0_INT_STATUS		__BIT(0)
+#define  TIMER_TEST_EN			__BIT(15)
+#define  TIMER_EN			__BIT(7)
+#define  TIMER_MODE(x)			(((x) & 0x3) << 4)
+#define   TIMER_MODE_FREE		0
+#define   TIMER_MODE_PERIODIC		1
+#define   TIMER_MODE_TIMEOUT		2
+#define   TIMER_MODE_WDOG		3	/* only valid for TIMER_1 */
+#define  TIMER_PRESCALE(x)		(((x) & 0xf) << 0)
 #define   TIMER_PRESCALE_DIV_1		0
 #define   TIMER_PRESCALE_DIV_4		1
 #define   TIMER_PRESCALE_DIV_8		2
@@ -335,62 +414,131 @@
 /*
  * Interrupt Controller Registers
  */
+#if defined(MT7628)
+#define RA_INTCTL_IRQ0STAT	0x9c
+#define RA_INTCTL_IRQ1STAT	0xa0
+#define RA_INTCTL_TYPE		0x00
+#define RA_INTCTL_RAW		0xa4
+#define RA_INTCTL_ENABLE	0x80
+#define RA_INTCTL_DISABLE	0x78
+#else
 #define RA_INTCTL_IRQ0STAT	0x00
 #define RA_INTCTL_IRQ1STAT	0x04
 #define RA_INTCTL_TYPE		0x20
 #define RA_INTCTL_RAW		0x30
 #define RA_INTCTL_ENABLE	0x34
 #define RA_INTCTL_DISABLE	0x38
+#endif
 
+/* Interrupt controller mask bit */
+#define INT_GLOBAL	31
+#define INT_GLOBAL_EN	__BIT(INT_GLOBAL)
+#if defined(MT7628)
+#define INT_WDOG	24
+#define INT_UART2	22
+#define INT_UART1	21
+#define INT_UARTL	20
+#endif
+#define INT_UDEV	19
+#define INT_USB		18
+#define INT_ETHSW	17
+#define INT_R2P		15
+#define INT_SDHC	14
+#define INT_CRYPTO	13
+#if !defined(MT7628)
+#define INT_UARTL	12
+#endif
+#define INT_SPI		11
+#define INT_I2S		10
+#define INT_PERF	9
+#define INT_NAND	8
+#define INT_DMA		7
+#define INT_PIO		6
+#define INT_UARTF	5
+#define INT_PCM		4
+#define INT_ILLACC	3
+#if !defined(MT7628)
+#define INT_WDOG	2
+#endif
+#define INT_TIMER0	1
+#define INT_SYSCTL	0
 
-#define INT_GLOBAL	__BIT(31)
-#define INT_UDEV	__BIT(19)
-#define INT_USB		__BIT(18)
-#define INT_ETHSW	__BIT(17)
-#define INT_R2P		__BIT(15)
-#define INT_SDHC	__BIT(14)
-#define INT_UARTL	__BIT(12)
-#define INT_SPI		__BIT(11)
-#define INT_I2S		__BIT(10)
-#define INT_PERF	__BIT(9)
-#define INT_NAND	__BIT(8)
-#define INT_DMA		__BIT(7)
-#define INT_PIO		__BIT(6)
-#define INT_UARTF	__BIT(5)
-#define INT_PCM		__BIT(4)
-#define INT_ILLACC	__BIT(3)
-#define INT_WDOG	__BIT(2)
-#define INT_TIMER0	__BIT(1)
-#define INT_SYSCTL	__BIT(0)
 
 /*
  * Ralink Linear CPU Interrupt Mapping For Lists
  */
-#define RA_IRQ_LOW	0
-#define RA_IRQ_HIGH     1
-#define RA_IRQ_PCI	2
-#define RA_IRQ_FENGINE  3
-#define RA_IRQ_WLAN     4
-#define RA_IRQ_TIMER    5
-#define RA_IRQ_SYSCTL   6
-#define RA_IRQ_TIMER0   7
-#define RA_IRQ_WDOG     8
-#define RA_IRQ_ILLACC   9
-#define RA_IRQ_PCM	10
-#define RA_IRQ_UARTF    11
-#define RA_IRQ_PIO	12
-#define RA_IRQ_DMA	13
-#define RA_IRQ_NAND     14
-#define RA_IRQ_PERF     15
-#define RA_IRQ_I2S	16
-#define RA_IRQ_UARTL    17
-#define RA_IRQ_ETHSW    18
-#define RA_IRQ_USB	19
-#define RA_IRQ_MAX	20
+enum ralink_irq {
+	/* CPU interrupts */
+	RA_IRQ_LOW = 0,
+	RA_IRQ_HIGH,
+	RA_IRQ_PCI,
+	RA_IRQ_FENGINE,
+	RA_IRQ_WLAN,
+	RA_IRQ_TIMER,
+
+	/* pseudo IRQ for Interrupt controller */
+	RA_IRQ_SYSCTL,
+	RA_IRQ_TIMER0,
+	RA_IRQ_WDOG,
+	RA_IRQ_ILLACC,
+	RA_IRQ_PCM,
+	RA_IRQ_UARTF,
+	RA_IRQ_PIO,
+	RA_IRQ_DMA,
+	RA_IRQ_NAND,
+	RA_IRQ_PERF,
+	RA_IRQ_I2S,
+	RA_IRQ_SPI,
+	RA_IRQ_UARTL,
+	RA_IRQ_CRYPTO,
+	RA_IRQ_SDHC,
+	RA_IRQ_R2P,
+	RA_IRQ_ETHSW,
+	RA_IRQ_USB,
+	RA_IRQ_UDEV,
+	RA_IRQ_UART1,
+	RA_IRQ_UART2,
+	RA_IRQ_MAX
+};
 
 /*
  * General Purpose I/O
  */
+#if defined(MT7628)
+#define RA_PIO_00_31_DIR		0x00
+#define RA_PIO_32_63_DIR		0x04
+#define RA_PIO_64_95_DIR		0x08
+#define RA_PIO_00_31_POLARITY		0x10
+#define RA_PIO_32_63_POLARITY		0x14
+#define RA_PIO_64_95_POLARITY		0x18
+#define RA_PIO_00_31_DATA		0x20
+#define RA_PIO_32_63_DATA		0x24
+#define RA_PIO_64_95_DATA		0x28
+#define RA_PIO_00_31_SET_BIT		0x30
+#define RA_PIO_32_63_SET_BIT		0x34
+#define RA_PIO_64_95_SET_BIT		0x38
+#define RA_PIO_00_31_CLR_BIT		0x40
+#define RA_PIO_32_63_CLR_BIT		0x44
+#define RA_PIO_64_95_CLR_BIT		0x48
+#define RA_PIO_00_31_INT_RISE_EN	0x50
+#define RA_PIO_32_63_INT_RISE_EN	0x54
+#define RA_PIO_64_95_INT_RISE_EN	0x58
+#define RA_PIO_00_31_INT_FALL_EN	0x60
+#define RA_PIO_32_63_INT_FALL_EN	0x64
+#define RA_PIO_64_95_INT_FALL_EN	0x68
+#define RA_PIO_00_31_INT_HIGH_EN	0x70
+#define RA_PIO_32_63_INT_HIGH_EN	0x74
+#define RA_PIO_64_95_INT_HIGH_EN	0x78
+#define RA_PIO_00_31_INT_LOW_EN		0x80
+#define RA_PIO_32_63_INT_LOW_EN		0x84
+#define RA_PIO_64_95_INT_LOW_EN		0x88
+#define RA_PIO_00_31_INT_STAT		0x90
+#define RA_PIO_32_63_INT_STAT		0x94
+#define RA_PIO_64_95_INT_STAT		0x98
+#define RA_PIO_00_31_INT_STAT_EDGE	0xA0
+#define RA_PIO_32_63_INT_STAT_EDGE	0xA4
+#define RA_PIO_64_95_INT_STAT_EDGE	0xA8
+#else
 #define RA_PIO_00_23_INT		0x00
 #define RA_PIO_00_23_EDGE_INT		0x04
 #define RA_PIO_00_23_INT_RISE_EN	0x08
@@ -431,12 +579,25 @@
 #define RA_PIO_72_95_SET_BIT		0xa4
 #define RA_PIO_72_95_CLR_BIT		0xa8
 #define RA_PIO_72_95_TGL_BIT		0xac
-
+#endif
 
 /*
  * UART registers
  */
 
+#if defined(MT7628)
+#define RA_UART_RBR	0x00
+#define RA_UART_TBR	0x00
+#define RA_UART_IER	0x04
+#define RA_UART_IIR	0x08
+#define RA_UART_FCR	0x08
+#define RA_UART_LCR	0x0c
+#define RA_UART_MCR	0x10
+#define RA_UART_LSR	0x14
+#define RA_UART_MSR	0x18
+#define RA_UART_DLL	0x00
+#define RA_UART_DLM	0x04
+#else
 #define RA_UART_RBR	0x00
 #define RA_UART_TBR	0x04
 #define RA_UART_IER	0x08
@@ -447,10 +608,11 @@
 #define RA_UART_LSR	0x1C
 #define RA_UART_MSR	0x20
 #define RA_UART_DLL	0x28
+#endif
 
 
-#define UART_IER_ELSI	__BIT(2)    /* Receiver Line Status Interrupt Enable */
-#define UART_IER_ETBEI	__BIT(1)   /* Transmit Buffer Empty Interrupt Enable */
+#define UART_IER_ELSI	__BIT(2)	/* RX Line Status Interrupt Enable */
+#define UART_IER_ETBEI	__BIT(1)	/* TX Buffer Empty Interrupt Enable */
 #define UART_IER_ERBFI	__BIT(0)
 			/* Data Ready or Character Time-Out Interrupt Enable */
 
@@ -461,10 +623,10 @@
 #define UART_IIR_IID1	 __BIT(1)	/* Interrupt Source Encoded */
 #define UART_IIR_IP	 __BIT(0)	/* Interrupt Pending (active low) */
 
-#define UART_FCR_RXTRIG1 __BIT(7)	/* Receiver Interrupt Trigger Level */
-#define UART_FCR_RXTRIG0 __BIT(6)	/* Receiver Interrupt Trigger Level */
-#define UART_FCR_TXTRIG1 __BIT(5)    /* Transmitter Interrupt Trigger Level */
-#define UART_FCR_TXTRIG0 __BIT(4)    /* Transmitter Interrupt Trigger Level */
+#define UART_FCR_RXTRIG1 __BIT(7)	/* RX Interrupt Trigger Level */
+#define UART_FCR_RXTRIG0 __BIT(6)	/* RX Interrupt Trigger Level */
+#define UART_FCR_TXTRIG1 __BIT(5)	/* TX Interrupt Trigger Level */
+#define UART_FCR_TXTRIG0 __BIT(4)	/* TX Interrupt Trigger Level */
 #define UART_FCR_DMAMODE __BIT(3)	/* Enable DMA transfers */
 #define UART_FCR_TXRST	 __BIT(2)	/* Reset Transmitter FIFO */
 #define UART_FCR_RXRST	 __BIT(1)	/* Reset Receiver FIFO */
@@ -559,6 +721,71 @@
 /*
  * Frame Engine registers
  */
+#if defined(MT7628)
+#define RA_FE_TX_BASE_PTR_0	0x800	/*  TX Ring #0 Base Pointer */
+#define RA_FE_TX_MAX_CNT_0	0x804	/*  TX Ring #0 Maximum Count */
+#define RA_FE_TX_CTX_IDX_0	0x808	/*  TX Ring #0 CPU pointer */
+#define RA_FE_TX_DTX_IDX_0	0x80c	/*  TX Ring #0 DMA poitner */
+#define RA_FE_PDMA_TX0_PTR	RA_FE_TX_BASE_PTR_0
+#define RA_FE_PDMA_TX0_COUNT	RA_FE_TX_MAX_CNT_0
+#define RA_FE_PDMA_TX0_CPU_IDX	RA_FE_TX_CTX_IDX_0
+#define RA_FE_PDMA_TX0_DMA_IDX	RA_FE_TX_DTX_IDX_0
+#define RA_FE_TX_BASE_PTR_1	0x810	/*  TX Ring #1 Base Pointer */
+#define RA_FE_TX_MAX_CNT_1	0x814	/*  TX Ring #1 Maximum Count */
+#define RA_FE_TX_CTX_IDX_1	0x818	/*  TX Ring #1 CPU pointer */
+#define RA_FE_TX_DTX_IDX_1	0x81c	/*  TX Ring #1 DMA poitner */
+#define RA_FE_TX_BASE_PTR_2	0x820	/*  TX Ring #2 Base Pointer */
+#define RA_FE_TX_MAX_CNT_2	0x824	/*  TX Ring #2 Maximum Count */
+#define RA_FE_TX_CTX_IDX_2	0x828	/*  TX Ring #2 CPU pointer */
+#define RA_FE_TX_DTX_IDX_2	0x82c	/*  TX Ring #2 DMA poitner */
+#define RA_FE_TX_BASE_PTR_3	0x830	/*  TX Ring #3 Base Pointer */
+#define RA_FE_TX_MAX_CNT_3	0x834	/*  TX Ring #3 Maximum Count */
+#define RA_FE_TX_CTX_IDX_3	0x838	/*  TX Ring #3 CPU pointer */
+#define RA_FE_TX_DTX_IDX_3	0x83c	/*  TX Ring #3 DMA poitner */
+#define RA_FE_RX_BASE_PTR_0	0x900	/*  RX Ring #0 Base Pointer */
+#define RA_FE_RX_MAX_CNT_0	0x904	/*  RX Ring #0 Maximum Count */
+#define RA_FE_RX_CRX_IDX_0	0x908	/*  RX Ring #0 CPU pointer */
+#define RA_FE_RX_DRX_IDX_0	0x90c	/*  RX Ring #0 DMA poitner */
+#define RA_FE_PDMA_RX0_PTR	RA_FE_RX_BASE_PTR_0
+#define RA_FE_PDMA_RX0_COUNT	RA_FE_RX_MAX_CNT_0
+#define RA_FE_PDMA_RX0_CPU_IDX	RA_FE_RX_CRX_IDX_0
+#define RA_FE_PDMA_RX0_DMA_IDX	RA_FE_RX_DRX_IDX_0
+#define RA_FE_RX_BASE_PTR_1	0x910	/*  RX Ring #1 Base Pointer */
+#define RA_FE_RX_MAX_CNT_1	0x914	/*  RX Ring #1 Maximum Count */
+#define RA_FE_RX_CRX_IDX_1	0x918	/*  RX Ring #1 CPU pointer */
+#define RA_FE_RX_DRX_IDX_1	0x91c	/*  RX Ring #1 DMA poitner */
+#define RA_FE_PDMA_INFO		0xa00	/*  PDMA Information */
+#define RA_FE_PDMA_GLOBAL_CFG	0xa04	/*  PDMA Global Configuration */
+#define RA_FE_DELAY_INT_CFG	0xa0c	/*  Delay Interrupt Configuration */
+#define RA_FE_FREEQ_THRES	0xa10	/*  Free Queue Threshold */
+#define RA_FE_INT_STATUS	0xa20	/*  Interrupt Status */
+#define RA_FE_INT_MASK		0xa28	/*  Interrupt Mask */
+#define  RA_FE_INT_RX_COHERENT		__BIT(31)
+#define  RA_FE_INT_RX_DLY		__BIT(30)
+#define  RA_FE_INT_TX_COHERENT		__BIT(29)
+#define  RA_FE_INT_TX_DLY_INT		__BIT(28)
+#define  RA_FE_INT_RX_DONE_INT1		__BIT(17)
+#define  RA_FE_INT_RX_DONE_INT0		__BIT(16)
+#define  RA_FE_INT_TX_DONE_INT3		__BIT(3)
+#define  RA_FE_INT_TX_DONE_INT2		__BIT(2)
+#define  RA_FE_INT_TX_DONE_INT1		__BIT(1)
+#define  RA_FE_INT_TX_DONE_INT0		__BIT(0)
+
+#define RA_FE_PDMA_SCH		0xa80	/*  Scheduler Configuration for Q0&Q1 */
+#define RA_FE_PDMA_WRR		0xa84	/*  Scheduler Configuration for Q2&Q3 */
+#define RA_FE_SDM_CON		0xc00	/*  Switch DMA Control */
+#define RA_FE_SDM_RING		0xc04	/*  Switch DMA Rx Ring */
+#define RA_FE_SDM_TRING		0xc08	/*  Switch DMA TX Ring */
+#define RA_FE_SDM_MAC_ADRL	0xc0c	/*  Switch MAC Address LSB */
+#define RA_FE_SDM_MAC_ADRH	0xc10	/*  Switch MAC Address MSB */
+#define RA_FE_GDMA1_MAC_LSB	RA_FE_SDM_MAC_ADRL
+#define RA_FE_GDMA1_MAC_MSB	RA_FE_SDM_MAC_ADRH
+#define RA_FE_SDM_TPCNT		0xd00	/*  Switch DMA Tx Packet Count */
+#define RA_FE_SDM_TBCNT		0xd04	/*  Switch DMA TX Byte Count */
+#define RA_FE_SDM_RPCNT		0xd08	/*  Switch DMA RX Packet Count */
+#define RA_FE_SDM_RBCNT		0xd0c	/*  Switch DMA RX Byte Count */
+#define RA_FE_SDM_CS_ERR	0xd10	/*  Switch DMA RX Checksum Error */
+#else /* !MT7628 */
 #define RA_FE_MDIO_ACCESS	0x000
 #define RA_FE_MDIO_CFG1		0x004
 #define RA_FE_GLOBAL_CFG	0x008
@@ -628,6 +855,7 @@
 #define RA_FE_PDMA_TX3_CPU_IDX	0x158
 #define RA_FE_PDMA_TX3_DMA_IDX	0x15C
 #define RA_FE_PDMA_FC_CFG	0x1F0
+#endif /* !MT7628 */
 /* TODO: FE_COUNTERS */
 
 #define  MDIO_ACCESS_TRG			__BIT(31)
@@ -729,11 +957,15 @@
 /*
  * 10/100 Switch registers
  */
-
 #define RA_ETH_SW_ISR		0x00
 #define RA_ETH_SW_IMR		0x04
 #define RA_ETH_SW_FCT0		0x08
+#define  RA_ETH_SW_FCT0_FC_RLS_TH(x)	(((x) & 0xff) << 24)
+#define  RA_ETH_SW_FCT0_FC_SET_TH(x)	(((x) & 0xff) << 16)
+#define  RA_ETH_SW_FCT0_DROP_RLS_TH(x)	(((x) & 0xff) << 8)
+#define  RA_ETH_SW_FCT0_DROP_SET_TH(x)	(((x) & 0xff) << 0)
 #define RA_ETH_SW_FCT1		0x0C
+#define  RA_ETH_SW_FCT1_PORT_TH(x)	(((x) & 0xff) << 0)
 #define RA_ETH_SW_PFC0		0x10
 #define RA_ETH_SW_PFC1		0x14
 #define RA_ETH_SW_PFC2		0x18
@@ -778,8 +1010,8 @@
 #define RA_ETH_SW_LEDP4		0xB4
 #define RA_ETH_SW_WDOG		0xB8
 #define RA_ETH_SW_DBG		0xBC
-#define RA_ETH_SW_PCTL0		0xC0
-#define RA_ETH_SW_PCTL1		0xC4
+#define RA_ETH_SW_PCTL0		0xC0	/* PCR0 */
+#define RA_ETH_SW_PCTL1		0xC4	/* PCR1 */
 #define RA_ETH_SW_FPORT		0xC8
 #define RA_ETH_SW_FTC2		0xCC
 #define RA_ETH_SW_QSS0		0xD0
@@ -1107,8 +1339,8 @@
 #define  PCICFG_P2P_BR_DEVNUM0		__BITS(19,16)
 #define  PCICFG_PSIRST			__BIT(1)
 #define RA_PCI_PCIINT			0x0008
-#define  PCIINT_INT3			__BIT(21) // PCIe1 interrupt
-#define  PCIINT_INT2			__BIT(20) // PCIe0 interrupt
+#define  PCIINT_INT3			__BIT(21) /* PCIe1 interrupt */
+#define  PCIINT_INT2			__BIT(20) /* PCIe0 interrupt */
 #define  PCIINT_INT1			__BIT(19)
 #define  PCIINT_INT0			__BIT(18)
 #define RA_PCI_PCIENA			0x000c

Index: src/sys/arch/mips/ralink/ralink_var.h
diff -u src/sys/arch/mips/ralink/ralink_var.h:1.6 src/sys/arch/mips/ralink/ralink_var.h:1.7
--- src/sys/arch/mips/ralink/ralink_var.h:1.6	Wed Apr 30 00:51:01 2014
+++ src/sys/arch/mips/ralink/ralink_var.h	Wed Oct  5 15:54:58 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ralink_var.h,v 1.6 2014/04/30 00:51:01 matt Exp $	*/
+/*	$NetBSD: ralink_var.h,v 1.7 2016/10/05 15:54:58 ryo Exp $	*/
 /*-
  * Copyright (c) 2011 CradlePoint Technology, Inc.
  * All rights reserved.
@@ -49,6 +49,7 @@ struct mainbus_attach_args {
 	const char     *ma_name;
 	bus_space_tag_t ma_memt;
 	bus_dma_tag_t   ma_dmat;
+	bus_addr_t      ma_addr;
 };
 
 #define SERIAL_CONSOLE 1

Added files:

Index: src/sys/arch/evbmips/conf/LINKITSMART7688
diff -u /dev/null src/sys/arch/evbmips/conf/LINKITSMART7688:1.1
--- /dev/null	Wed Oct  5 15:54:58 2016
+++ src/sys/arch/evbmips/conf/LINKITSMART7688	Wed Oct  5 15:54:58 2016
@@ -0,0 +1,286 @@
+#	$NetBSD: LINKITSMART7688,v 1.1 2016/10/05 15:54:58 ryo Exp $
+#
+# MediaTek MT7688
+#
+
+include		"arch/evbmips/conf/std.rasoc"
+
+makeoptions	COPY_SYMTAB=1		# size for embedded symbol table
+
+options 	RALINK_CONSOLE_EARLY
+options 	RALINK_CONADDR=RA_UART2_BASE
+
+options 	MT7628
+options 	CONSPEED=57600
+
+maxusers	8
+
+# Size reduction options
+#options 	VNODE_OP_NOINLINE
+#options 	PIPE_SOCKETPAIR	# smaller, but slower pipe(2)
+#options 	SOSEND_NO_LOAN
+
+# Standard system options
+
+options 	INSECURE	# disable kernel security levels - X needs this
+
+options 	RTC_OFFSET=0	# hardware clock is this many mins. west of GMT
+options 	NTP		# NTP phase/frequency locked loop
+
+options 	KTRACE		# system call tracing via ktrace(1)
+
+#options 	SYSVMSG		# System V-like message queues
+#options 	SYSVSEM		# System V-like semaphores
+#options 	SYSVSHM		# System V-like memory sharing
+#options 	SHMMAXPGS=2048	# 2048 pages is the default
+
+#options 	NMBCLUSTERS=1024
+#options 	MCLSHIFT=12 # 4k mbuf clusters (increases pool max's to 4k as well)
+
+#options 	USERCONF	# userconf(4) support
+#options 	SYSCTL_INCLUDE_DESCR	# Include sysctl descriptions in kernel
+
+# Diagnostic/debugging support options
+options 	DIAGNOSTIC	# expensive kernel consistency checks
+#options 	LOCKDEBUG
+#options 	KSTACK_CHECK_MAGIC
+#options 	DEBUG		# expensive debugging checks/support
+options 	DDB			# in-kernel debugger
+options 	DDB_ONPANIC=1		# see also sysctl(7): `ddb.onpanic'
+#options 	DDB_HISTORY_SIZE=512	# enable history editing in DDB
+#options 	DDB_COMMANDONENTER="w/b 0x90000128 0 ; bt"	# disable watchdog & drop history on enter
+#options 	KGDB		# remote debugger
+#options 	KGDB_DEVNAME="\"com\"",KGDB_DEVADDR=0x2f8,KGDB_DEVRATE=9600
+#makeoptions 	DEBUG="-g2"	# compile full symbol table
+#makeoptions 	COPTS="-Os"	# Optimise for space.
+
+#makeoptions PROF="-p"		# build profiling in 
+#options 	GPROF
+
+# Compatibility options
+#options 	COMPAT_NOMID	# NetBSD 0.8, 386BSD, and BSDI
+#options 	COMPAT_09	# NetBSD 0.9,
+#options 	COMPAT_10	# NetBSD 1.0,
+#options 	COMPAT_11	# NetBSD 1.1,
+#options 	COMPAT_12	# NetBSD 1.2 (and 386BSD and BSDI),
+#options 	COMPAT_13	# NetBSD 1.3 (and 386BSD and BSDI),
+#options 	COMPAT_14	# NetBSD 1.4,
+#options 	COMPAT_15	# NetBSD 1.5,
+#options 	COMPAT_16	# NetBSD 1.6,
+#options 	COMPAT_20	# NetBSD 2.0,
+#options 	COMPAT_30	# NetBSD 3.0,
+#options 	COMPAT_40	# NetBSD 4.0,
+options 	COMPAT_50	# NetBSD 5.0,
+options 	COMPAT_60	# NetBSD 6.0, and
+options 	COMPAT_70	# NetBSD 7.0 binary compatibility.
+#options 	COMPAT_43	# 4.3BSD, 386BSD, and BSDI
+#options 	COMPAT_386BSD_MBRPART # recognize old partition ID
+#options 	TCP_COMPAT_42	# 4.2BSD TCP/IP bug compat. Not recommended.
+
+#options 	COMPAT_SVR4	# binary compatibility with SVR4
+#options 	COMPAT_IBCS2	# binary compatibility with SCO and ISC
+#options 	COMPAT_LINUX	# binary compatibility with Linux
+#options 	COMPAT_FREEBSD	# binary compatibility with FreeBSD
+#options 	COMPAT_BSDPTY	# /dev/[pt]ty?? ptys.
+
+# File systems
+file-system	FFS		# UFS
+file-system	EXT2FS		# second extended file system (linux)
+#file-system	LFS		# log-structured file system
+file-system	MFS		# memory file system
+file-system	NFS		# Network File System client
+#file-system	CD9660		# ISO 9660 + Rock Ridge file system
+file-system	MSDOSFS		# MS-DOS file system
+#file-system	FDESC		# /dev/fd
+file-system	KERNFS		# /kern
+#file-system	NULLFS		# loopback file system
+#file-system	PORTAL		# portal filesystem (still experimental)
+file-system	PROCFS		# /proc
+#file-system	UMAPFS		# NULLFS + uid and gid remapping
+#file-system	UNION		# union file system
+#file-system	SMBFS		# experimental - CIFS; also needs nsmb (below)
+file-system	PTYFS		# /dev/pts/N support
+file-system	TMPFS		# Efficient memory file-system
+
+# File system options
+#options 	QUOTA		# UFS quotas
+#options 	FFS_EI		# FFS Endian Independant support
+#options 	NFSSERVER	# Network File System server
+options 	FFS_NO_SNAPSHOT	# No FF snapshot support
+#options 	EXT2FS_SYSTEM_FLAGS # makes ext2fs file flags (append and immutable) behave as system flags.
+
+# Networking options
+#options 	GATEWAY		# packet forwarding
+options 	INET		# IP + ICMP + TCP + UDP
+options 	MROUTING	# IP multicast routing
+options 	INET6		# IPV6
+#options 	IPSEC		# IP security
+#options 	IPSEC_DEBUG	# debug for IP security
+#options 	PIM		# Protocol Independent Multicast
+#options 	NETATALK	# AppleTalk networking protocols
+#options 	PPP_BSDCOMP	# BSD-Compress compression support for PPP
+#options 	PPP_DEFLATE	# Deflate compression support for PPP
+#options 	PPP_FILTER	# Active filter support for PPP (requires bpf)
+#options 	IPFILTER_LOG	# ipmon(8) log support
+#options 	IPFILTER_LOOKUP	# ippool(8) support
+#options 	IPFILTER_DEFAULT_BLOCK	# block all packets by default
+#options 	TCP_DEBUG	# Record last TCP_NDEBUG packets with SO_DEBUG
+
+#options 	ALTQ		# Manipulate network interfaces' output queues
+#options 	ALTQ_BLUE	# Stochastic Fair Blue
+#options 	ALTQ_CBQ	# Class-Based Queueing
+#options 	ALTQ_CDNR	# Diffserv Traffic Conditioner
+#options 	ALTQ_FIFOQ	# First-In First-Out Queue
+#options 	ALTQ_FLOWVALVE	# RED/flow-valve (red-penalty-box)
+#options 	ALTQ_HFSC	# Hierarchical Fair Service Curve
+#options 	ALTQ_LOCALQ	# Local queueing discipline
+#options 	ALTQ_PRIQ	# Priority Queueing
+#options 	ALTQ_RED	# Random Early Detection
+#options 	ALTQ_RIO	# RED with IN/OUT
+#options 	ALTQ_WFQ	# Weighted Fair Queueing
+
+# JIT compiler for bpfilter
+#options	SLJIT
+#options	BPFJIT
+
+# These options enable verbose messages for several subsystems.
+# Warning, these may compile large string tables into the kernel!
+#options 	EISAVERBOSE	# verbose EISA device autoconfig messages
+#options 	PCIVERBOSE	# verbose PCI device autoconfig messages
+#options 	PCI_CONFIG_DUMP	# verbosely dump PCI config space
+#options 	PCMCIAVERBOSE	# verbose PCMCIA configuration messages
+#options 	SCSIVERBOSE	# human readable SCSI error messages
+options 	USBVERBOSE	# verbose USB device autoconfig messages
+
+# Options for necessary to use MD
+#options 	MEMORY_DISK_HOOKS
+#options 	MEMORY_DISK_IS_ROOT		# force root on memory disk
+#options 	MEMORY_DISK_SERVER=0		# no userspace memory disk support
+#options 	MEMORY_DISK_ROOT_SIZE=8192	# embed the FS into the system for now
+#options 	MEMORY_RBFLAGS=0		# keep the kernel from forcing single user mode
+
+# Options for NFS root boot
+#options 	NFS_BOOT_DHCP,NFS_BOOT_BOOTPARAM,NFS_BOOT_BOOTSTATIC
+options 	NFS_BOOT_BOOTSTATIC
+options 	NFS_BOOTSTATIC_MYIP="\"192.168.0.1\""
+options 	NFS_BOOTSTATIC_GWIP="\"192.168.0.1\""
+options 	NFS_BOOTSTATIC_MASK="\"255.255.255.0\""
+options 	NFS_BOOTSTATIC_SERVADDR="\"192.168.0.5\""
+options 	NFS_BOOTSTATIC_SERVER="\"192.168.0.5:server:/path/to/root\""
+
+# Need more mbufs for IPsec VPN
+#options 	NMBCLUSTERS=4096
+
+# LinkItSmart7688 dev board root on embedded NFS mount disk
+#config		netbsd root on ? type ?
+#config		netbsd root on sd0a type ffs dumps none
+config		netbsd root on reth0 type nfs dumps none
+
+mainbus0	at root
+cpu0		at mainbus?
+
+# UARTs
+com0		at mainbus? addr 0x10000c00
+com1		at mainbus? addr 0x10000d00
+com2		at mainbus? addr 0x10000e00
+
+# Watchdog
+rwdog0 		at mainbus?
+options 	RA_WDOG_DEFAULT_PERIOD=10
+#options 	RA_WDOG_DEFAULT_MODE=WDOG_MODE_DISARMED
+options 	RA_WDOG_DEFAULT_MODE=WDOG_MODE_KTICKLE
+
+# Ethernet MACs
+reth*		at mainbus?
+options 	RALINK_ETH_MACADDR="00:00:aa:bb:cc:dd"	# according to u-boot env
+
+# MII/PHY support
+ukphy*	at mii? phy ?			# generic unknown PHYs
+
+# PCI/PCIe support
+rpci0		at mainbus?
+pci*		at rpci?
+
+# GPIO support
+rgpio0		at mainbus?
+gpio*		at rgpio?
+
+# I2C support
+ri2c0		at mainbus?
+iic*		at ri2c?
+
+# NOR Flash
+#options 	NOR_VERBOSE
+#cfi0 		at mainbus0
+#nor0		at cfi0
+#flash0		at nor0 offset 0x00000000 size 0x00030000	# u-boot
+#flash1		at nor0 offset 0x00030000 size 0x00010000	# u-boot env
+#flash2		at nor0 offset 0x00040000 size 0x00010000	# factory
+#flash3		at nor0 offset 0x00050000 size 0x007b0000	# firmware
+
+# USB support on rusb0
+ehci*		at mainbus?
+usb*		at ehci?
+
+# USB support on rusb0
+ohci*		at mainbus?
+usb*		at ohci?
+
+# USB device drivers
+include "dev/usb/usbdevices.config"
+
+midi*		at midibus?
+
+
+# Pseudo-Devices
+
+pseudo-device	crypto			# /dev/crypto device
+pseudo-device	swcrypto		# software crypto implementation
+
+# disk/mass storage pseudo-devices
+#pseudo-device	md			# memory disk device (ramdisk)
+#options 	MEMORY_DISK_HOOKS	# enable root ramdisk
+#options 	MEMORY_DISK_DYNAMIC	# loaded via kernel module(7)
+
+#pseudo-device	vnd			# disk-like interface to files
+#options 	VND_COMPRESSION		# compressed vnd(4)
+
+# network pseudo-devices
+pseudo-device	bpfilter		# Berkeley packet filter
+#pseudo-device	carp			# Common Address Redundancy Protocol
+pseudo-device	ipfilter		# IP filter (firewall) and NAT
+pseudo-device	loop			# network loopback
+#pseudo-device	mpls			# MPLS pseudo-interface
+pseudo-device	ppp			# Point-to-Point Protocol
+pseudo-device	pppoe			# PPP over Ethernet (RFC 2516)
+#options	PPPOE_SERVER		# Enable PPPoE server via link0
+pseudo-device	sl			# Serial Line IP
+pseudo-device	strip			# Starmode Radio IP (Metricom)
+pseudo-device	irframetty		# IrDA frame line discipline
+pseudo-device	tap			# virtual Ethernet
+pseudo-device	tun			# network tunneling over tty
+pseudo-device	gre			# generic L3 over IP tunnel
+pseudo-device	gif			# IPv[46] over IPv[46] tunnel (RFC 1933)
+#pseudo-device	faith			# IPv[46] TCP relay translation i/f
+pseudo-device	stf			# 6to4 IPv6 over IPv4 encapsulation
+pseudo-device	vlan			# IEEE 802.1q encapsulation
+pseudo-device	bridge			# simple inter-network bridging
+#options	BRIDGE_IPF		# bridge uses IP/IPv6 pfil hooks too
+pseudo-device	agr			# IEEE 802.3ad link aggregation
+#pseudo-device	pf			# PF packet filter
+#pseudo-device	pflog			# PF log if
+#pseudo-device	pfsync			# PF sync if
+#pseudo-device	npf			# NPF packet filter
+#pseudo-device	etherip			# Tunnel Ethernet over IP
+# srt is EXPERIMENTAL
+#pseudo-device	srt			# source-address-based routing
+
+# miscellaneous pseudo-devices
+pseudo-device	pty			# pseudo-terminals
+pseudo-device	sequencer		# MIDI sequencer
+pseudo-device	clockctl		# user control of clock subsystem
+pseudo-device	ksyms			# /dev/ksyms
+pseudo-device	lockstat		# lock profiling
+pseudo-device	bcsp			# BlueCore Serial Protocol
+pseudo-device	btuart			# Bluetooth HCI UART (H4)
+#pseudo-device	gpiosim		1	# GPIO simulator

Reply via email to